FFT: Calm down and don't do stupid things
Saturday, September 16, 2017

Reverse insomnia: when you wake up too early but can't go back to sleep

This FFT is inspired by real life and articles I've read over the years about how you shouldn't make decisions when you're not in the right state of mind (confusion, anger, sadness). I agree, and I'm going to try explaining it in a quantifiable manner.

As the saying goes,
You can't control what happens to you, but you can control how you react to them.
There have been uncountable situations where I've done or said something I've regretted after thinking about it moments, days, weeks later. I could've done better if I just took my time to calm down and think about it. Now, before everyone starts trying to over-rationalize everything that happens to them, I'll like to add that your choices made under duress isn't necessarily wrong. The problem is that we can never replay that exact moment and how we feel at that point in time.

A simple example would be when your life is threatened by some external force, say, a robbery where the assailant has a knife. In this example, you happen to own a gun and you're in a position where you can either shoot him, make a warning shot or run. It would not be surprising that a good number of people would choose to shoot him instead of giving a warning shot, not because some people just wants to shoot people; but because they're not in the right state of mind to make the rational choice of giving a warning shot.
(I understand the caveats where the victim is well-trained like a soldier, but their mental state is different from a normal person so the point still stands)

If you belong to the group who shot the robber, would you have regretted your actions if he died? Would you think that you're wrong?

It depends.

Whatever you feel about the goodness/evilness of your actions, it's pretty much universal that if you have had more time, you could've made a choice where you would feel better in the long run. Feelings don't last forever, when all that adrenaline/serotonin/dopamine finally balances out, you're faced with the stark truth of your actions. Which brings me to this graph.

x-axis: time / y-axis: satisfaction

Disclaimer: there's absolutely no statistical evidence backing this up, just plotting how I feel about it

The red line starts off with a really high satisfaction level (point 0), and it's usually the thing we end up doing; because it seemed like a really great idea at that point of time. Compared to the blue option at point 0, it feels leaps and bounds better. But the red line dips dramatically after the initial moments as you start wondering, "why did I do this?", "what if?", "maybe I should've tried something else". It will still feel like a great idea while you're still being fueled by emotions; until it finally hits you at that magical break-even point.

It was at this moment that you realize you fucked up.

The solution is simple, when you're not in a clear state of mind, if you can afford to, hold off on any decision making. Sounds simple and common sense, but applying it in real life is a difficult practice of restraint. Being aware that you're not calm is probably the first step.

Unfortunately, even when I'm aware of my state of mind, I'm not able to always make the best choices.

to err is human
(to forgive, divine)

The way I keep myself moving forward and not be bogged down by the countless of regrets that may arise from some bad choices is simply to write my thoughts down. Put it down in a tangible form that you can experience again, to feel the similar emotions you've felt. In my case, >90% of time I still feel like I have made the right call.
(p.s. the rightness of your choices depends on what you value, will probably write about it some other day)

And life goes on.


Random stuff I'm afraid of
Tuesday, August 22, 2017

When I close my eyes because soap got in while bathing, my hands will be searching for the tap to wash the soap way. Sometimes I'm afraid that instead of a tap, I'll touch another hand.

AWS Solutions Architect course
Saturday, August 19, 2017

Woah, the past week was insane and I just felt like I needed to rant about it.

Attended the Amazon Web Services Solutions Architect course because it's what I chose as an external certification (prerequisite for graduating from my course). Of course, it doesn't have to be this specific course but it's what I've always been interested in so it's perfect.

However the amount of content is insane, >200 slides each day and an average of 2 labs per day. Starting from 9am to 5pm everyday. Thankfully the lunch provided is actually decent and there are 2 small breaks between the sessions.

Fortunately, as this was my area of interest, I've had exposure to most of the concepts that they had to offer. The only tough part is translating all those concepts into the actual services that they provide. Many of the things that they talked about is similar to the things I've done in this post. Or it was something I learnt during my poly days, just in a more advanced form.

Studying about these made me think hard about what kind of job I want to do in the future. Currently I'm moving towards the (web) developer side of things; which is really high in demand. But it's definitely not as cool as being the one to architect a highly available system that is able to survive failures across multiple nodes. So many things to consider with the internship coming up in a couple of months, hope I can figure something out.

p.s. bought my dream keyboard, a new speaker system, extra storage


Nate Ruess: Great Big Storm
Friday, August 04, 2017

Because we’re
Holding our own in a great big storm
It’s a great big storm and we’re holding our own
Holding our own in a great big storm
It’s a great big storm and we’re holding our own

[Verse 1]
I’ve been lost in this maze
Losing love, losing friends
Losing faith in chemicals
Afraid one day you’ll find me
Asleep above the stars
I watch my mother cry
Father Time is catching up
I keep the phone by my side
Afraid she’ll wake me up to catch the next flight
In time to say goodbye

But sometimes I fall asleep at night
To the TV light and it sings
Oh ooo whoa oh
One day the sun will break into the room

Because we’re holding our own in a great big storm
And though we’re cutting it close
We won’t let go
Oh no I can’t believe
Everything falling down around me
But now we’re holding our own
And won’t let go
Holding our own in a great big storm
It’s a great big storm and we’re holding our own
Holding our own in a great big storm
It’s a great big storm and we’re holding our own

[Verse 2]
Broken hearts broken homes and broken bones
Secret love let me go
You know I gotta find my own way
Through mistakes that I can’t change
Because there’s beauty in every sin
Every single black eye
Has some blue like the moon just before the sun shines
No I don’t believe in all the things that they preach

But sometimes I fall asleep at night
And I just know you’re smiling at me
Oh ooo whoa oh
One day I’m gonna make this up to you

Because we’re holding our own in a great big storm
And though we’re cutting it close
We won’t let go
Oh no I can’t believe
Everything falling down around me
But now we’re holding our own
And won’t let go
Holding our own in a great big storm
It’s a great big storm and we’re holding our own
Holding our own in a great big storm
It’s a great big storm and we’re holding our own

I can’t stand myself
And all the curse words that fall from my mouth
I can’t stand myself
Or my legs as they run from the ones here to help
But I just woke up with you next to me
Some new air to breathe
And a belief that it’s all gonna be alright
I can’t stand myself
But it’s high time that we gave it a try
And I think I’m gonna finally give myself a new try

Because we’re holding our own in a great big storm
And though we’re cutting it close
We won’t let go
Oh no I can’t believe
Everything falling down around me
But now we’re holding our own
And won’t let go
No we won't let go
No we won't let go, oh no


How a programmer experiences heart break
Thursday, June 22, 2017

It's like having a vital piece of functioning code ripped out of my program suddenly.

Analogy time.

I started out as a normal program with code required to function and perform day to day tasks. One day, I was introduced a small piece of new code, it became part of me; but it wasn't doing any critical function yet.

Over time, more and more functions and code are added to that block of code. My program started relying heavily on it and it made me run faster, tasks was shared with it and generally all was good. But no program is bug free, so I spent a lot of time debugging the errors and working out the kinks. But some bugs never really went away, hotfix patches would resolve those bugs, only for them to surface again after an arbitrary amount of time. It was a lot of work to keep up with the patch work.

After many rounds of careful analysis, it was decided that the code needed to be removed.

Even though the prep work has been done, deleting a huge block of code that has been supporting the program is a painful move. Unsurprisingly, the program crashed, and it crashed hard. Turns out that block of code was doing a lot more than the comments specified. Vital operations were disrupted and errors were throwing up everywhere, constant stack/heap overflows.

The best course of action is to start going through all of the error messages and addressing them one by one, which I did. Slowly but surely, I started writing out little functions that handles all the memory leaks. But they are pretty much just

emotions > /dev/null 2>&1 ?

In summary, the program still works. It's a little confused on what files to import, wishing that the missing block had adopted an adapter pattern. But

It'll continue to run, just a little different from now.

Home Server May 2017
Tuesday, May 02, 2017

It has been no secret that I've been working on a few personal projects of my own. My friends know how fucking excited I've been getting lately when I hit my milestones.

Since I've been repeating myself a lot lately and it's quite hard to explain quickly without the aid of diagrams, I created some diagrams.

Firstly, I'm using an open source solution called Docker for hosting my services and it's amazing and I urge you devs out there to check it out. In simple terms, it's a way of virtualizing services rather than the OS itself. The benefits are that there is less overhead, starting and stopping services are just a few simple commands away and you can duplicate as many services as you want across a cluster(swarm).

Right now I have a few services that are always turned on.

  1. Automated torrent downloading
  2. Google Drive-like service for files
  3. Internal DNS service
  4. Service manager for docker containers
  5. VPN service

I also have some development sites that runs on and off based on changing needs (eg. web, database service).

Secondly, I've been reading up quite a lot about reverse proxy and I've been wanting to set them up for months/years(?!) but just haven't had the time to get to them. In simple terms, a reverse proxy is kind of like a seamless way of redirecting users to the correct server based on the URL. It could be used for load balancing, or in my case, used as a transparent way for end users to access the services*.
* | why not DNS? Because DNS only resolves IP but cannot resolve port numbers. My services are only exposed by port and are (mostly) on a single machine so I had to do it this way.

However, I still have a DNS service running because I need to be able to resolve URLs to a physical machine. (no messing with host files anymore)

An overview of how it works is shown in the diagram below.

--- update ---
Made a mistake in the diagram, when accessing data.service it goes directly to the DNS service then to the NAS. Does not require nginx to resolve at all.

When the reverse proxy server (aka. nginx) is hit with a URL query, eg. (http://torrent.service), it looks in the configuration where to redirect the user to seamlessly in the background. The seamlessness/transparency is a very powerful tool. I will explain it in more detail after illustrating how the general flow of logic of this setup.

* | client machine must be configured to use my DNS server (forced over VPN)

When user visits any site ending with .service or .dev, the DNS service will return the address of the services. Because most of the services are hosted on one physical machine, the nginx (reverse proxy) service resolves the incoming request to the corresponding service/dev.
* | if user visits another site eg. google.com, it will be resolved normally to the internet (albeit with a very slight latency overhead)

Going back to why nginx (reverse proxy) is a powerful tool, it's really the transparency that makes it awesome. When the user visits http://torrent.service, the DNS resolves it to the machine (eg.*). The nginx service listening on port 80 takes that query and forward it to the service (eg. However, to the end user, the URL never changes, the visible IP never changes, it all works seamlessly in the background.
* | IP and port number separated by semi-colon

eg. You navigate to the "downloads" page. The visible URL changes to http://torrent.service/downloads, it looks like it's to the system, but it's actually It all takes place automagically.

It's great when everything comes together but I definitely had my fair share of problems when setting it up and have to combine multiple sources of answers online before I could get my services running the way that I want them to. There is still 2 amazing projects that I'm looking to tackle before school starts proper, my fingers are crossed.

I'll like to clarify that when I say service, it may be made up of one or more services. For example http://torrent.service is made up of Transmission (the downloader service), and Flexget (the background service that searches for latest episode).

To end it off, everything is hosted either on my secondhand Thinkpad X200 (released in 2008), or on a Raspberry Pi 3. So if there's anyone who's interested in sponsoring me for anything (I can even make a video about it), contact me.

Labels: , , ,

End of Year 2 Trimester 2
Friday, April 21, 2017

I barely survived the previous trimester.

Everyone was slogging day in day out and my gaming hours plummeted like United Airline's stock. [link] My grades weren't terrible but my feelings were. Cramming knowledge in the day, Skype meetings at night; that's the routine for most of my friends.

The first couple of weeks was fine, but then it suddenly escalated and we didn't have a breather for approximately 9 weeks *insert too damn high meme*. Even though it was tough, I'm glad to say that we did manage to build some decent software at least.

1. Android application that detects exercise
2. Crowd sourced story writing web platform
3. Multi-cast chat application (invite/leave/kick/register/switch)
4. Hadoop Map Reduce Twitter analyzer

Shot and edited 2 videos in the process of doing all those.

1. Android showcase [link]
2. Foley (sound design self-learning mod*)
*it's about pedagogy and I'm too lazy to explain it

Apart from the school work itself, I've also gotten more familiar with how Docker works and can host simple web applications on my server (which I now realize I totally forgot to write about).

Also managed to pick up a part time job for the school; can't really say much about it but at least there's a small income for it.

I closed my eyes and thought hard about the past 3-4 months, thinking if there's any interesting/funny story that I could share and write down for me to remember. But I came up with nothing. It was just really tiring throughout, dealing with people, bugs, and deadlines. I felt like I died a little on the inside dealing with the people.

Not all teammates are bad of course, but the ones that are; they're  freakin' terrible. Sometimes it's just easier to do it alone, or with one other friend that you can trust to have your back.

Moving on, my exams ended 2 days ago.
I've done pretty much nothing but play games for the past 2 days and I think I'm getting a little bored with the games. Going to work on my personal project tomorrow and hope that I can get it working.

Oh and tech stuffs that I've gotten myself in the past couple of months!

1. Cooler Master MasterKeys L Pro White (brown switches)
2. Cooler Master TKL wrist rest
3. Withings Activité Pop watch (activity tracker)
4. Clear screen protector for MBP 13" 2015
5. Braided USB cable

I guess I should work towards being more thrifty in the coming months. (unless there's an insane sale going on)

The Withings Activité Pop retails at $259 and there was an online sale for $99, couldn't miss such a deal. But the high quality version went on sale the next week for ~$126 and I totally regretted getting the lower quality one. Well, you win some you lose some.

Alright this has been a really boring post, more note to myself honestly. Till the next time.

Labels: , ,