<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Dhruva Sagar</title>
    <link>https://dhruvasagar.dev/</link>
    <description>Recent content on Dhruva Sagar</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 14 Jan 2026 20:45:12 +0530</lastBuildDate>
    <atom:link href="https://dhruvasagar.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Embrace the Wobble</title>
      <link>https://dhruvasagar.dev/posts/embrace-the-wobble/</link>
      <pubDate>Wed, 14 Jan 2026 20:45:12 +0530</pubDate>
      <guid>https://dhruvasagar.dev/posts/embrace-the-wobble/</guid>
      <description>&lt;p&gt;Watching my daughter grip her bike&amp;rsquo;s handlebars for the first time, I&#xA;saw the familiar flicker of fear in her eyes, the apprehension of the&#xA;unknown, the hesitation to stumble, the dread of failure. It reminded&#xA;me of a feeling I know too well, one that lingers in moments of&#xA;uncertainty throughout our lives.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;“What if I fall?” she asked.&lt;/p&gt;&#xA;&lt;p&gt;I met her gaze and smiled. “Don’t be afraid of falling; instead be&#xA;afraid of never falling,” I said.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building a Scalable Ingestion Pipeline With Rust</title>
      <link>https://dhruvasagar.dev/posts/building-a-scalable-ingestion-pipeline-with-rust/</link>
      <pubDate>Mon, 05 May 2025 16:58:25 +0530</pubDate>
      <guid>https://dhruvasagar.dev/posts/building-a-scalable-ingestion-pipeline-with-rust/</guid>
      <description>How to build a scalable ingestion pipeline with Rust</description>
    </item>
    <item>
      <title>Positive Effects of Exercise on Mental Health</title>
      <link>https://dhruvasagar.dev/posts/positive-effects-of-exercise-on-mental-health/</link>
      <pubDate>Mon, 18 Nov 2024 10:51:28 +0530</pubDate>
      <guid>https://dhruvasagar.dev/posts/positive-effects-of-exercise-on-mental-health/</guid>
      <description>Exercise is also a form of meditation, has tremendous positive impact on mental health</description>
    </item>
    <item>
      <title>Neovim as a Java IDE</title>
      <link>https://dhruvasagar.dev/posts/neovim-java-ide/</link>
      <pubDate>Sun, 01 Sep 2024 04:16:00 +0530</pubDate>
      <guid>https://dhruvasagar.dev/posts/neovim-java-ide/</guid>
      <description>&lt;p&gt;Neovim has come a long way today from it&amp;rsquo;s original goal of being able to&#xA;support asynchronous jobs. Today it comes packed with a ton of useful and high&#xA;performance libraries and plugins. To add to that it also has a highly&#xA;enthusiastic and vibrant community of lua developers who are working&#xA;tirelessly to make neovim better.&lt;/p&gt;&#xA;&lt;p&gt;Today we&amp;rsquo;ll look at how one can easily configure neovim to work similar to&#xA;a modern Java IDE.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Speak</title>
      <link>https://dhruvasagar.dev/posts/how-to-speak/</link>
      <pubDate>Sun, 17 Mar 2024 19:54:06 +0530</pubDate>
      <guid>https://dhruvasagar.dev/posts/how-to-speak/</guid>
      <description>Collection of my notes from the lecture titled &amp;lsquo;How to Speak&amp;rsquo; by Patrick Winston</description>
    </item>
    <item>
      <title>Generic Callbacks in Rust</title>
      <link>https://dhruvasagar.dev/posts/generic-callbacks-in-rust/</link>
      <pubDate>Mon, 11 Mar 2024 10:45:06 +0530</pubDate>
      <guid>https://dhruvasagar.dev/posts/generic-callbacks-in-rust/</guid>
      <description>&lt;p&gt;In a recent project, we developed an ingestion pipeline in Rust. We wanted to&#xA;execute asynchronous tasks in response to messages received from SQS, as&#xA;a &lt;strong&gt;subscriber&lt;/strong&gt;. Our goal was to leverage Rust generics to allow the&#xA;subscriber to take ownership of the payload schema and the pipeline&#xA;implementation details. This approach enables the separation of the SQS&#xA;subscription logic from the subscriber’s responsibilities, promoting of&#xA;cleaner separation of concerns. It also facilitates independent testing of&#xA;both components, ensuring they can be assessed in isolation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>DIY remote controlled pan &amp; tilt CCTV using Raspberry Pi</title>
      <link>https://dhruvasagar.dev/2018/07/06/diy-remote-controlled-pan-tilt-cctv-using-raspberry-pi/</link>
      <pubDate>Fri, 06 Jul 2018 16:59:10 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2018/07/06/diy-remote-controlled-pan-tilt-cctv-using-raspberry-pi/</guid>
      <description>&lt;p&gt;&lt;strong&gt;RPi CCTV in Action&lt;/strong&gt; :&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;div class=&#34;video-container&#34;&gt;&#xA;&lt;iframe&#xA;class=&#34;video video--16x9&#34;&#xA;src=&#34;https://www.youtube-nocookie.com/embed/5gEBrlaixCk?cc_load_policy=1&amp;cc=1&#34; allowfullscreen title=&#34;RPi CCTV in Action&#34; frameborder=&#34;0&#34; sandbox=&#34;allow-same-origin allow-scripts&#34; loading=&#34;lazy&#34;&gt;&lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;A simple web interface to control the RPi CCTV&lt;/strong&gt; :&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;div class=&#34;video-container&#34;&gt;&#xA;&lt;iframe&#xA;class=&#34;video video--16x9&#34;&#xA;src=&#34;https://www.youtube-nocookie.com/embed/1G8wricwkds?cc_load_policy=1&amp;cc=1&#34; allowfullscreen title=&#34;A simple web interface to control the RPi CCTV&#34; frameborder=&#34;0&#34; sandbox=&#34;allow-same-origin allow-scripts&#34; loading=&#34;lazy&#34;&gt;&lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;What you need to build this (hardware)&lt;/strong&gt; :&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Raspberry Pi&lt;label for=&#34;sidenote-1&#34; class=&#34;margin-toggle sidenote-number&#34;&gt;(1)&lt;/label&gt;&#xA;&lt;input type=&#34;checkbox&#34; id=&#34;sidenote-1&#34; class=&#34;margin-toggle&#34;/&gt;&#xA;&lt;span class=&#34;sidenote&#34;&gt;&#xA;&lt;span class=&#34;sidenote-number&#34;&gt;(1)&lt;/span&gt;Preferably Raspberry Pi-3, for on-board wireless, or&#xA;Raspberry Pi Zero W, although you can achieve similar result without much&#xA;effort using other boards&#xA;&lt;/span&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Pan &amp;amp; Tilt frame, I used one available here on amazon :&#xA;&lt;a href=&#34;https://www.amazon.in/gp/product/B010M25JVU/&#34;&gt;https://www.amazon.in/gp/product/B010M25JVU/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;2 servo motors. I used sg90 micro servo motors since I had them handy,&#xA;however you can also use other similar ones available&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;I have recently started learning GoLang, and I decided to try to make use of&#xA;it for a small IOT project that I&amp;rsquo;ve been meaning to do for a long time. In my&#xA;research I came across &lt;a href=&#34;https://gobot.io&#34;&gt;Gobot&lt;/a&gt;, which is a framework for&#xA;building robots written in golang. It comes with support for a lot of&#xA;development boards available in the market such as Raspberry Pi, Beaglebone,&#xA;Arduino, and several more. Not only that it also has drivers available for&#xA;a wide variety of devices which can be used to create all sorts of nifty&#xA;robots.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSH Config Trick</title>
      <link>https://dhruvasagar.dev/2017/10/07/ssh-config-trick/</link>
      <pubDate>Fri, 06 Oct 2017 19:21:20 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2017/10/07/ssh-config-trick/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Update2 : As I have been informed now, there has recently been support added&#xA;for including external files in the ssh config. Refer&#xA;&lt;a href=&#34;https://man.openbsd.org/ssh_config#Include&#34;&gt;https://man.openbsd.org/ssh_config#Include&lt;/a&gt;&#xA;for details.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Update : Modified the script for more flexibility to allow easy modifications&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;I use SSH nearly every day to securely connect to remote servers. For&#xA;simplifying managing remote server configurations &amp;amp; not having to remember IP&#xA;addresses and other server specific details, I use ssh config. For those who&#xA;aren’t familiar with this should read – &lt;a href=&#34;http://nerderati.com/2011/03/17/simplify-your-life-with-an-ssh-config-file/&#34;&gt;http://nerderati.com/2011/03/17/simplify-your-life-with-an-ssh-config-file/&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Text Editor Choice &amp; Peer Pressure</title>
      <link>https://dhruvasagar.dev/2017/03/01/text-editor-choice-peer-pressure/</link>
      <pubDate>Wed, 01 Mar 2017 10:37:42 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2017/03/01/text-editor-choice-peer-pressure/</guid>
      <description>&lt;p&gt;I am a &lt;a href=&#34;https://www.vim.org&#34;&gt;VIM&lt;/a&gt; user and have been for quite a long&#xA;time&lt;label for=&#34;sidenote-1&#34; class=&#34;margin-toggle sidenote-number&#34;&gt;(1)&lt;/label&gt;&#xA;&lt;input type=&#34;checkbox&#34; id=&#34;sidenote-1&#34; class=&#34;margin-toggle&#34;/&gt;&#xA;&lt;span class=&#34;sidenote&#34;&gt;&#xA;&lt;span class=&#34;sidenote-number&#34;&gt;(1)&lt;/span&gt;~7 years&#xA;&lt;/span&gt;&#xA;. I am both a vim plugin author and&#xA;also like to believe I have helped a lot of people switch / grok the core&#xA;philosophy that I believe distinguishes it from all other editors and gives it&#xA;an edge (IMO).&lt;/p&gt;&#xA;&lt;p&gt;However, in this article I am not here to convince you to choose VIM as your&#xA;choice of text editor, on the contrary, I am going to suggest you to do the&#xA;opposite, especially if the only motivation to do so is driven by some form of&#xA;peer pressure.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Template with Context using ERB</title>
      <link>https://dhruvasagar.dev/2017/02/01/template-context-using-erb/</link>
      <pubDate>Wed, 01 Feb 2017 12:15:49 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2017/02/01/template-context-using-erb/</guid>
      <description>&lt;p&gt;Recently, I was required to build a template rendering component that should&#xA;render within a dynamic context, i.e. it would have methods / variables&#xA;defined within a predefined context available during rendering, apart from&#xA;what was provided directly.&lt;/p&gt;&#xA;&lt;p&gt;For simplicity we chose &lt;a href=&#34;http://www.stuartellis.name/articles/erb/&#34;&gt;ERB&lt;/a&gt;,&#xA;since we can place them within locale files for internationalisation and&#xA;designers could edit them with ease if need arises.&lt;/p&gt;&#xA;&lt;p&gt;Following is a very simple implementation. Since we extend &lt;code&gt;OpenStruct&lt;/code&gt; we&#xA;can simply pass a hash to it during instantiation and all the keys will be&#xA;accessible as methods and will be exposed directly during rendering.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Slack old school style</title>
      <link>https://dhruvasagar.dev/2016/11/13/slack-old-school-style/</link>
      <pubDate>Sun, 13 Nov 2016 12:27:39 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2016/11/13/slack-old-school-style/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://slack.com&#34;&gt;Slack&lt;/a&gt; has gained a lot of popularity in recent times as&#xA;a tool for inter-team communication and for the right reasons. It offers a lot&#xA;of features such as 3rd party software integrations, rich content&#xA;communication, collaboration, bots etc. which when put together help create&#xA;a rich collaborative user experience for teams to work together, especially&#xA;when they are not co-located, which is fairly common these days.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re anything like me and have been around long enough to know what&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Internet_Relay_Chat&#34;&gt;IRC&lt;/a&gt; is and when you look&#xA;at various elements that slack provides like channels, accounts (servers),&#xA;private messaging, etc. you know that it draws a lot of parallels and&#xA;inspiration from that old school communication tool.&lt;/p&gt;</description>
    </item>
    <item>
      <title>WebRTC Broadcast</title>
      <link>https://dhruvasagar.dev/2016/11/02/webrtc-broadcast/</link>
      <pubDate>Wed, 02 Nov 2016 12:52:30 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2016/11/02/webrtc-broadcast/</guid>
      <description>&lt;p&gt;WebRTC is fun! I recently gave a quick session on WebRTC at Bangalore Ruby&#xA;User Group (BRUG). Following are the slides of my presentation.&lt;/p&gt;&#xA;&lt;iframe&#xA;  style=&#34;width: 100%; height: 500px;&#34;&#xA;  frameborder=&#34;0&#34;&#xA;  marginwidth=&#34;0&#34;&#xA;  marginheight=&#34;0&#34;&#xA;  scrolling=&#34;no&#34;&#xA;  src=&#34;https://www.slideshare.net/slideshow/embed_code/key/3n2wUUKX2yV3EJ?startSlide=1&#34;&#xA;  allowfullscreen&#xA;  webkitallowfullscreen&#xA;  mozallowfullscreen&gt;&#xA;&lt;/iframe&gt;&#xA;&lt;div style=&#34;margin-bottom: 5px;text-align: center;&#34;&gt;&#xA;  &lt;strong&gt;&#xA;    &lt;a&#xA;        href=&#34;https://www.slideshare.net/dhruvasagar/webrtc-67392562&#34;&#xA;        title=&#34;WebRTC&#34;&#xA;        target=&#34;_blank&#34;&gt;&#xA;      WebRTC&#xA;    &lt;/a&gt;&#xA;  &lt;/strong&gt; from &lt;strong&gt;&#xA;    &lt;a href=&#34;https://www.slideshare.net/dhruvasagar&#34; target=&#34;_blank&#34;&gt;&#xA;      Dhruva Sagar&#xA;    &lt;/a&gt;&#xA;  &lt;/strong&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;For demo I had recently created a demo application in elixir using the phoenix&#xA;framework because it makes dealing with websockets really easy. That is used&#xA;for creating the custom signaling service that is required to facilitate such&#xA;a broadcast. The source code is available at &lt;a href=&#34;https://github.com/dhruvasagar/webrtc-broadcast&#34;&gt;dhruvasagar/webrtc-broadcast&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pristine – ZSH Theme</title>
      <link>https://dhruvasagar.dev/2015/11/28/pristine-zsh-theme/</link>
      <pubDate>Sat, 28 Nov 2015 06:24:13 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2015/11/28/pristine-zsh-theme/</guid>
      <description>&lt;p&gt;A while back I posted about &lt;a href=&#34;https://dhruvasagar.dev/2013/03/13/amuse-zsh-theme&#34;&gt;Amuse&lt;/a&gt; my prompt theme for ZSH targeting&#xA;&lt;code&gt;oh-my-zsh&lt;/code&gt;. Since this was a much appreciated theme, I would like to share&#xA;another theme, Pristine, that I have created.&lt;/p&gt;&#xA;&lt;p&gt;However, I recently switched to using&#xA;&lt;a href=&#34;https://github.com/sorin-ionescu/prezto&#34;&gt;Prezto&lt;/a&gt;. This is because it felt&#xA;like a more minimalistic configuration framework for ZSH. I also wanted to get&#xA;faster load times. I must say my experience has been quite good and I really&#xA;like it. Obviously there are pros and cons but I digress.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Google open sources it’s machine learning system</title>
      <link>https://dhruvasagar.dev/2015/11/10/google-open-sources-its-machine-learning-system/</link>
      <pubDate>Mon, 09 Nov 2015 19:46:28 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2015/11/10/google-open-sources-its-machine-learning-system/</guid>
      <description>&lt;p&gt;I am a huge proponent of open source technologies and having worked&#xA;predominantly in various web technologies in the course of my career, I mostly&#xA;work exclusively with open source stacks.&lt;/p&gt;&#xA;&lt;p&gt;In the recent past I have been very keen to try and wrap my head around&#xA;Artificial Intelligence and more specifically Machine Learning, although I am&#xA;still barely even scratching the surface of the nitty-gritty’s of the&#xA;field, especially the mathematical underpinnings, this is still a huge deal!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Grow your brain!</title>
      <link>https://dhruvasagar.dev/2015/11/09/grow-your-brain/</link>
      <pubDate>Mon, 09 Nov 2015 14:27:20 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2015/11/09/grow-your-brain/</guid>
      <description>&lt;p&gt;Learning is key in brain development. Of course what aspects and how much of&#xA;brain function improve as a result depends on the mode / type / content&#xA;&amp;amp; method of learning. But I am not here to talk about that. Now, this&#xA;knowledge isn&amp;rsquo;t new information, we all know this already, and have seen&#xA;it in good effect in children and hence we all know and understand the&#xA;importance of education &amp;amp; sport for children.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Find huge files in linux</title>
      <link>https://dhruvasagar.dev/2015/05/08/find-huge-files-in-linux/</link>
      <pubDate>Fri, 08 May 2015 04:17:01 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2015/05/08/find-huge-files-in-linux/</guid>
      <description>&lt;p&gt;Switching to SSD&amp;rsquo;s for better performance and compromising on disk space can&#xA;be a tough decision to make. Though nowadays with the prices of SSD&amp;rsquo;s going&#xA;down, it is something that a lot of people are consciously doing.&lt;/p&gt;&#xA;&lt;p&gt;However &lt;label for=&#34;marginnote-1&#34; class=&#34;margin-toggle marginnote-ind&#34;&gt;&lt;/label&gt;&#xA;&lt;input type=&#34;checkbox&#34; id=&#34;marginnote-1&#34; class=&#34;margin-toggle&#34;/&gt;&#xA;&lt;span class=&#34;marginnote&#34;&gt;&#xA;having spoilt by past experiences of having ample disk&#xA;space&#xA;&lt;/span&gt;&#xA; when you switch from a 500GB (or 1TB) hard disk to an,&#xA;albeit super fast, 128GB SSD, you will inevitably run into situations where&#xA;you need to clean out large files taking space on your disk. Something I had&#xA;run into myself about a year back when I made the switch myself on my macbook.&#xA;Oddly enough this problem turned out to be significant enough that I had to&#xA;seek out a way to quickly find out which were the top biggest files on my file&#xA;system so I could get rid of them / move to an external hard disk.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Google Code Jam 2014 Qualifiers</title>
      <link>https://dhruvasagar.dev/2014/04/14/google-code-jam-2014-qualifiers/</link>
      <pubDate>Mon, 14 Apr 2014 08:55:35 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2014/04/14/google-code-jam-2014-qualifiers/</guid>
      <description>&lt;p&gt;Google Code Jam has always been a competition I have cherished, simply because&#xA;the problems they post are brilliant and the closest to reality as compared to&#xA;problems of other competitions. They&amp;rsquo;re always fun to read, disect &amp;amp; solve,&#xA;more often than not, the solutions are reasonably&#xA;trivial&lt;label for=&#34;sidenote-1&#34; class=&#34;margin-toggle sidenote-number&#34;&gt;(1)&lt;/label&gt;&#xA;&lt;input type=&#34;checkbox&#34; id=&#34;sidenote-1&#34; class=&#34;margin-toggle&#34;/&gt;&#xA;&lt;span class=&#34;sidenote&#34;&gt;&#xA;&lt;span class=&#34;sidenote-number&#34;&gt;(1)&lt;/span&gt;Especially for the qualifiers&#xA;&lt;/span&gt;&#xA; yet&#xA;extremely subtle &amp;amp; deceptive.&lt;/p&gt;&#xA;&lt;p&gt;Today I want to share the solutions of 3 problems I was able to solve, the&#xA;code should pretty much speak for itself because none of it is very complex.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VIM Custom TabLine</title>
      <link>https://dhruvasagar.dev/2014/04/06/vim-custom-tabline/</link>
      <pubDate>Sat, 05 Apr 2014 18:40:01 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2014/04/06/vim-custom-tabline/</guid>
      <description>&lt;p&gt;Hi guys,&lt;/p&gt;&#xA;&lt;p&gt;VIM has an option &lt;code&gt;tabline&lt;/code&gt; that one can use to configure how the tab line&#xA;would look like. Back when I used to use gvim, I could very easily manipulate&#xA;how the text on the tab looked like by setting the &lt;code&gt;guitablabel&lt;/code&gt; setting,&#xA;however &lt;code&gt;tabline&lt;/code&gt; is not all that easy to configure.&lt;/p&gt;&#xA;&lt;p&gt;Here is what I use now :&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;!&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;MyTabLine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tabpagenr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;$&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tabnr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;&amp;#34; range() starts at 0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;winnr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tabpagewinnr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tabnr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;buflist&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tabpagebuflist&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tabnr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bufnr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;buflist&lt;/span&gt;[&lt;span class=&#34;nx&#34;&gt;winnr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bufname&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fnamemodify&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bufname&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bufnr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;:t&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt; .&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;%&amp;#39;&lt;/span&gt; . &lt;span class=&#34;nx&#34;&gt;tabnr&lt;/span&gt; . &lt;span class=&#34;s1&#34;&gt;&amp;#39;T&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt; .&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tabnr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tabpagenr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; ? &lt;span class=&#34;s1&#34;&gt;&amp;#39;%#TabLineSel#&amp;#39;&lt;/span&gt; : &lt;span class=&#34;s1&#34;&gt;&amp;#39;%#TabLine#&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt; .&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; . &lt;span class=&#34;nx&#34;&gt;tabnr&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tabpagewinnr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tabnr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;$&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt; .&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;:&amp;#39;&lt;/span&gt; . &lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;endif&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt; .&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bufname&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; ? &lt;span class=&#34;s1&#34;&gt;&amp;#39; [No Name] &amp;#39;&lt;/span&gt; : &lt;span class=&#34;s1&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; . &lt;span class=&#34;nx&#34;&gt;bufname&lt;/span&gt; . &lt;span class=&#34;s1&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bufmodified&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;getbufvar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bufnr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;amp;mod&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bufmodified&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt; .&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;+ &amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;endif&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;endfor&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt; .&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;%#TabLineFill#&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;endfunction&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tabline&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;%&lt;span class=&#34;p&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;MyTabLine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is what it looks like :&lt;/p&gt;</description>
    </item>
    <item>
      <title>Creating Custom Scratch Buffers in VIM</title>
      <link>https://dhruvasagar.dev/2014/03/11/creating-custom-scratch-buffers-in-vim/</link>
      <pubDate>Tue, 11 Mar 2014 09:07:22 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2014/03/11/creating-custom-scratch-buffers-in-vim/</guid>
      <description>&lt;p&gt;The other day I wanted to open a scratch buffer to write some temporary code&#xA;and the pass it on to a repl to test it out, the idea was that I could modify&#xA;it as needed and resend it back to the repl and see the changes, helps to&#xA;debug easily.&lt;/p&gt;&#xA;&lt;p&gt;So I just wrote out this simple code here that allows me to launch a scratch&#xA;buffer in different ways, but the difference is I can set various options for&#xA;it while creating it. First lets have a look at the code :&lt;/p&gt;</description>
    </item>
    <item>
      <title>VIM – Filter Quickfix List</title>
      <link>https://dhruvasagar.dev/2013/12/17/vim-filter-quickfix-list/</link>
      <pubDate>Tue, 17 Dec 2013 10:15:07 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2013/12/17/vim-filter-quickfix-list/</guid>
      <description>&lt;p&gt;If you are used to using the quickfix list in VIM there are times when you&#xA;want to filter certain things out of the quickfix list to narrow it down to&#xA;relevant results that you need. Rather than firing the quickfix command all&#xA;over again with a refined expression, it is easier &amp;amp; often faster to simply&#xA;remove items from the list. I wrote this simple vimscript to do just that.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VIM – Toggle Ruby Hash Syntax</title>
      <link>https://dhruvasagar.dev/2013/11/26/vim-toggle-ruby-hash-syntax/</link>
      <pubDate>Tue, 26 Nov 2013 15:05:55 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2013/11/26/vim-toggle-ruby-hash-syntax/</guid>
      <description>&lt;p&gt;Ruby 1.9 introduced a new json style ruby hash syntax. Although we can use&#xA;this to define static hash objects and puts a limitation on the key we can&#xA;use, it&amp;rsquo;s a fairly neat syntax nevertheless. However I work on several&#xA;projects, both new and old and hence the new syntax is not always readily&#xA;available.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Old style hash&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;hash&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;test&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# New style hash&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;hash&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;test&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To demonstrate the sheer power of regular expressions &amp;amp; VIM, here&amp;rsquo;s&#xA;a tiny snippet that allows you to quickly toggle a ruby hash syntax from one&#xA;form to other.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VIM for Multiple Projects in separate Tmux windows</title>
      <link>https://dhruvasagar.dev/2013/11/26/vim-for-multiple-projects-in-tmux-windows/</link>
      <pubDate>Tue, 26 Nov 2013 05:20:57 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2013/11/26/vim-for-multiple-projects-in-tmux-windows/</guid>
      <description>&lt;p&gt;My development environment setup consists of several tools, however the 2 most&#xA;used and essential tools that have a great impact on my workflow are &lt;code&gt;tmux&lt;/code&gt;&#xA;&amp;amp; &lt;code&gt;vim&lt;/code&gt;. Since I often work on several projects, I find it best to work on&#xA;different vim sessions in separate tmux windows.&lt;/p&gt;&#xA;&lt;p&gt;However tmux by default only shows the name of the currently running process&#xA;in the title and that can often lead to confusion as to which tmux window is&#xA;which project. To solve this issue I came up with a very simple vim script&#xA;that utilizes tmux&amp;rsquo;s powerful API to automatically rename the tmux&#xA;window appropriately and hence make it incredibly easy for me to know which&#xA;tmux window is for which project.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ActiveRecord like where for array of hashes in ruby</title>
      <link>https://dhruvasagar.dev/2013/04/20/activerecord-like-where-for-array-of-hashes-in-ruby/</link>
      <pubDate>Sat, 20 Apr 2013 05:36:35 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2013/04/20/activerecord-like-where-for-array-of-hashes-in-ruby/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Edit : Updated the code as per the suggestions made by Masklinn.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Recently I was working on&#xA;&lt;a href=&#34;https://github.com/dhruvasagar/soulmate_rails/issues/1&#34;&gt;Issue#1&lt;/a&gt; of my&#xA;&lt;a href=&#34;https://github.com/dhruvasagar/soulmate_rails&#34;&gt;Soulmate Rails&lt;/a&gt; gem, which is&#xA;a very simple and obvious optimization that I should have thought of myself.&#xA;Thanks to &lt;a href=&#34;https://github.com/lephyrius&#34;&gt;lephyrius&lt;/a&gt; though for pointing it&#xA;out. In my search method I was looping through the search results and calling&#xA;find on each to get it from db. The fix involved to instead use a single where&#xA;for all ids so that it translates to a single db call. A simple fix as well as&#xA;an optimization.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VIM Markify</title>
      <link>https://dhruvasagar.dev/2013/04/01/vim-markify/</link>
      <pubDate>Mon, 01 Apr 2013 13:06:29 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2013/04/01/vim-markify/</guid>
      <description>&lt;p&gt;Recently I picked up some minor configs for ruby from &lt;a href=&#34;http://tpo.pe&#34;&gt;Time&#xA;Pope&amp;rsquo;s&lt;/a&gt;&#xA;&lt;a href=&#34;https://github.com/tpope/tpope/blob/master/.vimrc#L505&#34;&gt;vimrc&lt;/a&gt;. Here&amp;rsquo;s the&#xA;code :&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;autocmd&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;FileType&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ruby&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    \ &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;expand&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;%&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=~&lt;/span&gt;# &lt;span class=&#34;s1&#34;&gt;&amp;#39;_test\.rb$&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    \   &lt;span class=&#34;nx&#34;&gt;compiler&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;rubyunit&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;setl&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;makeprg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;testrb&lt;/span&gt;\ \&lt;span class=&#34;s2&#34;&gt;&amp;#34;%:p\&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    \ &lt;span class=&#34;k&#34;&gt;elseif&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;expand&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;%&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=~&lt;/span&gt;# &lt;span class=&#34;s1&#34;&gt;&amp;#39;_spec\.rb$&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    \   &lt;span class=&#34;nx&#34;&gt;compiler&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;rspec&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;setl&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;makeprg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;rspec&lt;/span&gt;\ \&lt;span class=&#34;s2&#34;&gt;&amp;#34;%:p\&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    \ &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    \   &lt;span class=&#34;nx&#34;&gt;compiler&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ruby&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;setl&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;makeprg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ruby&lt;/span&gt;\ &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;wc&lt;/span&gt;\ \&lt;span class=&#34;s2&#34;&gt;&amp;#34;%:p\&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    \ &lt;span class=&#34;k&#34;&gt;endif&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What this does is given the filetype is Ruby, it correctly sets up the&#xA;compiler and makeprg such that it allows you to run your tests via &lt;code&gt;:make!&lt;/code&gt;&#xA;This is pretty neat I must say :), because it correctly loads the quickfix&#xA;list with the errors and I can actually traverse them in order and fix them.&#xA;All this without needing any plugin whatsoever :).&lt;/p&gt;</description>
    </item>
    <item>
      <title>VIM Better FoldText</title>
      <link>https://dhruvasagar.dev/2013/03/28/vim-better-foldtext/</link>
      <pubDate>Thu, 28 Mar 2013 18:00:54 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2013/03/28/vim-better-foldtext/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Update 3&lt;/strong&gt;: Improved the code for extraction of fillchar from &lt;code&gt;fillchars&lt;/code&gt;&#xA;option and taking &lt;code&gt;foldcolumn&lt;/code&gt; into account.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Update 2&lt;/strong&gt;: Fixed the regex for removing the fold marker from the&#xA;displayed text by splitting the &lt;code&gt;&#39;{{{&#39;&lt;/code&gt; in the regex to&#xA;&lt;code&gt;&#39;{{&#39;. &#39;{&#39;&lt;/code&gt; so that it is not treated as a fold marker&#xA;by vim. Thanks to &lt;a href=&#34;http://www.reddit.com/user/Amadan&#34;&gt;Amadan&lt;/a&gt; on reddit&#xA;&lt;a href=&#34;http://www.reddit.com/r/vim/comments/1b6viw/vim_better_foldtext/c94it43&#34;&gt;Reddit&#xA;Tip&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Fixed &lt;code&gt;NeatFoldText()&lt;/code&gt; to get &lt;code&gt;foldchar&lt;/code&gt; from &lt;code&gt;fillchars&lt;/code&gt;&#xA;settings.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Initially when I started using VIM, I had borrowed configs from my mentor&#xA;&lt;a href=&#34;http://vagmim.in/&#34;&gt;Vagmi Mudumbai&lt;/a&gt; &lt;label for=&#34;sidenote-1&#34; class=&#34;margin-toggle sidenote-number&#34;&gt;(1)&lt;/label&gt;&#xA;&lt;input type=&#34;checkbox&#34; id=&#34;sidenote-1&#34; class=&#34;margin-toggle&#34;/&gt;&#xA;&lt;span class=&#34;sidenote&#34;&gt;&#xA;&lt;span class=&#34;sidenote-number&#34;&gt;(1)&lt;/span&gt;To whom I am Eternally&#xA;Thankful!!!&#xA;&lt;/span&gt;&#xA;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VIM Table Mode</title>
      <link>https://dhruvasagar.dev/2013/03/17/vim-table-mode/</link>
      <pubDate>Sun, 17 Mar 2013 07:20:15 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2013/03/17/vim-table-mode/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;UPDATE 2: Released v 2.0 of the plugin. Check github for details.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;UPDATE : I have added more features to the original plugin, showcasing some&#xA;core features in a new demo (Part 2).&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Recently a friend of mine showed off emacs table mode to me and to be honest,&#xA;I felt a bit jealous :). Hence I began to search for existing vim plugins that&#xA;might offer a similar functionality and I did find a plugin &lt;a href=&#34;https://github.com/nvie/vim-rst-tables&#34;&gt;VIM RST&#xA;Tables&lt;/a&gt;, which is a ftplugin that aids&#xA;the creation of tables within rst files and allows you to format existing&#xA;content into a table, although this plugin came closest to what I was looking&#xA;for it wasn&amp;rsquo;t quite there. Then I found a very interesting &amp;amp; simple plugin&#xA;shared as a gist by the infamous &lt;a href=&#34;http://tpo.pe&#34;&gt;Tim Pope&lt;/a&gt;:&#xA;&lt;a href=&#34;https://gist.github.com/tpope/287147&#34;&gt;cucumbertables.vim&lt;/a&gt; which I found quite&#xA;impressive.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Amuse – ZSH Theme</title>
      <link>https://dhruvasagar.dev/2013/03/13/amuse-zsh-theme/</link>
      <pubDate>Wed, 13 Mar 2013 11:12:50 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2013/03/13/amuse-zsh-theme/</guid>
      <description>&lt;p&gt;Amuse is a simplistic theme I built for the popular shell ZSH that I use.&lt;/p&gt;&#xA;&lt;p&gt;Features :&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Shows git prompt with additional support for dirty (! in red) and untracked&#xA;(? in green) git flags.&lt;/li&gt;&#xA;&lt;li&gt;Shows the system time with a neat time unicode character. Although I am&#xA;sure most wouldn&amp;rsquo;t find having time on the prompt useful, I find it&#xA;very useful since it helps me get a good idea on how long a command took to&#xA;execute or even how long back I executed some command. Check the screenshot&#xA;for reference.&lt;/li&gt;&#xA;&lt;li&gt;Prompt where you type the command starts after a $ on a new line giving you&#xA;ample space (full width barring the $ and a space) to type your command and&#xA;so the prompt (especially if it’s long, eg. if you are in some deep&#xA;nested directory) does not interfere with your commands and avoids wrapping&#xA;for the most part unless you are typing an excessively long command in which&#xA;case you should probably use an editor (&lt;a href=&#34;https://dhruvasagar.dev/2012/08/24/vim-in-my-muscle-memory&#34; title=&#34;VIM in my muscle memory&#34;&gt;VIM&lt;/a&gt;) to edit it with&#xA;&lt;kbd&gt;^X^E&lt;/kbd&gt;&#xA;.&lt;/li&gt;&#xA;&lt;li&gt;Shows you the current ruby version in use from rvm, using the &lt;code&gt;rvm current&lt;/code&gt;&#xA;command in the right prompt. The ZSH right prompt is really&#xA;cool and since I use rvm with several ruby versions which change with&#xA;different projects .rvmrc files, the right prompt helps me to know the ruby&#xA;context at all times. It shows the full ruby version along with the gemset&#xA;name in use. The nice thing about the right prompt in ZSH is that it hides&#xA;automatically if you happen to type a command that&amp;rsquo;s long enough to&#xA;reach it :).&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: My AMUSE theme for &lt;a href=&#34;https://github.com/robbyrussell/oh-my-zsh&#34;&gt;Oh My&#xA;Zsh&lt;/a&gt; was merged into the&#xA;repository so you don&amp;rsquo;t need my fork anymore which has since been deleted.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vim Railscasts Colorscheme</title>
      <link>https://dhruvasagar.dev/2013/03/08/vim-railscasts-colorscheme/</link>
      <pubDate>Fri, 08 Mar 2013 08:03:00 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2013/03/08/vim-railscasts-colorscheme/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://dhruvasagar.dev/2012/08/24/vim-in-my-muscle-memory&#34; title=&#34;VIM in my muscle memory&#34;&gt;VIM in my muscle memory&lt;/a&gt; is one of my popular posts, the day I published&#xA;it, I attracted over 3,200 unique views in a single day, mostly from &lt;a href=&#34;http://news.ycombinator.com/&#34;&gt;Hacker&#xA;News&lt;/a&gt; and &lt;a href=&#34;http://www.reddit.com/r/programming&#34;&gt;Reddit&#xA;Programming&lt;/a&gt;. Although it is an extremely&#xA;densely packed post with lots of information, I hope it has helped some to&#xA;appreciate &lt;a href=&#34;http://www.vim.org/&#34;&gt;VIM&lt;/a&gt; like I do.&lt;/p&gt;&#xA;&lt;p&gt;In my several years of VIM usage, I have tried several colorscheme’s, though&#xA;I have come to like only a select few. One colorscheme that I have liked the&#xA;most and have always ended up coming back to is the Railscasts theme. There&#xA;are 2 versions of this script :&lt;/p&gt;</description>
    </item>
    <item>
      <title>Soulmate Rails</title>
      <link>https://dhruvasagar.dev/2013/03/04/soulmate-rails/</link>
      <pubDate>Mon, 04 Mar 2013 08:11:28 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2013/03/04/soulmate-rails/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;UPDATE : I released the first stable version 0.2.1, it should be usable as&#xA;is without any issues.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;One of the most common things to do in any standard rails web applications is&#xA;auto-completion. One interesting solution for this is by using redis’ sorted&#xA;sets &lt;label for=&#34;sidenote-1&#34; class=&#34;margin-toggle sidenote-number&#34;&gt;(1)&lt;/label&gt;&#xA;&lt;input type=&#34;checkbox&#34; id=&#34;sidenote-1&#34; class=&#34;margin-toggle&#34;/&gt;&#xA;&lt;span class=&#34;sidenote&#34;&gt;&#xA;&lt;span class=&#34;sidenote-number&#34;&gt;(1)&lt;/span&gt;Which are blazing fast&#xA;&lt;/span&gt;&#xA;, storing key value&#xA;pairs for partial matches. For example, if we wish to index the word ‘Dhruva&#xA;Sagar’, you can simply create key -&amp;gt; value pairs of ‘d’ -&amp;gt; ‘Dhruva Sagar’,&#xA;‘dh’ -&amp;gt; ‘Dhruva Sagar’, ‘dhr’ -&amp;gt; ‘Dhruva Sagar’ and so on. Since hash lookups&#xA;are of constant time complexity O(1), they’re very fast and hence the&#xA;completions are too! Combine this with using sorted sets of redis to easily&#xA;order / sort information on a specific criteria and you have a blazing fast&#xA;solution. Of course the actual implementation can be further optimized by&#xA;means of caching query results and make the system perform even further.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tmux Powerline Special Characters Issue</title>
      <link>https://dhruvasagar.dev/2013/02/23/tmux-powerline-special-characters-issue/</link>
      <pubDate>Sat, 23 Feb 2013 07:16:45 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2013/02/23/tmux-powerline-special-characters-issue/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://tmux.sourceforge.net/&#34;&gt;Tmux&lt;/a&gt; is a terminal multiplexer like&#xA;&lt;a href=&#34;http://www.gnu.org/software/screen/&#34;&gt;Screen&lt;/a&gt; on steroids. It is faster,&#xA;slicker and much more easily extendable than screen. For why you might want to&#xA;try tmux over screen checkout these articles :&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://dominik.honnef.co/posts/2010/10/why_you_should_try_tmux_instead_of_screen/&#34;&gt;Why you should try Tmux instead of Screen&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.wikivs.com/wiki/Screen_vs_tmux&#34;&gt;Screen Vs Tmux&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Tmux Powerline is an extension to tmux&amp;rsquo;s statusline which makes it look&#xA;incredibly cool. Look at this screenshot:&lt;/p&gt;&#xA;&#xA;&#xA;    &lt;figure class=&#34;fullwidth&#34;&gt;&#xA;  &#xA;  &#xA;  &lt;img src=&#34;https://dhruvasagar.dev/wp-content/uploads/2013/02/Screenshot-from-2013-02-23-122131.png&#34; alt=&#34;Image&#34;&gt;&#xA;  &#xA;  &lt;figcaption&gt;&#xA;&#xA;&lt;strong&gt;Tmux Powerline. &lt;/strong&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &lt;/figcaption&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;/figure&gt;&#xA;&#xA;&#xA;&lt;p&gt;There are 2 projects that provide this feature.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ubuntu on Macbook Pro</title>
      <link>https://dhruvasagar.dev/2012/12/28/ubuntu-on-macbook-pro/</link>
      <pubDate>Fri, 28 Dec 2012 11:02:32 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2012/12/28/ubuntu-on-macbook-pro/</guid>
      <description>&lt;p&gt;As I have mentioned before ([Magician Chrome makes RAM disappear][1]), I had&#xA;been facing several issues with Mac OSX. I use vim extensively, and so I had&#xA;installed &lt;a href=&#34;http://macvim.org/&#34;&gt;MacVim&lt;/a&gt;&lt;label for=&#34;sidenote-1&#34; class=&#34;margin-toggle sidenote-number&#34;&gt;(1)&lt;/label&gt;&#xA;&lt;input type=&#34;checkbox&#34; id=&#34;sidenote-1&#34; class=&#34;margin-toggle&#34;/&gt;&#xA;&lt;span class=&#34;sidenote&#34;&gt;&#xA;&lt;span class=&#34;sidenote-number&#34;&gt;(1)&lt;/span&gt;after great&#xA;difficulty&#xA;&lt;/span&gt;&#xA; on my Macbook Pro, but recently while trying out&#xA;a new plugin I found there was something amiss between MacVim &amp;amp; Python on my&#xA;system and as a result I was unable to use the plugin. In my attempt at trying&#xA;to repair MacVim, I ended up uninstalling it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Magician Chrome makes RAM disappear</title>
      <link>https://dhruvasagar.dev/2012/08/28/magician-chrome-makes-ram-disappear/</link>
      <pubDate>Tue, 28 Aug 2012 08:47:19 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2012/08/28/magician-chrome-makes-ram-disappear/</guid>
      <description>&lt;p&gt;Recently I have been experiencing a very weird issue on my Macbook Pro, I have&#xA;Lion v10.7.4, with a decent configuration : 2.8 GHz Intel Core i7 processor,&#xA;8GB Ram with a 750GB sata hard disk. But over a reasonably prolonged period of&#xA;usage, of around 4-6 hours, I notice from time to time that Mac OSX runs&#xA;completely out of RAM! The Activity Monitor reports mere MBs of Free Memory,&#xA;sometimes even less than 10MB. Needless to say this makes the Macbook loose&#xA;it&amp;rsquo;s mind, it would freeze up on random, seemingly basic tasks, even switching&#xA;to a window can freeze the macbook for minutes, if not hours. Which is&#xA;understandable, though, given how low memory it is left with.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VIM in my muscle memory</title>
      <link>https://dhruvasagar.dev/2012/08/24/vim-in-my-muscle-memory/</link>
      <pubDate>Fri, 24 Aug 2012 17:59:45 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2012/08/24/vim-in-my-muscle-memory/</guid>
      <description>&lt;p&gt;I have been an ardent VIM user for almost 4 years now, and it&amp;rsquo;s been&#xA;a while since I have been wanting to write this Blog. My motivation is not to&#xA;showoff or to start any flame war against any other popular text editors that&#xA;may or &lt;strong&gt;may not&lt;/strong&gt; be better ;), but to simply showcase the things I like and&#xA;have come to appreciate in VIM, and show why you should seriously consider it&#xA;when deciding which programming editor you should use. Hopefully I will be&#xA;able to do justice to VIM - the &lt;strong&gt;Ultimate Programmer&amp;rsquo;s Editor&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Artificially Intelligent Spyware</title>
      <link>https://dhruvasagar.dev/2012/08/21/artificially-intelligent-spyware/</link>
      <pubDate>Tue, 21 Aug 2012 09:58:49 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2012/08/21/artificially-intelligent-spyware/</guid>
      <description>&lt;p&gt;There has been tremendous advancement in the domain of Artificial Intelligence&#xA;(AI) and Machine Learning (ML) in the recent years. Although people often like&#xA;to take a shot at the state of AI on the grounds of the fact that several of&#xA;the early claims on AI that it will soon become almost as real as humans&#xA;haven&amp;rsquo;t really materialized, there still has been an incredible amount&#xA;of growth in this domain.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting started with Ruby – TOC</title>
      <link>https://dhruvasagar.dev/2010/12/24/getting-started-with-ruby-toc/</link>
      <pubDate>Fri, 24 Dec 2010 18:29:47 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2010/12/24/getting-started-with-ruby-toc/</guid>
      <description>&lt;p&gt;Hi,&lt;/p&gt;&#xA;&lt;p&gt;I have written a series of articles (in several parts) in an attempt to guide&#xA;beginners to get comfortable with Ruby. This article is my attempt to build&#xA;a TOC (Table of Contents) for it to act as an index for people to get a brief&#xA;idea regarding what each article is about and help them get to the sections&#xA;they are interested in.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dhruvasagar.dev/2010/10/19/getting-started-with-ruby-part1/&#34; title=&#34;Getting started with Ruby - Part 1&#34;&gt;Getting started with Ruby - Part 1&lt;/a&gt;: In this article I begin with an&#xA;introduction to myself and my motivation behind writing these articles. I give&#xA;an introduction to Ruby, about how to get started with building your&#xA;development environment and introduce a few tools that ship along with Ruby&#xA;which will make your life that much better.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dhruvasagar.dev/2010/10/19/getting-started-with-ruby-part2/&#34; title=&#34;Getting started with Ruby - Part 2&#34;&gt;Getting started with Ruby - Part 2&lt;/a&gt;: In this article I introduce Ruby in&#xA;slightly more detail and I get started with describing different data types in&#xA;Ruby. I cover Strings and Numbers in this article.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dhruvasagar.dev/2010/10/21/getting-started-with-ruby-part3/&#34; title=&#34;Getting started with Ruby - Part 3&#34;&gt;Getting started with Ruby - Part 3&lt;/a&gt;: In this article I continue from my&#xA;previous article describing data types in Ruby and cover Ranges and Arrays.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dhruvasagar.dev/2010/10/23/getting-started-with-ruby-part4/&#34; title=&#34;Getting started with Ruby - Part 4&#34;&gt;Getting started with Ruby - Part 4&lt;/a&gt;: In this article I continue further&#xA;and cover Hashes, one of the most commonly used data types in Ruby. I also&#xA;introduce blocks and about using blocks with functions.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dhruvasagar.dev/2010/10/26/getting-started-with-ruby-part5/&#34; title=&#34;Getting started with Ruby - Part 5&#34;&gt;Getting started with Ruby - Part 5&lt;/a&gt;: In this article I move onto&#xA;describing various looping constructs in Ruby, and also various flow control&#xA;modifiers in Ruby. After that I introduce Variables, Symbols, Constants,&#xA;Methods and Global Variables in Ruby.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dhruvasagar.dev/2010/11/03/getting-started-with-ruby-part6/&#34; title=&#34;Getting started with Ruby - Part 6&#34;&gt;Getting started with Ruby - Part 6&lt;/a&gt;: After having covered basics of&#xA;various constructs in Ruby, I considered it better to take a problem statement&#xA;and solve it in Ruby to bring most of what we’ve discussed into use. I chose&#xA;Google Codejam 2009′s qualification round problem – &lt;a href=&#34;http://code.google.com/codejam/contest/dashboard?c=90101&#34;&gt;Alien Language&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I tried to be clear, precise and specific. My intention was write more code&#xA;than to waste time in trying to explain and so I’ve used code comments to help&#xA;people understand what each part of the code is meant to do. I have plans on&#xA;going further and go onto describing classes &amp;amp; modules, sometime soon, even&#xA;though I expected more people to read and give their feedback, but owing to&#xA;a lot of work and hence a lack of time, I haven’t been able to do much justice&#xA;to the same, but hopefully I will be able to do so very soon. I hope it helps&#xA;people appreciate Ruby and motivate them to learn and understand it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>MongoMapper Plugin – Versionable</title>
      <link>https://dhruvasagar.dev/2010/12/02/mongomapper-plugin-versionable/</link>
      <pubDate>Thu, 02 Dec 2010 03:53:38 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2010/12/02/mongomapper-plugin-versionable/</guid>
      <description>&lt;p&gt;There was a requirement at one of our projects here at &lt;a href=&#34;http://web.archive.org/web/20110917020206/http://www.artha42.com/&#34; title=&#34;Artha42 Innovations Private Limited&#34;&gt;Artha42 Innovations&#xA;Private Limited&lt;/a&gt; that our Mongo Mapper documents have inherent versioning&#xA;so as to be able to track the changes being made and also if required revert&#xA;the changes to a previous state. Since we’re using MongoMapper, I set out to&#xA;create a simple plugin for the same to add the required functionality.&lt;/p&gt;&#xA;&lt;p&gt;Initially, from the initial research I did, I found &lt;a href=&#34;http://shapado.com/&#34; title=&#34;Shapado&#34;&gt;Shapado&lt;/a&gt; had an&#xA;implementation of exactly what I wanted, however when I studied and understood&#xA;their implementation in detail, I realized that it doesn’t really work that&#xA;well in most scenarios, especially the ones we were tackling in our project.&#xA;Shapado’s versionable allows you to define a set of keys for a document, whose&#xA;changes would trigger creation of new versions. However in our project we&#xA;needed to track changes at the complete document level, i.e. even for changes&#xA;in the associations. Also the versions were embedded within the document&#xA;itself, which implied that the document would grow in size very rapidly, even&#xA;though our changes in each iteration could be minor, since each version would&#xA;literally be a snapshot of the complete document itself.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Calculating Hashes</title>
      <link>https://dhruvasagar.dev/2010/11/25/calculating-hashes/</link>
      <pubDate>Thu, 25 Nov 2010 09:30:27 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2010/11/25/calculating-hashes/</guid>
      <description>&lt;p&gt;Showcasing how to calculate hashes in Java, C# and Ruby!&lt;/p&gt;&#xA;&lt;h2 id=&#34;java-&#34;&gt;&#xA;Java :&#xA;&lt;a href=&#34;#java-&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;algorithm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buffer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MessageDigest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;md&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MessageDigest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getInstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;algorithm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;md&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;update&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;digest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;md&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;digest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hexValue&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;digest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;digest&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0xff&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toHexString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toHexString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hex&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NoSuchAlgorithmException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;printStackTrace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;c-&#34;&gt;&#xA;C# :&#xA;&lt;a href=&#34;#c-&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System.Text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System.Security.Cryptography&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;getHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;algo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sourceBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Encoding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Default&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WriteLine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;algo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;switch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;algo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ToUpper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;MD5&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MD5CryptoServiceProvider&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ComputeHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sourceBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;SHA1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SHA1Managed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ComputeHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sourceBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;SHA256&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SHA256Managed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ComputeHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sourceBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;SHA384&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SHA384Managed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ComputeHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sourceBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;SHA512&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SHA512Managed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ComputeHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sourceBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;StringBuilder&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sb&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;StringBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Length&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;++)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;sb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AppendFormat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;{0:x2}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ToString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ruby-&#34;&gt;&#xA;Ruby :&#xA;&lt;a href=&#34;#ruby-&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;require&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;digest&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;getHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;algo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;md5&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;algo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strip&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;upcase&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;MD5&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;Digest&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;MD5&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hexdigest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SHA1&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;Digest&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;SHA1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hexdigest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SHA256&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;Digest&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;SHA256&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hexdigest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SHA384&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;Digest&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;SHA384&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hexdigest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;SHA512&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;Digest&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;SHA512&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hexdigest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As you can see, the Ruby version to calculate hashes is the most concise&#xA;&amp;amp; simple.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting started with Ruby – Part 6</title>
      <link>https://dhruvasagar.dev/2010/11/03/getting-started-with-ruby-part6/</link>
      <pubDate>Wed, 03 Nov 2010 04:22:09 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2010/11/03/getting-started-with-ruby-part6/</guid>
      <description>&lt;p&gt;After having covered most of the basics of Ruby, lets get started on an actual&#xA;problem, just like I had promised in my previous article – &lt;a href=&#34;https://dhruvasagar.dev/2010/10/26/getting-started-with-ruby-part5/&#34; title=&#34;Getting started with Ruby - Part 5&#34;&gt;Getting started&#xA;with Ruby – Part 5&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;I am taking a relatively simple problem that came in &lt;a href=&#34;http://code.google.com/codejam/&#34;&gt;Google&#xA;Codejam&lt;/a&gt; 2009 qualification round. Here is&#xA;the direct link to the problem : &lt;a href=&#34;http://code.google.com/codejam/contest/dashboard?c=90101&#34;&gt;Alien&#xA;Language&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;After years of study, scientists at Google Labs have discovered an alien&#xA;language transmitted from a faraway planet. The alien language is very&#xA;unique in that every word consists of exactly L lowercase letters. Also,&#xA;there are exactly D words in this language.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting started with Ruby – Part 5</title>
      <link>https://dhruvasagar.dev/2010/10/26/getting-started-with-ruby-part5/</link>
      <pubDate>Tue, 26 Oct 2010 03:35:06 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2010/10/26/getting-started-with-ruby-part5/</guid>
      <description>&lt;p&gt;Hi in my previous article &lt;a href=&#34;https://dhruvasagar.dev/2010/10/23/getting-started-with-ruby-part4/&#34; title=&#34;Getting started with Ruby - Part 4&#34;&gt;Getting started with Ruby – Part 4&lt;/a&gt; I covered&#xA;Hashes &amp;amp; blocks.&lt;/p&gt;&#xA;&lt;p&gt;Today I will take you through the various forms of loops in Ruby.&lt;/p&gt;&#xA;&lt;h2 id=&#34;while&#34;&gt;&#xA;While&#xA;&lt;a href=&#34;#while&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Executes &lt;em&gt;code&lt;/em&gt; as long as the given condition is true. We can separate the&#xA;code from the condition using either the keyword &lt;strong&gt;do&lt;/strong&gt;, a newline or&#xA;a semi-colon (;)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;puts&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Iteration &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Output :&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Iteration 0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Iteration 1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Iteration 2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Iteration 3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Iteration 4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Alternatively, it is also possible to use the while loop as a modifier&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# towards the end of a statement or a code block&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;begin&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;puts&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Iteration &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;#{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;end&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Output :&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Iteration 0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Iteration 1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Iteration 2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Iteration 3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Iteration 4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;until&#34;&gt;&#xA;Until&#xA;&lt;a href=&#34;#until&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Is very similar to the while loop with respect to the syntax &amp;amp; usage, the only&#xA;difference between the two is the fact that the while loop executes the code&#xA;block as long as the condition is true, the until loop does exactly the&#xA;opposite, i.e. it executes the code block as long as the condition is false.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting started with Ruby – Part 4 – Hashes &amp; Blocks</title>
      <link>https://dhruvasagar.dev/2010/10/23/getting-started-with-ruby-part4/</link>
      <pubDate>Fri, 22 Oct 2010 19:57:01 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2010/10/23/getting-started-with-ruby-part4/</guid>
      <description>&lt;p&gt;In my previous article &lt;a href=&#34;https://dhruvasagar.dev/2010/10/21/getting-started-with-ruby-part3/&#34; title=&#34;Getting started with Ruby&#34;&gt;Getting started with Ruby – Part 3&lt;/a&gt; I started with&#xA;Collections and covered basics of Ranges &amp;amp; Arrays. Like I mentioned towards&#xA;the end of the article (in case you couldn’t manage to reach the end) I will&#xA;start with one of the most commonly used Collection objects in Ruby, namely&#xA;Hashes.&lt;/p&gt;&#xA;&lt;p&gt;Hashes are essentially data structures to store key – value pairs, when you&#xA;wish to store an element in the Hash you do so by assigning a unique key to it&#xA;within the hash and while retrieving you do so with the help of that unique&#xA;key. The beauty of hashes is the fact that the ‘key’ in question here could be&#xA;just about any object in Ruby, most commonly however in practice strings or&#xA;symbols (i’ll get to what these are soon) are used as keys.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting started with Ruby – Part 3 – Collections, Ranges &amp; Arrays</title>
      <link>https://dhruvasagar.dev/2010/10/21/getting-started-with-ruby-part3/</link>
      <pubDate>Wed, 20 Oct 2010 19:27:19 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2010/10/21/getting-started-with-ruby-part3/</guid>
      <description>&lt;p&gt;In my previous article &lt;a href=&#34;https://dhruvasagar.dev/2010/10/19/getting-started-with-ruby-part2/&#34; title=&#34;Getting started with Ruby - Part 2&#34;&gt;Getting started with Ruby – Part 2&lt;/a&gt; I introduced&#xA;you all to Ruby &amp;amp; its philosophy and I started out with data type classes in&#xA;Ruby. I was able to give you an overview about Strings &amp;amp; Numbers in ruby.&#xA;Today I will start with &lt;strong&gt;Collections&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-range&#34;&gt;&#xA;The Range&#xA;&lt;a href=&#34;#the-range&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;As the name suggests, ranges hold a sequential collection of numbers. Defining&#xA;a range in Ruby is extremely simple, instead of explaining, i’ll show it to&#xA;you. Don’t be afraid to start an IRB shell to try the code out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting started with Ruby – Part 2 – Introduction &amp; Philosophy</title>
      <link>https://dhruvasagar.dev/2010/10/19/getting-started-with-ruby-part2/</link>
      <pubDate>Mon, 18 Oct 2010 18:53:29 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2010/10/19/getting-started-with-ruby-part2/</guid>
      <description>&lt;p&gt;Hi again, this is part 2 of my series of articles to help beginners getting&#xA;started with the Ruby programming language. At this point of time I would like&#xA;to quote the definition of Ruby from the &lt;a href=&#34;http://www.ruby-lang.org/en/&#34;&gt;Ruby Programming Language&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A dynamic, open source programming language with a focus on simplicity and&#xA;productivity. It has an elegant syntax that is natural to read and easy to&#xA;write.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;I know I had already quoted Ruby’s definition from wikipedia in my previous&#xA;article &lt;a href=&#34;https://dhruvasagar.dev/2010/10/19/getting-started-with-ruby-part1/&#34;&gt;Getting started with Ruby - Part&#xA;1&lt;/a&gt;, but that was more from&#xA;a technical standpoint. Here I wanted to draw your attention to &lt;a href=&#34;http://en.wikipedia.org/wiki/Yukihiro_Matsumoto&#34;&gt;Yukihiro&#xA;Matsumoto&lt;/a&gt;‘s&lt;label for=&#34;sidenote-1&#34; class=&#34;margin-toggle sidenote-number&#34;&gt;(1)&lt;/label&gt;&#xA;&lt;input type=&#34;checkbox&#34; id=&#34;sidenote-1&#34; class=&#34;margin-toggle&#34;/&gt;&#xA;&lt;span class=&#34;sidenote&#34;&gt;&#xA;&lt;span class=&#34;sidenote-number&#34;&gt;(1)&lt;/span&gt;Popularly&#xA;known as Matz&#xA;&lt;/span&gt;&#xA; philosophy behind creating Ruby, which is&#xA;making programming as simple &amp;amp; natural as humanely possible. We will be&#xA;witnessing that very soon.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting started with Ruby – Part 1</title>
      <link>https://dhruvasagar.dev/2010/10/19/getting-started-with-ruby-part1/</link>
      <pubDate>Mon, 18 Oct 2010 18:38:33 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2010/10/19/getting-started-with-ruby-part1/</guid>
      <description>&lt;p&gt;Before we get started with Ruby, let me first give you a brief on who I am,&#xA;I am Dhruva Sagar, a software engineer having a little over 4 years of&#xA;professional experience having worked in technologies in and around Java,&#xA;Javascript, Adobe Flex, PHP and Ruby. I have always been fascinated by&#xA;programming languages and have been eager to learn new ones and I can also&#xA;code comfortably in Perl, Python &amp;amp; Groovy, however I haven’t worked&#xA;extensively on these. Right now I am working in a startup &lt;a href=&#34;http://www.artha42.com/&#34;&gt;Artha42 Innovations&#xA;Private Limited&lt;/a&gt; and am having the best time of my&#xA;life!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Moving to Ubuntu</title>
      <link>https://dhruvasagar.dev/2008/05/06/moving-to-ubuntu/</link>
      <pubDate>Tue, 06 May 2008 09:59:31 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2008/05/06/moving-to-ubuntu/</guid>
      <description>&lt;p&gt;I have worked on quite a few Linux distros, Redhat, Knoppix, BackTrack, PHLAK,&#xA;ubuntu, etc. But most of the times I did that only to explore the realm of&#xA;Linux and see for myself what its all about and explore a little more for the&#xA;particular distro’s utilities, and not to actually shift myself completely to&#xA;using it solely, since I have been accustomed to using windows and the various&#xA;softwares that I use on windows.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cleaning data on my computer</title>
      <link>https://dhruvasagar.dev/2008/05/05/cleaning-data-on-my-computer/</link>
      <pubDate>Mon, 05 May 2008 03:50:14 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2008/05/05/cleaning-data-on-my-computer/</guid>
      <description>&lt;p&gt;I remember my first computer which I had when I was in about 4th&#xA;standard&lt;label for=&#34;sidenote-1&#34; class=&#34;margin-toggle sidenote-number&#34;&gt;(1)&lt;/label&gt;&#xA;&lt;input type=&#34;checkbox&#34; id=&#34;sidenote-1&#34; class=&#34;margin-toggle&#34;/&gt;&#xA;&lt;span class=&#34;sidenote&#34;&gt;&#xA;&lt;span class=&#34;sidenote-number&#34;&gt;(1)&lt;/span&gt;About 15 years back if I remember&#xA;correctly&#xA;&lt;/span&gt;&#xA;. It was a real source of entertainment for me at&#xA;the time. Although I did enjoy playing basic dos games on it for long&#xA;durations a lot, but I remember that computer and most importantly it’s exact&#xA;configuration because of a really hilarious incident that happened with&#xA;me!&lt;label for=&#34;sidenote-2&#34; class=&#34;margin-toggle sidenote-number&#34;&gt;(2)&lt;/label&gt;&#xA;&lt;input type=&#34;checkbox&#34; id=&#34;sidenote-2&#34; class=&#34;margin-toggle&#34;/&gt;&#xA;&lt;span class=&#34;sidenote&#34;&gt;&#xA;&lt;span class=&#34;sidenote-number&#34;&gt;(2)&lt;/span&gt;Well considering my age at that time and my level of&#xA;understanding of computers, it really was hilarious, not that dumb&#xA;😀&#xA;&lt;/span&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Calculating a MD5, SHA1, SHA256, SHA384, SHA512 Hash in C#</title>
      <link>https://dhruvasagar.dev/2007/08/15/calculating-a-md5-sha1-sha256-sha384-sha512-hash-in-c/</link>
      <pubDate>Wed, 15 Aug 2007 18:12:56 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2007/08/15/calculating-a-md5-sha1-sha256-sha384-sha512-hash-in-c/</guid>
      <description>&lt;p&gt;Following up on my &lt;a href=&#34;https://dhruvasagar.dev/2007/08/13/calculating-a-md5-sha1-sha256-sha384-sha512-hash-in-java&#34; title=&#34;Calculating a MD5, SHA1, SHA256, SHA384, SHA512 hash in Java&#34;&gt;Creating a Hash in Java&lt;/a&gt; post, here I am giving another&#xA;implementation through a simple function for calculating a Hash in C#.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the code:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System.Text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;System.Security.Cryptography&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;computeHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;algo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sourceBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Encoding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Default&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;Console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WriteLine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;algo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;switch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;algo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ToUpper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;MD5&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MD5CryptoServiceProvider&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ComputeHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sourceBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;SHA1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SHA1Managed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ComputeHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sourceBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;SHA256&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SHA256Managed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ComputeHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sourceBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;SHA384&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SHA384Managed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ComputeHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sourceBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;SHA512&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SHA512Managed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ComputeHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sourceBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;k&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&#x9;&lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;n&#34;&gt;StringBuilder&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sb&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;StringBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Length&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;++)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&#x9;&lt;span class=&#34;n&#34;&gt;sb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AppendFormat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;{0:x2}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hashBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#x9;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ToString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Calculating a MD5, SHA1, SHA256, SHA384, SHA512 Hash in Java</title>
      <link>https://dhruvasagar.dev/2007/08/13/calculating-a-md5-sha1-sha256-sha384-sha512-hash-in-java/</link>
      <pubDate>Mon, 13 Aug 2007 17:58:32 +0000</pubDate>
      <guid>https://dhruvasagar.dev/2007/08/13/calculating-a-md5-sha1-sha256-sha384-sha512-hash-in-java/</guid>
      <description>&lt;p&gt;Hi, today I will show you with examples how to evaluate Hashes in Java&#xA;programming language. I hope this information comes in useful for many&#xA;people.&lt;/p&gt;&#xA;&lt;p&gt;Java which is my favorite programming language because of sheer simplicity,&#xA;vastness and ease with which you can customize and extend existing libraries&#xA;to suit your needs.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * The getHash method returns the hash of the message&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param message The message to be hashed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @param algorithm The hashing algorithm to be used,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; *                  Possible values are MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @return The hash of the message&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @author Dhruva Sagar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;getHash&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;algorithm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buffer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getBytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MessageDigest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;md&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MessageDigest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getInstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;algorithm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;md&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;update&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;digest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;md&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;digest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hexValue&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;digest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;digest&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0xff&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toHexString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hex&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toHexString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hex&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NoSuchAlgorithmException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;printStackTrace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://dhruvasagar.dev/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dhruvasagar.dev/about/</guid>
      <description>&lt;h2 id=&#34;i-am-dhruva-sagar&#34;&gt;&#xA;I am Dhruva Sagar&#xA;&lt;a href=&#34;#i-am-dhruva-sagar&#34; class=&#34;heading-anchor&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When I was 15 year old. My dream was very simple. I wanted to write code. Open&#xA;Source code, more specifically. I have been chasing that dream for a long&#xA;time&lt;label for=&#34;sidenote-1&#34; class=&#34;margin-toggle sidenote-number&#34;&gt;(1)&lt;/label&gt;&#xA;&lt;input type=&#34;checkbox&#34; id=&#34;sidenote-1&#34; class=&#34;margin-toggle&#34;/&gt;&#xA;&lt;span class=&#34;sidenote&#34;&gt;&#xA;&lt;span class=&#34;sidenote-number&#34;&gt;(1)&lt;/span&gt;~18 years professionally, significantly longer if you count&#xA;the time since I was writing code in school / college&#xA;&lt;/span&gt;&#xA;.&#xA;Still at it. &lt;strong&gt;That&amp;rsquo;s what keeps me going&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This site is my little corner of the web where I jot down some of the&#xA;interesting things I come across&lt;/p&gt;</description>
    </item>
    <item>
      <title>Now</title>
      <link>https://dhruvasagar.dev/now/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dhruvasagar.dev/now/</guid>
      <description>What I am focused on NOW</description>
    </item>
  </channel>
</rss>
