Varuna Jayasiri


Read this first

In search for the best data analysis tool for auditors

A good data analysis tool is determined by a number of aspects. These change from auditor to auditor, and what the tool is used for. Auditors use data analysis tools mainly for audit planning and continuous monitoring. A good data analysis tool for auditors is determined by how well and easily it helps auditors analyse data.

DISCLAIMER: I work for a software company that makes data analysis software for managers, auditors, and finance officers. So there may be some bias in this post, but I’ve tried to be neutral.

I have broken down features and qualities of data analysis tools by data sources, analyses, features, and overall design.

Data sources and connectivity

This is a key factor as one of the biggest problems faced by auditors in analyzing data is difficulty in obtaining data.

Manual file uploading is usually a wizard that allows the auditor to upload files and identify columns...

Continue reading →

Shared memory with node.js

This is more like a tutorial on writing a simple node.js add-on to share memory among node.js processes.

One of the limitations of node.js/io.js is that they are single threaded. Only way to use multiple cores in the processor is to run multiple processes [1]. But then you are working on different memory spaces. So it doesn’t help if you want multiple processes working on the same memory block. This is required in memory intensive tasks that cannot be efficiently sharded.

All the source code is available in Github.

Node addon

You need node-gyp installed to build the node module.

npm install node-gyp -g 

I think the node.js version matters as the addon api has changed. I was working on node 0.12.2, when I tested this out.

binding.gyp is required by node-gyp to build the addon.

Then comes shm_addon.cpp. This is a very basic addon that has one export createSHM, which creates a shared...

Continue reading →

Lessons learned: Getting the first B2B customer

It took Forestpin almost 2 years to get its first big customer. Making the first sale is always hard. It was a tough ride; talking to a lot of potential customers, changing product strategy from time to time, taking up classes on pitching and of course a lot of programming. We learned a lot during the process.


We started off in March 2012, with a meeting of a few of guys. Some of whom believed that there is a lack of tools to find fraud and irregularities in financial transactions.

The idea was to develop financial data analytics software to highlight anomalies.

First couple of months were spent on research. We talked to auditors, accountants and managers to see if they had the problem we were trying to solve. We also discussed solutions they were using to solve it.

Before starting on the product, we implemented a bunch of analyses to highlight anomalies in payments data;...

Continue reading →

Black or White

Which background is better? Most text editors and document readers have light backgrounds. But there’s a lot of programmers who use dark backgrounds. And there are a some analytics and dashboard applications with dark backgrounds.

Dark background - WIP

Stephan Few has criticized using dark backgrounds for dashboards in his book Information Dashboard Design, citing an image of Roambi. By the way, Roambi later moved to a white background and then brought back the option of dark backgrounds.

Have you noticed that many business intelligence (BI) software companies have introduced black screens as the standard for mobile devices? Is this because mobile devices work better with black screens? If you look for the research, as I have, it isn’t likely that you’ll find any.

No one seems to question the efficacy of light backgrounds for reading text. Why the difference? Text and graphics both involve objects that...

Continue reading →

SEO Crap

SEO is dead - at least much different from what it was known to be. But there are a plenty of consultants who market SEO, as if it is something that is hard to get right. Many organizations fall for it.

Search engines do not want to show web sites with some special SEO sauce to be on top. They want websites that people look for.

There were days when you could use neat little tricks (link farms, etc) to go higher on search results. This was possible because it is hard for an algorithm to figure out what’s better content. Now search engine algorithms have gotten better and they don’t fall for these tricks.

Yet I knew from experience that the real secret to SEO was not about tricks but about making your site the best it could be for your users while keeping the search engines in mind. It was true when I started doing SEO and it’s true now. Doing that always, always, always works to...

Continue reading →

Hacker News Redesign

This is motivated by Hacker News Redesign (HN discussion) by @hilapeleg. It was a great looking design and I too wanted to spend a couple of hours redesigning Hacker News. Here’s the chrome extension to try it.


I am a developer and have no experience with design tools. So I started off changing HTML and CSS and ended up writing a small chrome extension that applies this redesign on the HN front page. My redesign is more like an improvement in rather than a complete redesign.

I used bootstrap for it’s grid system and navigation bar.



I feel the font size on Hacker News is way too small. In fact I always have the site zoomed into about 120%. I wanted to use Gill Sans which is used by Edward Tufte. I have used the free alternative Lato instead.



Variable length underlines below points and comments give an indication of the number of points and number of comments. It...

Continue reading →

2-10X faster frame rates with transform:matrix3d over top/left

When animating/moving HTML elements, setting their position with -webkit-transform: matrix3d() gives two to ten times faster frame rates compared to top/left or -webkit-transform: matrix(). On mobile devices you can observe native app like performance with transform: matrix3d.


It moves a panel that contains 10,000 div elements. On my macbook air running chrome, transform:matrix3d gives 30 - 40 fps while position:top/left and transform:matrix gives 10-15 fps. You can check the frame rate by selecting Show FPS meter on Rendering tab of chrome developer tools.

The following image shows snapshot of frames timeline with top/left. Timeline for top/left

This is the snapshot of frames timeline with transform:matrix3d. Timeline for transform:matrix3d

transform: matrix3d takes out the paint operation which gives increased frame.

The 3d translation layers offer a way of pre-blitting all the stuff...

Continue reading →

What people want and what’s good for them

What people want are not always good for them. And people not always want what’s good for them.

The short term success of products depend on how much people want it and not on how good it is for them. But in long term, usually it matters whether the product is actually good for them.

Products that people want, but not necessarily good for them, such as addictive games, drugs and some social networks get popular quickly but has an uncertain future. Products that people don’t want, but are good for them don’t get popular or takes ages to get popular even with a lot of awareness building.

So, if you want to help, you should make something that is not only good for people but also wanted by them.

There are products that people want and are good for them, such as maps, spreadsheets, internet search, certain blogs and social networks. Then there are products that couple something that’s...

Continue reading → is a lightweight library with no dependencies to generate DOM elements. We developed it to replace Coffeecup as a client side template engine. Because of its simplicity and performance, we are also using Weya to replace DOM manipulation of d3.js in data visualizations.


  • JsPerf -
  • Github -
  • Example bar chart -

Here’s a small example to show the usage.

userElems = [] Weya container, -> @div ".users", -> for user, i in users userDiv = @div '.user', on: {click: editUser}, -> name = @span ".name", @span ".phone", if v.image? @img src: user.image userDiv.userId = i userElems.push user: user, name: name 

The above code creates a list of users. It binds the data to the dom element userDiv.userId = i and also keeps track of all the DOM elements...

Continue reading → without third-party networks recently announced that they are discontinuing support for all third party messaging networks[1]. Most users chose for that, and there’s a chance that people will start leaving and trigger a chain reaction. I was an intern programmer at back in 2010, and it’s run by very smart people. So they’ve probably got a very good plan. The following are my thoughts on what they might do in the future to grow their network. will now focus on their network. With the resources they have, they will improve fast. There are two main components of One is messaging, where you connect with two or more people in your contacts. Other is broadcasts, where you publish stuff publicly and anyone can respond. There is a chance might drop broadcasts to focus only on messaging, but it is highly doubtful looking at what they’ve been doing lately.



Continue reading →