<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Classic Logic</title><link>/</link><description>Recent content on Classic Logic</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 19 Jul 2026 18:09:29 +0530</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>Keyboards</title><link>/post/keyboards/</link><pubDate>Sun, 19 Jul 2026 18:09:29 +0530</pubDate><guid>/post/keyboards/</guid><description>&lt;p&gt;&lt;em&gt;(I&amp;rsquo;m not sponsored by or affiliated to any keyboard manufacturers).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The other day I happened to listen to a podcast where The subject of keyboards came up. The discussion was about whether they can put up with a terrible keyboard at work if they have a huge salary. Their answer depended on how terrible the keyboard is. The money itself was not the sole motivator. The discussion made me think about my own keyboards over the years.&lt;/p&gt;</description></item><item><title>Cancelling Netflix</title><link>/post/cancelling-netflix/</link><pubDate>Sun, 18 Jan 2026 22:27:01 +0530</pubDate><guid>/post/cancelling-netflix/</guid><description>&lt;p&gt;I cancelled my Netflix subscription a month ago. I was barely watching anything over the last few years. It made no financial sense to keep the subscription.&lt;/p&gt;
&lt;p&gt;I signed up for Netlfix in early 2020 with the mobile-only plan that was available here in India. It was not full-HD but that was okay. This plan costs around ₹199 (less than $3 in 2020) per month. That amount was not insignificant to me back then; it took me days to decide whether I should splurge on this. &lt;em&gt;But what is life without a little entertainment?&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Summarizing a meeting using WhisperX</title><link>/post/summarizing_a_meeting_using_whisperx/</link><pubDate>Tue, 01 Jul 2025 22:58:51 +0530</pubDate><guid>/post/summarizing_a_meeting_using_whisperx/</guid><description>&lt;p&gt;I was casually playing around with &lt;a href="https://github.com/m-bain/whisperX"&gt;WhisperX&lt;/a&gt; and wanted to quickly document how I summarized a meeting. This is a toy example just to demonstrate to myself how this works. There was no actual meeting. I pulled a publicly available non-serious meeting audio from the internet. Basically you need a .mp3 file; the exact audio format does not matter.&lt;/p&gt;
&lt;h3 id="1-transcribe-the-meeting-audio"&gt;1. Transcribe the meeting audio&lt;/h3&gt;
&lt;p&gt;In a dedicated python environment, I pip installed the whisperx:&lt;/p&gt;</description></item><item><title>In China, Macau, &amp; Hong Kong</title><link>/post/cmh_tour_2024/</link><pubDate>Sun, 05 May 2024 22:00:23 +0530</pubDate><guid>/post/cmh_tour_2024/</guid><description>&lt;p&gt;I recently returned from a sightseeing tour of China, Macau, and Hong Kong. I visited Beijing, Shanghai, Macau, and Hong Kong, in that order.&lt;/p&gt;
&lt;p&gt;As you&amp;rsquo;re probably aware, common internet things like Google (including search, GMail, Drive, Docs, Play Store, YouTube etc), WhatsApp, Facebook, Instagram, X, or anything else that you take for granted don&amp;rsquo;t work in China. Most VPNs are also blocked, although people have claimed varying degrees of success with them.&lt;/p&gt;</description></item><item><title>Email Management</title><link>/post/email-management/</link><pubDate>Sat, 09 Sep 2023 10:01:13 +0530</pubDate><guid>/post/email-management/</guid><description>&lt;p&gt;I use GMail for most (not all) of my email needs. I&amp;rsquo;m aware of the risks of getting spontaneously banned from it, but that&amp;rsquo;s not what I wanted to talk about today.&lt;/p&gt;
&lt;p&gt;In this post I&amp;rsquo;ll talk about how I have automated the handling of non-personal emails (ie., emails not sent by a human to me, such as newsletters, updates from various services etc).&lt;/p&gt;
&lt;p&gt;Initially I used to manually label the emails to make it easier to deal with later. After a while I started liberally using the mail-filter feature to automatically label the emails based on who it&amp;rsquo;s from and the keywords within the message. This removed the need for me to manually label the emails myself, and my inbox stayed a little more organized.&lt;/p&gt;</description></item><item><title>Japanese Restrooms</title><link>/post/japanese-restrooms/</link><pubDate>Wed, 29 Mar 2023 11:52:46 +0530</pubDate><guid>/post/japanese-restrooms/</guid><description>&lt;p&gt;Toilets in Japan are a contraption in itself. I literally dropped my jaws when I noticed the controls.&lt;/p&gt;
&lt;p&gt;&lt;img src="/images/japan_mar_apr_2023/restroom_controls.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;First up, the seat is heated! I&amp;rsquo;ve heard of heated and ventilated seats in cars but this is the first time I&amp;rsquo;m seeing a heated toilet-seats. I realized that heated toilet-seat is exactly what you need on a frigid morning!&lt;/p&gt;
&lt;p&gt;Next is the wiping mechanism. At the press of a button a &amp;ldquo;wand&amp;rdquo; extends and sprays water at your, well, hole. In addition to finer adjustments to pinpoint the exact location where you want the water to be sprayed, you can also adjust the pressure of the water. For the ladies there&amp;rsquo;s a button to spray water from the front. The whole thing just blew my mind.&lt;/p&gt;</description></item><item><title>In Japan</title><link>/post/in-japan/</link><pubDate>Tue, 28 Mar 2023 11:08:53 +0530</pubDate><guid>/post/in-japan/</guid><description>&lt;p&gt;&lt;img src="/images/japan_mar_apr_2023/nrt.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;Just landed at Narita International Airport in Tokyo, Japan &amp;#x1f1ef;&amp;#x1f1f5;.&lt;/p&gt;
&lt;p&gt;This is a family holiday trip. I&amp;rsquo;ll spend nearly two weeks here. In addition to Tokyo, I&amp;rsquo;ll also visit Mt. Fuji &amp;#x1f5fb; , Hiroshima, Osaka, Himeji, Kyoto, and Nara.&lt;/p&gt;
&lt;p&gt;Japan wasn&amp;rsquo;t ever in my bucket list so I&amp;rsquo;m pleasantly amused to find myself here. Looking forward to viewing the cherry blossoms &amp;#x1f338;.&lt;/p&gt;</description></item><item><title>MX Master 3 Recharge Log</title><link>/post/mx-master-3-recharge-log/</link><pubDate>Sat, 31 Dec 2022 17:28:21 +0530</pubDate><guid>/post/mx-master-3-recharge-log/</guid><description>&lt;p&gt;One of my programmer friend&amp;rsquo;s only regret after buying the MX Master 2 (he saved a few bucks by not going for the MX Master 3 &amp;ndash; that&amp;rsquo;s his choice) was that he didn&amp;rsquo;t buy it sooner. That, and &lt;a href="https://blog.bolt.io/logitech-mx-master-3-vs-2s/"&gt;this teardown article&lt;/a&gt; about the amount of engineering that went to it made me buy a Logitech MX Master 3 in August 2021.&lt;/p&gt;
&lt;p&gt;Praises have been sung for this fantastic piece of engineering over the years, so I&amp;rsquo;ll keep that to a minimum.&lt;/p&gt;</description></item><item><title>Netflix Asks Me to Buy New Device</title><link>/post/netflix-asks-me-to-buy-new-device/</link><pubDate>Sun, 12 Jun 2022 01:20:43 +0530</pubDate><guid>/post/netflix-asks-me-to-buy-new-device/</guid><description>&lt;p&gt;I have been a happy customer of Netflix for over two years even though I don&amp;rsquo;t even watch it enough to justify what I pay (and where I&amp;rsquo;m from Netflix is substantially more expensive than other streaming platforms). But I figured it&amp;rsquo;s fine.&lt;/p&gt;
&lt;p&gt;I usually watch Netflix via a ThinkPad running Linux, connected to an external monitor. &lt;em&gt;I&amp;rsquo;m old school.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Yesterday I decided to watch a movie that will soon be removed from Netflix. I signed into my Linux laptop and went to &lt;a href="https://www.netflix.com/"&gt;netflix.com&lt;/a&gt; (the page loaded fine), and from there clicked the login link.&lt;/p&gt;</description></item><item><title>Manual User Authentication in Laravel</title><link>/post/manual-user-authentication-in-laravel/</link><pubDate>Sun, 09 Jan 2022 15:31:13 +0530</pubDate><guid>/post/manual-user-authentication-in-laravel/</guid><description>&lt;p&gt;Laravel comes with a flexible user authentication mechanism which I highly recommend. Occasionally though, you have a good reason not to use what comes with Laravel and instead roll your own user authentication mechanism. The Laravel documentation does a pretty-good job of documenting what I&amp;rsquo;m about to do. This post is just a concrete example.&lt;/p&gt;
&lt;p&gt;This is roughly what I&amp;rsquo;ll be doing.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Define my own table for managing users, via a migration.&lt;/li&gt;
&lt;li&gt;Create an eloquent model for the users&lt;/li&gt;
&lt;li&gt;Modify users provider to use our model for users&lt;/li&gt;
&lt;li&gt;Implement signup, login, and logout&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Not that it matters, but I used sqlite3 database while doing this. Things should work exactly the same with Postgres and MySql.&lt;/p&gt;</description></item><item><title>DFS Subtlety</title><link>/post/dfs-subtlety/</link><pubDate>Tue, 29 Jun 2021 22:50:34 +0530</pubDate><guid>/post/dfs-subtlety/</guid><description>&lt;p&gt;I&amp;rsquo;ve been brushing up my algorithms knowledge during my free time. My preferred way to do this is working on &lt;a href="https://www3.cs.stonybrook.edu/~skiena/"&gt;Steven Skiena&amp;rsquo;s&lt;/a&gt; excellent &lt;a href="https://www.algorist.com/"&gt;Algorithm Design Manual&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Depth-first traversal of graphs have struck me as being subtle. In this post I&amp;rsquo;m jotting down the subtleties involved in discovering back-edges, so that I don&amp;rsquo;t have to re-think it every time.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a python implementation of the DFS routine using pseudocode from the book:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007020;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#06287e"&gt;depth_first_search&lt;/span&gt;(graph, vertex, parent, state):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; state[vertex] &lt;span style="color:#666"&gt;=&lt;/span&gt; VertexState&lt;span style="color:#666"&gt;.&lt;/span&gt;DISCOVERED
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process_vertex_early(vertex)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007020;font-weight:bold"&gt;for&lt;/span&gt; adj_vertex &lt;span style="color:#007020;font-weight:bold"&gt;in&lt;/span&gt; graph[vertex]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007020;font-weight:bold"&gt;if&lt;/span&gt; state[adj_vertex] &lt;span style="color:#666"&gt;!=&lt;/span&gt; VertexState&lt;span style="color:#666"&gt;.&lt;/span&gt;DISCOVERED:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parent[adj_vertex] &lt;span style="color:#666"&gt;=&lt;/span&gt; vertex
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process_edge(vertex, adj_vertex)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; depth_first_search(graph, adj_vertex, parent, state)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007020;font-weight:bold"&gt;elif&lt;/span&gt; state[adj_vertex] &lt;span style="color:#666"&gt;!=&lt;/span&gt; VertexState&lt;span style="color:#666"&gt;.&lt;/span&gt;PROCESSED &lt;span style="color:#007020;font-weight:bold"&gt;and&lt;/span&gt; parent[vertex] &lt;span style="color:#666"&gt;!=&lt;/span&gt; adj_vertex:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#60a0b0;font-style:italic"&gt;# adj_vertex has been discovered before&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007020"&gt;print&lt;/span&gt;(&lt;span style="color:#4070a0"&gt;&amp;#34;back-edge from &lt;/span&gt;&lt;span style="color:#70a0d0"&gt;{}&lt;/span&gt;&lt;span style="color:#4070a0"&gt; to &lt;/span&gt;&lt;span style="color:#70a0d0"&gt;{}&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#666"&gt;.&lt;/span&gt;format(vertex, adj_vertex))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process_edge(vertex, adj_vertex)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#60a0b0;font-style:italic"&gt;# we have processed all our adjacent vertices (if any)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#60a0b0;font-style:italic"&gt;# therefore we are processed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; process_vertex_late(vertex)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; state[vertex] &lt;span style="color:#666"&gt;=&lt;/span&gt; VertexState&lt;span style="color:#666"&gt;.&lt;/span&gt;PROCESSED&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;VertexState&lt;/code&gt; is an enum with &lt;code&gt;UNDISCOVERED&lt;/code&gt;, &lt;code&gt;DISCOVERED&lt;/code&gt;, and &lt;code&gt;PROCESSED&lt;/code&gt; states, denoting whether we have discovered and completely processed a vertex in our depth-first traversal&lt;/p&gt;</description></item><item><title>Book Review: Atomic Habits</title><link>/post/book-review-atomic-habits/</link><pubDate>Sat, 29 May 2021 22:15:25 +0530</pubDate><guid>/post/book-review-atomic-habits/</guid><description>&lt;p&gt;I normally shy away from self-help books because they rarely work for me, but I decided to give Atomic Habits by James Clear a shot because it was recommended to me over a year ago by an esteemed colleague of mine, and he was a living example of how the ideas from this book transformed his life.&lt;/p&gt;
&lt;p&gt;The first 50 pages present the core idea of Atomic Habits &amp;ndash; our habits and small changes (however insignificant they may be) can have a profound impact on our lives. The next 150+ pages talk about ways to create and stick with habits.&lt;/p&gt;</description></item><item><title>XKCD Post Counter</title><link>/post/xkcd-post-counter/</link><pubDate>Sun, 28 Mar 2021 15:34:06 +0530</pubDate><guid>/post/xkcd-post-counter/</guid><description>&lt;p&gt;It was a lazy Sunday afternoon and I was going through &lt;a href="https://xkcd.com/"&gt;XKCD&lt;/a&gt;. I wondered how many posts XKCD has in total. The neat thing about XKCD is that their URLs are clean, and all their new posts get a number that&amp;rsquo;s one higher than the previous post. The site itself is very minimal and straightforward; apparently no weird frameworks doing magic.&lt;/p&gt;
&lt;p&gt;I randomly typed &lt;a href="https://xkcd.com/5000/"&gt;https://xkcd.com/5000/&lt;/a&gt;, and it gave me a 404.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t want to randomly try a bunch of URLs to find out how many posts there are. So I decided to write a quick script that would do a binary search to find out how many posts there are. Binary search because a brute-force linear search of &amp;ndash; who knows, 4000? &amp;ndash; URLs would be inefficient both for me and whoever owns XKCD servers&lt;/p&gt;</description></item><item><title>Number Lock Brute Force</title><link>/post/number-lock-brute-force/</link><pubDate>Sun, 14 Mar 2021 11:00:02 +0530</pubDate><guid>/post/number-lock-brute-force/</guid><description>&lt;p&gt;While cleaning his wardrobe a family-member discovered his old bag with a built-in number lock. He forgot the number and was contemplating detroying the lock to open it.&lt;/p&gt;
&lt;p&gt;The lock had only two 10-digit combination; 100 possible numbers &amp;ndash; brute force is feasible!&lt;/p&gt;
&lt;p&gt;The lock opened on &lt;code&gt;55&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This lead me to contemplate the design of the bag and the number lock. Why would anyone design a number lock with just two digits? Anybody who steals the bag can find the correct permutation in less than 3 minutes &amp;ndash; blatant illusion of safety.&lt;/p&gt;</description></item><item><title>How to setup OpenProject via Vagrant</title><link>/post/openproject-setup-vagrant/</link><pubDate>Mon, 15 Feb 2021 08:33:22 +0530</pubDate><guid>/post/openproject-setup-vagrant/</guid><description>&lt;p&gt;I had to set up OpenProject locally on my machine for certain tinkering I&amp;rsquo;ve been doing.&lt;/p&gt;
&lt;p&gt;I chose to install OpenProject inside a Vagrant box to keep my native machine clean. Went along with &lt;a href="https://app.vagrantup.com/hashicorp/boxes/bionic64"&gt;hashicorp&amp;rsquo;s Ubuntu 18.04 LTS&lt;/a&gt; box rather than an official release because the former was already in my machine which meant I did not have to do any additional downloads.&lt;/p&gt;
&lt;p&gt;Installation and configuration of OpenProject was straightforward thanks to their excellent documentation &lt;a href="https://docs.openproject.org/installation-and-operations/installation/packaged/#install-openproject-with-debrpm-packages"&gt;here.&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Laravel Artisan Command to Create Custom Classes</title><link>/post/laravel-artisan-custom-class-creation/</link><pubDate>Sat, 06 Feb 2021 11:06:40 +0530</pubDate><guid>/post/laravel-artisan-custom-class-creation/</guid><description>&lt;p&gt;Here are the steps to create an artisan command that will generate custom classes and interfaces that follow a pre-determined template.&lt;/p&gt;
&lt;p&gt;For Laravel projects I write utility classes and interfaces to abstract away the logic; these files go into subdirectories within &lt;code&gt;app/Utilities/&lt;/code&gt; (of course it can be anything). Let&amp;rsquo;s say you want to write &lt;code&gt;FooUtility&lt;/code&gt; for something. My usual workflow is this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a directory &lt;code&gt;Foo&lt;/code&gt; inside &lt;code&gt;app/Utilities&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create two files &lt;code&gt;FooUtility.php&lt;/code&gt; and &lt;code&gt;FooUtilityInterface.php&lt;/code&gt; inside &lt;code&gt;app/Utilities/Foo/&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Vagrant Hiccups</title><link>/post/vagrant-hiccups/</link><pubDate>Sun, 31 Jan 2021 15:50:06 +0530</pubDate><guid>/post/vagrant-hiccups/</guid><description>&lt;p&gt;&lt;em&gt;(This is not a criticism against Vagrant; it has been a useful tool which I would continue to use it and encourage others to use as well.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This post is a note of the minor hiccups I faced while setting up Vagrant, and the steps I took to solve them, so that I can refer this later if required. This will be a living-document which I&amp;rsquo;m hoping I would have to update only rarely.&lt;/p&gt;</description></item><item><title>7000 Years From Now</title><link>/post/7000-years/</link><pubDate>Thu, 21 Jan 2021 23:24:20 +0530</pubDate><guid>/post/7000-years/</guid><description>&lt;p&gt;I don&amp;rsquo;t remember how I got there, but while having a virtual conversation with friends in a Signal group, I wondered how life in the year 7534 would be like. Will there be cars? Will people be teleporting instead? Would America still exist? Would people have conquered other planets? Or would the entire earth as we know it be destroyed by then?&lt;/p&gt;
&lt;p&gt;As I&amp;rsquo;m typing this, I realize 7534 is only a little over 5500 years from now (2021 + 5500 + change) instead of 7000, but I won&amp;rsquo;t bother changing the title of this post or anything. And for some reason, 5500 doesn&amp;rsquo;t seem as far off as 7000. That&amp;rsquo;s probably because it isn&amp;rsquo;t.&lt;/p&gt;</description></item><item><title>Working with Homestead</title><link>/post/working-with-homestead/</link><pubDate>Sat, 19 Sep 2020 08:17:29 +0530</pubDate><guid>/post/working-with-homestead/</guid><description>&lt;p&gt;&lt;a href="https://laravel.com/docs/8.x/homestead"&gt;Homestead&lt;/a&gt; is a convenient way to work with &lt;a href="https://laravel.com/"&gt;Laravel&lt;/a&gt;. It keeps the native OS installation uncluttered with packages such as MySQL, Apache, Laravel, Composer, and so forth.&lt;/p&gt;
&lt;p&gt;This post is a quick-start to set up a new Laravel project using Homestead. It covers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mapping project directory from your host machine to your virtual machine&lt;/li&gt;
&lt;li&gt;Creating a new Laravel project&lt;/li&gt;
&lt;li&gt;Making the Laravel project accessible from your browser&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Detailed steps to set up Homestead is documented extensively in the &lt;a href="https://laravel.com/docs/8.x/homestead" title="Laravel 8 documentation on Homestead"&gt;official docs&lt;/a&gt;. I recommended getting the bigger picture first.&lt;/p&gt;</description></item><item><title>Reboot</title><link>/post/reboot/</link><pubDate>Tue, 08 Sep 2020 21:42:21 +0530</pubDate><guid>/post/reboot/</guid><description>&lt;p&gt;It&amp;rsquo;s been unacceptably long since I last blogged. I won&amp;rsquo;t even bother making up an explanation.&lt;/p&gt;
&lt;p&gt;However, I&amp;rsquo;m planning to get blogging again.&lt;/p&gt;
&lt;p&gt;By now I have forgotten how Hugo worked. So I&amp;rsquo;m going to have to get up to speed on that. This post is actually just to see if the whole build pipeline for this hugo site still works. Honestly at this point I have no idea how that works.&lt;/p&gt;</description></item><item><title>Build OpenGL Projects Using Gradle</title><link>/post/build-opengl-projects-using-gradle/</link><pubDate>Fri, 23 Nov 2018 22:53:50 -0700</pubDate><guid>/post/build-opengl-projects-using-gradle/</guid><description>&lt;p&gt;This article is primarily written as a note to self so that I can refer to this years later if the need arises.&lt;/p&gt;
&lt;p&gt;Also, this ain&amp;rsquo;t a tutorial on OpenGL or &lt;a href="https://gradle.org/"&gt;Gradle&lt;/a&gt;. I&amp;rsquo;m an expert at neither. I&amp;rsquo;m just documenting what worked for me.&lt;/p&gt;
&lt;p&gt;This article assumes you have some familiarity with OpenGL.&lt;/p&gt;
&lt;p&gt;There are excellent resources for learning more about both of these, such as the &lt;a href="https://www.khronos.org/opengl/wiki"&gt;OpenGL Wiki&lt;/a&gt; for OpenGL, and &lt;a href="https://gradle.org/guides/"&gt;official Gradle tutorials&lt;/a&gt; for Gradle.&lt;/p&gt;</description></item><item><title>Open Source: Contributing Back to the Community</title><link>/post/firefox-focus-new-tab/</link><pubDate>Fri, 09 Nov 2018 10:33:00 -0700</pubDate><guid>/post/firefox-focus-new-tab/</guid><description>&lt;p&gt;It&amp;rsquo;s no secret to people who know me personally that I&amp;rsquo;m an open-source enthusiast. However, I haven&amp;rsquo;t been contributing back to the community as much as I should have.&lt;/p&gt;
&lt;p&gt;Till now, my focus has been on fixing bugs in existing programs. It all started when I tried &lt;a href="https://kernelnewbies.org/FirstKernelPatch"&gt;contributing to the Linux kernel&lt;/a&gt; several years ago. In retrospect, I was biting way more than I could chew. It took me several days of carefully reading through the instructions and code before I was able to submit my first patch. Imagine my thrill when I received an email from &lt;a href="https://en.wikipedia.org/wiki/Greg_Kroah-Hartman"&gt;Greg Kroah-Hartman&lt;/a&gt; himself saying that my patch has been accepted!&lt;/p&gt;</description></item><item><title>XV6 System Call</title><link>/post/xv6-system-call/</link><pubDate>Tue, 16 Oct 2018 12:01:18 -0600</pubDate><guid>/post/xv6-system-call/</guid><description>&lt;p&gt;&lt;a href="https://github.com/mit-pdos/xv6-public"&gt;XV6&lt;/a&gt; is a UNIX-like operating system that&amp;rsquo;s used in my OS class (and other OS classes across the world) for pedagogical purposes.&lt;/p&gt;
&lt;p&gt;Creating system calls in XV6 is something I do frequently as part of my assignments, and in this article I&amp;rsquo;m documenting how to do that.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s say I want to implement a system call called &lt;code&gt;square&lt;/code&gt; that returns the square of of its &lt;code&gt;int&lt;/code&gt; argument. (This is just a toy example to show you how the plumbing works; system calls are overkill to find the square of a number).&lt;/p&gt;</description></item><item><title>Things You Should Know About Mobile Networks</title><link>/post/mobile-networks/</link><pubDate>Fri, 07 Sep 2018 20:03:59 -0600</pubDate><guid>/post/mobile-networks/</guid><description>&lt;p&gt;Here are some things about mobile networks that I learnt the hard way.&lt;/p&gt;
&lt;p&gt;While I was in India during the summer, I purchased the &lt;a href="https://www.nokia.com/en_int/phones/nokia-6"&gt;Nokia 6.1&lt;/a&gt;* smartphone. It is an &lt;a href="https://www.android.com/one/"&gt;Android One&lt;/a&gt; device.&lt;/p&gt;
&lt;p&gt;In India, your phone and your carrier are two separate independent things. Unlocked phones are the default there. That means, to change your phone, get yourself a new phone and put in your old SIM card. To change your SIM card, get a new SIM card and put it in your old phone. Trivial, right?!&lt;/p&gt;</description></item><item><title>Mozilla 101</title><link>/post/mozilla-101/</link><pubDate>Tue, 17 Jul 2018 22:04:11 +0530</pubDate><guid>/post/mozilla-101/</guid><description>&lt;p&gt;It&amp;rsquo;s been a while since I&amp;rsquo;ve started contributing code to the Mozilla codebase.&lt;/p&gt;
&lt;p&gt;Because I frequently nuke and re-install everything on my primary computer (due to other experiments that have nothing to do with Mozilla), I&amp;rsquo;ve decided to write myself a reference I can quickly refer to when setting up the local version of Firefox. All of the following were performed on Debian-based distros.&lt;/p&gt;
&lt;p&gt;I plan to make this a living document; expect changes here as I learn more.&lt;/p&gt;</description></item><item><title>Moving to Hugo</title><link>/post/moving-to-hugo/</link><pubDate>Thu, 05 Jul 2018 15:33:29 +0530</pubDate><guid>/post/moving-to-hugo/</guid><description>&lt;p&gt;I hereby announce that I have moved from &lt;a href="https://jekyllrb.com/"&gt;Jekyll&lt;/a&gt; to &lt;a href="https://gohugo.io/"&gt;Hugo.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I originally moved to Jekyll from Wordpress in the summer of 2015 because static sites made sense for my specific use-case. Also, WordPress provided more features than what I need, and because I wasn&amp;rsquo;t using a self-hosted version, I felt like I couldn&amp;rsquo;t get the ultimate control that I wanted.&lt;/p&gt;
&lt;p&gt;However, to take full advantage of Jekyll and customize it the way I want, I had to know ruby &amp;ndash; a language I wasn&amp;rsquo;t keen on learning; it&amp;rsquo;s a great language, but I&amp;rsquo;d rather spend my time learning haskell or lisp rather than ruby.&lt;/p&gt;</description></item><item><title>About</title><link>/about/</link><pubDate>Wed, 04 Jul 2018 13:11:05 +0530</pubDate><guid>/about/</guid><description>&lt;p&gt;Hey,&lt;/p&gt;
&lt;p&gt;My name is Arjun and I&amp;rsquo;m a software developer in Kochi, India.&lt;/p&gt;
&lt;p&gt;Professionally I work mostly as a web developer doing PHP and Laravel, but I have knowledge of other areas of the tech-stack as well. I sometimes contribute to open-source projects, such as Mozilla Firefox.&lt;/p&gt;
&lt;p&gt;Recently I&amp;rsquo;ve been experimenting with functional programming languages such as Haskell, StandardML, and Elm. Because it requires a different mindset than what I&amp;rsquo;m used to, I find the learning experience a refreshing challenge.&lt;/p&gt;</description></item><item><title>Desktop Entry for Matlab</title><link>/post/2018-01-16-desktop-entry-for-matlab/</link><pubDate>Tue, 16 Jan 2018 18:50:10 -0700</pubDate><guid>/post/2018-01-16-desktop-entry-for-matlab/</guid><description>&lt;p&gt;&lt;em&gt;This article is not about Matlab itself; I just used it as a test example to demonstrate how you can create a desktop entry in Gnome.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;However, if you are interested in using Matlab, I highly insist you try &lt;a href="https://www.gnu.org/software/octave/"&gt;GNU Octave&lt;/a&gt;. The syntax is highly compatible with Matlab, and I was able to do on Octave everything I was supposed to do on Matlab, without any hassles whatsoever. Octave is free and open-source, and you&amp;rsquo;ve got nothing to loose by trying it out.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Automatic Markdown Table Generation</title><link>/post/2017-12-03-automatic-markdown-table-generation/</link><pubDate>Sun, 03 Dec 2017 12:00:18 -0700</pubDate><guid>/post/2017-12-03-automatic-markdown-table-generation/</guid><description>&lt;p&gt;Because I had nothing better to do on a Saturday night, I decided to create a list of books I&amp;rsquo;ve ever read, to post on my personal blog. &lt;em&gt;I know what you&amp;rsquo;re thinking.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I wanted to include a sequence number, title of the book, and its author. The title would also double up as a link to its amazon page. Because this is a structured data, a table made more sense than an ordered (or unordered) list of books.&lt;/p&gt;</description></item><item><title>Capture Packets Using T-Shark</title><link>/post/2017-11-27-capture-packets-using-t-shark/</link><pubDate>Mon, 27 Nov 2017 15:34:10 -0700</pubDate><guid>/post/2017-11-27-capture-packets-using-t-shark/</guid><description>&lt;h4 id="disclaimer"&gt;DISCLAIMER&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Snooping on real internet traffic is illegal in most countries. It is your responsibility to follow the appropriate rules of your locality. I cannot be held responsible if you do something wrong.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I did the following activities from a controlled virtual environment.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Did you know that you can poke around network traffic using tshark? According to the &lt;a href="https://www.wireshark.org/docs/man-pages/tshark.html"&gt;official tshark man page&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;TShark is a network protocol analyzer. It lets you capture packet data from a live network, or read packets from a previously saved capture file, either printing a decoded form of those packets to the standard output or writing the packets to a file. TShark&amp;rsquo;s native capture file format is pcap format, which is also the format used by tcpdump and various other tools.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>First Impressions with Go</title><link>/post/2017-10-19-first-impressions-with-go/</link><pubDate>Thu, 19 Oct 2017 16:20:56 -0600</pubDate><guid>/post/2017-10-19-first-impressions-with-go/</guid><description>&lt;p&gt;The upcoming assignments for my networks class require fair amounts of socket programming. C is a double edged sword. Java is too verbose for my tastes. Python, despite all its beauty, is slow. And Haskell is not allowed for the networks assignments.&lt;/p&gt;
&lt;p&gt;It was time to pick up a new language.&lt;/p&gt;
&lt;p&gt;After contemplating on many alternatives, I finally settled on &lt;a href="https://golang.org/"&gt;Go (aka golang).&lt;/a&gt; It is&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simple to learn&lt;/li&gt;
&lt;li&gt;Statically typed&lt;/li&gt;
&lt;li&gt;Compiled&lt;/li&gt;
&lt;li&gt;Faster than most other languages&lt;/li&gt;
&lt;li&gt;Almost purpose-built for systems and networks programming&lt;/li&gt;
&lt;li&gt;Has excellent support for concurrency&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Go is a winner for my purposes.&lt;/p&gt;</description></item><item><title>Tree Implementation in Haskell</title><link>/post/2017-10-07-tree-implementation-in-haskell/</link><pubDate>Sat, 07 Oct 2017 16:36:38 -0600</pubDate><guid>/post/2017-10-07-tree-implementation-in-haskell/</guid><description>&lt;p&gt;Let&amp;rsquo;s implement a binary tree in Haskell.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-haskell" data-lang="haskell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007020;font-weight:bold"&gt;data&lt;/span&gt; &lt;span style="color:#902000"&gt;Tree&lt;/span&gt; a &lt;span style="color:#007020;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#902000"&gt;Leaf&lt;/span&gt; a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#666"&gt;|&lt;/span&gt; &lt;span style="color:#902000"&gt;Node&lt;/span&gt; (&lt;span style="color:#902000"&gt;Tree&lt;/span&gt; a) (&lt;span style="color:#902000"&gt;Tree&lt;/span&gt; a)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#007020;font-weight:bold"&gt;deriving&lt;/span&gt; (&lt;span style="color:#902000"&gt;Show&lt;/span&gt;, &lt;span style="color:#902000"&gt;Eq&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The above defines a &lt;code&gt;Tree&lt;/code&gt; that takes a value of type &lt;code&gt;a&lt;/code&gt;. Because we have not explicitly specified any datatype (such as an &lt;code&gt;Int&lt;/code&gt; or a &lt;code&gt;[Char]&lt;/code&gt;, for instance) and instead defined it in terms of &lt;code&gt;a&lt;/code&gt; which can stand for any type, this tree is capable of handling values of any datatype.&lt;/p&gt;</description></item><item><title>UNM New Arrival Guide</title><link>/unm-guide/</link><pubDate>Mon, 18 Sep 2017 13:02:57 +0530</pubDate><guid>/unm-guide/</guid><description>&lt;p&gt;&lt;strong&gt;Disclaimer: This is UNOFFICIAL. I&amp;rsquo;m just documenting how things were like for me. It may have changed. I cannot be held responsible if anything goes wrong after following this post.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(An unofficial guide for students from &lt;a href="https://www.amrita.edu/"&gt;Amrita Vishwa Vidyapeetham&lt;/a&gt; planning to study at the &lt;a href="https://www.unm.edu/"&gt;University of New Mexico&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve been admitted to UNM, congratulations!&lt;/p&gt;
&lt;p&gt;I studied at UNM twice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;as an undergrad exchange student during Spring 2016&lt;/li&gt;
&lt;li&gt;as a graduate student (MS) in Computer Science (CS) from Spring 2017 to the end of Fall 2018.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="/images/unm-guide/duck_pond.jpg" alt="Duck Pond" title="Duck pond"&gt;
&lt;em&gt;The &lt;a href="https://campushistory.unm.edu/essays/duck-pond"&gt;Duck Pond&lt;/a&gt; at UNM on a bright sunny day. It&amp;rsquo;s much larger than it seems in the photo.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Using JUnit with Eclipse</title><link>/post/2017-09-03-using-junit-with-eclipse/</link><pubDate>Sun, 03 Sep 2017 00:00:00 +0000</pubDate><guid>/post/2017-09-03-using-junit-with-eclipse/</guid><description>&lt;p&gt;Recently, I set up &lt;a href="https://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;* to work with &lt;a href="http://junit.org"&gt;JUnit&lt;/a&gt;, and it took more effort than I anticipated. I&amp;rsquo;m recording the steps here so that I &amp;ndash; or anybody else &amp;ndash; can refer to it later if the need arises.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the environment I used:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;OS&lt;/td&gt;
					&lt;td&gt;Debian 9 64-bit&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="http://openjdk.java.net/install/"&gt;JDK&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;openjdk version &amp;ldquo;1.8.0_141&amp;rdquo;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="https://www.eclipse.org/downloads/"&gt;Eclipse&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Oxygen Release (4.7.0)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="http://bit.ly/My9IXz"&gt;JUnit&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;version 4.12&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="http://bit.ly/1gbl25b"&gt;Hamcrest&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;version 1.3&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The above packages were at their latest versions when I wrote this article.&lt;/p&gt;</description></item><item><title>Introducing JekPost</title><link>/post/2017-08-14-introducing-jekpost/</link><pubDate>Mon, 14 Aug 2017 00:00:00 +0000</pubDate><guid>/post/2017-08-14-introducing-jekpost/</guid><description>&lt;p&gt;As much as I love &lt;a href="https://jekyllrb.com/"&gt;jekyll&lt;/a&gt;, one thing I found really annoying about it was the post creation ritual itself. You had to name the file a certain way and type in a bunch of metadata at its top for the whole thing to work. Cumbersome and repetitive.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s when I decided to write a script to simplify the post creation process.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s actually been a year since I wrote JekPost. It was something I wrote for myself, and had not really thought about sharing it with anybody. There were some minor nuances, but they were things I could live with. After a while I decided that I might as well upload the package to &lt;a href="https://pypi.python.org/pypi"&gt;pypi&lt;/a&gt;, which in itself was a learning experience.&lt;/p&gt;</description></item><item><title>At the Google Play App Excellence Summit</title><link>/post/2017-08-04-app-excellence-summit-india/</link><pubDate>Fri, 04 Aug 2017 00:00:00 +0000</pubDate><guid>/post/2017-08-04-app-excellence-summit-india/</guid><description>&lt;p&gt;&lt;a href="https://events.withgoogle.com/made-for-india/"&gt;Google Play App Excellence Summit&lt;/a&gt; was held on August 1st at Bengaluru, India. Entry to the program was free if you were invited (only invitees were allowed to attend).&lt;/p&gt;
&lt;p&gt;I arrived at the venue &amp;ndash; &lt;a href="http://www.sheratongrandbangalore.com/"&gt;Sheraton Grand Hotel&lt;/a&gt; &amp;ndash; by 8:30 am. The place was already crowded with enthusiastic developers from all over the country despite me arriving an hour ahead of schedule. Breakfast was included; too bad I wasn&amp;rsquo;t very hungry.&lt;/p&gt;</description></item><item><title>Introducing Snap Event</title><link>/post/snapevent/</link><pubDate>Tue, 23 May 2017 00:00:00 +0000</pubDate><guid>/post/snapevent/</guid><description>&lt;p&gt;My first Android app &lt;a href="https://play.google.com/store/apps/details?id=io.github.arjunkrishnababu96.snapevent"&gt;&lt;em&gt;Snap Event&lt;/em&gt;&lt;/a&gt; was published to the Google Play Store a few days ago.&lt;/p&gt;
&lt;p&gt;Snap Event creates calendar events from photographs of the event&amp;rsquo;s poster.&lt;/p&gt;
&lt;p&gt;The app is by no means perfect, but it&amp;rsquo;s functional and is a proof of concept that the idea works.&lt;/p&gt;
&lt;h3 id="motivation"&gt;Motivation&lt;/h3&gt;
&lt;p&gt;People say the best way to learn a new programming language or a framework is to do a project with it. Sure you need some familiarity with the basics of whatever it is that you&amp;rsquo;re trying to learn, but past that stage projects are the way to go.&lt;/p&gt;</description></item><item><title>A Case for Smart Washing Machines</title><link>/post/2017-04-08-a-case-for-smart-washing-machines/</link><pubDate>Sat, 08 Apr 2017 00:00:00 +0000</pubDate><guid>/post/2017-04-08-a-case-for-smart-washing-machines/</guid><description>&lt;p&gt;The residence hall I live in offers washing and drying facilities to wash and dry our clothes.&lt;/p&gt;
&lt;p&gt;There is one dedicated room for the washers and dryers. In the rest of this article, I will be calling this room the &amp;ldquo;laundry-room&amp;rdquo;. The washing and drying takes approximately 30 and 45 minutes respectively, depending on the mode you choose. Of course, once the washing is done, you have to manually move your clothes from the washer to the dryer.&lt;/p&gt;</description></item><item><title>Getting a US student visa</title><link>/post/getting-a-us-student-visa/</link><pubDate>Thu, 01 Dec 2016 15:41:51 +0530</pubDate><guid>/post/getting-a-us-student-visa/</guid><description>&lt;p&gt;Just wanted to write down the process of obtaining a US visa. None of this is legal advice. I&amp;rsquo;m just posting my own experience. Consult the official US govt websites for most accurate and uptodate information about visas.&lt;/p&gt;
&lt;p&gt;People seem to have wrong ideas about the whole process and what happens at the consulate. And for student visa atleast, there is no need to hire a consultant or agent.&lt;/p&gt;
&lt;p&gt;I did it twice so far &amp;ndash; once for an exchange visa (J1) and the second time for a student visa (F1). So I can only talk from such a perspective; the process is probably different for business/tourist visas, and definitely different for H1B, L1 etc. I applied from India; the process might be different for people in other countries.&lt;/p&gt;</description></item><item><title>Send Emails Using Code</title><link>/post/send-emails-using-code/</link><pubDate>Wed, 28 Sep 2016 00:00:00 +0000</pubDate><guid>/post/send-emails-using-code/</guid><description>&lt;p&gt;Figuring out how to send emails using code is something that has been in my to-do list for sometime. And well, it has finally made it to the top of the stack, and here I am tackling the issue.&lt;/p&gt;
&lt;p&gt;Turns out, sending emails using code is pretty easy and straightforward. &lt;em&gt;Yay!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Please do note upfront that this was more of a learning exercise for me to learn how to fire off a bunch of emails to a bunch of people; there might probably be more straightforward methods to do the same thing in a production environment.&lt;/p&gt;</description></item><item><title>Fedora 24 Impressions</title><link>/post/2016-07-16-fedora-24-impressions/</link><pubDate>Sat, 16 Jul 2016 00:00:00 +0000</pubDate><guid>/post/2016-07-16-fedora-24-impressions/</guid><description>&lt;p&gt;Though it hasn&amp;rsquo;t been long since I&amp;rsquo;ve switched to Fedora as my everyday OS, I&amp;rsquo;ve become a huge fan of it.&lt;/p&gt;
&lt;p&gt;Ubuntu was consistently giving me problems (like, freezes for instance), and that&amp;rsquo;s when I had decided to make the switch. (However, I reckon the problems I&amp;rsquo;ve been facing with Ubuntu are more of a Unity problem than an Ubuntu problem).&lt;/p&gt;
&lt;p&gt;Never had any deal-breaking issues with Fedora.&lt;/p&gt;
&lt;p&gt;And then, there are some nice touches like the small box that pops up when you create or rename a folder. Polished, though not quite in the leagues of the Macs.&lt;/p&gt;</description></item><item><title>The Hacker Way to Download an Entire Tree of Webpages</title><link>/post/2016-04-17-hacker-way-to-download-an-entire-webpage-tree/</link><pubDate>Sun, 17 Apr 2016 00:00:00 +0000</pubDate><guid>/post/2016-04-17-hacker-way-to-download-an-entire-webpage-tree/</guid><description>&lt;p&gt;&lt;em&gt;(&amp;quot;&lt;a href="http://catb.org/jargon/html/H/hacker.html"&gt;Hacker&lt;/a&gt;&amp;quot; as defined in &lt;a href="http://catb.org/jargon/html/"&gt;The Jargon File&lt;/a&gt;).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Have you ever wanted to download an entire tree of webpages onto your computer so that you can check it out later, offline?&lt;/p&gt;
&lt;p&gt;Why might you want to do this? Let&amp;rsquo;s say you&amp;rsquo;re traveling on an airplane without an internet connection, and you as a developer want to work on that Android app you were developing back when you were in the ground.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a rather proficient programmer, you might as well go work with it.&lt;/p&gt;</description></item><item><title>Getting Started With GraphLab Create</title><link>/post/2016-04-04-getting-started-with-graphlab-create/</link><pubDate>Mon, 04 Apr 2016 00:00:00 +0000</pubDate><guid>/post/2016-04-04-getting-started-with-graphlab-create/</guid><description>&lt;p&gt;As part of a &lt;a href="https://www.coursera.org/specializations/machine-learning"&gt;machine learning course&lt;/a&gt; I&amp;rsquo;ve been taking on &lt;a href="https://www.coursera.org/"&gt;Coursera&lt;/a&gt;, I had to get some packages installed.&lt;/p&gt;
&lt;p&gt;Since I couldn&amp;rsquo;t find a one-stop webpage covering all the instructions, I had to go back and forth multiple webpages. And then, after I&amp;rsquo;ve installed the whole thing, it took me a while to figure out how to run it.&lt;/p&gt;
&lt;p&gt;And so, in this single post, I try to explain everything to you.&lt;/p&gt;</description></item><item><title>Keyboard Shortcuts To Toggle WiFi</title><link>/post/2016-03-06-keyboard-shortcuts-to-toggle-wifi/</link><pubDate>Sun, 06 Mar 2016 00:00:00 +0000</pubDate><guid>/post/2016-03-06-keyboard-shortcuts-to-toggle-wifi/</guid><description>&lt;p&gt;Being developers, nearly all of us prefer minimal use of the mouse (or touchpad).&lt;/p&gt;
&lt;p&gt;Now I don&amp;rsquo;t know about you, but there are cases when I don&amp;rsquo;t frequently have to browse the internet, and during those times I prefer to turn off my WiFi. &lt;em&gt;At the very least, it would save some power.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;But then, there are some cases when I just have to momentarily turn on my WiFi, only to turn it back off after a brief while. And, I kind of figured it&amp;rsquo;s somewhat annoying to drag around the mouse to the corner of the screen to turn the WiFi on. To me, using a mouse for somewhat mundane tasks like turn ON/OFF wifi seems kind of lame.&lt;/p&gt;</description></item><item><title>In America</title><link>/post/in-america/</link><pubDate>Wed, 13 Jan 2016 19:10:18 +0530</pubDate><guid>/post/in-america/</guid><description>&lt;p&gt;&lt;img src="/images/seatac_1.jpg" alt="blank Chrome page"&gt;&lt;/p&gt;
&lt;p&gt;Just landed at Seattle-Tacoma International Airport, in Seattle, USA.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll be spending my upcoming semester here in America as part of a student-exchange program; very excited! Just 5 months ago, America wasn&amp;rsquo;t even in my radar, and now here I am!&lt;/p&gt;</description></item><item><title>Connecting to MySql Database from VisualStudio</title><link>/post/2015-12-14-connecting-to-mysql-database-from-visual-studio/</link><pubDate>Mon, 14 Dec 2015 00:00:00 +0000</pubDate><guid>/post/2015-12-14-connecting-to-mysql-database-from-visual-studio/</guid><description>&lt;p&gt;As I discovered the hard way, setting up Visual Studio to connect to a MySql database can be tricky. And becuase I had to go through pages and pages of &lt;a href="http://stackoverflow.com/"&gt;StackOverflow&lt;/a&gt; for what turned out to be a trivial solution in retrospect, I figured I&amp;rsquo;d pen down the whole process.&lt;/p&gt;
&lt;p&gt;Note that, I had Windows 8.1 installed as a VirtualBox guest OS in Linux.&lt;/p&gt;
&lt;h3 id="install-visual-studio-if-you-havent-already"&gt;Install Visual Studio (if you haven&amp;rsquo;t already)&lt;/h3&gt;
&lt;p&gt;Before you do anything else, get your copy of Visual Studio from the &lt;a href="https://www.visualstudio.com/downloads/download-visual-studio-vs"&gt;official website.&lt;/a&gt; The exact version you want to use depends on what all you plan to do with Visual Studio. Keep in mind that not all versions of Visual Studio are free, and some are available for free only for a limited trial period. As for me, I got myself the &lt;a href="https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx"&gt;Visual Studio Community 2013&lt;/a&gt; &amp;ndash; ticked all the right boxes. &lt;em&gt;I didn&amp;rsquo;t go for the latest version as it was giving me minor hiccups.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Connecting to BluetoothDevice using phone's native settings</title><link>/post/2015-10-20-connecting-to-bluetoothdevice/</link><pubDate>Tue, 20 Oct 2015 00:00:00 +0000</pubDate><guid>/post/2015-10-20-connecting-to-bluetoothdevice/</guid><description>&lt;p&gt;It took me more than an acceptable amount of time to figure out how to make use of an Android phone&amp;rsquo;s built-in connectivity program to connect to a remote bluetooth device, and then get the reference of that &lt;a href="http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html"&gt;BluetoothDevice&lt;/a&gt; in your app (in your MainActivity, for instance). And I&amp;rsquo;m kind of guessing I wasn&amp;rsquo;t the only on earth trying to do the same thing.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://developer.android.com/guide/topics/connectivity/bluetooth.html"&gt;official documentation on Bluetooth&lt;/a&gt; &amp;ndash; while being pretty good &amp;ndash; shows you how to reinvent the wheel and implement your own bluetooth-settings app rather than invoking the existing bluetooth settings which comes with nearly every Android phone out there.&lt;/p&gt;</description></item><item><title>Rebooting Fedora!</title><link>/post/2015-09-12-rebooting-fedora/</link><pubDate>Sat, 12 Sep 2015 00:00:00 +0000</pubDate><guid>/post/2015-09-12-rebooting-fedora/</guid><description>&lt;p&gt;Remember when I told you about my brief experience with the Fedora? Or perhaps you don&amp;rsquo;t, coz I had written about that in my &lt;a href="https://classiccoder.wordpress.com/2015/06/06/ubuntu-to-fedora-and-back-to-ubuntu/"&gt;older blog&lt;/a&gt;.
Anyways, to put a long story short, I had switched from a solid Ubuntu installation to Fedora 22, only to switch back to my good old Trusty Tahr in less than 72 hours!&lt;/p&gt;
&lt;p&gt;Fedora was just too bleeding edge for me!&lt;/p&gt;
&lt;p&gt;However, I&amp;rsquo;m proud to say that I&amp;rsquo;ve switched back to Fedora! Or to be more precise, I&amp;rsquo;ve dual-booted my laptop with Ubuntu and Fedora.
The reasons for it are multifold; one thing which I did notice during my one-night stand with this bleeding edge beauty is its performance. A very noticeable bump from what already seemed like snappy performance in Ubuntu (the difference became even more evident when I switched back to Ubuntu from Fedora).&lt;/p&gt;</description></item><item><title>Introducing ShScript Creator</title><link>/post/2015-08-10-introducing-shscript-creator/</link><pubDate>Mon, 10 Aug 2015 00:00:00 +0000</pubDate><guid>/post/2015-08-10-introducing-shscript-creator/</guid><description>&lt;p&gt;This one is a tribute to all the shell programmers out there.&lt;/p&gt;
&lt;p&gt;Of late, I&amp;rsquo;ve been having to deal with a lot of shell-scripts, mostly as part of my academic pursuits. And it&amp;rsquo;s fun you know, when you really get to know the power of shells..!&lt;/p&gt;
&lt;p&gt;However, despite all the fun, I was somehow irritated at having to write down the hashbang everytime I create a new script. And on top of that, I would also have to chmod the file to give it the execute permissions. Blame it on the fact that I mostly use IDEs like NetBeans and Android Studio among others that do half the work for you, like adding in all the placeholders, parentheses, imports etc. Frankly speaking, having to write the hashbang everytime I create the shell script was kind of annoying.&lt;/p&gt;</description></item><item><title>Memory Organization in PIC Microcontroller</title><link>/post/2015-07-22-pic-exploration-memory-organization-in-pic/</link><pubDate>Wed, 22 Jul 2015 00:00:00 +0000</pubDate><guid>/post/2015-07-22-pic-exploration-memory-organization-in-pic/</guid><description>&lt;p&gt;&lt;em&gt;(This post is currently undergoing revisions)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been working with the PIC microcontrollers lately, and I kind of figured I might as well document what I&amp;rsquo;ve been learning.&lt;/p&gt;
&lt;p&gt;The microcontroller I&amp;rsquo;m talking about in this post is the &lt;strong&gt;P16F877A&lt;/strong&gt;, and keep in mind that whenever I&amp;rsquo;m referring to &amp;ldquo;PIC&amp;rdquo;, I&amp;rsquo;m talking about this particular microcontroller.&lt;/p&gt;
&lt;p&gt;The PIC microcontroller has a Harvard architecture, which in simple terms mean that they have separate memory for both program and data, called program memory and data memory respectively. One advantage of this architecture is that they can simultaneously access both program memory and data memory. In addition to both these memory, there&amp;rsquo;s also a stack, which I&amp;rsquo;ll talk about in more detail later.&lt;/p&gt;</description></item><item><title>Blogging The Hacker Way!</title><link>/post/2015-07-14-blogging-the-hacker-way/</link><pubDate>Tue, 14 Jul 2015 00:00:00 +0000</pubDate><guid>/post/2015-07-14-blogging-the-hacker-way/</guid><description>&lt;p&gt;Just switched over to Jekyll, and I&amp;rsquo;m finding the experience a little bit different. If there&amp;rsquo;s any one grouse I have at the moment, it&amp;rsquo;s that I don&amp;rsquo;t have a custom domain. I guess that&amp;rsquo;s more or less okay for now.&lt;/p&gt;
&lt;p&gt;More posts coming soon!&lt;/p&gt;</description></item><item><title>First Drive: Blogging with Jekyll</title><link>/post/2015-07-14-first-impressions/</link><pubDate>Tue, 14 Jul 2015 00:00:00 +0000</pubDate><guid>/post/2015-07-14-first-impressions/</guid><description>&lt;p&gt;To be outright honest with you, setting up the whole thing took longer than I originally anticipated. But in the end, things seem to be more or less alright as of now. The official docs at Jekyll&amp;rsquo;s isn&amp;rsquo;t as helpful as I&amp;rsquo;d have liked, and I had to extensively look around the web to figure out how to do certain tasks.&lt;/p&gt;
&lt;p&gt;Like I mentioned, the one serious grouse that I do have is that I do not have a custom domain. And just for this one simple reason alone, I debated whether I should switch back over to my old site on WordPress. However, upon further thoughts, I concluded that being on github.io domain in itself speaks to the world that this blog is more or less technically oriented.&lt;/p&gt;</description></item><item><title>You're up and running! This should be interesting!</title><link>/post/2014-3-3-hello-world/</link><pubDate>Mon, 03 Mar 2014 00:00:00 +0000</pubDate><guid>/post/2014-3-3-hello-world/</guid><description>&lt;p&gt;Next you can update your site name, avatar and other options using the _config.yml file in the root of your repository (shown below).&lt;/p&gt;
&lt;p&gt;![_config.yml]({{ site.baseurl }}/images/config.png)&lt;/p&gt;
&lt;p&gt;The easiest way to make your first post is to edit this one. Go into /_posts/ and update the Hello World markdown file. For more instructions head over to the &lt;a href="https://github.com/barryclark/jekyll-now"&gt;Jekyll Now repository&lt;/a&gt; on GitHub.&lt;/p&gt;</description></item></channel></rss>