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.

Monday, July 18, 2016

Prefer type declaration instead of casting

If casting is use, you may incur typos or spelling errors and the compiler won't even flag you about it. Prefer type declaration, use let-variable-colon-type-assignment.

Happy Coding!

Sunday, July 17, 2016

Making unnecessary promises?

That's a sign of cargo culting

getOptions(): ng.IPromise<IOption[]> {

    let defer = $q.defer();

    http.get('options.json').then(result => {

    return defer.promise;

That should be improved to:

getOptions(): ng.IPromise<IOption[]> {

    return $http.get('options.json').then(result => {


Read from

Cargo Culting, unnecessary rituals. Yes, no matter how logical programmers are, they are not immune to blind faith too. Sometimes, it's because of lack of understanding of how the tool should be used. Sometimes also, the documentation is lacking.

Some programmers have too much faith in their own code, when in fact they should not be writing codes at all or should just write a minimal amount of code in the first place.

Another good read on promises anti-pattern:

Happy Coding!

Saturday, July 16, 2016

Broken Promises? Bluebird Solves It!

Broken promises. denodeify and Q's denodeify both doesn't work on MassiveJS:

let find = denodeify(
let find = Q.denodeify(

And even bluebird's promisify doesn't work:

let find = bluebird.promisify(

All of them when this is performed:

find({locationId: 168}).then(result => {

Results to this:

TypeError: Cannot read property 'query' of undefined
    at Queryable.find (/Users/geek/WebstormProjects/personal/node_modules/massive/lib/queryable.js:108:12)

Those promisifier libraries might be having a hard time converting MassiveJS callback to promise as the target method(find) are dynamically generated.

And then I read bluebird's promisifyAll method. It can create a promise version of each methods in the object.

let email = bluebird.promisifyAll(;

With that, it will generate a promise version of all the methods found in object. The promise version of the method have the Async suffix on the method name.

An example use:

email.findAsync({locationId: 168}).then(result => 

And it works!

Then I found another approach that works in bluebird, it can also target specific method to promisify. You just have to pass the immediate object of the method you want to promisify on the second parameter.

let find = bluebird.promisify(,;

find({locationId: 168}).then(result => {


Happy Coding!