The documentation of
bluebird is so much better than
Q - the library which I’m currently using.
nodejs is even better: it can convert an existing promise-unaware API to promise-returning API which is so awesome. Thid feature works with most popular libraries (which use error as first arg (as they all should)).
So I upgraded my VPS
I have little to none demand for web server’s power since my blog is static, plus a couple of small web apps I test on the VPS now and then. Recently, my interests shifted to Ionic framework, nodejs, mongodb and angularjs. I had quite a few ideas for pet projects, mostly for the purpose of learning. I decided to upgrade my VPS to a bit better plan - 256MB of RAM. Still a tiny machine but should be enough for what I have in mind.
I’ve also did a re-installation of the OS as I switch from 64bit Ubuntu 14.04 image to 32bit version. I have no plan to scale this VPS for anything serious so 32bit is good plenty for the purpose, plus all the additional bit of memory.
Migration process is rather painless. I just had to click
Re-install OS, setup new user account,
apt-get a couple of libs (rvm, ruby, jekyll), setup git server and then
git push my blog. Everything is back to normal now I suppose.
Scaling node.js application with cluster
node.js’s single thread default architecture prevents it from utilizing multi-cores machines. When you create a new
node.js application in WebStorm for example, this is what you get:
This code snippet will create a simple HTTP server on the given port, executed in a single-threaded process; doesn’t matter how many cores your machine has. This is where
cluster comes in.
cluster allows you to create multiple processes, which can share the same port. Ideally, you should spawn only 1 thread per core.
That’s how you do it on a single machine. With a few more lines of code, you application can now utilize better modern hardware. If this isn’t enough and you need to scale across machines, take a look at load balancing using
nginx. I will cover that in another post.
Using AngularJS with jekyll
This blog is running on
jekyll; and since I’m learning AngularJS, I want to try AngularJS on my blog as well. The problem is both are using double curly braces syntax,
jekyll will consume it first when generating and AngularJS will be left with nothing.
In order to use AngularJS with
jekyll, we have to instruct AngularJS to use different start and end symbol by using
Using it with the new symbol
That’s it. Enjoy hacking your blog.
P/S: I didn’t push any change to this blog. I’m just playing AngularJS and
A fork of
node.js with faster release cycle and open source governance.
io.js v1.0.0 also marks the return of Ben Noordhuis with third most commits in
node.js as a technical commitee.
For those who don’t know about Ben Noordhuis’s story1. Here’s a short version:
Ben Noorddhuis was a major contributor to NodeJS and a voluntee
Ben Noorddhuis rejected a pull request2 that would have made pronoun in the document gender neutral. The documents were already grammatically correct, but whoever made the pull request had a political preference for using a non masculine pronoun. Ben rightly saw this a trivial change and reject.
Issacsaccepted the PR and Ben attempted to revert3 it.
Joyent put an embarrassing and immature blog post which essentially called Ben an “asshole” and said that if he was an employee he’d be fired.
More related links:
A minimal iTerm2 setup
My current machine is a Macbook Air 11 inches so screen estate is a luxury thing. I’ve always try to maximise the use of my screen by things like moving Dock to the side (and auto hide, delay set to 0), making use of multiple Mission Control desktop,etc…
It always strikes me that even though iTerm2 already supports tmux out-out-the-box, it still has all that title bar and tab bar. They are basically useless to me. So why not getting rid of it? iTerm2 is open-source anyway.
You just have to
clone the repo and edit a bit to get rid of the titlebar.
Search for method
styleMaskForWindowType and in the
default case, remove
Rebuild and enjoy the new sexy, minimal look of iTerm2.
Very easy to use for quick prototyping.
AngularJS diary - Day 4
ng-model of one controller from another
$broadcast to broadcast a message (or
$emit) and put listener on that message on receiver.
When to use
$broadcast and when to use
$broadcast— dispatches the event downwards to all child scopes,
$emit— dispatches the event upwards through the scope hierarchy.
In case there is no parent-child relation, use
##Making AJAX call the right way
providers for that. It’s advised not to make AJAX calls within the controller.
##Services vs Factory
In most cases, both can be used interchangably.
When you’re using
service, Angular instantiates it behind the scenes with the
new keyword. Because of that, you’ll add properties to
this and the service will return
this. When you pass the service into your controller, those properties on
this will now be available on that controller through your service. This is why
service is most suitable for generic utilities.
factory is useful for for cases like when you don’t want to expose private fields but via public methods instead. Just like a regular class object.
The next bullet on my resume: AngularJS
Of those two, AngularJS is obviously the more popular choice. There’re many frameworks built on AngularJS; thousands of questions on StackOverflow; lots of open-source projects base on AngularJS on GitHub. There are many great frameworks out there but few has gained so much developer mindshare like AngularJS. There’s clearly something about this framework. I mean, take a look at the search trend of AngularJS vs other frameworks.
So I decided to take sometimes to evaluate AngularJS first to see what’s all the hypes are about. I downloaded AngularJS; played around; read documents, tutorials and top questions on StackOverflow.
I don’t know much about AngularJS yet but I will start blogging about it as I learn here. These are the few things that I’ve learnt about AngularJS in the last two days.
AngularJS is easy to start with
The thing about AngularJS is it’s very intutive, simple to start and easy to understand if you’re already familiar with MVx pattern. It has a very high WOW factor (data binding for one) at the beginning if you’re coming from, say jQuery. Seeing things like this make people want to explore the framework further. This is one of the main reason that make AngularJS popular, I think.
Single source of truth
Single Source Of Truth (SSOT) refers to the practice of structuring information models and associated schemata such that every data element is stored exactly once
Suppose that you have a toggle button, if you were to use jQuery, you will have to add an
active CSS class to style when it’s toggle on; remove it and re-add
inactive class when it’s off. If there’s data dependent on it, you will have to manipulate the DOM yourself. Crazy right! The problem is that it may go out of sync (toggle is on but css class is still
inactive for example). Plus, the code will be much longer and unnescessary complicated.
AngularJS seperates data from its presentation and offer you data binding. You create a view, bound a field to an attribute in your model. Your data model is now single source of truth. You don’t have to manipulate with the DOM yourself but dealing with the model instead.
There’s no base model/object in Angular. Whatever you put inside
$scope is your model. This is a bit weird coming from OOP language. I wonder how would we share the model outside of the
$scope. The data is stucked between your template and
$scope. So far, I’ve seen example using
$rootScope but it’s like using global variables which I’m against unless really nescessary.
factory seems to be the thing I’m looking for. I shall read more documentations about this.
That’s it for today. I will continue once I found more cool stuff worth sharing about Angular.
How to setup rtorrent, rutorrent on Ubuntu
This is a simple and concise tutorial on how to setup a seedbox running
rutorrent as webui on Ubuntu OS. I’ve tried to simplify as much as possible to make it easy to understand. It may look a bit lengthy but it’s copy-paste-fu mostly.
Initial server setup
Login to your server and create a new user account, add it to
sudo group. Substitute
USER_NAME with your desired username.
Setup key authentication
It’s better, less hassle and a lot safer. You should use it.
You can try logging in your server with the new user. It will not ask you to enter password this time.
Disable root login
nano to change
Ctrl+O to save and
Ctrl+X to quit afterward.
Create new user to run
rtorrent and required folders
rtorrent config, you can copy the default one and mess around. It’s simple and straight forward. I won’t go into details here.
Setup nginx/rutorrent for webui
php5-fpm to run
By default, your root folder will be at
Create a configuration file for
Copy and paste the content below
Create symlink to
sites-enabled and restart
Create a test file to verify
php5-fpm is working
And that’s it. Start
rtorrent and things should work as it supposes to. Feel free to ask me any question if you got stuck.
If you’re a casual torrent user like me and still looking for a dead-cheap, torrent-friendly VPS provider, I may recommend you to take a look at RamNode. They provide a $15 per YEAR for 80GB of space and 500GB bandwidth. As long as you don’t do heavy torrenting and public trackers, you should be safe.