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.ng-dirty, form.ng-submitted .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 =
        'postgres://'
        + connectionJson.user
        + ':' + connectionJson.password
        + '@' + connectionJson.host
        + '/' + 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) => {

    console.log(data);

    let connectionJson = JSON.parse(data);

    let connectionString =
            'postgres://'
            + connectionJson.user
            + ':' + connectionJson.password
            + '@' + connectionJson.host
            + '/' + 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.

http://www.ienablemuch.com/2014/07/when-using-stringly-typed-code-eliminate-boilerplate-codes.html
http://programmers.stackexchange.com/questions/163185/torvalds-quote-about-good-programmer
https://blog.codinghorror.com/the-best-code-is-no-code-at-all/

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 => {
        defer.resolve(result.data);
    });

    return defer.promise;
}

That should be improved to:

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

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

}


Read from codelord.net



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.

https://blog.codinghorror.com/the-best-code-is-no-code-at-all/

http://haacked.com/archive/2010/08/26/not-paid-to-write-code.aspx/

https://en.wikipedia.org/wiki/Cargo_cult_programming


Another good read on promises anti-pattern: http://taoofcode.net/promise-anti-patterns/


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(db.notification.email.find)
let find = Q.denodeify(db.notification.email.find)

And even bluebird's promisify doesn't work:

let find = bluebird.promisify(db.notification.email.find)


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(db.notification.email);

With that, it will generate a promise version of all the methods found in db.notification.email 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(db.notification.email.find, db.notification.email);

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

});


Happy Coding!

Monday, July 11, 2016

Sample XML XSLT

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="html"/>

    <xsl:template match="data">
        <link href="/bootstrap/css/bootstrap.min.css" type="text/css" rel="stylesheet"/>
        <table class="table table-bordered table-condensed table-striped">
            <xsl:apply-templates/>
        </table>
    </xsl:template>

    <xsl:template match="titles">
        <tr>
          <xsl:apply-templates mode="header"/>
        </tr>    
    </xsl:template>

    <xsl:template match="row" name="standardRow">
        <tr>
          <xsl:apply-templates/>
        </tr>
    </xsl:template>

    <xsl:template match="row/*">
        <td>
          <xsl:apply-templates select="node()"/>
        </td>
    </xsl:template>

    <xsl:template match="title" mode="header">
        <th>
          <xsl:value-of select="node()"/>
        </th>
    </xsl:template>

</xsl:stylesheet>

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="sample.xslt"?>


<data>

    <titles>
        <title>Pangalan</title>
        <title>Apelyido</title>    
    </titles>


    <rows>

        <row><Lastname>Abbas</Lastname><FirstName>Syed</FirstName></row>
        <row><Lastname>Abel</Lastname><FirstName>Catherine</FirstName></row>
        <row><Lastname>Abercrombie</Lastname><FirstName>Kim</FirstName></row>

        
    </rows>

</data>