Ian Lai
  • About
  • Contact

GitLab Runner on Docker

· 3 min. read

Recently at Courtsite, we launched a single project-specific GitLab Runner on Docker using Hetzner Cloud for approximately $7 / month. We originally launched it on our production Kubernetes cluster, but it had an immediate adverse impact on our production services. We reexamined our solutions, and opted for a dedicated compute instance as it was a simpler, and more cost-effective (both monetarily, and infrastructure) solution with the least risks. The setup process was far simpler than what was (and probably still is) documented at GitLab’s website.

Continue Reading »

Introducing: HistoryX for Chrome

· 6 min. read

HistoryX for Chrome

I am excited to introduce, Historyχ (v2.4.0), an open source Chrome extension that I have been sporadically working on this past week. In the project manifest (and on GitHub), it is described as an "extension to enhance your browsing history experience". But more specifically, it is an extension which, when enabled, will replace your existing history page with one that is leaner, and expanded with functionality.

It is ideal for regular, and power users alike. The former can take advantage of the improved interface, and smooth materialesque browsing experience, while the latter can take advantage of the search, sort, group, and filter features.


Install via Chrome Web Store

You can install v2.4.0 in the Chrome Web Store now or download the source, and run it in developer mode.

Prepare() in Beego Web Framework

· 3 min. read

Prepare() is a method exposed by beego.Controller{} and it is executed prior to the method corresponding to your route and HTTP request (the action). It is not a filter and thus, it can easily be extended (much like the Get() and Post() method) for a variety of functions such as:

  • Session control: ACL-based authentication and authorization
  • Globals: Setting [ REUSABLE ] defaults for your template (stylesheets, JavaScipts, variables...)

Passwords. You're Doing It Wrong

· 11 min. read

I seem to be having difficulties getting into the mood to revise for an exam tomorrow. It is what I should be doing, but what I really want to be doing is to code all day. Unfortunately, as it is exam season I have decided to self-impose a ban on coding until I have completed all my exams. Fortunately, I do not recall banning myself from making a blog post so here we go.

If you are running a website that requires a user-password-based authentication system there is a high chance you are probably handling the password poorly (at least in my books). Indeed, several e-commerce and e-banking websites are doing it wrong too. As a disclaimer, I am neither an expert in web security nor am I one in user experience. The following post is not targeted towards a layperson. I am merely synthesising a list of bad questionable password practices by web developers and they are based on personal observations (albeit, with some support from the web community).

On Long Showers & Deep Thoughts

· 4 min. read

The following post is a x-post from my [private] Tumblr. I think this is the only post from my Tumblr worthy of being included here (available for the public, if anyone is even interested; and search engines). The post was in response to (or rather, just building upon) an answer provided by Hank Green to a question posed by another Tumblr user.


lukemichael5 asked:

Hank, Is there any psychological or biological reason for why people stand in the shower for a long time when thinking? Does the running water provide any mental relief? Could there be an evolutionary reason why? Have I asked too many questions for you to answer? (Probably)

edwardspoonhands answered:

I honestly think it’s because every other moment of the day is filled up with THING TO DO! ADVERTISEMENT! SMARTPHONE! STIMULUS! GET IN THE CAR! DO THING! STOP STOPPING! START STARTING! NO THINKY! THINKY BAD! GO GO SPEND WATCH DO MOVE GO! The shower is like, the last place where you can feel ok about just standing there.

Older posts →