Keeping up with dependency updates

Dependency updates are an inevitable part of software engineering. With every major language offering its own package ecosystem, keeping up with these updates — some of which address critical security issues — can quickly become tedious. TLDR? My dependency update PRs are automatically merged by a tool Reports of my GitHub Actions runs are generated by another tool The problem I maintain several open source projects on GitHub. While GitHub offers handy tools like Dependabot to regularly scan repositories and create pull requests for dependency updates, keeping up with these PRs can quickly become overwhelming. My notifications panel often looks like this: ...

June 16, 2025

Feature Preview Deployments for the Front-end

The front-end for “Employee Referrals” — the department where I work — at Radancy is a single page web application, served as static assets by nginx, which also acts as a reverse proxy. The problem Historically, the front-end team at “Employee Referrals” has followed a practice of working on features in long-running git branches, iteratively adding small changes to the branch until the feature is complete, at which point they merge it. While this (somewhat) worked when these front-end developers were part of a dedicated and siloed team, it doesn’t really work well with our new team structure — cross functional teams where front-end and back-end developers work together on product features. The need to wait for merging these long-running branches to the main branch before seeing the corresponding features on our pre-prod environment qa resulted in significant delays. This meant that it took quite a long time before other team members — product owners, testers, other devs — could test out new features and provide feedback. I wanted to get rid of this delay by allowing previews for front-end feature branches. ...

July 20, 2023

Knowing What You're Shipping

We use Jenkins for continuous integration and continuous delivery of software in my team at Radancy. Jenkins then sends a notification to a Slack channel (a dedicated channel for monitoring needs) when a deployment is through. When I joined Radancy last year, these notifications looked like this: As is clear in the image above, these notifications do not convey a lot of information about the change that is being deployed. The most useful piece of information in these notifications is a link to the Jenkins run. We use Bitbucket for source code management — we’re migrating to Github soon — which doesn’t have the best user experience for viewing commits, and doesn’t have a feature like Github Actions, so I was stuck with using Jenkins to improve these CICD notifications. ...

July 16, 2023

Getting pytest results into Neovim's quickfix list

At work, we have a Python monorepo containing multiple projects, each deployed as individual docker containers. Each project has its own set of pytest tests. There is some code that is shared between projects, which is copied into the docker containers using the docker COPY command, or mounted via volumes locally. This is all to say that the file structure in the code is not exactly the same as it is in the containers. ...

October 30, 2021

Binary Search Trees

Let’s consider a Linked List that we’ve seen so far for the problem of storing and retrieving information. In particular, let’s implement a set using an ordered linked list as the underlying data structure. Here’s how that would look like: From the get-go we can see that searching and inserting would be slow for this implementation. Say we want to check if node E exists in the list or not. We’ll start searching at the begining of the list, perform a check to see if a node matches the key we’re searching for, and if not, move on to the next node in the list. This will lead to O(N) time complexity for search, which is definitely not good. ...

June 10, 2020

Disjoint Sets

Disjoint sets are used to solve a problem called dynamic connectivity. This data structure has two operations: connect(x, y): connects x and y isConnected(x, y): returns true if x and y are connected. Connections don’t need to be direct (transitive) Note: The ideas and content (including images) in this post come from Josh Hug’s excellent lectures from UC Berkeley’s CS61B. Introduction Let’s consider an example. We start with a set of 7 integers from 0 to 6 connected as follows: ...

June 10, 2020

ML Basics #4: Replace Negatives with Zeros!

This is the fourth post in this series on the basics of Machine Learning. These posts are intended to serve as companion pieces to this zine on binary classification. In the last one, we learnt how adding hidden layers to a Multilayer Perceptron helps it learn increasingly complex decision boundaries. The MLPs used till now made use of the sigmoid function as the activation function. In this post, we’ll move our focus to a much simpler kind of activation function: The Rectifier. ...

September 4, 2019

ML Basics #3: More Layers!

This is the third post in this series on the basics of Machine Learning. In the last one, we learnt how a Multilayer Perceptron can be trained to non-linearly segment a dataset. We also saw how a simple artificial neuron forms the building block of a Multilayer Perceptron — or a neural network in general — which can learn much more complicated decision boundaries. Let’s move on to datasets that are harder to segment. One way to improve the learning capability of a MLP is to add more neurons in the form of hidden layers. In this post we’ll explore MLPs with 2 hidden layers. ...

August 26, 2019

ML Basics #2: Multilayer Perceptron

This is the second post in this series on the basics of Machine Learning. The last post detailed the functioning of an artificial neuron, and how it can be trained to linearly segment a dataset. However, most real world datasets are not linearly separable, which begs the question: What is the point of learning about a neuron? Well, by the end of this post, we’ll see that a bunch of neurons, when stacked together, can learn to create powerful non-linear solution spaces. Let’s see how that works. ...

August 25, 2019

ML Basics #1: Start With A Neuron

This is the first post in this series on the basics of Machine Learning. My aim here is to create a comprehensive catalogue of ML concepts so that I can quickly refer to them in the future, as well as be of help to anybody in a position similar to mine. This post complements the first segment in the zine: Linear Binary Classification. The idea is to have the content here supplement that in the zine. ...

August 15, 2019