I'm an experienced computer programmer that enjoys writing code for games, web applications, and other things that interest me. I have great experience with web development but have used many different tools and languages over the years of my career.
I love problem-solving and completing puzzles so working on interesting projects is one of my favorite hobbies. Feel free to take a look below to learn more about me and what I've worked on.
I am currently the CTO of the Korean startup SPOWEEK. SPOWEEK is a sports event planning and management service where event planners can accept user applications, manage their teams, and also manage the scores and results for the event.
Allure coffee is a site I have worked on in my free time for a client's coffee shop. The site is responsive and looks great on any device. I created a CMS to allow the owner to easily manage all of the content on the
site such
as the menu, front page, and images.
The site also uses Naver Store's API to pull items from his Naver store so as users can browse coffees without having to leave the website.
I used the Laravel framework to create this site (just like this one).
jobs.ac.uk
Working at jobs.ac.uk I was responsible for both Front end and back end development. Working in a small team was a great experience that allowed me to work closely with more senior developers and learn as well as put
forwards
my own ideas and suggestions. Version control, code review, and using weekly sprint cycles were all used to make sure everything ran smoothly. I helped update the site to be more responsive and modern in its
appearance.
IGGY was a website aimed to deliver content to bright students who enjoyed learning. I helped out a few months managing their website myself while they sought a new permanent developer. While there I helped create some
useful
tools and materials to go on the site including a heavily requested notification system.
Unfortunately, the company has since closed but you can find out more about it here
Game Development
Godot
Romulus
Romulus was the first godot project I worked on.
Originally I was planning to make it into a Roman city builder similar to Caesar 3 butin the end I was just learning the engine so just created a procedural terrain generator.
The generator is fairly simple and generates a height map using textures of gaussian noise with various strengths and frequencies which are then layered.
The height map then takes this information to generate a 3D mesh of the world using Godot's 'SurfaceTool'.
Then, trees are added using another noise texture to represent the likelihood of a tree in a given area and then this is used in combination with the height map to determine the final placement of trees. It generally means trees only spawn at certain heights on the map.
Finally I created a simple shader for the terrain that blends between different textures for the land depending on its height.
2D Farming Game
My second godot project was to make a simple 2D farming game.
For this game I again with a procedulary generated map. This method also uses a noise teture to generate where there is water, grass, dirt, trees, etc.
For this project I focused a lot more on learning to use shaders and particles in Godot.
I was able to create a nice reflection effect in the water and also dynamically generate puddles and snow depending on the weather.
The game also features a simple weather and calendar system as well as an easy to use music player.
Monogame
Pirate Platformer
My previous two projects were mostly just figuring out world generation and learning the tools that Godot had to offer.
However I wanted to create a proper game with an objective.
So, I decided to make a simple platformer.
I didn't want to play around with creating/modifying assets this time so I used the Treasure Hunters pack from Pixel Frog
I also wanted to have a better understanding and more control of how game engines typically work so I opted to use Monogame this time rather than Godot.
This was also a great oppurtunity to improve my C# skills.
The tools I used were: Visual Studio Code, Asesprite, and Tiled.
First I set up the project and created a simple import script to add all my assets from asesprite.
I prefered this method to using Monogame's content editor as I found their content editor clunky and buggy to use.
I could also setup Tiled and export the xml files for the levels I made which made quickly creating and editing levels incredibly easy.
The game is a simple platformer where you can run around, jump and fight crab enemies.
p5js
p5js is a great library for easily rendering 2d or 3d scenes onto a HTML canvas. I enjoy using it to create fun little projects. I've also used it in conjuction with ml5js which is a machine learning library built upon
Tensor Flow.
You can click here to view all my p5js projects on github.
Below please find a few of my p5js projects from my github. You can click the title of any of them to view them on github.
# [Fireworks](https://github.com/Natf/p5js/tree/master/Fireworks)
Create pretty fireworks with your mouse!
The user can click within the window which will create a small firework that shoots up and then creates a small explosion of color.
I made this just for a bit of fun.
![Fireworks running](https://raw.githubusercontent.com/Natf/p5js/master/Fireworks/fireworks.gif)
# [Conway's Game of Life created using p5js](https://github.com/Natf/p5js/tree/master/Game_of_Life)
A basic implementation of John Conway's game of life.
The app will generate a grid of cells that are randomly dead or alive.
Each cell stores a list of all of its neighbors. Each draw cycle each cell will decide to be in a dead or alive state using Conway's rules.
1. Any live cell with two or three live neighbours survives.
2. Any dead cell with three live neighbours becomes a live cell.
3. All other live cells die in the next generation. Similarly, all other dead cells stay dead.
![Preview of game of life running](https://raw.githubusercontent.com/Natf/p5js/master/Game_of_Life/gol.gif)
# [Quadtree](https://github.com/Natf/p5js/tree/master/Quad_Tree)
This was a project created by following [The Coding Train's series on Quadtrees](https://www.youtube.com/watch?v=OJxEcs0w_kE).
There will be a number of points placed within the window using random guassian distribution.
Then a quad tree is generated such that no more than four points are within any suqare of the tree.
Then the quadtree is drawn.
Finally a random rectangle within the window is constructed and drawn in green.
It will also find all of the points within the rectangle and draw those in green.
![Image of Quadtree with points highlighted](https://raw.githubusercontent.com/Natf/p5js/master/Quad_Tree/quadtree.png)
# [Falling Sand in p5js](https://github.com/Natf/p5js/tree/master/Sand)
A simple [faling sand game](https://en.wikipedia.org/wiki/Falling-sand_game).
The user can click anywhere in the window to create sand that will fall and then create pleasant looking piles of sand.
![Preview of falling sand game](https://raw.githubusercontent.com/Natf/p5js/master/Sand/falling-sand-small.gif)
The game will create a point for each pixel and then calculate the neighbors for each of these points on setup. When running the game will loop through each point. An active "sand" point will then check if there is a free space below it and move down if there is. It will randomly choose the bottom right or bottom left and try to move there.
From /Sand/MapPoint.js
```javascript
if (this.type === 1) {
if ("bottom" in this.neighbors) {
if(this.neighbors.bottom.type !== 1){
this.neighbors.bottom.setType(1);
this.type = null;
return;
}
}
if (("bottomleft" in this.neighbors) && ("bottomright" in this.neighbors)) {
let leftRight = null;
if (random(2) >=1) {
leftRight = this.neighbors.bottomright;
} else {
leftRight = this.neighbors.bottomleft;
}
if (leftRight.type !== 1) {
leftRight.type = 1;
this.type = null;
return;
}
}
}
```
# [Towers of Hanoi in p5js](https://github.com/Natf/p5js/tree/master/Towers_of_Hanoi)
[Towers of Hanoi](https://en.wikipedia.org/wiki/Tower_of_Hanoi) is a classic puzzle where the user must move the tower from the starting position to a new position.
The tower and it's pieces may only be placed upon the three pegs within the puzzle.
Each of the pieces may only be place on an empty peg or on top of a piece which is larger than itself.
The player may only move one piece at a time and the goal is to generally move the entire tower on to a new peg in the fewest number of moves.
The game was created with goal of implementing the rules and allowing for the number of pieces to be easily changed along with the program running on a mobile device.
Currently it all works fine however in the future a move counter, reset button, and a way of the game to detect when you have successfully completed the puzzle would make great additions.
![Puzzle being solved](https://raw.githubusercontent.com/Natf/p5js/master/Towers_of_Hanoi/towers-hanoi.gif)
Other Projects
Below is a list of other small projects I've worked on either out of interest or to learn new skills.
Image Steganography
I first heard about steganography from youtuber/streamer Thor "Pirate Software" and was just interested about how it worked.
After reading about the topic it seemed very straightforwards and easy to do so I decided to create a small project to try it out myself.
The project takes two input files: a cover image where there the secret image will be hidden inside of and a secret image that we want to hide inside the cover image.
The project works by taking taking the least 2 significant bits for each color channel in the cover image.
This means we get 6 bits of available storage per pixel in the cover image.
Then, the project calculate the total number of bits to required to store the secret image.
If the number of bits required exceeds the number available the script will automatically try and reduce the amount required to store the secret image.
It does this in three main ways:
1. Try and reduce the actual size of the secret image so as there is less data overall
2. Try and compress the image using GZipStream
3. Reduce the number of bits required by not using the full 8 bits for each color channel. It will try 7, then, 6... etc.
The project will keep trying these methods until the image is small enough to store inside the cover image.
Finally the project copies the data into the least significant bits in the cover image and outputs a new image file with all of the data.
You can then use the project to decode the secret image by passing in the encoded image.
All information such as original image size and number of bits stored is saved within the encoded image and there is a number of initial header bits that are reserved to store this information.
Below you can see some images of the images used while testing the project. On the left there are the original cover and secret images. On the right are the encoded and decoded secret images.
No one likes to wait for things to load. One of my main goals when creating anything is to make it fast. Whether that means making something load faster or just work without making your computer sound like a jumbo jet
taking off, I aim to optimize my code to deliver the best user experience.
Maintainability
Code that works well and doesn't break is good. Code that does this and is easy to read and update is amazing! I'm well experienced with tools such as git and believe that your code should be
understood by even the least tech savvy of engineers in order to stand the test of time. I aim to let the comments write themselves by creating clear code.
Learning
In this industry I know that things can change overnight. As such, I'm always trying to stay up to date. Reading blogs, watching seminars, and talking with other engineers are some of the main ways I try to do this. Beyond
just updating my current skills, I'm an avid learner who enjoys picking up and playing with new tools to see how they work.
Communication
Talking is important in any team. However, I know that listening is just as important and sometimes moreso. I love to pitch my own ideas as well as listen to exciting new ones, too. I'm a firm believer that the original idea
is never it's best iteration and communication is key to creating the best product.
Contact Me
Please use the form below to contact me about work or if you have any questions!