Wednesday, October 5, 2016


Destructuring makes code readable

// We could use this directly, but the parameter names won't be obvious
//      EmployeeViewResource.get($state.params)
// So let's do this:
const {employeeId,userId} = $state.params;

EmployeeViewResource.get({employeeId, userId}).$promise.then(result =>

Sunday, October 2, 2016

newing from dynamically-loaded type

newing an object from a dynamically-loaded/reflected type from statically language such as C# and Java requires an API (e.g., Activator.CreateInstance for C# developers). Whereas in node you can still use the new keyword

> new (require('./api/-core/protocol-buffer/proto-mapping')['com.puter.platform.protocols.users.AccountUpdated'])({account: { uuid: {id: '021e4feb-99c4-419b-8891-b38bd6b00897'}}}).encode64();

Just mind the parenthesis after the new keyword.

Have yet to know what's the difference of the above dynamic object creation from ES6's Reflect.construct.

Happy Coding!

Thursday, September 29, 2016

Protobufjs decoding base64

These are same:

var obj = MessageName.decode(Buffer.from(base64string, 'base64'));

var obj = MessageName.decode64(base64string);

Saturday, July 30, 2016

Error with: npm install pdf-fill-form

The solution to following error..

pdf-fill-form@2.0.0 install /Users/jack/node-playground/test-pdf/node_modules/pdf-fill-form
node-gyp rebuild
CXX(target) Release/
CXX(target) Release/
CXX(target) Release/
../src/ fatal error: 'poppler/qt4/poppler-form.h' file not found
1 error generated.
make: *** [Release/] Error 1
gyp ERR! build error 
gyp ERR! stack Error: make failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:276:23)
gyp ERR! stack at emitTwo (events.js:106:13)
gyp ERR! stack at ChildProcess.emit (events.js:191:7)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:204:12)
gyp ERR! System Darwin 15.5.0
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /Users/jack/node-playground/test-pdf/node_modules/pdf-fill-form
gyp ERR! node -v v6.0.0
gyp ERR! node-gyp -v v3.4.0
gyp ERR! not ok 
npm WARN test-pdf@1.0.0 No description
npm WARN test-pdf@1.0.0 No repository field.
npm ERR! Darwin 15.5.0
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install" "pdf-fill-form" "--save"
npm ERR! node v6.0.0
npm ERR! npm v3.10.5

npm ERR! pdf-fill-form@2.0.0 install: node-gyp rebuild
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the pdf-fill-form@2.0.0 install script 'node-gyp rebuild'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the pdf-fill-form package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! node-gyp rebuild
npm ERR! You can get information on how to open an issue for this project with:
npm ERR! npm bugs pdf-fill-form
npm ERR! Or if that isn't available, you can get their info via:
npm ERR! npm owner ls pdf-fill-form
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR! /Users/jack/node-playground/test-pdf/npm-debug.log to install Xcode first:

xcode-select --install

Then re-run:
npm install pdf-fill-form

Happy Coding!

Friday, July 29, 2016

Show invalid inputs upon submit

Old approach was to set all the controls dirty upon submit. This is the better way:

    form, .ng-invalid  {
        border-color: red;

Friday, July 22, 2016

Little-known capability of require

require can also read JSON file for you:
let c = path.join(os.homedir(), 'connection.json');

let connectionJson = require(c);

let connectionString =
        + connectionJson.user
        + ':' + connectionJson.password
        + '@' +
        + '/' + connectionJson.database;

let massiveInstance = massive.connectSync({connectionString: connectionString});
app.set('db', massiveInstance);

So no more need to open and read the JSON file manually:
let c = path.join(os.homedir(), 'connection.json');

fs.readFile(c, 'utf8', (err, data: any) => {


    let connectionJson = JSON.parse(data);

    let connectionString =
            + connectionJson.user
            + ':' + connectionJson.password
            + '@' +
            + '/' + connectionJson.database;

    let massiveInstance = massive.connectSync({connectionString: connectionString});
    app.set('db', massiveInstance);

Happy Coding!

Thursday, July 21, 2016

Smart Data Structure vs Smart Code

Smart data structures and dumb code works a lot better than the other way around." -- Eric S. Raymond

"Bad programmers worry about the code. Good programmers worry about data structures and their relationships." -- Linus Torvalds

"The best code is no code at all" -- Jeff Atwood

I'm proud of my dumb codes, as I create smart data structures instead.

With smart data structure, the code can be simple, smaller and easy to read. And sometimes, you don't even need to write any code at all if you are using smart data structure.

With dumb data structure, the code tend to become smart/clever/tricky. Sometimes I'm ceasing to look at the smart/clever/tricky code as smart/clever/tricky, they are sometimes looking like a show-off codes.

And some programmers call their codes a hack when oftentimes it's really a poor code compensating for dumb data structure.

Some programmers are giving the word hack a bad name.

I hate writing codes.

I should fully qualify that sentence. I hate writing codes against dumb data structures.