nodejs: callback vs promise
Consider the code snippet below:
The second statement will not wait for the first one to complete, hence result in
true in the second statement.
When it comes to dealing with asynchronous in nodejs, we usually come down to 2 most popular options: callback and promise.
Callback is widely used but when we need 3 or more operations going in sequence, things are going to get ugly. Consider the following code snippet.
That is just one function with callback. Imagine this with 4 levels of callback. Welcome to CALLBACK HELL!!
What is a promise?
The core idea behind promises is that a promise represents the result of an asynchronous operation. A promise is in one of three different states:
- pending - The initial state of a promise.
- fulfilled - The state of a promise representing a successful operation.
- rejected - The state of a promise representing a failed operation.
Once a promise is fulfilled or rejected, it is immutable (i.e. it can never change again).
The most complete library for promise on Nodejs is
How to fix `Logon failed for login 'username' due to trigger execution` error with mssql
I recently tumbled upon an error when trying to connect to SQL Server in nodejs using
Logon failed for login 'username' due to trigger execution
I have no problem connecting to a dev db server of mine, probably due to I don’t have any restriction/security setup on it. I only got this when connecting to a production server.
Problem lies in the default driver
tedious used by
mssql. Changing to
tds fixes the problem.
I don’t actually understand the problem behind this so if anyone knows, please help explain it to me.
How to setup Sublime-IJulia with Sublime Text
I love Sublime Text. I prefer to do all of my development in Sublime Text if possible, especially when Julia Studio or Juno don’t offer much addtional features.
The instructions on GitHub repo is a bit confusing so I decided to rewrite it steps by steps how to set Sublime-IJulia up on OS X. I can’t say for other OS though.
I suppose that you have already had
julia installed (v0.3.3 as of this post) and add
julia to PATH variable.
Install zeromq and ipython
From terminal app, install
After that, launch
julia console and install
IJulia should be added and builded successfully.
Now head to Sublime Text and install
Sublime-IJulia by pressing
Ctrl+Cmd+P and type
Install Package, search for
Follow the instruction from step 7 of this GitHub repo. There are a few things to note though:
Change zeromq dylib path because of the version difference.
If you got
Kernel diederror message, try using absolute path for
juliaeven though you already have it in
That’s it. Follow the instructions carefully and it will work as expected.
A conversation with stranger
Stranger: So you’ve been living here for nine years? How come you don’t speak Thai?
me: Well… (chuckle)
Stranger: What do you do for a living?
me: I’m a programmer. I write softwares.
Stranger: Aha. So you’re a nerd? You don’t feel the need to talk to people.
Social sharing button without embedding sharing script crap
Found this collection share url structure from various social networks on Github.
Example, for Twitter:
Use this along with font-awesome icons and we have some nice social sharing buttons without tracking scripts or slowing down your website one bit.
When static website isn't fast enough
I have recently taken a look at my website loading speed again.
A bit about my website, as of currently:
I hosted my website on a smallest, cheapest VPS plan at RamNode ($15 per year, massive plan) which shares the physical machine with a numerous other people.
This website is powered by jekyll - a static site generator.
The website is using a custom theme, based on Bootstrap. I loaded two addtional fonts from Google Fonts (Ubuntu and Merriweather) for heading and paragraph.
I have Jquery and Bootstrap script on my page for some fancy stuff I might need later, along with Google Analytics script (async).
As for the testing setup, I will compare the loading speed of two posts with text only.
|Total load time||2.8s||2s|
|Number of request||14||17|
2-3 seconds to load isn’t too bad itself but it’s definitely not good enough for me. My idea number would be something less than 1 second. I know that custom fonts come with the trade of loading speed but I would expect it to load faster than this, especially when they’re served by Google.
Stuff I have already tried:
Combine CSS into a single file, minified and served by CloudFlare.
Images are optimized with ImageOptim for optimal size.
Defer/async script when possible. Loading JS script right before
Webpagetest gives my website A for everything except: First Byte Time (B) and Cache static content (C). Let’s break it down.
First Byte Time
- 845 ms First Byte Time
- 717 ms Target First Byte Time
Apparently, the VPS my website is on is slow (which is expected). I can’t do much to enhance this either.
Cache static content
Webpagetest also complains about there’s no
expires set in header on
fonts.googleapi.com. I have no idea why Google didn’t set
expires for this. Maybe someone with better understanding about this can help explaining to me.
As much as I would like to make my website load faster (I’m sucker for this kind of stuff), I either have to upgrade the VPS plan ($$$) or go with web safe fonts (Ewwwww!).
I guess I would have to settle with this for now. Hopefully, you don’t find this website too slow.
My blog is now using customized Shiori theme - a Bootstrap-based theme for jekyll by Elle Kasai.
The switching process is painless. I just have to copy my data over from old jekyll instance, tweak here and there a bit and
git push. BAMM! The blog now has a shiny new modern look :)
BAT script to execute commands on remote Unix machine with PuTTY
putty -i private_key.ppk remoteuser@remotehost -m local_script.bat
In the example above, I use public key authentication to authenticate and then execute the commands inside
local_script.bat on the remote machine. Alternatively, you can use
plink which is basically
putty without the GUI part. All other options are basically the same.
You can also use password for authentication, just replace
-i option with
-pw and your password.
youtube-dl is a small command-line program to download videos from YouTube.com and a few more sites.
youtube-dl is as easy as
brew install youtube-dl on OS X.
youtube-dl allows you to download from many online audio/video sharing websites, not just Youtube.
You can use it to download all videos from a playlist, from a channel or simply extracting the audio from a Youtube link.
From a channel:
youtube-dl -citw ytuser:channel_name
From a link/playlist
Listing all available formats:
youtube-dl -F OKbtC223e30
Download a Youtube video as audio
youtube-dl -f bestaudio OKbtC223e30
youtube-dl is included in many distro’s repo but I recommend you to install from the main website for quicker update. The version in the repo is usually very outdated.
Shorter code is better?
Which one do you prefer: shorter code or more legible code? As for me, legibility of the code always come first. Working in a team will make one realize the importance of code legibility sooner or later. Your code is not for you alone to read. It should be friendly and easy for whoever has to maintain your code as well. It’s not easy to write elegant code but it’s much easier to write legible code.
- Always give a good name to your variables. It’s not random naming was talked as one of the hardest problems in computer science.
“There are only two hard things in Computer Science: cache invalidation and naming things.”
- Phil Karlton
Comments: comment is not a bad thing. But lots of comment definitely is. It might be a signal that the code is not legible enough that it needs that much lines of comment for readers to be able to understand. Also, it’s not a good thing to comment code and leave it there. It will create confusion for those who maintains it.
Uncouple your code. Uncoupling increases legibility and writing test unit a lot easier.
Write everything as if you were to write an API, as it should be intuitive and easy to understand. Your code should be easy to make changes when needed. It should not break a whole system when does.
“Writing specifications is like writing a novel. Writing code is like writing poetry.”
Your code can talk, so tell a story.