Software Engineering
Web Development
Information Technology
Hi! I'm Chris. Welcome to my portfolio. Here I will be posting entries and videos about school, personal, and work projects while maintaining academic and professional integrity. Some of my school and personal programming projects can be found using the menu below.
                            As of October 2024, I have completed my ABET-accredited
                            Bachelor of Science degree program in Software Engineering
                            at
                            Arizona State University. For my capstone project, I worked with a team to create a virtual reality
                            "asteroid surface experience" using Unreal Engine for NASA's mission to Psyche.
                            I have also taken (or am currently taking) the following online courses/bootcamps:
                            Docker and Kubernetes: From Zero to Hero
                            C# .NET with MS SQL Complete Beginner to Master
                            The Complete Web Development Bootcamp
                            C Programming with Linux
                            
                            I have worked in IT for many years performing various technical support roles including help desk and operations support for popular name brand retailers.
                        
                        
                        
                        
                        
                        
                        For my capstone project 
                        at ASU, I had the amazing opportunity to work with a team to create a VR experience 
                        using Unreal Engine. NASA and ASU tasked us with creating an experience of what it might be like to walk around 
                        on and explore the asteroid Psyche, for which NASA has launched a probe to explore the space object. As total 
                        newbies to VR or 3D game development in general, we had no idea what our project would entail. Our experience 
                        as software engineering students had been limited to Java, C, perhaps some JavaScript and a handful of other
                        general programming languages. The project led us into the land of 3D world building, visual programming, binary 
                        object collaboration, player interaction, stereoscopic image implementation, and much more. In the end, we created 
                        a product we were all proud of, one that gave us confidence to take on new creative engineering paradigms. 
                        
                            
                            
                            
                        
                        
                        This portfolio was mainly developed using Bootstrap with a little customization.
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        My old portfolio website was
                        made using Django/Python (with SQLite), HTML, CSS, and Markdown. It was based
                        on
                        the Wiki assignment from Harvard's CS50
                        web programming course. The pages were written in Markdown files (with some HTML) and then
                        converted to pure HTML.
                        I liked the original idea of using Markdown files for the pages because it's simple, fun,
                        and
                        easy to work with. Instead of using the files as the sole means of keeping track of entries,
                        I
                        implemented an entry model so that the objects are saved in the database as well. This
                        allows
                        for easy entry/page handling in the admin console.
                        I modified much of the CSS, however some of it is from the original project which uses a
                        little
                        Bootstrap. I created a color palette by uploading the banner image (original photo by me) to
                        PaletteGenerator and then
                        adjusting the colors to my
                        liking. I implemented screen size responsiveness for mobile screens.
                        
                        
                        
                        
                            
                            
                            
                            
                        
                        
                        I took a mobile development course as an elective for my degree program. It covered the basics of
                        Node and React for Android. Some examples of the projects we worked on include: tab navigation, buttons, state changes,
                        asynchronous storage, Redux, media player, maps, API integration, menus.
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                            This is a project (GitHub) from the
                            2023 Web Development Bootcamp on Udemy. It runs on Node.js/Express and uses EJS for
                            templating. The database
                            is NoSQL using MongoDB and Mongoose js, and part of the project was also hosting the db
                            using MongoDB Atlas. It allows for new, custom list creation by entering a new word for the
                            URL, so if you want a to-do list for work you would go to "/Work", etc. It also has a
                            default list for "Today".
                            It uses lodash to fix capitalization when creating a new list or accessing a previous one,
                            so it doesn't matter
                            if you type in "/WORK" or "/work", it will end up on the proper list "Work".
                        
                        
                            Although I was previously familiar with using templates and embedded scripts, having worked
                            a fair amount
                            with Django, it was a good experience learning how to do things the JavaScript way. I also
                            became comfortable
                            with NoSQL during this project; using Mongoose and spending a good amount of time in the
                            MongoDB Shell.
                        
                        
                            The instructor used some functions in which their callbacks had been deprecated, so I had to
                            do some actual
                            programming on this project. Many of Mongoose's CRUD operations no longer do callbacks, so
                            instead you need to
                            either use an asynchronous function and then use "await", or you can do a cool try/catch
                            statement using
                            anonymous functions, which is what I chose to do.
                        
                        
                            
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                            This is a project (GitHub) from the
                            2023 Web Development Bootcamp on Udemy. It runs on Node.js/Express and uses EJS for
                            templating/URL. The database
                            is NoSQL using MongoDB and Mongoose JS. We used Studio 3T (formerly Robo 3T) to manage and
                            view the database, and Postman for the API interaction.
                            
                            
                            It's a simple wiki-style API for CRUD'ing articles in a MongoDB database. Its only
                            parameters are "title" and "content". We also learned how to chain route handlers to reduce redundancy.
                            
                            
                            I had previously programmed a RESTful API in my distributed systems course; I hosted an AWS
                            EC2
                            Java/Gradle API "Mad Libs" style game, where you could use a query to fill in the
                            appropriate blanks
                            (noun, verb, proper name, etc.) and it would return you the completed story. We also did a
                            basic calculator API.
                        
                        
                        
                        
                        
                        
                        
                        
                            In this CS50 project, Django's
                            built-in security features for authentication and authorization are utilized. At the time of
                            writing this, Django uses
                            PBKDF2 for password
                            salting, and it includes many useful
                            methods such as authenticate and
                            validate_password. This
                            auction-style website uses Django's session framework to manage logins.
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                            This is a project (GitHub) from the
                            2023 Web Development Bootcamp on Udemy. It runs on Node.js/Express and uses EJS for
                            templating/URL. The database
                            is NoSQL using MongoDB and Mongoose JS. We used Studio 3T (formerly Robo 3T) to manage and
                            view the database. Environment variables were used to keep the keys safe. Initially,
                            bcrypt was used to hash
                            and salt passwords, then we upgraded to use OAuth 2.0 with Passport to login via Google.
                            
                            
                            The concept is a website that lists "secrets" that any user can save to the site
                            anonymously.
                            It allows users to register and login using an email and password,
                            or they can login via Google. If they login without Google, their password is hashed and
                            salted using Passport
                            and then saved in the database. If they choose to login via Google, their Google ID will be
                            saved to the database instead.
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                            This was my first time working as part of a Scrum team on an Agile development project. It
                            was
                            also my first time working with legacy code to create something new. We were given an old
                            "diary
                            manager and tool for scheduling personal projects" called
                            Memoranda. It was
                            up
                            to us to come up with a new
                            idea using the code, and we decided to convert it into a Scrum board application. It's a 
                            desktop Java/Gradle program. For testing we used JUnit, Jacoco, SpotBugs, and
                            Checkstyle, and we also used Travis CI for continuous integration via GitHub Actions.
                            We used Taiga
                            for
                            our Scrum board. I also compiled a Wiki of responsibilities and instructions.
                        
                        
                        
                        
                        
                        
                        
                        
                        
                            This team project uses Java's
                            JDBC
                            libraries to connect to
                            MySQL. It uses a simple CLI menu system based on potential SQL queries. The project required
                            dummy data for demonstration, so I decided to write an
                            additional
                                program to create that dummy data (as
                            explained in the video). The data outputs as SQL insert statements which can then be used to
                            easily insert data into the database. I used the Department of Energy's
                            Fuel Economy
                                API to
                            compile vehicle data, and random name
                            and address generators for the owner data.
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                            Here's a Java/Gradle project which uses the Jacoco code coverage tool, as well as SpotBugs
                            and
                            Checkstyle plugins. It was developed using Travis CI (a continuous integration tool) via
                            GitHub
                            Actions. It includes an option to run a simulated version of the game which outputs the
                            results
                            of commands entered automatically as an example, though this is not demonstrated in the
                            video.
                            In the video I incorrectly state that the characters use a Builder design pattern when they
                            actually use a Factory pattern.
                        
                        
                            Design Patterns used:
                        
                        
                            Decorator: Level is a decorator interface which layers on character’s “titles” and
                            level up
                            bonuses, so
                            if your title at level 1 is “Apprentice”, when you get to level 2 your title will be
                            “Apprentice, Adventurer” and so on. Level 2 hit point and mana bonuses will layer on, so
                            each
                            level will give you many more bonus points than the previous level because it adds them to
                            the
                            previous level bonuses.
                        
                        
                            State: State is used for changing a character’s state from AwakeState to
                            SleepingState
                            (using “wake”
                            or “sleep” commands), and their action responses will differ depending on the state. A
                            character
                            cannot walk around or do anything besides wake up when they are in sleeping state, but they
                            will
                            get messages which are specific to the actions inputted about being asleep or awake (i.e.,
                            “You
                            are already awake”, “You can’t move while you’re sleeping.”, etc.).
                        
                        
                            Builder: SandwichBuilder is used to build Sandwich objects. Using the “menu” command,
                            a menu
                            for
                            creating a sandwich will be displayed and when the player is done, they will receive a
                            sandwich
                            and (in the future) they will be charged the appropriate cost.
                        
                        
                            Factory: Character is an interface which is used by the abstract class
                            CharacterCreator. The
                            concrete
                            factories FighterCreator, MagicUserCreator, and MonsterCreator implement CharacterCreator
                            and
                            all produce objects respective of their class names.
                        
                        
                            Features implemented:
                        
                        
                        
                        
                        
                        
                            Consensus algorithms use multiple
                            processes or nodes to achieve agreement on some value (like in blockchain), and to maintain
                            integrity of a system by increasing its resiliency (like for load balancing). This project
                            implements a consensus algorithm wherein a leader class divides up the work of encrypting a
                            string and assigns distributed nodes different chunks--using muli-threading--to carry out
                            the
                            work. The leader then sends a decrypted and an encrypted version of the chunks to different
                            nodes than they were originally from, verifying that the encryption process was done
                            correctly.
                            If a node reports a disagreement, the leader will check the work of the original node and
                            the
                            one reporting a discrepancy and determine which is faulty, then disconnect it. It will
                            repeat
                            the process until it has consensus between all nodes.
                            A singleton class is used for a TCP server (see section "Distributed computing: TCP server
                            and WireShark")
                            which keeps track of the node sockets. JSON (using JSONObject in Java) is used for data
                            serialization.
                        
                        
                        
                        
                        
                        
                        
                        
                        
                            This program uses the same server socket elements from the
                            TCP server "Distributed computing: TCP server and WireShark" example. It consists of a
                            server
                            class which uses multi-threading to handle client connections, as well as a client class. It
                            uses
                            Protocol
                                Buffers as its means for data
                            serialization. Once a game is started, multiple clients may connect to the server and play
                            the
                            same game simultaneously.
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                            This Java (with Gradle) TCP server and client was given as an example for my Distributed
                            Systems
                            course at ASU. It is publicly available as part of a repository of examples
                            here
                            Since I'm unable to share the code for my assignment submission, I used this example to show
                            the
                            basics of how to create a socket server and client in Java. In the video I demonstrate how
                            to
                            use it as well as some basic WireShark packet capturing. Part of the original project was to
                            also serve the server on an AWS EC2 instance.
                        
                        
                        
                        
                        
                        
                        
                        
                        
                            Parallel
                                computing using multithreading
                            isn't always the best option for your program. An image processing program may benefit from
                            the
                            fact that it can utilize a multi-core system to assign multiple threads to process an image
                            filtering algorithm simultaneously, because--when dividing up an image for processing--you
                            can
                            assign individual threads to process each division. A program which depends on a particular
                            order of execution may not be able to take advantage of parallel processing.
                        
                        
                            This project demonstrates the effectiveness of parallel computing using the C programming
                            language. The short video gives a demonstration of the program and also some basic
                            procedures of
                            compiling and testing the program.
                        
                        
                            As with all school projects, I can't share the code publicly for academic integrity reasons,
                            however I can share my code via Zoom to prospective employers or allow them to view my
                            private
                            repository on GitHub.
                        
                        
                        
                        
                        
                        
                        
                            I learned Vim on the job working in a data center for a grocery distribution company. I
                            worked
                            daily with AIX and Linux
                            servers, and since I was often
                            on the command line working with logs and various files, it was very convenient to learn new
                            ways to not have to use a mouse; switching back and forth between the keyboard can be clumsy
                            and
                            annoying if you're in a hurry looking for that error or remotely copying and renaming files.
                            Eventually I started writing shell scripts and then got into programming in general, so I
                            was
                            able to keep Vim in my tool belt and I've never looked back.