Over the past few months, I’ve been exploring the lakes around my home in North
Bengaluru. They have blown me away with the diversity of birdlife they host. In
a rapidly expanding city, these water bodies serve as vital sanctuaries. While
well-known hotspots like the Jakkur lake are predictably teeming with avian
activity, even smaller, unassuming spots like the Chokkanahalli lake…
Language servers enable IDE-like features in text editors that support the
 Language Server Protocol . pylsp is a language server for
Python. I use vim-lsp to integrate language servers into Vim.
Configuring a language server in vim-lsp is straightforward for most
languages , but not for Python. 
 Any non-trivial Python codebase uses a virtual environment (venv) to store…
There are two key problems to solve on the journey to attaining Financial
Independence and Retiring Early (FIRE): 1) ensuring you have enough money for
the rest of your life and 2) figuring out what to do after retiring. While the
latter is critical for a fulfilling retirement, it is also highly personal.
However, the path to achieving the former is quite common to most people.…
There has been a lot of talk about employee productivity in recent days, with
some Indian tech entrepreneurs asking people to work 70 hours a week.
Productivity is not the sole purpose of life. Health and relationships that we
value are more important and productivity must never come at the cost of these.
With that out of the way, here is my view of productivity and ways to improve…
As I mentioned in the post about my backup system , I run restic check 
regularly, to test the integrity of my backup. It has never reported any error
in my repository. It performs a quick, shallow check, and does not verify that
all the data is intact. I also restore a random file, whenever I run restic check , to test recoverability. 
 Shortly after I wrote the previous post , I…
Computing devices and online services can fail catastrophically and take our
data with them. It is crucial that we have a robust system to backup and
restore our data, to protect against such events. This post details what I
wanted from the backup system for my personal data and the tools I use to
achieve them. This system has served me well over the last 5 years,…
At a previous job, we had several instances of Ruby on Rails applications
connecting to PostgreSQL through PgBouncer . The services and databases
were deployed on bare-metal servers and chugged along fine. We then decided to
migrate to AWS. Upon migration, we noticed that PgBouncer started leaking
connections to PostgreSQL like a sieve, leading to exhaustion of the…
Vim offers many ways to use the command-line tools available on your system when editing. You can: 
 
 insert the output of a command into the current buffer - e.g., insert the current date. 
 process lines of the current buffer through a command - e.g., sum up a list of numbers in the file. 
 manipulate lines of the current buffer using a command - e.g., sort a list of names in…
This is third in the series of posts describing how I use
 GnuCash to manage my finances. In
 previous 
 posts , I had discussed
how I organize my accounts, record transactions and handle taxation in GnuCash.
In this post I’ll show how GnuCash can be configured to fetch the current NAV
of mutual funds from the Internet.
This is second in the series of posts describing how I use
 GnuCash to manage my finances. In the previous
post I had discussed how I
organize my accounts in GnuCash. In this post I’ll describe how I record
transactions and use GnuCash to help with computation of taxes and filing of
tax returns.
GnuCash is an open-source double-entry bookkeeping
software. In a series of posts this week, I will describe how I use GnuCash to
manage my finances. The series will be biased towards a portfolio composed
primarily of Indian mutual funds. This post describes the chart of
accounts involved and the
purpose of each account.
For better or worse, passwords are central to the safety of almost all our
online accounts. 2-factor authentication systems are meant to protect users
from compromise of their passwords. However, not all services support it. Also,
several online services (including banks), use OTP sent over SMS as the second
factor. This has several vulnerabilities and has been deprecated…
Prepared statements are the best way to avoid SQL injections in applications
accepting user input. However they require an additional round-trip to
prepare the query, which increases latency when your queries are dynamic and
the statements are not re-used. PostgreSQL allows execution of such queries
without the additional cost!
Quiz time. How many threads (other than main ) will this program create on a
dual-core machine? 
 public class App {
 public static void main (String [] args) {
 for ( int i = 0; i < 10; i ++ ) {
 CompletableFuture. runAsync (() -> {
 System. out . println (currentThread(). getName ());
 }). join ();
 }
 }
 }

The rule of thumb for equity investments is to not time the market, but
there are also several analyses correlating investing at high index PE levels
with lower returns. So can we use the PE levels of indices to generate better
returns than SIP and reduce volatility of the portfolio?
One of the weaknesses of Go’s runtime today is the relatively naive GC
implementation. This is evident from go performing consistently worse than most
other languages in the binary trees
benchmark .
However, the language can make designing programs that reduce GC cost fairly
straightforward.
When working with object-oriented languages, there are many instances when one
would want to implement an interface re-using code from another implementation
of the interface. While inheritance will work, it couples the new
implementation to the specific other implementation. Composition with
delegation will be a better way of doing this.
I’ve recently started getting my head around Git having been a Subversion
(sadly even CVS) user all along. While I liked the fact that it was distributed
and way faster than Subversion at most operations, I couldn’t understand why
many claimed it was better at merging than Subversion (1.5 and above). Even the
“Branch Handling” section in Git’s
wiki…
Every web application has elements common to all its pages which are good
candidates for re-use. While Spring MVC provides integration with Tiles, it can
be an overkill for simple applications and needs using Spring’s client side JS
library for AJAX (correct me if I’m wrong).
Let’s consider the below Game class in a guessing game where a random target is
chosen by the system and the user guesses the target. The system returns an
appropriate message based on whether the guess was higher, lower or equal to
the random target.
Java 6 allows you to execute and communicate with scripts written in any
scripting language, using the Scripting
API .
However, the code needed to create a
 ScriptEngine 
and evaluate a set of script files within it, is quite verbose and throws
several checked exceptions.
AJAX4JSF is library of JSF components which can be used to easily add AJAX
capabilities to JSF web applications. AJAX4JSF is available as part of the
 Richfaces component library.
I have long been wanting to make a local directory, which contains all my
Debian packages, as a repository to be added in, /etc/apt/sources.list .
Finally, I did it.