Technology
This website is built on a wide variety of open source tools. Most of them are listed below in alphabetical order, along with a brief description of how I've used them and my experience with each. Generally, this website has the Django framework at its core, where all other technology listed is used in support of that framework.
One of the very first things I ever did with Linux was build PHP and Apache together. Since then I have become familiar with Apache configuration and the various ways this is spread out depending on which Linux distrubition it's installed on, and its logging files which I routinely use for troubleshooting purposes. Specific to this site, I learned about SSL implementation and some very basic vhost configuration.
Bash was used extensively during the troubleshooting and implementation of the website—everything from simple file system commands, redirection and pipe operators, job management, permissions and authorization, shell scripting, and more. Long live the CLI.
Sometime in or around 2017, I had to quickly write a small website that was fully mobile compatible. The grid system inherent in this CSS framework came to my rescue then and I haven't looked back since. I regularly use it for all of my forms styling, various UI elements and all content & typography. Along the way, I became familiar with the challenges in moving from Bootstrap version 3 to Bootstrap 5.
After a fairly negative experience with a different MVC ORM around 2009, I was hesitant to try another. Fast forward several years, and I was tasked with the creation of a web app that needed a dozen or so models (not this one), each with identical CRUD requirements. As a result, I decided to take a second look at these technologies. That search eventually led me to Django. This framework's strict adherence to the DRY principle, its built-in administration interface, templating engine and open source nature were all very appealing and I became a convert. This ORM definitely lives up to the hype.
The use of Django for a variety of personal and professional web application projects eventually led me to the framework's Achilles heel: deploying it. Having previously worked with PHP and MySQL a fair bit, I naïvely thought I would merely copy my Django application code to a web server and everything would work. At most, I thought I might have to enable a Python module in Apache or something simple like that. Anyone familiar with Django deployment is probably laughing right now. Needless to say, deploying Django is actually quite challenging.
While I was somewhat successful in getting mod_wsgi working, a friend suggested I give docker a try. I did - and it worked very well. In fact, this application is being served by a docker container right now. Along the way, I learned the nuances involved in multi-container management via docker compose, implementing a multi-stage build, container logging, volumes, various types of docker networking, and general troubleshooting of my containers. The docker rabbit hole is pretty deep and I certainly don't claim to be a DevOps engineer, however, learning the basics of this powerful technology has certainly given me a much greater appreciation for that field. More importantly, I can now reliably deploy my Django applications to virtually any hosting environment.
I have been a life-long fan of all things Linux, open source and free software. While I have nothing against proprietary software, I prefer free and open alternatives whenever possible. Throughout my career, I've used a wide variety of Linux based operating systems, including Red Hat and Debian based distributions. While I enjoy them all, I find I am most at home on the Debian variants.
I’ll be the first to admit that I don’t actually know a lot of Python. Most of my practical experience with the language has come through working with Django. This has given me a solid grasp of Python’s syntax and core constructs, including data structures like arrays and lists, conditionals, loops, and implementing basic object-oriented class structures.
SQLite is currently used as the backend for this application, though that may change to PostgreSQL if I ever move it to GCP. One of the Django model fields is defined as models.JSONField, and this led to some interesting challenges as I moved data between the database, python and javascript. The Django user model was extended to support an additional field or two, but generally speaking the data requirements of this app are very low. A lot of people think sqlite isn't appropriate for production use, but for a small application supporting a very obscure sport like trick water skiing, I can't help but think it's not just appropriate, but actually very fitting for this use case.
A few other notable mentions include JavaScript which, while I'm still not overly keen on this language in general, I did learn a great deal about thanks in part to a former colleague who was kind enough to review my code. I also improved my understanding of modern HTML and CSS, SSL, the JSON and YAML formats and more.