Overview
Say goodbye to unofficial lyric videos and bad audio on YouTube!
This YouTube-esque web application populates search results directly from YouTube’s ‘Topic’ channels to provide the highest quality music to the user.
With the help of Stephen Grider's Udemy course, I designed components / states in ES6 to create the site's backbone, and bundled the application with Babel and Webpack.
Then I took off running, querying the search results to return only videos from 'Topic' channels and using jQuery to select/deselect videos as the user chooses. I also learned to organize my CSS with Sass, which greatly improved the source code's readability.
Check out the GitHub repo!
Technologies Used
FRONT END: React JS, Sass/Scss, Bootstrap, HTML5, CSS3
BACK END: ES6 JavaScript, jQuery, Webpack, YouTube Data API
Overview
Besides tackling cool projects to deepen my skill set and show what I could do as YOUR next software developer, I also love DJing! And what better way to combine the two than to create a simple yet effective landing page for my DJ persona, FLMWRK?
I first created a minimalistic footer. Then I converted my self-designed logo into SVGs in Adobe Illustrator, and used CSS animations to trace, fill, and fade them in following a specific order.
Lastly, I needed to emphasize the 'FLM' (flame) in 'FLMWRK', so I set animation delays on certain aspects of my logo in order to emulate a cool "flaming" illusion.
Check out the Github repo!
Technologies Used
FRONT END: HTML5, CSS3
MISC. TOOLS: SVG, Adobe Illustrator CS5
Overview
Objective: Evade Bug swarms to collect Hearts from a Princess at the end of the board.
Alright, I cannot take ALL the credit for this Frogger-esque game!
HUGE thank you to the Udacity Front End Web Developer Nanodegree course for providing the artwork, game engine, and starting code for the Boy and Bug sprites.
Having that foundation allowed me to expand on each aspect of the game using ES6 JavaScript. I first edited the game engine to extend the gameboard. I also figured out how to vary the Bugs' frequency and speed, and recalibrated both their and the Boy's impact radii.
Then I inserted a Princess who moves to a random block after each interaction with the Boy, which causes the Hearts, Score, and amount of Bugs to update. This was the most difficult algorithm to devise because it required multiple JavaScript prototypes to listen to each other.
Finally, I used HTML Local Storage to cache the player's highest score so he/she can try to beat it in the future!
***More game instructions are on the right side of its page.***
Check out the Github repo!
Technologies Used
FRONT END: HTML5, CSS3
BACK END: ES6 JavaScript
Overview
This was a group project for my Web Based Computing course in college. Two teammates and I created an online storefront for gold watches. I was the lead developer.
First, I combined 3 Bootstrap templates to connect the parallax structure, product view modals, and team member section together.
I gave each product view modal a title->image->table->form layout. As my teammates filled product view modals with watch information and images, I searched for ways to spice up the interface. I found a ticking Canvas clock online and superimposed it onto the home page.
A teammate and I implemented a dynamic star-rating and feedback system within HTML forms in the product view modals. I edited the PHP code given by my professor to display this feedback on an internal page. Lastly, we reworked the CSS to establish the site's overall feel.
Technologies Used
FRONT END: HTML5, CSS3, Bootstrap
BACK END: ES6 JavaScript, PHP, MySQL
Overview
This application centered around optimization and scalability. I simulated vigorous Netflix site activity through stress tests that conjured 3,500+ concurrent users. Though there were 3 use cases, my primary focus was to provide another microservice with full video data (15 sections) from my Cassandra database of 10,000,000 unique records – in each request I received!
Using Koa.js in a Node.js runtime environment, I authored all route, endpoint, database, and test files to provide my Artillery stress test endpoints to attack with requests. My primary endpoint was called 'GET content/:id'.
Initially, my functionality could only reach a throughput of 400 requests per second (RPS), and at some points, took 2,600 milliseconds (ms) to complete a request. However, after implementing Redis to cache results and achieve constant time retrieval, I increased my throughput by 400% to 1,300 RPS and reduced my latency by 75% to 630 ms!
I then enlisted a Docker Swarm to deploy my service on Amazon Web Services EC2 Linux Instances. I started with 1 t2.medium instance to hold Cassandra, Redis, and a proxy server, and 1 t2.micro to hold my application's web server.
My deployment goal was to achieve 1,000+ RPS and a latency below 200 ms. Stress testing this setup yielded a throughput of 650 RPS and latency of 722 ms. Not quite there yet.
So, to distribute request load across more nodes, I horizontally scaled my service by adding 2 more t2.micro instances, both of which carried my web server as well. With this new and robust setup, I more than doubled my throughput to 1,400 RPS and cut my latency by 85% to 115 ms!
Check out the GitHub repo!
Technologies Used
DEPLOYMENT: Amazon Web Services, Docker, Docker Swarm
BACK END: Node.js, Koa.js, Cassandra DB, Redis
Best metrics achieved: 1400 RPS, latency of < 125 ms
Overview
Welcome to the social media for programmers!
This application was heavily inspired by Facebook's functionalities, look, and feel.
I led the development of Rebasebook in a team with 3 other engineers, creating the initial scaffolding, authoring several key React components, implementing React Router, editing most styles, and working with fellow engineers on their components' CSS.
I architected the CreatePost, Post, and PostList components, which were reusable throughout the application – mainly within the Feed and Profile components.
The biggest challenge? The Liking and Unliking functionality, including showing which users have already Liked a Post. Of the 10+ database and React methods that I wrote, the ones concerning Likes were the most complicated because of their queries' nested JOINs.
Another difficulty was rendering different Profiles upon URL changes. I solved this by incorporating a React lifecycle method called componentWillReceiveProps, in which I detected changes in URL parameters and pushed them to a React Router redirect function to render a new Profile.
Despite the bumps, my team and I were able to piece together an amazingly accurate Facebook replica!
Check out the GitHub repo!
Technologies Used
FRONT END: React JS, React Router, CSS, HTML
BACK END: PostgreSQL, Express.js
Overview
Tired of ads and other irrelevant aspects on ticket purchasing websites?
Ticketfaster is a ticket purchasing platform that finds you exactly what you are looking for: event tickets, faster!
I architected the front end portion with React, and powered the application with Ticketmaster's API and a back end of Sequelize ORM (in MySQL dialect) and Express.js.
The biggest challenge that I faced while developing Ticketfaster was enabling components to re-render with new data within the same page.
I accomplished that by adding multi-layer callback functions that set component states to new data, thereby re-rendering them as desired.
Check out the GitHub repo!
Technologies Used
FRONT END: React JS, CSS, HTML
BACK END: Sequelize ORM, Express.js, Ticketmaster API
Overview
My engineering team and I inherited a Reddit-esque topic sharing platform from another team. This version of Toppit utilized React Router and MongoDB, and offered the following functionalities: Passport Authentication, Login, Sign Up, Create Topic, and Upvote.
To further our understanding of state management and challenge ourselves with new concepts, we collaborated to refactor the application to React Redux, modularize it into inner pages called Subtoppits (like Subreddits), add a Chat window, and implement nested commenting.
I led the Redux refactoring and tackled the nested commenting functionality.
My biggest challenge was undoubtedly getting a nested comment to even show up, because it involved recursive React components and threaded MongoDB queries. Though my threaded MongoDB query function worked, I encountered many 'Maximum Call Stack Exceeded' errors from React.
I finally accomplished the feat by adding detailed Axios GET requests in componentDidMount and utilizing Promise.all to consolidate all data for new Comments and store that in the global store. This way, I was able to pull down the desired state to populate a nested Comment component instance.
Check out the GitHub repo!
Technologies Used
FRONT END: React JS, React Redux, React Router, CSS, HTML
BACK END: MongoDB, Express.js, Passport for Google Auth & GitHub Auth