<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rahul Chowdhury 🕶</title>
    <description>The latest articles on DEV Community by Rahul Chowdhury 🕶 (@rahulchowdhury).</description>
    <link>https://dev.to/rahulchowdhury</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F138964%2F61b7d979-f688-449e-a55c-d00bc6e99379.jpg</url>
      <title>DEV Community: Rahul Chowdhury 🕶</title>
      <link>https://dev.to/rahulchowdhury</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rahulchowdhury"/>
    <language>en</language>
    <item>
      <title>Day 10: Algorithms</title>
      <dc:creator>Rahul Chowdhury 🕶</dc:creator>
      <pubDate>Fri, 02 Aug 2019 11:28:28 +0000</pubDate>
      <link>https://dev.to/rahulchowdhury/day-10-algorithms-4g81</link>
      <guid>https://dev.to/rahulchowdhury/day-10-algorithms-4g81</guid>
      <description>&lt;p&gt;I got an interview tomorrow, so I started brushing up my algorithms knowledge.&lt;/p&gt;

&lt;p&gt;I have never had a pleasant experience learning algorithms because most resources are filled with jargon and very less real-world applications.&lt;/p&gt;

&lt;p&gt;Thankfully, I found a book that makes learning popular algorithms fun. Here it is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.manning.com/books/grokking-algorithms"&gt;https://www.manning.com/books/grokking-algorithms&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's most of today's update. Check out the book if you struggle with algorithms, like me.&lt;/p&gt;

</description>
      <category>books</category>
    </item>
    <item>
      <title>Day 9: Display list of elephants</title>
      <dc:creator>Rahul Chowdhury 🕶</dc:creator>
      <pubDate>Thu, 01 Aug 2019 11:49:36 +0000</pubDate>
      <link>https://dev.to/rahulchowdhury/day-9-display-list-of-elephants-2cp8</link>
      <guid>https://dev.to/rahulchowdhury/day-9-display-list-of-elephants-2cp8</guid>
      <description>&lt;p&gt;I finally added a &lt;code&gt;RecyclerView&lt;/code&gt; to display the list of elephants on the home fragment which is &lt;code&gt;ElephantListFragment&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With a mocktail of &lt;code&gt;ListAdapter&lt;/code&gt;, Data Binding and &lt;code&gt;DiffUtil&lt;/code&gt;, populating data to the &lt;code&gt;RecyclerView&lt;/code&gt; in an efficient way was damn easy.&lt;/p&gt;

&lt;p&gt;Here's my sleek adapter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ElephantListAdapter&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ListAdapter&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Elephant&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;ElephantListAdapter&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ViewHolder&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;ElephantDiffCallback&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onCreateViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ViewGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;viewType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;ViewHolder&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;binding&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ElephantListItemBinding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inflate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;LayoutInflater&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;false&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onBindViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;holder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ViewHolder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;elephant&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;holder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elephant&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;createClickListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elephantName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;elephant&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;elephantListItemBinding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ElephantListItemBinding&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RecyclerView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elephantListItemBinding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Elephant&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;listener&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OnClickListener&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;elephantListItemBinding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;elephant&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;
                &lt;span class="n"&gt;clickListener&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;listener&lt;/span&gt;
                &lt;span class="nf"&gt;executePendingBindings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;createClickListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elephantName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OnClickListener&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OnClickListener&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;navArgs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Bundle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;navArgs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;putString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"elephantName"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elephantName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findNavController&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;elephantProfileFragment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;navArgs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ElephantDiffCallback&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;DiffUtil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ItemCallback&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Elephant&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;areItemsTheSame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oldItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Elephant&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Elephant&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
        &lt;span class="n"&gt;oldItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;

    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;areContentsTheSame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oldItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Elephant&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Elephant&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
        &lt;span class="n"&gt;oldItem&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;newItem&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Polishes can be done here and there which I'll do in some time.&lt;/p&gt;

&lt;p&gt;Check out the repo, here: &lt;a href="https://github.com/rahulchowdhury/elly"&gt;https://github.com/rahulchowdhury/elly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, I would like to target UI testing with Espresso. Any handy guide for me?&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>What would you use for building an Android app today?</title>
      <dc:creator>Rahul Chowdhury 🕶</dc:creator>
      <pubDate>Wed, 31 Jul 2019 13:22:56 +0000</pubDate>
      <link>https://dev.to/rahulchowdhury/what-would-you-use-for-building-an-android-app-today-28h2</link>
      <guid>https://dev.to/rahulchowdhury/what-would-you-use-for-building-an-android-app-today-28h2</guid>
      <description>&lt;p&gt;Given that we have multiple tech to create an Android app today, what would you prefer using and why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native with Kotlin/Java&lt;/li&gt;
&lt;li&gt;Flutter&lt;/li&gt;
&lt;li&gt;React Native&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>android</category>
    </item>
    <item>
      <title>Day 8: Repository, tested</title>
      <dc:creator>Rahul Chowdhury 🕶</dc:creator>
      <pubDate>Wed, 31 Jul 2019 07:55:47 +0000</pubDate>
      <link>https://dev.to/rahulchowdhury/day-8-repository-tested-2dgm</link>
      <guid>https://dev.to/rahulchowdhury/day-8-repository-tested-2dgm</guid>
      <description>&lt;h1&gt;
  
  
  Yesterday's work
&lt;/h1&gt;

&lt;p&gt;I started refactoring my repository to accept local and remote source contracts instead of concrete classes.&lt;/p&gt;

&lt;p&gt;This move was to make my repository unit-testable using &lt;a href="https://junit.org/junit4/"&gt;JUnit4&lt;/a&gt; and &lt;a href="https://site.mockito.org/"&gt;Mockito&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here's an awesome tutorial on how to use Mockito for unit tests: &lt;a href="https://www.vogella.com/tutorials/Mockito/article.html"&gt;https://www.vogella.com/tutorials/Mockito/article.html&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Today?
&lt;/h1&gt;

&lt;p&gt;I worked the morning on writing unit tests for my repository. I have to say, it was fun.&lt;/p&gt;

&lt;p&gt;I used Mockito for the first time and it was a great experience. There were hiccups here and there but overall it was a nice experience.&lt;/p&gt;

&lt;p&gt;Some of the roadblocks I faced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;NullPointerException&lt;/code&gt; on mocking &lt;code&gt;Boolean&lt;/code&gt; values. Turns out there was an issue with Mockito v2.8.9 while unboxing/autoboxing &lt;code&gt;Boolean&lt;/code&gt; values on Kotlin. Solved it by upgrading to v3.0.0.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;IllegalStateException&lt;/code&gt; because &lt;code&gt;ArgumentMatchers.eq()&lt;/code&gt; returns a &lt;code&gt;Nullable&lt;/code&gt; value and my parameters were non-nullable. I had to fix this by introducing a local alternate method like this:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;T&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;safeArgumentEq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;My repository is now well-tested. You can find the test file for reference, &lt;a href="https://github.com/rahulchowdhury/elly/blob/master/app/src/test/java/co/rahulchowdhury/elly/data/repo/DefaultElephantRepositoryTest.kt"&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>android</category>
      <category>testing</category>
      <category>architecture</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>Day 7: Hey look, I got a list of elephants</title>
      <dc:creator>Rahul Chowdhury 🕶</dc:creator>
      <pubDate>Tue, 30 Jul 2019 09:59:55 +0000</pubDate>
      <link>https://dev.to/rahulchowdhury/day-7-hey-look-i-got-a-list-of-elephants-46gk</link>
      <guid>https://dev.to/rahulchowdhury/day-7-hey-look-i-got-a-list-of-elephants-46gk</guid>
      <description>&lt;p&gt;Hi there, it's day 7 of &lt;a href="https://dev.to/rahulchowdhury/day-1-looking-out-2eih"&gt;my job hunt journey&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Yesterday's work
&lt;/h1&gt;

&lt;p&gt;Implementing Jetpack's Navigation component was a breeze. It's great to see how far Android app development has come.&lt;/p&gt;

&lt;p&gt;The core Android team has done a fabulous job in making common use cases easy to implement so that developers can focus more on the business logic of their apps.&lt;/p&gt;

&lt;p&gt;Apart from that, I did a little bit of refactoring here and there.&lt;/p&gt;

&lt;h1&gt;
  
  
  Today?
&lt;/h1&gt;

&lt;p&gt;I started working on fetching a list of elephants from the &lt;a href="https://elephant-api.herokuapp.com/"&gt;Elephant API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When it came to caching a list of elephants, I had 2 options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solution A&lt;/strong&gt;: Serialise and store a list of elephants in the local DB, separate from the previous &lt;code&gt;Elephant&lt;/code&gt; model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution B&lt;/strong&gt;: Store all elephant objects in the list as individual records, as they were stored in the elephant profile screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There were pros and cons of both approaches but ultimately I decided to go with solution B.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros and cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solution A&lt;/strong&gt;: 

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Pros&lt;/em&gt;: It's easy to implement and check for last update time to determine whether the list needs to be re-fetched.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Cons&lt;/em&gt;: Not flexible. Have to maintain similar data in 2 places. Can result in data inconsistency. For example, let's say the list of elephants is refreshed in the main screen and the list data in DB is updated with the latest copy. However, the profile screen still fetches cached data from individual elephant entities which might not have the latest copy because their cache time hasn't yet expired.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution B&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Pros&lt;/em&gt;: Data is consistent because elephant details on both the list screen and the profile screen are fetched from the same DB row. Thus, if one screen updates the data, the other screen automatically gets the latest update.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Cons&lt;/em&gt;: Caching logic is not straightforward like solution A because there is more than 1 item to check staleness of data.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the logic that I applied to determine the staleness of the list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;refreshElephantListIfNeeded&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;staleTime&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="nc"&gt;Constants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FRESHNESS_PERIOD_IN_MILLIS&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;staleElephants&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;elephantDao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadStaleElephants&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;staleTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;staleElephants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isNotEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;elephantListResponse&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;elephantApiService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetchElephants&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;normalisedElephants&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;elephantListResponse&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toElephant&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;elephantDao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;saveMultiple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;normalisedElephants&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can find the updated project here: &lt;a href="https://github.com/rahulchowdhury/elly"&gt;https://github.com/rahulchowdhury/elly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm also exploring my options to test repositories for my app. Let's see what I find.&lt;/p&gt;

</description>
      <category>android</category>
      <category>career</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Day 6: Android Navigation component and interview preparation</title>
      <dc:creator>Rahul Chowdhury 🕶</dc:creator>
      <pubDate>Mon, 29 Jul 2019 06:13:00 +0000</pubDate>
      <link>https://dev.to/rahulchowdhury/day-6-android-navigation-component-and-interview-preparation-4jn7</link>
      <guid>https://dev.to/rahulchowdhury/day-6-android-navigation-component-and-interview-preparation-4jn7</guid>
      <description>&lt;p&gt;Hey, another day of my &lt;a href="https://dev.to/rahulchowdhury/day-1-looking-out-2eih"&gt;job hunt journey&lt;/a&gt; and here's another post.&lt;/p&gt;

&lt;h1&gt;
  
  
  Testing so far
&lt;/h1&gt;

&lt;p&gt;So, I started off with view model testing yesterday. I have to say, it was easier than I have been thinking all this time.&lt;/p&gt;

&lt;p&gt;Particularly using the MVVM architecture and some helpers for Kotlin coroutines and &lt;code&gt;LiveData&lt;/code&gt;, the testing session was fun.&lt;/p&gt;

&lt;p&gt;I mean I had done automated testing on Node/Express and Ruby/RoR but this was the first time I ran a test on Android. It felt good.&lt;/p&gt;

&lt;p&gt;Here's my test class from yesterday's session: &lt;a href="https://github.com/rahulchowdhury/elly/blob/master/app/src/test/java/co/rahulchowdhury/elly/ui/profile/ElephantProfileViewModelTest.kt"&gt;ElephantProfileViewModelTest.kt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're using &lt;code&gt;LiveData&lt;/code&gt; and Kotlin coroutines in your view models, these utility classes will help you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rahulchowdhury/elly/blob/master/app/src/test/java/co/rahulchowdhury/elly/LiveDataTestUtil.kt"&gt;LiveDataTestUtil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rahulchowdhury/elly/blob/master/app/src/test/java/co/rahulchowdhury/elly/MainCoroutineRule.kt"&gt;MainCoroutineRule&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  What's for today?
&lt;/h1&gt;

&lt;p&gt;Today I'm mainly focusing on preparing for an introductory call from a company. I can't name it as of now.&lt;/p&gt;

&lt;p&gt;Let's see how the call goes. 😁&lt;/p&gt;

&lt;p&gt;Also, on the development part, I'll be focusing on getting familiar with Android's Navigation component which is supposed to make navigating between screen a lot easier.&lt;/p&gt;

&lt;p&gt;Let's see how that goes.&lt;/p&gt;

&lt;p&gt;Wish me luck, guys. 🤞🏻&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>career</category>
    </item>
    <item>
      <title>Day 5: Test, testing, tested</title>
      <dc:creator>Rahul Chowdhury 🕶</dc:creator>
      <pubDate>Sun, 28 Jul 2019 08:19:52 +0000</pubDate>
      <link>https://dev.to/rahulchowdhury/day-5-test-testing-tested-4lbj</link>
      <guid>https://dev.to/rahulchowdhury/day-5-test-testing-tested-4lbj</guid>
      <description>&lt;p&gt;Hiya, it's the 5th day of &lt;a href="https://dev.to/rahulchowdhury/day-1-looking-out-2eih"&gt;my job hunt journey&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Update so far
&lt;/h1&gt;

&lt;p&gt;I worked on handling heavy tasks like network and database calls using Kotlin coroutines yesterday.&lt;/p&gt;

&lt;p&gt;Got into &lt;code&gt;BindingAdapter&lt;/code&gt; by hooking up Glide to load images into my layout using data binding. It was straightforward.&lt;/p&gt;

&lt;p&gt;After that, I watched a Google I/O'19 talk on what's testing like on Android and how to structure Android apps for scalable testing.&lt;/p&gt;

&lt;p&gt;Here it is:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/VJi2vmaQe6w"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;It gave me a direction to move forward.&lt;/p&gt;

&lt;h1&gt;
  
  
  Doing today
&lt;/h1&gt;

&lt;p&gt;I'm trying out a &lt;a href="https://codelabs.developers.google.com/codelabs/android-testing"&gt;code lab on testing&lt;/a&gt; to get the hang of how to test Android apps.&lt;/p&gt;

&lt;p&gt;Once I get a definite taste of testing, I'm planning to dig deeper into the subject by following this guide: &lt;a href="https://developer.android.com/training/testing/fundamentals"&gt;https://developer.android.com/training/testing/fundamentals&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any other stuff that I should check out regarding the subject? &lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>testing</category>
      <category>career</category>
    </item>
    <item>
      <title>Day 4: Kotlin coroutines and app testing</title>
      <dc:creator>Rahul Chowdhury 🕶</dc:creator>
      <pubDate>Sat, 27 Jul 2019 08:18:44 +0000</pubDate>
      <link>https://dev.to/rahulchowdhury/day-4-kotlin-coroutines-and-app-testing-3i3d</link>
      <guid>https://dev.to/rahulchowdhury/day-4-kotlin-coroutines-and-app-testing-3i3d</guid>
      <description>&lt;p&gt;Yo, it's day 4 of &lt;a href="https://dev.to/rahulchowdhury/day-1-looking-out-2eih"&gt;my journey&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Update till now
&lt;/h1&gt;

&lt;h4&gt;
  
  
  Yesterday
&lt;/h4&gt;

&lt;p&gt;Worked on setting up local persistence to make my app accessible offline (maybe with stale data but still).&lt;/p&gt;

&lt;p&gt;I used Room for storing data offline, and I must say it's been a joy to use it.&lt;/p&gt;

&lt;p&gt;When I first started developing Android apps, I remember I had to deal with nasty cursor implementations to store/fetch data from SQLite.&lt;/p&gt;

&lt;p&gt;Then, Realm came and made storing local data a way lot easier.&lt;/p&gt;

&lt;p&gt;Room is on another level. You get the same benefits of using an ORM over SQLite with added benefits like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Compile-time query validations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;First-class support for &lt;code&gt;LiveData&lt;/code&gt; and Kotlin coroutines&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Today
&lt;/h4&gt;

&lt;p&gt;I spent the whole morning learning Kotlin coroutines and how they're useful for an Android app.&lt;/p&gt;

&lt;p&gt;I remember the time when I first got into reactive programming. RxJava on Android seemed like magic.&lt;/p&gt;

&lt;p&gt;Kotlin coroutines are a notch above that. It's an absolute joy to work with coroutines, primarily since popular libraries like Retrofit and Room support it out of the box.&lt;/p&gt;

&lt;p&gt;Also, running coroutines with a &lt;code&gt;viewModelScope&lt;/code&gt; means you don't have to worry about cancelling your coroutines when your user navigates away from a screen. Any child coroutines that they launch gets cancelled with the parent coroutines.&lt;/p&gt;

&lt;p&gt;You can learn more about this here: &lt;a href="https://medium.com/androiddevelopers/coroutines-on-android-part-i-getting-the-background-3e0e54d20bb"&gt;https://medium.com/androiddevelopers/coroutines-on-android-part-i-getting-the-background-3e0e54d20bb&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What's next?
&lt;/h1&gt;

&lt;p&gt;I need to create a binding adapter to allow Glide to load images to my &lt;code&gt;ImageView&lt;/code&gt; using data binding.&lt;/p&gt;

&lt;p&gt;After that, my main focus will be to learn how to do automated testing on Android.&lt;/p&gt;

&lt;p&gt;My plan is to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with unit testing view models&lt;/li&gt;
&lt;li&gt;Progress to instrumentation tests for repositories&lt;/li&gt;
&lt;li&gt;Finish up with UI tests for controllers (Activity, Fragments, etc)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's see how much I can get done today.&lt;/p&gt;

&lt;p&gt;Repo 👉🏻&lt;a href="https://github.com/rahulchowdhury/elly/tree/add-elephant-profile"&gt;https://github.com/rahulchowdhury/elly/tree/add-elephant-profile&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>career</category>
    </item>
    <item>
      <title>Day 3: Implementing offline app access</title>
      <dc:creator>Rahul Chowdhury 🕶</dc:creator>
      <pubDate>Fri, 26 Jul 2019 06:28:16 +0000</pubDate>
      <link>https://dev.to/rahulchowdhury/day-3-implementing-offline-app-access-3nfe</link>
      <guid>https://dev.to/rahulchowdhury/day-3-implementing-offline-app-access-3nfe</guid>
      <description>&lt;p&gt;Hey, it's day 3 of &lt;a href="https://dev.to/rahulchowdhury/day-1-looking-out-2eih"&gt;my job hunt&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  What did I do yesterday?
&lt;/h1&gt;

&lt;p&gt;I ditched Dagger for now and used &lt;a href="https://github.com/InsertKoinIO/koin"&gt;Koin&lt;/a&gt; to resolve the dependencies for my app. Setting up Koin was damn easy. &lt;/p&gt;

&lt;p&gt;Also, since I'm writing my app in Kotlin, using Koin felt natural.&lt;/p&gt;

&lt;p&gt;There was a small bug due to a silly mistake I made while wiring up my &lt;code&gt;Actvity&lt;/code&gt; to my &lt;code&gt;Fragment&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I posted the issue on Twitter and &lt;a href="https://dev.to/droidpulkit"&gt;Pulkit&lt;/a&gt; pointed me to an Android issue tracker thread. Got my issue resolved after I posted a comment &lt;a href="https://issuetracker.google.com/issues/73644080#comment33"&gt;over there&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  What am I doing today?
&lt;/h1&gt;

&lt;p&gt;Now that my view model setup is working. I will be working on persisting API call data using the Room library.&lt;/p&gt;

&lt;p&gt;Also, focusing on picking up data binding library to display data in my app.&lt;/p&gt;

&lt;p&gt;Following this wonderful guide over here: &lt;a href="https://developer.android.com/topic/libraries/architecture"&gt;https://developer.android.com/topic/libraries/architecture&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any good tutorials on how to test view models?&lt;/p&gt;

</description>
      <category>android</category>
      <category>career</category>
    </item>
    <item>
      <title>Day 2: Relearning Dagger 2</title>
      <dc:creator>Rahul Chowdhury 🕶</dc:creator>
      <pubDate>Thu, 25 Jul 2019 04:30:49 +0000</pubDate>
      <link>https://dev.to/rahulchowdhury/day-2-relearning-dagger-2-247k</link>
      <guid>https://dev.to/rahulchowdhury/day-2-relearning-dagger-2-247k</guid>
      <description>&lt;p&gt;It's day 2 of my &lt;a href="https://dev.to/rahulchowdhury/day-1-looking-out-2eih"&gt;job finding journey&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Where am I right now?
&lt;/h1&gt;

&lt;p&gt;I started implementing a simple app using Android Architecture Components, Dagger and Kotlin.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/rahulchowdhury" rel="noopener noreferrer"&gt;
        rahulchowdhury
      &lt;/a&gt; / &lt;a href="https://github.com/rahulchowdhury/elly" rel="noopener noreferrer"&gt;
        elly
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Demo Android app with the new Android Jetpack 🚀components.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;elly&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Demo Android app with the new Android Jetpack 🚀components.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/rahulchowdhury/elly" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;I didn't know Dagger 2 has come such a long way since I last learned to use it.&lt;/p&gt;

&lt;p&gt;There's a whole new module called &lt;a href="https://dagger.dev/android.html" rel="noopener noreferrer"&gt;dagger.android&lt;/a&gt;, explicitly designed to reduce boilerplate Dagger code on Android projects.&lt;/p&gt;

&lt;p&gt;View models now have a new trick called &lt;code&gt;SavedStateHandle&lt;/code&gt; to reduce boilerplate while handling app state.&lt;/p&gt;

&lt;p&gt;Turns out injecting a &lt;code&gt;SavedStateHandle&lt;/code&gt; to a view model isn't straightforward. There's a lot to setup.&lt;/p&gt;

&lt;p&gt;Currently, I'm stuck in making that work.&lt;/p&gt;

&lt;h1&gt;
  
  
  What am I doing today?
&lt;/h1&gt;

&lt;p&gt;I'm going to take a step back and get accustomed to this new &lt;code&gt;dagger.android&lt;/code&gt; module, first.&lt;/p&gt;

&lt;p&gt;Then, I'm going to set up &lt;code&gt;SavedStateHandle&lt;/code&gt; injection using Dagger in my app.&lt;/p&gt;

&lt;p&gt;When all this is done, I'll be working on implementing &amp;amp; caching a single API call to show cool elephant profiles.&lt;/p&gt;

&lt;p&gt;Any tips to guide me through this?&lt;/p&gt;

&lt;h1&gt;
  
  
  Final notes
&lt;/h1&gt;

&lt;p&gt;I'm looking out for a job for the role of Android Engineer. I have over 3.5 years of experience, and either a career in Bangalore or a Remote job works for me.&lt;/p&gt;

</description>
      <category>android</category>
      <category>career</category>
    </item>
    <item>
      <title>Day 1: Looking out</title>
      <dc:creator>Rahul Chowdhury 🕶</dc:creator>
      <pubDate>Wed, 24 Jul 2019 02:55:53 +0000</pubDate>
      <link>https://dev.to/rahulchowdhury/day-1-looking-out-2eih</link>
      <guid>https://dev.to/rahulchowdhury/day-1-looking-out-2eih</guid>
      <description>&lt;p&gt;Hey there,&lt;/p&gt;

&lt;p&gt;My name is Rahul and I have been an Android Engineer for the past three and a half years, working at various start-ups in India.&lt;/p&gt;

&lt;p&gt;Today, I'm starting to look out for a new job opportunity for the same role. Either &lt;strong&gt;remote&lt;/strong&gt; or a job in &lt;strong&gt;Bangalore&lt;/strong&gt; works for me.&lt;/p&gt;

&lt;p&gt;Finding a new job can be an exhausting process. Week to month-long interview processes and rejection can easily wear people down.&lt;/p&gt;

&lt;p&gt;I have been there and &lt;em&gt;it sucks&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  A little about this series
&lt;/h1&gt;

&lt;p&gt;This isn't the first time someone is opening up about their job hunting journey. What I've mostly read are the stories of people who have successfully landed a job and how did they do it.&lt;/p&gt;

&lt;p&gt;I wanted to make this different. Make this a live record of my journey.&lt;/p&gt;

&lt;p&gt;As already shared on Twitter:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1153847300432654336-55" src="https://platform.twitter.com/embed/Tweet.html?id=1153847300432654336"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1153847300432654336-55');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1153847300432654336&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;I have decided to post my journey on a regular basis both here on dev.to and over at Twitter.&lt;/p&gt;

&lt;p&gt;What I'm hoping this will do is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable people in the same situation as me to relate to the process and maybe pick up a few learnings from my journey&lt;/li&gt;
&lt;li&gt;Get me help from the amazing developer community to correct what I'm doing wrong &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, let's begin.&lt;/p&gt;

&lt;h1&gt;
  
  
  What am I doing today?
&lt;/h1&gt;

&lt;p&gt;I got a few responses from AngelList after I switched my current status to &lt;strong&gt;Actively interviewing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Have to get back to them.&lt;/p&gt;

&lt;p&gt;Apart from that, I will be creating an open-source Android app implementing Android's new and shiny &lt;a href="https://developer.android.com/jetpack" rel="noopener noreferrer"&gt;Jetpack&lt;/a&gt; components.&lt;/p&gt;

&lt;p&gt;This project will help me move from the MVP architecture to MVVM and also get up to speed with the latest tech in the Android world.&lt;/p&gt;

&lt;p&gt;I'll post short tweets on my Twitter handle &lt;a href="https://twitter.com/chowdhuryrahul" rel="noopener noreferrer"&gt;@chowdhuryrahul&lt;/a&gt; while building up this app today.&lt;/p&gt;

&lt;p&gt;Follow me if you're interested in this journey. 😄&lt;/p&gt;

&lt;p&gt;Any thoughts on this?&lt;/p&gt;

</description>
      <category>android</category>
      <category>career</category>
    </item>
    <item>
      <title>Dynamic index name on Algolia with Rails</title>
      <dc:creator>Rahul Chowdhury 🕶</dc:creator>
      <pubDate>Tue, 04 Jun 2019 12:24:51 +0000</pubDate>
      <link>https://dev.to/rahulchowdhury/dynamic-index-name-on-algolia-with-rails-5ekb</link>
      <guid>https://dev.to/rahulchowdhury/dynamic-index-name-on-algolia-with-rails-5ekb</guid>
      <description>&lt;p&gt;Anyone used/using Algolia with Rails?&lt;/p&gt;

&lt;p&gt;I need to set the name of my index dynamically based on an association in my model.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;-&amp;gt; Indexing an article&lt;br&gt;
-&amp;gt; Article &lt;em&gt;belongs to&lt;/em&gt; Publication named &lt;code&gt;dev&lt;/code&gt;&lt;br&gt;
-&amp;gt; Index name should be set to &lt;code&gt;dev&lt;/code&gt;&lt;br&gt;
-&amp;gt; The new article gets added to the &lt;code&gt;dev&lt;/code&gt; index&lt;/p&gt;

&lt;p&gt;Any help, guys?&lt;/p&gt;

</description>
      <category>help</category>
    </item>
  </channel>
</rss>
