× Home My Portfolio Hire Me

Dev Blog

Hello, World!

Tuesday, 17 March 2026: Neocities

Many, many things happened in the span of five months. But before that, this website is now live on Neocities!

Putting this website live on a static webhost such as Neocities is a good motivator in order to tidy up my website a little, and maybe work on more projects too.

I have a few goals for this website, first off:

  • Embedded PDF viewers appear to be broken. I'll have to fix this or find a work around.
  • The fading in and out dates on the left look very cool, but years are better off organised in their own pages.
  • The portfolio page needs an update. I do have projects to show off. The rest of the tiles need to be clearly marked 'soon' or something.
  • Many, many other sections such as my personal diary/blog, interests, etc. Despite how everything looks, this is not meant to be a professional webpage!

Other than that, I've been incredibly busy and completely obsessed over reading Computer Systems: A Programmer's Perspective. It's a systems programming book, and it goes very, very low level. I have been having a good time learning so much about assembly and how computers work. I ought to write some blog posts about the things I learned from it too! Things like why a switch statement is faster than if/else... And what unions are, and why the size of structs can be bigger than the members totaled together.

I'm excited to see what I can do here!

Sunday, 2 November 2025: The End of CS50X

And I've done it! I have finished my CS50x Final Project. I ran into a bunch of difficulty when it came to the elevator logic system. The logic (at the time), was as follows:

  • Lift1 is at floor 1
  • Top floor (floor 4) presses down on their level
  • Lift1 goes up
  • Someone else on floor 2 presses down on their level too
  • Lift1 either stops on level 2 first and then ignores level 4, or deals with both
  • The free Lift2 that's also on floor 1 doesn't do anything

To fix it, I went back to the drawing board and re-wrote how I wanted the elevator to behave step-by-step. A decision-tree flow chart helped immensely. Here it is:


Thursday, 23 October 2025: Week 10 (Final Project) of CS50X

It has been roughly a week since I started my final project. I decided to create a modular elevator simulator. I figured it'd be quite fun figuring out the logic and algorithm that makes elevators tick. So let's talk about how I've taken a small crack into the problem.

I decided to go with what was familiar. A flask app with a python backend, and a HTML, CSS and Javascript frontend. I had initially thought of creating the simulator as an executable with a GUI. But low level Qt is far too big a skill cap for me to reasonably cover right now. Let alone the fact that I don't even have a proof of concept.

The structure of my web application is as follows:
  • app.py
  • elevators.db - An sqlite database that holds the number of elevators and floors.
  • index.html - The main webpage where the elevators reside.
  • settings.html - A settings page for the user to change the number of elevators and/or floors.
  • style.css
  • script.js - A Javascript script that handles the animation and click events. The main backbone for the program.

The very first thing I implemented was the database and the elevators. I had a simple for loop in jinja to repeat the number of elevators (and elevators shafts) as per the counts in the database. There was a lot of finnicking about in the CSS file and fighting bootstrap's defaults to get the elevators, buttons and whatnot to be completely even.

I found out about the canvas API that can be flexibly drawn with Javascript. canvas elements themselves represent a bitmap area on a page, but not what's in that area. For that, ctx = canvas.getContext('2d') is needed. ctx would be an object that you can call other methods to update the bitmap inside of canvas.

I realised that for adding additional elements to the canvas, it was using the methods on the same context object. I continued to do the same for the elevator doors. Underneath the doors is actually a layer of a different colour. This way I can animate the doors sliding open and close later on when needed. There's a lot of copy paste going on in the code, especially since most of the drawn images are solid filled rectangles. I ended up creating a helper function to minimise repetition.


// Helper function for solid rectangular fills
function createRect(e, x, y, width, height, color) {
    e.ctx.strokeRect(x, y, width, height);
    e.ctx.fillStyle = color;
    e.ctx.fillRect(x, y, width, height);
}

Friday, 17 October 2025: Week 9 (Flask) of CS50X

Today marks the day I am completely done with all the given problem sets of CS50X, barring the final project.

I've learned a lot from the previous few months I've been at this. I can't believe it's been four months since I first started! My official start date was on 16th July 2025, time really flies when you're hard at work. Speaking of which, I still have not uploaded Week 0's 'Starting from Scratch'. Oops. It's a bit funny that I'll only be recording my 'introduction' video then, better late than never!

Looking back at the progress I've made is astounding. I already knew a little bit on how to code before this course (beginner tier still), but having theory by my side changed the way I approached problems and solutions. My favourite weeks were every single one on C. I loved data structures and algorithms and memory. I wish I had made notes and saved them while from Week 1 to Week 3, but alas I only started writing on paper by Week 4. I skipped Week 9 since there was not much planning required for the problem set. Honestly, the difficulty in CS50X really took the nosedive the moment we hit Week 6's python. I miss the challenging logic problems.


Sunday, 5 October 2025: Week 8 (HTML, CSS, Javascript) of CS50X

I am officially almost done with week 8 of CS50X. I decided to take making this website as seriously as possible. It suffices as my actual personal portfolio website that I can showcase to prospective employers. The version right now is very rudimentary, with many things that will be improved on or changed before it'll finally be published. At the moment, everything on this dev blog is mainly placeholder text. After all, they all read more akin to diary entries than proper dev blogs.

To thread a bit more on the technical side of this exercise, I have always found clean and simple websites pleasing and easy to use. I decided to keep this theme going with my own website. I've managed to implement:

  • A basic homepage
  • The dev blog
  • The portfolio page
  • The contact me (hire me) page

The homepage is incredibly simple right now, with no javascript implemented whatsoever. In the future, I'm hoping to implement a scroll jack on it, when you scroll, it'll animate into my education timeline.

The dev blog is almost complete. It has a nice little javascript scrollbar for years on the left. I still think it can be made a little more fancy, but I'll leave that for after I am done with the course. I may have to redo the entire page to act as a landing page for different blog entries than one gigantic page that hosts years of work.

The portfolio page is a simple grid with a javascript animation for highlighting each card. Everything is a placeholder. In the final edition, each card will be linked to a whole page of its own, describing the project and linking the repo on Github. I uhm... need more projects to fill this. Aha.

Contact me (or hire me) is perfect the way it looks right now. Incredibly simple, links my resume as well. I'm not sure what else a contact me page needs.

Also, the side nav bar really needs to be fixed. The text runs each time it is opened and closed. That's not good at all. I'll fix it in the future. (EDIT: Fixed. Just a css property of white-space: nowrap does the trick.)

Optional ideas I have:

  • Javascript animated background in every page.
  • Javascript chrome dinosaur game running in the background of the homepage.
  • Dark/light mode CSS toggle

I feel a little miffed that my progress on C is on pause while I finish the rest of CS50X. But I know I can go back to it and then begin working on applications in C++ after I'm done. But overall, I'm pretty excited that I'm this close to the end of the finish line.


Saturday, 19 July 2025: Week 4 (Memory) of CS50X

I am currently on Week 4 of CS50x. Week 0 to week 2 was relatively manageable and even easy, though the difficulty truly began to ramp up by week 3. Week 4 is no exception, for the first time I'm looking incredibly deeply into memory in C.

It makes me wonder what I had even been learning during my time in school. If you asked me, I honestly don't remember most of it. It's also tough to know if I'm learning the right things - and if I'm trying to absorb information too quickly.

I have been taking a more active approach with looking up any new functions or keywords I encounter, and making notes of them. It's pretty overwhelming, but I hope I am on the right track. Whilst learning is always a great thing, I am still wondering how to apply my knowledge. What I wonder is if I'm even able to explain what's happening deeply in C itself.

I realised that I am able to explain rather well what's going on for the regular keywords (variable declarations, if/else, loops, etc) and functions. I am making decent progress.

Today I hit a roadblock with: RGBTRIPLE (*image)[width] = calloc(height, width * sizeof(RGBTRIPLE));

I don't understand why the image array was declared like this. After looking around quite a bit, I've found out that this has to do with complex declarations I'll have to look into it eventually. And it should be inside The C Programming Language by K&R book that I've ordered. It should also be in Expert C Programming: Deep C Secrets. cdecl.org is a website that can translate complex declarations into simple English.