<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on Sojjwal Kelkar</title>
    <link>https://sskelkar.github.io/post/</link>
    <description>Recent content in Posts on Sojjwal Kelkar</description>
    <generator>Hugo</generator>
    <language>en</language>
    <managingEditor>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</managingEditor>
    <webMaster>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</webMaster>
    <lastBuildDate>Thu, 23 Apr 2026 23:40:02 +0200</lastBuildDate>
    <atom:link href="https://sskelkar.github.io/post/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>If Rubens could delegate his paintings, why can&#39;t you delegate your code?</title>
      <link>https://sskelkar.github.io/post/if-rubens-could-delegate/</link>
      <pubDate>Thu, 23 Apr 2026 23:40:02 +0200</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/if-rubens-could-delegate/</guid>
      <description>&lt;p&gt;I have previously argued that &lt;a href=&#34;https://sskelkar.github.io/post/ics-using-genai-should-think-like-managers/&#34;&gt;engineers using agentic coding should think like managers&lt;/a&gt;. But perhaps you are not interested in management. You don&amp;rsquo;t know what managers do and don&amp;rsquo;t want to learn to think like them. You are put off by all the manager-analogies and wish they&amp;rsquo;d stop. Perhaps you are the artistic type, who thinks of themselves as a software craftsperson.&lt;/p&gt;&#xA;&lt;p&gt;So let&amp;rsquo;s change the subject and talk about something interesting, like art. Hey how about that Rubens? Do you know his process on some of his famous paintings like &lt;em&gt;The Elevation of the Cross&lt;/em&gt;?&lt;/p&gt;</description>
    </item>
    <item>
      <title>ICs Using AI Agents Should Think Like Managers</title>
      <link>https://sskelkar.github.io/post/ics-using-genai-should-think-like-managers/</link>
      <pubDate>Sun, 05 Oct 2025 22:01:56 +0200</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/ics-using-genai-should-think-like-managers/</guid>
      <description>&lt;p&gt;Developers new to agentic coding are at risk of having the wrong expectations. When they try coding agents for the first time, it feels like magic.  But cracks appear when AI is used without understanding its limitations. People tend to dismiss agentic coding if it doesn&amp;rsquo;t work &amp;ldquo;perfectly&amp;rdquo;. This is unfortunate, as coding agents are in fact very impressive.&lt;br&gt;&#xA;It is said that managers have been vibe coding forever. Now, if ICs are also vibe coding, are they like managers?&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Manager&#39;s Guide to Keeping the Lights On</title>
      <link>https://sskelkar.github.io/post/quarterly-roadmaps-for-complex-services/</link>
      <pubDate>Sun, 07 Sep 2025 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/quarterly-roadmaps-for-complex-services/</guid>
      <description>&lt;p&gt;Last year I transitioned to the role of engineering manager on a complex, legacy service with a poor reliability record.&#xA;As a first-time manager I found it challenging to plan a roadmap that can balance tackling reliability issues and reducing technical debt on one hand, and building&#xA;new features on the other.&lt;/p&gt;&#xA;&lt;p&gt;Developer time is a very precious resource. As a manager, you want to spend it in a way that produces compounding benefits over time.&#xA;So I came up with some guiding principles to help me prioritize work in a way that keeps the system running, with hopefully fewer hiccups over time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Software tenbagger</title>
      <link>https://sskelkar.github.io/post/software-tenbagger/</link>
      <pubDate>Mon, 12 May 2025 21:02:00 +0200</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/software-tenbagger/</guid>
      <description>&lt;p&gt;&amp;ldquo;Tenbagger&amp;rdquo; is a term coined by legendary investor Peter Lynch to describe stocks that provide tenfold value on the initial investment.&#xA;As software engineers we make scores of decisions every day in the face of ever-evolving requirements, whose impact on the architecture might only become visible down the line.&#xA;It&amp;rsquo;s nice when a relatively low-effort code change ends up providing compounding benefits over a long time horizon.&lt;/p&gt;&#xA;&lt;p&gt;I am currently working on a critical component in a distributed system for a food-delivery app. One of its core responsibilities is to receive information from an upstream service and&#xA;pass it into downstream services. The feature requirements typically follow this pattern: customers can now provide a backup phone number, which should be shown on the delivery app.&#xA;So an order passing through a chain of systems can now contain a new field, which needs to be forwarded to relevant downstream services.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Squashing ruby on rails database migrations</title>
      <link>https://sskelkar.github.io/post/squashing-ruby-on-rails-database-migrations/</link>
      <pubDate>Sat, 13 Feb 2021 00:00:00 +0100</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/squashing-ruby-on-rails-database-migrations/</guid>
      <description>&lt;h2 id=&#34;why&#34;&gt;Why?&lt;/h2&gt;&#xA;&lt;p&gt;There are several reasons why you&amp;rsquo;d want to squash the database migrations in your Ruby on Rails application:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;In a long running project you may end up with hundreds of files in your &lt;code&gt;db/migrate&lt;/code&gt; folder over time. Carrying these legacy&#xA;migrations incurs maintenance overhead. For example, when upgrading the Rails version, you may need to modify those old migrations for&#xA;syntax changes.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;If your build process involves recreating the database to run the tests, it would need to run all of these old migrations. Running a lot&#xA;of migrations would slow down the build time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Understanding a Postgres query plan</title>
      <link>https://sskelkar.github.io/post/postgres-explain-analyze/</link>
      <pubDate>Mon, 13 Apr 2020 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/postgres-explain-analyze/</guid>
      <description>&lt;p&gt;A query plan is a sequence of steps used by a database to access data. Being able to read a query plan is key to understanding the performance of an SQL query. While tuning a query we need to know how the rows are being fetched from the tables? Are the indexes being used? What is the cost of joining to tables? A query plan provides with an answer for all of these questions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Database integration tests for a Spring application</title>
      <link>https://sskelkar.github.io/post/db-integration-tests-for-spring-app/</link>
      <pubDate>Sat, 12 Jan 2019 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/db-integration-tests-for-spring-app/</guid>
      <description>&lt;p&gt;Suppose you are tasked with writing tests for a Spring and Hibernate application. This application uses a mix of native queries, HQL or entity associations to fetch data from the database. If you choose to mock the DAO or entity layers, you leave a significant portion of the code untested. In such cases data integration tests can provide the most correct feedback. But you do you configure your application to run integration tests?&lt;/p&gt;</description>
    </item>
    <item>
      <title>The small pleasures of programming</title>
      <link>https://sskelkar.github.io/post/small-pleasures-of-programming/</link>
      <pubDate>Sun, 23 Sep 2018 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/small-pleasures-of-programming/</guid>
      <description>&lt;p&gt;It’s not just pulling off a complex engineering feat that makes programmers love their jobs. There are small pleasures to be had even in your day to day tasks, if you look for them.&lt;/p&gt;&#xA;&lt;p&gt;Seasoned programmers know the thrill of recognising the possibility to introduce an abstraction over duplication.&#xA;A task as simple as renaming a variable can be the difference between obscurantism and lucidity.&#xA;It’s the boy scout principle in action. Making your code a bit more pleasant to revisit.&#xA;The joy one derives in these simple improvements is akin to &lt;a href=&#34;https://en.wikipedia.org/wiki/Am%C3%A9lie&#34;&gt;Amélie&lt;/a&gt;’s &lt;em&gt;les petits plaisirs&lt;/em&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Representing natural numbers in lambda calculus</title>
      <link>https://sskelkar.github.io/post/representing-natural-numbers-in-lambda-calculus/</link>
      <pubDate>Wed, 08 Nov 2017 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/representing-natural-numbers-in-lambda-calculus/</guid>
      <description>&lt;p&gt;One of the joys of reading &lt;a href=&#34;https://mitpress.mit.edu/sicp/full-text/book/book.html&#34;&gt;SICP&lt;/a&gt; is that apart from the main subject matter, we come across many tangential topics that are interesting in their own right. One such topic is mentioned in &lt;code&gt;Exercise 2.6&lt;/code&gt;: Church numerals. Named after the mathematician Alonzo Church, Church numerals are a way of representing natural numbers in lambda calculus. But what is λ-calculus?&lt;/p&gt;&#xA;&lt;p&gt;From a programming perspective, λ-calculus can be thought of as the smallest universal programming language. It lacks some of the common features that one would expect in a programming language like, primitives, booleans, numbers etc. In this language, variable substitution and functions are used as the building blocks to express everything else. Even numbers! In this post we will get a glimpse of how this is achieved.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using thread dumps to analyse deadlocks</title>
      <link>https://sskelkar.github.io/post/using-thread-dumps-to-analyze-deadlocks/</link>
      <pubDate>Sat, 14 Oct 2017 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/using-thread-dumps-to-analyze-deadlocks/</guid>
      <description>&lt;p&gt;In a multi-threaded Java application, a deadlock occurs when two threads wait forever attempting to acquire locks that are held by each other. Here’s a simple example to simulate a deadlock:&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Deadlock&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; Object lock1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; Object lock2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Deadlock&lt;/span&gt;(Object lock1, Object lock2) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;lock1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lock1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;lock2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lock2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;methodA&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;trying to acquire lock1 from - &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; Thread.&lt;span style=&#34;color:#a6e22e&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;getName&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;synchronized&lt;/span&gt; (lock1) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            someLongRunningTask();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            methodB();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;methodB&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;trying to acquire lock2 from - &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; Thread.&lt;span style=&#34;color:#a6e22e&#34;&gt;currentThread&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;getName&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;synchronized&lt;/span&gt; (lock2) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            someLongRunningTask();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            methodA();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;someLongRunningTask&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Thread.&lt;span style=&#34;color:#a6e22e&#34;&gt;sleep&lt;/span&gt;(100);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            e.&lt;span style=&#34;color:#a6e22e&#34;&gt;printStackTrace&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt;args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Object lock1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Object();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Object lock2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Object();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Thread(() &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Deadlock(lock1, lock2).&lt;span style=&#34;color:#a6e22e&#34;&gt;methodA&lt;/span&gt;()).&lt;span style=&#34;color:#a6e22e&#34;&gt;start&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Thread(() &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Deadlock(lock1, lock2).&lt;span style=&#34;color:#a6e22e&#34;&gt;methodB&lt;/span&gt;()).&lt;span style=&#34;color:#a6e22e&#34;&gt;start&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;First thread calls &lt;code&gt;methodA&lt;/code&gt; and acquires &lt;code&gt;lock1&lt;/code&gt;. Second thread calls &lt;code&gt;methodB&lt;/code&gt; and acquires &lt;code&gt;lock2&lt;/code&gt;. Then the first thread calls &lt;code&gt;methodB&lt;/code&gt; while at the same time the second thread calls &lt;code&gt;methodA&lt;/code&gt;. Both are trying to acquire a lock that is already held by another thread, so neither can proceed further.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting up a JavaScript project in 2017</title>
      <link>https://sskelkar.github.io/post/setting-up-a-javascript-project-in-2017/</link>
      <pubDate>Sat, 14 Jan 2017 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/setting-up-a-javascript-project-in-2017/</guid>
      <description>&lt;h2&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Creating a front-end JavaScript project can be a daunting task due to the sheer volume of choices available while deciding the tech stack. First, you need to decide the JavaScript framework or library for your project. Do you plan to use the latest ES2015 language features in your code? If yes, then you need a transpiler because your browser probably doesn’t support them yet. Then you require a bundling tool to get your code loaded in the browser. You may want to minify the code for faster load time. To automate all these steps, you need a build script. You may want to deploy your project on a local web server during development. Some setup is required for that. Finally, you need to include some testing framework in your project to write unit tests.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hystrix – a simple use case</title>
      <link>https://sskelkar.github.io/post/hystrix-a-simple-use-case/</link>
      <pubDate>Mon, 05 Dec 2016 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/hystrix-a-simple-use-case/</guid>
      <description>&lt;p&gt;Hystrix is a fault tolerance library that is very useful for managing failures in a distributed environment like microservices. Suppose we have a service &lt;code&gt;A&lt;/code&gt; dependent  on service &lt;code&gt;B&lt;/code&gt;, which is in turn dependent on service &lt;code&gt;C&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;A -&amp;gt; B -&amp;gt; C&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Let&amp;rsquo;s say a call is made from &lt;code&gt;A&lt;/code&gt; to &lt;code&gt;B&lt;/code&gt;. To serve this request, &lt;code&gt;B&lt;/code&gt; needs to call &lt;code&gt;C&lt;/code&gt; but there’s a communication failure between them. If the call from &lt;code&gt;B&lt;/code&gt; to &lt;code&gt;C&lt;/code&gt; is wrapped in Hystrix mechanism, we prevent the failure being propagated to &lt;code&gt;A&lt;/code&gt;. Because &lt;code&gt;B&lt;/code&gt; couldn’t fetch the actual information from &lt;code&gt;C&lt;/code&gt;, Hystrix gives us the option of declaring a fallback value to be used in this case, if feasible.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running time intensive operations in parallel with RxJava Observables</title>
      <link>https://sskelkar.github.io/post/rxjava-observables/</link>
      <pubDate>Thu, 01 Sep 2016 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/rxjava-observables/</guid>
      <description>&lt;p&gt;Recently I delved into the &lt;a href=&#34;https://github.com/ReactiveX/RxJava&#34;&gt;RxJava&lt;/a&gt; library. In this post I will demonstrate how RxJava Observables can be used to execute two long running tasks in parallel, so as to reduce their overall execution time.&lt;/p&gt;&#xA;&lt;p&gt;While we can create threads for this purpose, an additional benefit of using Observables is that it provides a convenient way of collecting the results of the parallel tasks. With threads, this can get pretty complicated.&#xA;Let&amp;rsquo;s consider a situation where we have a consumer class that depends on the result of two or more expensive independent tasks.&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Producer1&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;produce&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; list &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArrayList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;0; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;5; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Producer1 - &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Thread.&lt;span style=&#34;color:#a6e22e&#34;&gt;sleep&lt;/span&gt;(1000);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt;(Exception e) {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      list.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; list;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Producer2&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;produce&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; list &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArrayList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;0; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;5; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Producer2 - &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Thread.&lt;span style=&#34;color:#a6e22e&#34;&gt;sleep&lt;/span&gt;(1000);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt;(Exception e) {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      list.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; list;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Logging with Spring AOP</title>
      <link>https://sskelkar.github.io/post/logging-with-spring-aop/</link>
      <pubDate>Fri, 12 Feb 2016 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/logging-with-spring-aop/</guid>
      <description>&lt;p&gt;Aspect oriented programming (AOP) is a way of separating the business login in your code from cross cutting concerns. What is a cross cutting concern?&lt;/p&gt;&#xA;&lt;p&gt;Analogy time. A typical house has different rooms that have designated functions. We keep our stuff in the rooms where they make sense. The living room is an unlikely location for a dishwasher and a bathtub belongs in the bathroom. But the electric circuit runs throughout the house because it is not tied to the functionality of any specific room. Thus, the electric circuit is a cross-cutting concern.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Memory profiling – simple examples</title>
      <link>https://sskelkar.github.io/post/memory-profiling-simple-examples/</link>
      <pubDate>Thu, 04 Feb 2016 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/memory-profiling-simple-examples/</guid>
      <description>&lt;p&gt;Recently I have been trying to learn different memory profiling tools to monitor Java applications. I have looked into the command line tools that are shipped as part of JDK like &lt;code&gt;jstat&lt;/code&gt;, &lt;code&gt;jps&lt;/code&gt;, &lt;code&gt;jvisualvm&lt;/code&gt; etc. Licensed tools like &lt;code&gt;Yourkit&lt;/code&gt; provide wholesome information about a running JVM including memory usage, CPU time, thread count etc. Running a java application with &lt;code&gt;-verbose:gc&lt;/code&gt; option prints memory usage of each generation after every garbage collection event.&lt;/p&gt;</description>
    </item>
    <item>
      <title>JPA Entity Relationships</title>
      <link>https://sskelkar.github.io/post/jpa-entity-relationships/</link>
      <pubDate>Fri, 15 Jan 2016 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/jpa-entity-relationships/</guid>
      <description>&lt;p&gt;In a relational database, the relationships between two tables are defined by foreign keys. Typically, one table has a column that contains the primary key of another table’s row. In JPA, we deal with entity objects that are Java representations of database tables. So we need a different way for establishing relationship between two entities. JPA entity relationships define how these entities refer to each other.&lt;/p&gt;&#xA;&lt;p&gt;For the purpose of this article, I will work with JPA 2.0 and a table structure as following.&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; team(team_id NUMBER, name VARCHAR2(&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; team(team_id, name) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;india&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; team(team_id, name) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;australia&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; team(team_id, name) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;england&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; player(player_id NUMBER, name VARCHAR2(&lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;), team_id NUMBER, age NUMBER, &lt;span style=&#34;color:#66d9ef&#34;&gt;role&lt;/span&gt; VARCHAR2(&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; player(player_id, name, team_id, age, &lt;span style=&#34;color:#66d9ef&#34;&gt;role&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;sachin&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;42&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;batsman&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; player(player_id, name, team_id, age, &lt;span style=&#34;color:#66d9ef&#34;&gt;role&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;dhoni&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;34&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;wicketkeeper&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; player(player_id, name, team_id, age, &lt;span style=&#34;color:#66d9ef&#34;&gt;role&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;clarke&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;38&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;batsman&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; player(player_id, name, team_id, age, &lt;span style=&#34;color:#66d9ef&#34;&gt;role&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;rogers&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;40&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;batsman&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; player(player_id, name, team_id, age, &lt;span style=&#34;color:#66d9ef&#34;&gt;role&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;cook&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;31&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;batsman&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; player(player_id, name, team_id, age, &lt;span style=&#34;color:#66d9ef&#34;&gt;role&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;root&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;batsman&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; player_stat(player_stat_id NUMBER, player_id NUMBER, runs NUMBER, wickets NUMBER);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; player_stat(player_stat_id, player_id, runs, wickets) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;10000&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;300&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; player_stat(player_stat_id, player_id, runs, wickets) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5000&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; player_stat(player_stat_id, player_id, runs, wickets) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;7000&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; player_stat(player_stat_id, player_id, runs, wickets) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;40&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2000&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; player_stat(player_stat_id, player_id, runs, wickets) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;9000&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;A team can have multiple players. A player can have a statistic.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introduction to jdb</title>
      <link>https://sskelkar.github.io/post/introduction-to-jdb/</link>
      <pubDate>Mon, 11 Jan 2016 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/introduction-to-jdb/</guid>
      <description>&lt;p&gt;&lt;code&gt;jdb&lt;/code&gt; (Java Debugger) is a simple command-line debugger for Java classes that is provided as part of the JDK tools and utilities.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;jdb&lt;/code&gt; is based on a server-client model. While debugging, you have one JVM where the code is executed and another JVM where debugger runs. Either VMs can act as the server. There are two ways to start the debugger. You can directly fire up the debugger by giving the main class name with the jdb command.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Step by step guide to set up a service discovery environment</title>
      <link>https://sskelkar.github.io/post/service-discovery-setup-guide/</link>
      <pubDate>Thu, 17 Dec 2015 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/service-discovery-setup-guide/</guid>
      <description>&lt;p&gt;In a microservices environment we can run multiple instances of a service for resilience and scalability.&#xA;In a cloud environment these instances can go up and down arbitrarily.&#xA;So we need some kind of service discovery mechanism to keep track of running instances. When a service A needs to call a service B,&#xA;it asks for the address of any running instance of service B from the service discovery. The service discovery can also load balance the&#xA;incoming requests. In this post I demonstrate how to setup a service discovery environment with &lt;a href=&#34;https://github.com/Netflix/eureka&#34;&gt;Netflix Eureka&lt;/a&gt;.&#xA;When ever a service instance spins up, it registers itself with Eureka and sends regular heartbeats to confirm its availability.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to set up a local spring cloud config server</title>
      <link>https://sskelkar.github.io/post/how-to-set-up-a-local-spring-cloud-config-server/</link>
      <pubDate>Tue, 15 Dec 2015 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/how-to-set-up-a-local-spring-cloud-config-server/</guid>
      <description>&lt;p&gt;From the &lt;a href=&#34;https://spring.io/projects/spring-cloud-config&#34;&gt;official documentation&lt;/a&gt;,&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Spring Cloud Config provides server and client-side support for externalized configuration in a distributed system.&#xA;With the Config Server you have a central place to manage external properties for applications across all environments.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;steps-to-configure-config-server&#34;&gt;Steps to configure config server&lt;/h3&gt;&#xA;&lt;p&gt;a. Create a new Gradle project for the config server. In &lt;a href=&#34;https://start.spring.io/&#34;&gt;https://start.spring.io/&lt;/a&gt;, select the starters for config server.&lt;/p&gt;&#xA;&lt;p&gt;b. In your project, navigate to &lt;code&gt;src/main/resources&lt;/code&gt;. Rename the automatically generated &lt;code&gt;application.properties&lt;/code&gt; file to &lt;code&gt;bootstrap.yml&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building with Gradle</title>
      <link>https://sskelkar.github.io/post/building-with-gradle/</link>
      <pubDate>Sat, 24 Oct 2015 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/building-with-gradle/</guid>
      <description>&lt;p&gt;Gradle is a popular build tool to manage Java projects. Gradle’s build scripts are written in Groovy. The design of Gradle is aimed to be used as a language, not as a rigid framework. In this article, I want to give some basic idea about what a Gradle build script is composed of and some of the features provided by Gradle.&lt;/p&gt;&#xA;&lt;p&gt;Gradle is based upon two basic concepts: &lt;strong&gt;projects&lt;/strong&gt; and &lt;strong&gt;tasks&lt;/strong&gt;. A project can be your application or a library that might be used by a different project. A project doesn’t have to be something that you build, it could be something to be performed, like deploying an application. A task represents a particular piece of work that is done in a build process, like compiling some classes or running unit tests.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tail Recursion</title>
      <link>https://sskelkar.github.io/post/tail-recursion/</link>
      <pubDate>Wed, 26 Aug 2015 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/tail-recursion/</guid>
      <description>&lt;p&gt;Tail recursion is one of those functional programming concepts that are likely to be unknown to someone coming from a Java background, like me. I encountered this term while skimming through the first few pages of &lt;a href=&#34;https://mitpress.mit.edu/sicp/full-text/book/book.html&#34;&gt;SICP&lt;/a&gt;. After some quick R&amp;amp;D (i.e. googling), the following is a summary of what I have learnt.&lt;/p&gt;&#xA;&lt;p&gt;Before understanding tail recursion, we need to be familiar with the term &lt;strong&gt;tail call&lt;/strong&gt;. Simply put, if in a function definition, the last instruction before returning is a function call, then that function call is called a tail call.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How unit testing leads to improved code</title>
      <link>https://sskelkar.github.io/post/how-unit-testing-leads-to-improved-code/</link>
      <pubDate>Sun, 09 Aug 2015 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/how-unit-testing-leads-to-improved-code/</guid>
      <description>&lt;p&gt;In Test Driven Development, the purpose of unit testing is to help us design our classes and not just to validate the correctness of our code. In this article I want to demonstrate how unit testing forces us to write better code, with help of an example. I will use Mockito for mocking.&lt;/p&gt;&#xA;&lt;p&gt;First, let me define the problem domain I’ll be using in the example. Suppose we have an online booking portal where customers make reservations for travel or accommodation. Whenever a new reservation is created, its details are added to an XML which is kept at some location. Periodically, we need to fetch all the reservations that have been created in our system and send for printing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scheming with the Little Schemer</title>
      <link>https://sskelkar.github.io/post/scheming-with-the-little-schemer/</link>
      <pubDate>Wed, 05 Aug 2015 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/scheming-with-the-little-schemer/</guid>
      <description>&lt;p&gt;From a very long time, I have been an admirer of Lisp, an often praised but seldom used programming language. Common consensus about Lisp is that it is the kind of language you don’t need to know to get your daily tasks done, but any programmer worth his salt should be familiar with its concepts.&lt;/p&gt;&#xA;&lt;p&gt;For a beginner, perhaps the easiest way to get a taste of Lisp is to go through &lt;a href=&#34;https://mitpress.mit.edu/books/little-schemer&#34;&gt;The Little Schemer&lt;/a&gt;. As programming books go, this is quite an unusual one. Programmers like to say that they don’t really learn something new, unless they have written some code in it. The Little Schemer takes this idea up a notch. There are no formal definitions (but there are some &amp;ldquo;commandments&amp;rdquo;!) and very little explanation. The book is composed of nothing but (often humorously phrased) coding problems from beginning to end. You need to fire up your compiler and start writing code from the get go. The idea is to let the readers pickup functional programming concepts intuitively rather than teaching them explicitly. You can use any implementation of Lisp dialects like Scheme or Common Lisp to work out the problems. &lt;a href=&#34;http://www.gnu.org/software/mit-scheme/&#34;&gt;MIT/GNU Scheme&lt;/a&gt; worked fine for me.&lt;/p&gt;</description>
    </item>
    <item>
      <title>RIP Yahoo! Pipes</title>
      <link>https://sskelkar.github.io/post/rip-yahoo-pipes/</link>
      <pubDate>Thu, 23 Jul 2015 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/rip-yahoo-pipes/</guid>
      <description>&lt;p&gt;Yahoo has announced it will shut down its web mashup application Pipes on September of this year. Pipes was a pretty useful application to combine web feeds from multiple sources. With an easy to use GUI, you could add filters, modify the fields present in a feed and render the Pipe in RSS, JSON or Atom formats. So you could subscribe to a Pipe just like you would subscribe to any web feed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Closures in JavaScript</title>
      <link>https://sskelkar.github.io/post/closures-in-javascript/</link>
      <pubDate>Mon, 20 Jul 2015 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/closures-in-javascript/</guid>
      <description>&lt;p&gt;A good understanding of closures is a must-have skill for any JavaScript programmer. So let&amp;rsquo;s take a look at how they work with two simple examples.&lt;/p&gt;&#xA;&lt;p&gt;In JavaScript, functions are first class citizens. This means a function can be passed as an argument to another function, returned as the value from a function, assigned to a variable and stored in a data structure.&lt;/p&gt;&#xA;&lt;p&gt;We can even write a function within a function, and the inner function has access to the &lt;em&gt;environment&lt;/em&gt; within which it was created. A closure is a combination of a function and the environment in which it was created. This means an inner function can hold the scope of parent function even if the parent function has returned. Following example will make it a little clear.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dependency Injection in AngularJS 1.x</title>
      <link>https://sskelkar.github.io/post/dependency-injection-in-angularjs-1x/</link>
      <pubDate>Sun, 19 Jul 2015 00:00:00 +0530</pubDate><author>sojjwalkelkar@gmail.com (Sojjwal Kelkar)</author>
      <guid>https://sskelkar.github.io/post/dependency-injection-in-angularjs-1x/</guid>
      <description>&lt;p&gt;AngularJS Dependency Injection works like magic! You pass a service name in your controller constructor function and angular runtime promptly provides you with a suitable object. While this makes development process easier, it might be a little disconcerting if you don’t know what’s happening behind the scene. In this article, I will take a look at how angular DI works.&lt;/p&gt;&#xA;&lt;p&gt;In an Angular application, user can create different kinds of components like: directives, controllers, services etc. More often than not, a component has a dependency on other components. Let&amp;rsquo;s take a look at this sample controller:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
