Braintapper Logo

Recent Blog Posts

Basecamp's Guide To Internal Communication

January 10, 2020 by Steven Ng

Basecamp published their guide to internal communication recently, and it is insightful and excellent.

Some highlights:

Meetings are the last resort, not the first option.


If your words can be perceived in different ways, they'll be understood in the way which does the most harm.


"Now" is often the wrong time to say what just popped into your head. It's better to let it filter it through the sieve of time. What's left is the part worth saying.


Write at the right time. Sharing something at 5pm may keep someone at work longer. You may have some spare time on a Sunday afternoon to write something, but putting it out there on Sunday may pull people back into work on the weekends. Early Monday morning communication may be buried by other things. There may not be a perfect time, but there's certainly a wrong time. Keep that in mind when you hit send.

I highly recommend that you give the article a read.

Check out my Articles

January 6, 2020 by Steven Ng

As mentioned in my first post, I have an Articles section on the site where I'll be posting evergreen articles that will continue to be updated over time.

I have two articles in place now:

  1. The Windows Software I use to Stay Productive - This is a list of software that I recommend for Windows users.
  2. My Favorite Self-Hosted Applications - This is a list of mostly Docker containers (for now) that I recommend running in your own environment.

I have a queue of other useful articles on their way, and will announce their creation or updates here on the blog.

Convert an Outlook PST to JSON

January 6, 2020 by Steven Ng

I had to archive an Outlook mailbox to a PST file recently, but I'm not a huge fan of using Outlook for finding e-mails.

I looked around for tools that would convert a PST to JSON so I could load my data into something like Postgresql, but I didn't find anything that was free (I only need to do the conversion once).

I ended up searching for an NPM that could extract objects from a PST, and found epfromer's pst-extractor..

Using that NPM, I made a simple command line tool for Windows that can extract a PST into a JSON file.

Since my requirements were modest (one time use, reasonably sized PST file), I didn't really design it to scale. It doesn't support password protected PSTs, and I can't guarantee that it will run on a giant PST file if your machine doesn't have enough memory, but it's there if you need the functionality.

To use it, just download the executable from Github.

The command structure is pretty straightforward. From the directory of the executable, use:

pst_to_json -s /path/to/file.pst -d /path/to/output.json

There are some additional switches, but the above command is all you need to accomplish the task.

So I Wrote a Database Migrations NPM

December 30, 2019 by Steven Ng

I've been working on making Docker containers of my personal Nodejs projects lately, and for those that rely on a relational database (namely Postgresql), I wanted to be able to run database migrations on them locally to make updates easier. To be clear, I'm not talking about data migrations, which are a completely different thing.

For database migrations outside of Ruby on Rails, I've been using Liquibase, and more recently, Flyway. They're both perfectly fine tools, but they also require Java, which means one may need to consider the implications of how Java licenses work.

As it relates to migrations, I subscribe to the forward migrations only philosophy, which means my requirements are relatively simple. All I need to do is scan a pre-specified directory of SQL files and run only the new SQL files. The onus is on me for providing clean, error-free SQL files, so I don't need to make a migration tool very smart.

I did look at existing libraries on NPMJS, but I didn't see any having a workflow similar to Flyway, which has been my tool of choice.

You might be getting the impression that I suffer from NIH (Not Invented Here) syndrome, and you could be right. But my experience with some software is that there are always some elements that I find incredibly frustrating or incompatible with the way I work, and I end up spending significantly more time working around those issues than I would have if I had just written something from scratch.

My NPM, named pg-forward-migrations is designed to do one very specific task well, and took a few hours to write. I spent more time figuring out how to use Liquibase the first time I used it, so in this particular case, the NIH concern is a wash.

All this NPM does is run sequence of SQL statements against a Postgresql database. The workflow is inspired by Flyway in that it uses an easy-to-remember naming convention, and it tracks completed migrations by writing to a migration table in the target database. That's it. It's not rocket science, nor is it attempting to be a replacement for a multi-platform, enterprise-class database migration tool.

At some point, I will probably use this NPM to create command line executable, but at the moment, it's not a priority.

In any case, if you've got a need for a forward migration tool for Postgresql/Node, give the NPM a whirl.

Welcome to the New Site

December 29, 2019 by Steven Ng

Well it's been a while since the site has been updated. A long while, actually.

It's been a long time coming, but I forced myself over the holidays to revamp the site, and here it is.

Things are going to be rough for a little while, as this is a work in progress, and I've opted to go live with a buggy site as opposed to leaving a placeholder page up. This should force me to iterate more quickly and more often.

So before I rebuilt the site, I went through a lot of hand-wringing deciding how to publish this site.

Should I use a static generator like Jekyll? A GUI type tool like MarsEdit? Should I write my own tool? Wordpress (no f-ing way)? A hosted site like Squarespace?

I ended up choosing a hodgepodge of Svelte and Sapper, with some preprocessing using Gulp. I've already been immersing myself in Svelte for the past couple of months, so I figured I may as well stick with that for my site too. Once the site is somewhat stable, I'll try to write up a blog post on what I do to build this site. TLDR; I basically write my content as markdown posts, and have a script to process them into something consumable for my Svelte app.

The site's main focus is the blog, but I will have some evergreen content in the form of articles that can help boost your productivity. I plan to publish my list of "must have" software and services, among other things.

The blog will be mostly made up of a hodgepodge of technical topics, ranging from Cognos, Node, Database and other topics that I find interesting.

In the meantime, click on the RSS link at the top of the page to keep up with my new content.