<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Vasya Drobushkov</title>
    <link>https://krossovochkin.com/</link>
    <description>Recent content on Vasya Drobushkov</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 11 Jan 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://krossovochkin.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Kotlin Coroutines Cancellation and Exception Handling</title>
      <link>https://krossovochkin.com/posts/2026_01_11_kotlin_coroutines_cancellation_and_exception_handling/</link>
      <pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2026_01_11_kotlin_coroutines_cancellation_and_exception_handling/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://androidweekly.net/issues/issue-710&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-710-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Cancellation and exception handling in coroutines is by far the most complex thing I&amp;rsquo;ve faced during my entire career. These two things are so complicated that I sometimes ask myself how people are using such a difficult-to-use framework. I read all the possible docs that I found, many different articles, video courses, and even tried to look at the code - and still, I feel that my understanding of this topic is quite bad.&lt;br&gt;&#xA;When reading articles, I often thought that their structure was not good and that things were not clarified in a reasonable way. Usually, articles are just a collection of examples that show how certain combinations of suspending functions or coroutine builders will work. Learning by examples is good, but they should help with understanding core concepts so that all other situations are easy to relate to what was learned.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ChessKt Demo</title>
      <link>https://krossovochkin.com/apps/chesskt/</link>
      <pubDate>Sun, 27 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/apps/chesskt/</guid>
      <description>&lt;iframe width=&#34;340px&#34; height=&#34;340px&#34; src=&#34;../../applications/chess.kt/index.html&#34; style=&#34;margin: 0 auto; display: block; background-color: white;&#34;&gt;&lt;/iframe&gt;&#xA;&lt;p&gt;Sources: &lt;a href=&#34;https://github.com/krossovochkin/chess.kt&#34;&gt;https://github.com/krossovochkin/chess.kt&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Data-Driven Debugging for Engineers</title>
      <link>https://krossovochkin.com/posts/2025_06_03_data_driven_debugging_for_engineers/</link>
      <pubDate>Tue, 03 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2025_06_03_data_driven_debugging_for_engineers/</guid>
      <description>&lt;p&gt;As engineers, we deal with bugs every day. Finding the root cause and delivering the right fix is one of our most essential — and satisfying — skills.&lt;/p&gt;&#xA;&lt;p&gt;In this post, I want to walk through different types of issues we face and how we typically debug them. Most importantly, I’ll share my favorite and most challenging method: &lt;strong&gt;data-driven debugging&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Let’s break it down by who reports the issue and how it’s discovered.&lt;/p&gt;</description>
    </item>
    <item>
      <title>When SOLID breaks: Choose CLARITY</title>
      <link>https://krossovochkin.com/posts/2025_05_05_when_solid_breaks_choose_clarity/</link>
      <pubDate>Mon, 05 May 2025 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2025_05_05_when_solid_breaks_choose_clarity/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://androidweekly.net/issues/issue-674&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-674-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;A long time ago, when I had just started my journey into programming, development, and engineering, it wasn&amp;rsquo;t easy to find information, and bikeshedding could happen quite often because of that. We read books to gain insights into best practices and learn how to do things correctly. The concepts from the past were usually crucial and provided a great ramp-up to avoid obvious mistakes.&lt;/p&gt;&#xA;&lt;p&gt;Over time, we became flooded with information and opinions. In such an environment, old-time thoughts may even seem better, as they’ve been tested by time and by many engineers in the field.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Java after Kotlin</title>
      <link>https://krossovochkin.com/posts/2025_02_17_java_after_kotlin/</link>
      <pubDate>Mon, 17 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2025_02_17_java_after_kotlin/</guid>
      <description>&lt;p&gt;I am usually pretty slow with new technologies and software updates. That happened with Kotlin a while ago. While version 1.0 was released in early 2016, and many companies were early adopters since the alpha versions, I really started using it only around the end of 2017.&lt;/p&gt;&#xA;&lt;p&gt;I should say that I do find it a very concise and easy-to-write-and-read language. Its focus on developer experience makes it very pleasant to use (except coroutines, lol).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Relatively Non-Obvious Tricks in Solving Simple Algorithmic Problems</title>
      <link>https://krossovochkin.com/posts/2024_12_21_relatively_non_obvious_tricks_in_solving_simple_algorithmic_problems/</link>
      <pubDate>Sat, 21 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2024_12_21_relatively_non_obvious_tricks_in_solving_simple_algorithmic_problems/</guid>
      <description>&lt;p&gt;Blowing the dust off LeetCode once again, I found myself, as in the &lt;a href=&#34;https://krossovochkin.com/posts/2019_09_27_random_interview_coding_task_retrospective/&#34;&gt;past&lt;/a&gt;, struggling with coding relatively simple algorithms. Just like with anything else, if you don’t practice for years, you lose some of the hands-on experience.&lt;/p&gt;&#xA;&lt;p&gt;On the positive side, I noticed that for some problems, my new submissions were much better and more concise compared to my old ones. That’s an awesome feeling—a tangible measure of growth.&lt;/p&gt;&#xA;&lt;p&gt;While tackling certain easy problems, I realized that &amp;ldquo;easy&amp;rdquo; usually just means &amp;ldquo;doesn&amp;rsquo;t require much code.&amp;rdquo; However, the idea behind the optimal solution might still not be very intuitive. Sure, one can use brute force or additional collections, but in most cases, this leads to either a &amp;ldquo;time limit exceeded&amp;rdquo; or an &amp;ldquo;out of memory&amp;rdquo; error.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reactive streams testing</title>
      <link>https://krossovochkin.com/posts/2023_01_08_reactive_streams_testing/</link>
      <pubDate>Sun, 08 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2023_01_08_reactive_streams_testing/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;We should test the code to guarantee that it does exactly what it is expected to do. Tests not only verify correctness of the program but also set expectations. This becomes especially useful for public API, where tests can be treated as part of documentation that describes not only results but also behavior. Such things help do less painful migrations and refactoring as it becomes clear what behaviors are changing and what we should do about that.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dimensions Utils</title>
      <link>https://krossovochkin.com/apps/dimensions-utils/</link>
      <pubDate>Mon, 22 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/apps/dimensions-utils/</guid>
      <description>&lt;iframe width=&#34;340px&#34; height=&#34;270px&#34; src=&#34;../../applications/dimensions-utils/index.html&#34; style=&#34;margin: 0 auto; display: block; background-color: white;&#34;&gt;&lt;/iframe&gt;&#xD;&#xA;&lt;p&gt;Sources: &lt;a href=&#34;https://github.com/krossovochkin/dimensions-utils&#34;&gt;https://github.com/krossovochkin/dimensions-utils&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Time Utils</title>
      <link>https://krossovochkin.com/apps/time-utils/</link>
      <pubDate>Mon, 22 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/apps/time-utils/</guid>
      <description>&lt;iframe width=&#34;340px&#34; height=&#34;140px&#34; src=&#34;../../applications/time-utils/index.html&#34; style=&#34;margin: 0 auto; display: block; background-color: white;&#34;&gt;&lt;/iframe&gt;&#xD;&#xA;&lt;p&gt;Sources: &lt;a href=&#34;https://github.com/krossovochkin/time-utils&#34;&gt;https://github.com/krossovochkin/time-utils&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Color Utils</title>
      <link>https://krossovochkin.com/apps/color-utils/</link>
      <pubDate>Sat, 23 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/apps/color-utils/</guid>
      <description>&lt;iframe width=&#34;480px&#34; height=&#34;260px&#34; src=&#34;../../applications/color-utils/index.html&#34; style=&#34;margin: 0 auto; display: block; background-color: white;&#34;&gt;&lt;/iframe&gt;&#xD;&#xA;&lt;p&gt;Sources: &lt;a href=&#34;https://github.com/krossovochkin/color-utils&#34;&gt;https://github.com/krossovochkin/color-utils&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>When Compose remember cannot forget</title>
      <link>https://krossovochkin.com/posts/2022_07_23_when_compose_remember_cannot_forget/</link>
      <pubDate>Sat, 23 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2022_07_23_when_compose_remember_cannot_forget/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;../by/2022_07_23_when_compose_remember_cannot_forget&#34;&gt;Чытаць на беларускай мове&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://androidweekly.net/issues/issue-529&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-529-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;When developing &lt;a href=&#34;https://krossovochkin.com/apps/color-utils/&#34;&gt;color-utils&lt;/a&gt; app using Compose for Web I faced an issue that &lt;code&gt;remember&lt;/code&gt; didn&amp;rsquo;t want to forget the state. It was quite annoying experience as it felt stupid: composable function is recomposed with the new value provided but &lt;code&gt;remember&lt;/code&gt; still kept old value.&lt;br&gt;&#xA;As usual, there is no magic there and the answer is quite simple therefore this article won&amp;rsquo;t be that long.&lt;/p&gt;&#xA;&lt;p&gt;Compose is all about state. In the app I had two levels of state:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Калі Compose remember ня можа забыць</title>
      <link>https://krossovochkin.com/posts/by/2022_07_23_when_compose_remember_cannot_forget/</link>
      <pubDate>Sat, 23 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/by/2022_07_23_when_compose_remember_cannot_forget/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;../../2022_07_23_when_compose_remember_cannot_forget&#34;&gt;Read in English&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://androidweekly.net/issues/issue-529&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-529-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;уводзіны&#34;&gt;Уводзіны&lt;/h2&gt;&#xA;&lt;p&gt;Пры распрацоўцы прыкладання &lt;a href=&#34;https://krossovochkin.com/apps/color-utils/&#34;&gt;color-utils&lt;/a&gt; з выкарыстаннем Compose для Web я сутыкнуўся з праблемай, што &lt;code&gt;remember&lt;/code&gt; не хацеў забываць стан. Гэта быў вельмі раздражняльны вопыт, бо я адчуваў сябе па-дурному: Composable функцыя перакампанавана з новым значэннем, але &lt;code&gt;remember&lt;/code&gt; па-ранейшаму захоўвала старое значэнне.&#xA;Як звычайна, ніякай магіі тут няма, і адказ даволі просты, таму гэты артыкул не будзе вельмі доўгі.&lt;/p&gt;&#xA;&lt;p&gt;Compose - гэта ўсё аб стане. У прыкладанні ў мяне было два ўзроўні стану:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Card Soccer</title>
      <link>https://krossovochkin.com/apps/card-soccer/</link>
      <pubDate>Sun, 10 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/apps/card-soccer/</guid>
      <description>&lt;iframe width=&#34;275px&#34; height=&#34;600px&#34; src=&#34;../../applications/card-soccer/index.html&#34; style=&#34;margin: 0 auto; display: block;&#34;&gt;&lt;/iframe&gt;&#xA;&lt;h3 id=&#34;how-to-play&#34;&gt;How to play&lt;/h3&gt;&#xA;&lt;p&gt;The goal of the game is to win AI opponent by scoring more goals.&lt;br&gt;&#xA;The game is turn based.&lt;br&gt;&#xA;On your turn you should move the &amp;ldquo;ball&amp;rdquo; (card opened from your deck) to opponents goal.&lt;br&gt;&#xA;You start from the row that is close to your goal: you should select a card in a row and if it matches by value or suite - proceed to the next row up until the opponent&amp;rsquo;s goal.&lt;br&gt;&#xA;If there is no match - your turn is over.&lt;br&gt;&#xA;You can select opened and closed cards.&lt;br&gt;&#xA;If the whole row is opened - you can skip it and procced to the next one.&#xA;You score when your &amp;ldquo;ball&amp;rdquo; matches opponent goal.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Controlling TextView MinWidth</title>
      <link>https://krossovochkin.com/posts/2021_09_14_controlling_textview_minwidth/</link>
      <pubDate>Tue, 14 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2021_09_14_controlling_textview_minwidth/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://androidweekly.net/issues/issue-484&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-484-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;&#xA;&lt;p&gt;Sometimes we might need our TextView with &lt;code&gt;wrap_content&lt;/code&gt; width to occupy more space than it will based on amount of characters it displays. For that we can set minimum width. Usually, we do that via XML like this:&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-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;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;nt&#34;&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;xmlns:android=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;http://schemas.android.com/apk/res/android&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;na&#34;&gt;xmlns:app=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;http://schemas.android.com/apk/res-auto&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;na&#34;&gt;xmlns:tools=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;http://schemas.android.com/tools&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;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&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;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;match_parent&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;na&#34;&gt;tools:context=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;.MainActivity&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;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;nt&#34;&gt;&amp;lt;TextView&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;na&#34;&gt;android:id=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@+id/textView&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;na&#34;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wrap_content&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;na&#34;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wrap_content&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;na&#34;&gt;android:background=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@drawable/bg_text&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;na&#34;&gt;android:gravity=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;center&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;na&#34;&gt;android:minWidth=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;200dp&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;na&#34;&gt;android:text=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Hello World!&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;na&#34;&gt;app:layout_constraintBottom_toBottomOf=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;parent&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;na&#34;&gt;app:layout_constraintLeft_toLeftOf=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;parent&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;na&#34;&gt;app:layout_constraintRight_toRightOf=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;parent&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;na&#34;&gt;app:layout_constraintTop_toTopOf=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;parent&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;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;nt&#34;&gt;&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Having setup like this we ensure that our TextView will occupy a minimum of 200dp.&lt;br&gt;&#xA;Also, we can control minimum width programmatically via: &lt;code&gt;TextView#setMinWidth&lt;/code&gt;.&lt;br&gt;&#xA;But controlling minimum width programmatically has one caveat that I&amp;rsquo;d like to describe below.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mocking Matchers API</title>
      <link>https://krossovochkin.com/posts/2021_09_11_mocking_matchers_api/</link>
      <pubDate>Sat, 11 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2021_09_11_mocking_matchers_api/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://androidweekly.net/issues/issue-483&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-483-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://mailchi.mp/kotlinweekly/kotlin-weekly-268&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/kotlinweekly-268-purple#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;&#xA;&lt;p&gt;Recently, I faced an issue that in the first place I found weird. I even considered that the behavior is generally incorrect. Diving deeper I got few insights on the problem - and this is what I&amp;rsquo;d like to share with you.&lt;br&gt;&#xA;This is a story about the interesting behavior of mocking library and the difficulties of defining API surface for a library.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;&lt;br&gt;&#xA;In general, I favor fakes over mocks. In other words, instead of trying to implement emulation of the behavior as a mock - it is generally easier and safer to implement a simple fake object with all the logic (that can be covered with tests if needed).&lt;br&gt;&#xA;Though that doesn&amp;rsquo;t mean that one should not use mocks at all. In my opinion, it depends on the use case. If you would like to stub some values - then going with a fake object sounds like a wise choice, but for verifying behavior (e.g. whether there were interactions with a particular object or not) using mocking libraries might provide a fast solution.&lt;br&gt;&#xA;Needed to say that even when trying to verify interactions one can use fake objects wrapped with spies.&lt;br&gt;&#xA;Regardless, this article is not about what approach is better, it is more about the behavior of mocking libraries and how their API is designed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>JUnit Coroutines Runner</title>
      <link>https://krossovochkin.com/posts/2021_07_10_junit_coroutines_runner/</link>
      <pubDate>Sat, 10 Jul 2021 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2021_07_10_junit_coroutines_runner/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;&#xA;&lt;p&gt;Recently while writing tests for kotlin code with coroutines I found one annoying thing: almost all the tests start with &lt;code&gt;runBlockingTest&lt;/code&gt;. Typing the same stuff repeatedly is something we can&amp;rsquo;t accept! So, I decided to think about how to improve this.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Disclaimer. Yes, this is an example of how to spend few hours to optimize some task that requires you 2 seconds to complete each time. Even on a scale of hundreds of usages such optimization most likely won&amp;rsquo;t pay your time back. But it is always fun to do some weird things even if you understand that they are stupid.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kotlin flow: Nesting vs Chaining</title>
      <link>https://krossovochkin.com/posts/2021_07_08_kotlin_flow_nesting_vs_chaining/</link>
      <pubDate>Thu, 08 Jul 2021 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2021_07_08_kotlin_flow_nesting_vs_chaining/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://androidweekly.net/issues/issue-474&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-474-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://mailchi.mp/kotlinweekly/kotlin-weekly-258&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/kotlinweekly-258-purple#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;&#xA;&lt;p&gt;When it comes to reactive streams it is likely everyone heard about huge &amp;lsquo;Rx-chains&amp;rsquo;. But reactive streams are not only about chaining but also about nesting. Let&amp;rsquo;s find out what are they, what are the differences, and why it matters.&lt;br&gt;&#xA;We&amp;rsquo;ll use Kotlin Flow throughout the article, but everything can be applied to RxJava as well.&lt;/p&gt;&#xA;&lt;p&gt;First of all, we need to come up with definitions. For that, we&amp;rsquo;ll take a look at some simple streams.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why custom website instead of Medium</title>
      <link>https://krossovochkin.com/posts/2021_06_21_why_custom_website_instead_of_medium/</link>
      <pubDate>Mon, 21 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2021_06_21_why_custom_website_instead_of_medium/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;&#xA;&lt;p&gt;I like writing articles. This is the best format for me to share ideas, knowledge and also to better understand some topic. when writing something other people can read you have to dive deep enough so that the picture is complete. It helps systemize thoughts.&#xA;Starting writing was challenging as you don&amp;rsquo;t know what feedback you&amp;rsquo;ll receive. It is always a bit tough to be not correct in something. Fear of making a mistake – while not being a bad thing, as we learn from mistakes – is still here. Don&amp;rsquo;t make that fear stop you from doing what you feel is right.&#xA;I started writing on Medium and publishing in various publications there but then switched to my website quite a while ago.&#xA;After some time of running my stuff, I finally would like to share why I did so and what the pros and cons of that are.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Custom Reactive JSON parsing</title>
      <link>https://krossovochkin.com/posts/2021_06_08_custom_reactive_json_parsing/</link>
      <pubDate>Tue, 08 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2021_06_08_custom_reactive_json_parsing/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mailchi.mp/kotlinweekly/kotlin-weekly-254&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/kotlinweekly-254-purple#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;&#xA;&lt;p&gt;Parsing JSON strings is a must-have on most Android projects that have server-client communication (of course there are some other formats like XML or &lt;a href=&#34;https://developers.google.com/protocol-buffers&#34;&gt;Protobuf&lt;/a&gt;, but I guess JSON is the most common one at least at the moment). Setting up this communication is relatively straightforward: choose a library, add it to a project, describe models, create mappers, and so on. There are a bunch of various libraries to parse JSON: good old &lt;a href=&#34;https://github.com/google/gson&#34;&gt;Gson&lt;/a&gt;, &lt;a href=&#34;https://github.com/FasterXML/jackson&#34;&gt;Jackson&lt;/a&gt;, or more modern &lt;a href=&#34;https://github.com/square/moshi&#34;&gt;Moshi&lt;/a&gt;, &lt;a href=&#34;https://github.com/Kotlin/kotlinx.serialization&#34;&gt;kotlinx-serialization&lt;/a&gt; and there are more. Set up of these libraries is different, there are differences in the internal implementation, but the general idea is the same for most of them: you can convert JSON-string into a set of objects and vice versa.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bad Kotlin Extensions</title>
      <link>https://krossovochkin.com/posts/2021_01_25_bad_kotlin_extensions/</link>
      <pubDate>Mon, 25 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2021_01_25_bad_kotlin_extensions/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1598518619776-eae3f8a34eac?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&amp;amp;ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1351&amp;amp;q=80&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://androidweekly.net/issues/issue-451&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-451-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://mailchi.mp/kotlinweekly/kotlin-weekly-236&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/kotlinweekly-236-purple#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://www.oncreatedigest.com/issues/oncreate-digest-issue-41-309824&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/oncreate-41-ff69b4#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;&#xA;&lt;p&gt;Kotlin extensions are a cool feature. Though trying to write &amp;lsquo;idiomatic&amp;rsquo; Kotlin code some developers tend to overuse that feature making code worse than it could be without extensions. In this article, we&amp;rsquo;ll go through some examples of how not to write Kotlin extensions.&lt;/p&gt;&#xA;&lt;p&gt;First of all, we need to try to define what a good extension is.&lt;br&gt;&#xA;It is simple though vague: good extension solves some problems. When we talk about code the main feature extensions have is to improve readability. Extension methods are static methods with the first parameter being a receiver of the extension. For example, these are equivalents:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Debugging Proguard configuration issues</title>
      <link>https://krossovochkin.com/posts/2021_01_18_debugging_proguard_configuration_issues/</link>
      <pubDate>Mon, 18 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2021_01_18_debugging_proguard_configuration_issues/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1590249002987-c3d0e38db7a4?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&amp;amp;ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1350&amp;amp;q=80&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://androidweekly.net/issues/issue-450&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-450-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;It might happen so that there is a bug in your release build while in debug everything works fine. In many cases, it might be an issue with Proguard/R8 configuration. Of course, it is better to test your code thoroughly, properly configure Proguard if you, let&amp;rsquo;s say, load some classes only via reflection and so on. But reality sometimes strikes and bugs might go to production.&lt;br&gt;&#xA;In this case, the first thing that is needed is to find a bug and fix it. And only then have some retrospective to mitigate such situations in the future.&#xA;When the bug is in production already every minute counts, therefore it is important to have some plan. Proguard configuration seems complex to someone who didn&amp;rsquo;t work with it, so I recommend to take a look at its main features.&lt;br&gt;&#xA;Most of the time I&amp;rsquo;d say that issue is easy can be found and fixed by analyzing crash report logs. But sometimes the log is not that clear.&lt;br&gt;&#xA;In this article I&amp;rsquo;d like to introduce the plan to find what part of &amp;ldquo;Proguard&amp;rdquo; causing an issue, so you can debug more effectively.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Optimize reading articles experience</title>
      <link>https://krossovochkin.com/posts/2021_01_16_optimize_reading_articles_experience/</link>
      <pubDate>Sat, 16 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2021_01_16_optimize_reading_articles_experience/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;Learning is an essential part of doing anything. There are many different ways to learn something. Like active learning (studying) and passive learning (gaining experience), moving towards some particular goal and exploring unknown places looking for new ideas. One can learn using various types of perception - audial, visual, haptic, speech, etc.&#xA;Learning is important in all directions: improving your existing skills or getting new.&lt;/p&gt;&#xA;&lt;p&gt;I think one of the most straightforward ways of learning is active learning towards some particular goal. Some online-course might be an example: you start a course to let&amp;rsquo;s say learn new skills and after you&amp;rsquo;ve completed the course you can say that you&amp;rsquo;ve accomplished the goal and learned something.&lt;br&gt;&#xA;One of the most difficult ways of learning is exploring something new because there is no single way of doing that.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Android Room Hidden Costs</title>
      <link>https://krossovochkin.com/posts/2020_12_18_android_room_hidden_costs/</link>
      <pubDate>Fri, 18 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_12_18_android_room_hidden_costs/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://androidweekly.net/issues/issue-445&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-445-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://mailchi.mp/kotlinweekly/kotlin-weekly-230&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/kotlinweekly-230-purple#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;&#xA;&lt;p&gt;Android Room is an awesome AndroidX library. It is great because it provides a clean way of how to deal with databases without introducing some heavy concepts. Out of the box with Room one gets:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;simplified code comparing with raw SQLite queries&lt;/li&gt;&#xA;&lt;li&gt;working via DAO interfaces and models instead of Cursors&lt;/li&gt;&#xA;&lt;li&gt;auto-generated &amp;ldquo;boilerplate&amp;rdquo; code for queries&lt;/li&gt;&#xA;&lt;li&gt;migration support&lt;/li&gt;&#xA;&lt;li&gt;Android Studio tooling (compile-time verification of queries and highlight)&lt;/li&gt;&#xA;&lt;li&gt;support for reactive streams (RxJava, Kotlin Flow)&lt;/li&gt;&#xA;&lt;li&gt;and more&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;In this article, I&amp;rsquo;d like to discover some hidden costs Room applies to support reactive streams and how one can try to avoid them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Boolean not</title>
      <link>https://krossovochkin.com/posts/2020_10_31_boolean_not/</link>
      <pubDate>Sat, 31 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_10_31_boolean_not/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mailchi.mp/kotlinweekly/gjz7gia1eq&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/kotlinweekly-222-purple#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;&#xA;&lt;p&gt;Boolean is one of the essential types in programming and probably one of the simplest because it has only two values: true and false. Boolean are usually used as flags for control flow, specifically, conditions.&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-kotlin&#34; data-lang=&#34;kotlin&#34;&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;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isEmpty&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;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;String is empty&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;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;It is not much interesting in Boolean, but in Kotlin there is one thing which might be confusing if used - it is method &lt;code&gt;not()&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;negate-boolean&#34;&gt;Negate Boolean&lt;/h3&gt;&#xA;&lt;p&gt;If we look at declaration of Boolean class in Kotlin we&amp;rsquo;ll see five methods, four of which are pretty obvious: &lt;code&gt;and&lt;/code&gt;, &lt;code&gt;or&lt;/code&gt;, &lt;code&gt;xor&lt;/code&gt; and &lt;code&gt;compareTo&lt;/code&gt;. And the fifth is &lt;code&gt;not&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Middle Point</title>
      <link>https://krossovochkin.com/posts/2020_10_28_middle_point/</link>
      <pubDate>Wed, 28 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_10_28_middle_point/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;&#xA;&lt;p&gt;Working with numbers in programming never was a simple thing. In math, we deal with various sets of numbers - whole numbers, rational, complex. All these sets are infinite - that means that for any number we can find another smaller one and one which is bigger. In programming when we work with numbers we deal with some subset of these sets - that many that can be represented with a given amount of bits.&#xA;When we want to work with whole numbers we can use e.g. Integer, which are the numbers being able to be represented usually with 4 bits. For floating-point numbers - say Double - it is 8 bits. There is no plus or minus infinity (in Double there are +/- infinity, though they are used for special cases).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kotlin Functional Interfaces: Function reference and SAM conversion</title>
      <link>https://krossovochkin.com/posts/2020_10_17_kotlin_functional_interfaces_function_references_and_sam_conversion/</link>
      <pubDate>Sat, 17 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_10_17_kotlin_functional_interfaces_function_references_and_sam_conversion/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mailchi.mp/kotlinweekly/kotlin-weekly-220&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/kotlinweekly-220-purple#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;&#xA;&lt;p&gt;About two years ago I &lt;a href=&#34;https://medium.com/@krossovochkin/kotlin-java-interop-function-references-and-sam-conversions-3d0cd36f7967&#34;&gt;made a post&lt;/a&gt; about a tricky case in Kotlin-Java interop related to the usage of function references and SAM conversion.&#xA;One of the points there was that in Kotlin, if interface is declared instead of a function, one has to explicitly create an object, therefore no caveats as with interop:&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-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;py&#34;&gt;callback&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;: &lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;ThirdParty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Callback&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;override&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;fun&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;onValueChanged&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Int&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;this&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@App&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;onValueChanged&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;value&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;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;With Kotlin 1.4 there is now a &amp;ldquo;Functional interface&amp;rdquo; which supports SAM conversion. And &lt;a href=&#34;https://medium.com/@mwolfe38/does-the-new-kotlin-1-4-sam-interfaces-using-fun-interface-declaration-have-similar-issues-1b08fa65a096&#34;&gt;I&amp;rsquo;ve been asked&lt;/a&gt; on how it works in a similar situation.&lt;br&gt;&#xA;Let&amp;rsquo;s find out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kotlin Nitpicker&#39;s guide</title>
      <link>https://krossovochkin.com/posts/2020_10_14_kotlin_nitpickers_guide/</link>
      <pubDate>Wed, 14 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_10_14_kotlin_nitpickers_guide/</guid>
      <description>&lt;h3 id=&#34;introduction&#34;&gt;Introduction&lt;/h3&gt;&#xA;&lt;p&gt;Code review is an essential tool for a development team, which helps ensure high-quality standards of code. While reviewing others&amp;rsquo; code one might find bugs, design issues, and so on. One another part of reviewing is getting used to the codebase and following team&amp;rsquo;s code style for better maintenance.&#xA;Though it is pretty cool in theory, in practice team might face few issues, one of which is nitpicking. When review is bloated with dozens of similar comments related to e.g. how beautifully code looks like.&#xA;Common code style is important, but having a lot of similar comments in each review doesn&amp;rsquo;t help. Instead of trying to understand what code is doing, nitpicker writes a lot of similar comments on the style. Back and forth discussions or fixes of such slow down development process and overall make team&amp;rsquo;s morale worse.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Real Kotlin Flow benefits over RxJava</title>
      <link>https://krossovochkin.com/posts/2020_05_17_the_real_kotlin_flow_benefits_over_rxjava/</link>
      <pubDate>Sun, 17 May 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_05_17_the_real_kotlin_flow_benefits_over_rxjava/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1553877522-43269d4ea984?ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1357&amp;amp;q=80&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/Lks7vei-eAg&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/the-real-kotlin-flow-benefits-over-rxjava-c19b99ba6eb9&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://proandroiddev.com/proandroiddev-digest-22-a7bf64f9f068&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/proandroiddevdigest-22-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Recently the article about Kotlin Flow benefits over RxJava was published by &lt;a href=&#34;undefined&#34;&gt;Antoni Castejón García&lt;/a&gt;:&#xA;&lt;a href=&#34;https://proandroiddev.com/kotlin-flow-benefits-over-rxjava-b220658f1a92&#34;&gt;&lt;strong&gt;Kotlin Flow benefits over RxJava&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Though Antoni made a good work and many thanks to him for providing his feedback and experience (we need to share our thoughts, this improves community acknowledgment in various areas) — I found few places in the article with which I don’t fully or partially agree. Some points, in my opinion, were missing. So, I decided to make a follow-up feedback post on what I consider the real benefits of Kotlin Flow over RxJava. Feedback is also a good thing as it helps us to drive forward and maybe look at the same things from a different angle.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Raising old project from the depth</title>
      <link>https://krossovochkin.com/posts/2020_05_07_raising_old_project_from_the_depth/</link>
      <pubDate>Thu, 07 May 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_05_07_raising_old_project_from_the_depth/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://medium.com/@krossovochkin/raising-old-project-from-the-depth-22f3084ed82e&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;I am an Android Developer from the beginning of my professional career. Straight from the University, I’ve jumped into Android development, and to this day continue my journey. During that time I’ve worked in different areas: enterprise, product business applications, SDK development. But all that started with mobile game development.&lt;/p&gt;&#xA;&lt;p&gt;The first project I took part in was called “nICE”. It was a match-3-like game. It was at the time when there was Android Market and not Google Play Store, when we used Eclipse and not Android Studio and, of course, used Java. The game was already available in the Market, but we wanted to develop it more by adding some power-ups to make game experience richer (and gain more from in-app purchases) and introduce some additional game modes (like puzzles).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kotlin useful but unfairly not mentioned features</title>
      <link>https://krossovochkin.com/posts/2020_05_03_kotlin_useful_but_unfairly_not_mentioned_features/</link>
      <pubDate>Sun, 03 May 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_05_03_kotlin_useful_but_unfairly_not_mentioned_features/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1519963759188-0e9264cd7992?ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1357&amp;amp;q=80&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/5EoKAdyStik&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/kotlin-useful-but-unfairly-not-mentioned-features-25ec41ea0a87&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://proandroiddev.com/proandroiddev-digest-21-60de024d6337&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/proandroiddevdigest-21-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Many of us first learned Kotlin after Java. Learning process was fairly simple because Kotlin has many similarities when at the same time improves development experience by fighting common pain points Java developer (especially on Java 6, which is common in Android world) has to encounter every day.&lt;/p&gt;&#xA;&lt;p&gt;There are a bunch of articles about cool Kotlin features like immutability, handling nullability, smart-cast, data classes, and so forth. Yes, these features are great. Having to add a bunch of nullability annotations, final keywords, override equals/hashCode methods, create additional local variables after type checks — all of this adds unnecessary work that needs to be done all the time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Category theory</title>
      <link>https://krossovochkin.com/posts/2020_04_26_category_theory/</link>
      <pubDate>Sun, 26 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_04_26_category_theory/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1453733190371-0a9bedd82893?ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1357&amp;amp;q=80&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/5mZ_M06Fc9g&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://medium.com/@krossovochkin/category-theory-90b89ec9f2ab&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;disclaimer&#34;&gt;Disclaimer&lt;/h2&gt;&#xA;&lt;p&gt;This is short synopsis of great &lt;a href=&#34;https://www.youtube.com/playlist?list=PLbgaMIhjbmEnaH_LTkxLI7FMa2HsnawM_&#34;&gt;set of lectures&lt;/a&gt;. What is written here is by no means true, one should refer to original lectures or some books etc. This is written mostly for myself in case I wanted to revisit the topic in the future.&#xA;Everything below is not “what it is” but mostly “how I understood that”. So, there might be mistakes and so on.&lt;/p&gt;&#xA;&lt;h2 id=&#34;category&#34;&gt;Category&lt;/h2&gt;&#xA;&lt;p&gt;Category consists of:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Accessibility of text over generic background color</title>
      <link>https://krossovochkin.com/posts/2020_03_29_accessibility_of_text_over_generic_background_color/</link>
      <pubDate>Sun, 29 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_03_29_accessibility_of_text_over_generic_background_color/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1465403843003-b277b46a1120?ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1357&amp;amp;q=80&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/Jky9coxzeHI&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/accessibility-of-text-over-generic-background-color-e82e9546731a&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://proandroiddev.com/proandroiddev-digest-18-4c6a096fc7e8&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/proandroiddevdigest-18-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;One of the important parts of application development is to make it accessible to as many users as possible. This includes people with impaired vision, color blindness, impaired hearing, impaired dexterity, cognitive disabilities, and many other disabilities.&#xA;Making an app accessible is challenging but rewarding. The difficulty is because the development team should pay attention to some details which often might be overlooked. Though besides some advanced accessibility support might be too expensive to add, there are still some basic best practices to ensure that your app development is heading in the right direction (and can be improved later over time).&#xA;Basic accessibility support includes providing content descriptions, large enough touchable areas and ensuring good color contrast between foreground and background components.&#xA;In this article, we’ll go in detail on the latest — color contrast. We’ll take a look at one specific situation I faced while developing &lt;a href=&#34;https://github.com/krossovochkin/FiberyUnofficial&#34;&gt;FiberyUnofficial&lt;/a&gt; — my pet project, Android companion app for &lt;a href=&#34;https://fibery.io&#34;&gt;https://fibery.io&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Compiler-generated classes, methods and fields in Java</title>
      <link>https://krossovochkin.com/posts/2020_03_19_compiler_generated_classes_methods_and_fields_in_java/</link>
      <pubDate>Thu, 19 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_03_19_compiler_generated_classes_methods_and_fields_in_java/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1563951163384-ddbc3fbaacd4?ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1357&amp;amp;q=80&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/tdsG7cUNrOo&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://medium.com/javarevisited/compiler-generated-classes-methods-and-fields-in-java-343dde2cce61&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;When we write program in Java we create some classes, methods, fields and put all of this into our source code — .java files. After these files are compiled with javac (Java Compiler) into .class files we got a bunch of Java bytecode.&#xA;It turns out that not only we create classes, methods and fields in our source code, but also compiler by itself can create them when needed.&#xA;In this article we’ll try to get into the compiler-generated topic, will find out what are synthetic and bridge, access flags, learn some new things from official documentation and maybe more.&#xA;Let’s dive in.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Unit Testing Best Practices</title>
      <link>https://krossovochkin.com/posts/2020_03_19_unit_testing_best_practices/</link>
      <pubDate>Thu, 19 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_03_19_unit_testing_best_practices/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1547637589-f54c34f5d7a4?ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1357&amp;amp;q=80&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/IiEFmIXZWSw&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://medium.com/better-programming/unit-testing-best-practices-9bceeafe6edf&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: This is a set of things I consider very useful when writing unit tests. I call them &lt;em&gt;best practices&lt;/em&gt; because they allow me to write good, quality tests that are easier to read, more maintainable, and better describe business needs.&lt;/p&gt;&#xA;&lt;p&gt;These points might be subjective, you might have other opinions or have more items. That’s fine. Do not hesitate to put your opinions in the comments.&lt;/p&gt;&#xA;&lt;h2 id=&#34;tests-in-the-development-process&#34;&gt;Tests in the Development Process&lt;/h2&gt;&#xA;&lt;p&gt;Tests are very important in the development process. They give you a lot of benefits:&lt;/p&gt;</description>
    </item>
    <item>
      <title>From RxJava to Kotlin Flow: Testing</title>
      <link>https://krossovochkin.com/posts/2020_03_05_from_rxjava_to_kotlin_flow_testing/</link>
      <pubDate>Thu, 05 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_03_05_from_rxjava_to_kotlin_flow_testing/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1574170609519-d1d8d4b71f60?ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1357&amp;amp;q=80&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/9kSTF9PvETM&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;This post is part of series of comparing RxJava to Kotlin Flow. Previous articles were about &lt;a href=&#34;https://proandroiddev.com/from-rxjava-2-to-kotlin-flow-threading-8618867e1955&#34;&gt;Threading&lt;/a&gt;, &lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-backpressure-d1fb91e6dea8&#34;&gt;Backpressure&lt;/a&gt;, &lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-error-handling-da1f6a4f2708&#34;&gt;Error Handling,&lt;/a&gt; &lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-stream-types-7916be6cabc2&#34;&gt;Stream Types&lt;/a&gt;, &lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-throttling-ed1778847619&#34;&gt;Throttling&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-testing-42f1641d8433&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Testing is a crucial part of whole development. Testing allows you to write programs in a reliable fashion, prevent regressions and have many other goodies. I won’t go through the list of advantages of writing tests in this article though.&#xA;In testing it is important to have tools which allow you to write reliable tests and also tools which allow you to test your business logic.&#xA;Business logic might be inside some function which calculates data and returns result, but also it might be some loading of data from network or doing some work in reaction to UI events. In places where we might have RxJava integrated. So it is very important to be able to test our rx-chains.&#xA;In this article we’ll go through the most important concepts in RxJava testing and compare it with what we have in Kotlin Flow.&lt;/p&gt;</description>
    </item>
    <item>
      <title>From RxJava to Kotlin Flow: Throttling</title>
      <link>https://krossovochkin.com/posts/2020_03_02_from_rxjava_to_kotlin_flow_throttling/</link>
      <pubDate>Mon, 02 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_03_02_from_rxjava_to_kotlin_flow_throttling/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1538474705339-e87de81450e8?ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1357&amp;amp;q=80&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/scUBcasSvbE&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;This post is part of series of comparing RxJava to Kotlin Flow. Previous articles were about &lt;a href=&#34;https://proandroiddev.com/from-rxjava-2-to-kotlin-flow-threading-8618867e1955&#34;&gt;Threading&lt;/a&gt;, &lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-backpressure-d1fb91e6dea8&#34;&gt;Backpressure&lt;/a&gt;, &lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-error-handling-da1f6a4f2708&#34;&gt;Error Handling,&lt;/a&gt; &lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-stream-types-7916be6cabc2&#34;&gt;Stream Types&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-throttling-ed1778847619&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://proandroiddev.com/proandroiddev-digest-17-d52bc575edb6&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/proandroiddevdigest-17-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;It is advised to take a look at the overview of Throttling operators in RxJava before reading this article:&#xA;&lt;a href=&#34;https://proandroiddev.com/throttling-in-rxjava-2-d640ea5f7bf1&#34;&gt;&lt;strong&gt;Throttling in RxJava 2&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Throttling is also one of the essential features of reactive programming. Streams might emit more values than we’re expecting to receive, so ability to limit number of events in a stream is very important.&#xA;Most common place where it applies is handling UI events. Examples of usage might be handling button clicks (to not allow double clicks), usage with search view when we’d like to wait for user to stop typing before querying some data and so on.&#xA;In this article we’ll try to compare throttling operators in RxJava and Kotlin Flow.&lt;/p&gt;</description>
    </item>
    <item>
      <title>From RxJava to Kotlin Flow: Stream Types</title>
      <link>https://krossovochkin.com/posts/2020_02_26_from_rxjava_to_kotlin_flow_stream_types/</link>
      <pubDate>Wed, 26 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_02_26_from_rxjava_to_kotlin_flow_stream_types/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1516192891955-70642cf1ac88?ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1357&amp;amp;q=80&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/JcimvPDC3as&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;This post is part of series of comparing RxJava to Kotlin Flow. Previous articles were about &lt;a href=&#34;https://proandroiddev.com/from-rxjava-2-to-kotlin-flow-threading-8618867e1955&#34;&gt;Threading&lt;/a&gt;, &lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-backpressure-d1fb91e6dea8&#34;&gt;Backpressure&lt;/a&gt;, &lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-error-handling-da1f6a4f2708&#34;&gt;Error Handling&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-stream-types-7916be6cabc2&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://proandroiddev.com/proandroiddev-digest-16-e17b7e8ae48b&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/proandroiddevdigest-16-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;In reactive programming we use streams. Therefore in both RxJava and Kotlin Flow we’ll have to use some streams. Though we’ll encounter some differences if we decide to migrate.&#xA;In this article we’ll try to get into the stream types which have RxJava and Kotlin Flow and some important differences.&lt;/p&gt;</description>
    </item>
    <item>
      <title>From RxJava to Kotlin Flow: Error Handling</title>
      <link>https://krossovochkin.com/posts/2020_02_24_from_rxjava_to_kotlin_flow_error_handling/</link>
      <pubDate>Mon, 24 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_02_24_from_rxjava_to_kotlin_flow_error_handling/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1580357991342-89ec1672c98a?ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1357&amp;amp;q=80&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/aYNyC6fIH84&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;This post is part of series of comparing RxJava to Kotlin Flow. Previous articles were about &lt;a href=&#34;https://proandroiddev.com/from-rxjava-2-to-kotlin-flow-threading-8618867e1955&#34;&gt;Threading &lt;/a&gt;and &lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-backpressure-d1fb91e6dea8&#34;&gt;Backpressure&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-error-handling-da1f6a4f2708&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Error handling is fundamental in reactive programming. Reactive streams might fail with exception and propagate it as an event downstream notifying consumers on the error that happened.&#xA;As in previous articles, we’ll try to compare RxJava and Kotlin Flow error handling mechanisms. This might help us to migrate existing code from RxJava to Kotlin Flow and also understand how to properly use Kotlin Flow.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vinyls animation with MotionLayout</title>
      <link>https://krossovochkin.com/posts/2020_02_21_vinyls_animation_with_motionlayout/</link>
      <pubDate>Fri, 21 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_02_21_vinyls_animation_with_motionlayout/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1539375665275-f9de415ef9ac?ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1357&amp;amp;q=80&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/Jm9P0mDPo6A&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://medium.com/@krossovochkin/vinyls-animation-with-motionlayout-595e716c2752&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Being professional Android developer for many years, things which were always difficult to me are animations, colors and dimensions — basically all the UI/UX stuff. I can’t describe or easily understand what good colors can be used, how to implement this or that animation and so on.&#xA;Though we’re waiting for MotionLayout for quite long time (and Android Studio 4.0) I took some time to play with it. And I should say that experience (even without Motion Editor) was much better than I expected.&lt;/p&gt;</description>
    </item>
    <item>
      <title>From RxJava to Kotlin Flow: Backpressure</title>
      <link>https://krossovochkin.com/posts/2020_02_06_from_rxjava_to_kotlin_flow_backpressure/</link>
      <pubDate>Thu, 06 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_02_06_from_rxjava_to_kotlin_flow_backpressure/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/from-rxjava-to-kotlin-flow-backpressure-d1fb91e6dea8&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://androidweekly.net/issues/issue-400&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-400-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://proandroiddev.com/proandroiddev-digest-15-b467005869ce&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/proandroiddevdigest-15-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Disclaimer&#xA;This article unfortunately is not that dive deep (because of complexity of internals of coroutines), but instead trying to compare RxJava and Kotlin Flow mostly as black box with trying to find out differences in behavior and how to migrate from RxJava with its backpressure solution to Kotlin Flow.&#xA;Hopefully this article will give you direction on where to look at if you decide to migrate to Kotlin Flow.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Diving deep into Android Dex bytecode</title>
      <link>https://krossovochkin.com/posts/2020_02_02_diving_deep_into_android_dex_bytecode/</link>
      <pubDate>Sun, 02 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_02_02_diving_deep_into_android_dex_bytecode/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1501721709601-744e5bf3440d?ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1357&amp;amp;q=80&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/5MvL55-rSvI&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/diving-deep-into-android-dex-bytecode-48db82b170c8&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://proandroiddev.com/proandroiddev-digest-15-b467005869ce&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/proandroiddevdigest-15-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Modern Android development is based on Kotlin, which is interoperable with Java. Whenever we use some cool feature from Kotlin (say High-order functions) under the hood (when running on JVM) the feature is implemented in terms of Java bytecode. This might lead to some overheads in memory and performance if used without caution (for example excessive usage of lambdas with parameters without inlining might produce a lot of anonymous classes and put additional pressure on GC).&lt;/p&gt;</description>
    </item>
    <item>
      <title>From RxJava 2 to Kotlin Flow: Threading</title>
      <link>https://krossovochkin.com/posts/2020_01_25_from_rxjava_2_to_kotlin_flow_threading/</link>
      <pubDate>Sat, 25 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_01_25_from_rxjava_2_to_kotlin_flow_threading/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1552034412-443022194b52?ixlib=rb-1.2.1&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1357&amp;amp;q=80&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/vyyVbUOYNPc&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/from-rxjava-2-to-kotlin-flow-threading-8618867e1955&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://androidweekly.net/issues/issue-398&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-398-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://proandroiddev.com/proandroiddev-digest-14-b7247f25292f&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/proandroiddevdigest-14-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;For a long time RxJava was undisputed leader for reactive solutions on Android, though with Kotlin expansion and introducing cold streams (Flow) seems situation might be rapidly changing in the coming years.&#xA;Though reactive programming is not related to threading in the first place, concurrency and parallelism are very important anyway.&#xA;In this article we’ll try to make short recap on threading in RxJava 2 (with some basic caveats on its usage) and then take a look at how threading works in Kotlin Flow, so if anyone would like to migrate their code without affecting functionality it would be nice and smooth.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Change Theme Dynamically with Circular Reveal Animation on Android</title>
      <link>https://krossovochkin.com/posts/2020_01_19_change_theme_dynamically_with_circular_reveal_animation_on_android/</link>
      <pubDate>Sun, 19 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_01_19_change_theme_dynamically_with_circular_reveal_animation_on_android/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/change-theme-dynamically-with-circular-reveal-animation-on-android-8cd574f5f0d8&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://proandroiddev.com/proandroiddev-digest-14-b7247f25292f&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/proandroiddevdigest-14-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Dark theme on Android is on a hype at the moment. More and more apps add support for Dark theme over time allowing users to customize their phones, save battery and provide better accessibility. Though another trend which grows today is animated theme changes. First app I saw support of this was Telegram:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;../../img/1_JKZ-OapISQlTMhX8Y-VmcA.gif&#34; alt=&#34;Source&#34;&gt;&lt;em&gt;&lt;a href=&#34;https://telegram.org/blog#switch-to-night-mode-faster&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;After that in different modifications such feature started to appear in other apps, for example VK.&#xA;The effect is amazing. And in this article we’ll go into how to implement such functionality in your app.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SQLite Triggers (&#43; Android Room)</title>
      <link>https://krossovochkin.com/posts/2020_01_17_sqlite_triggers_android_room/</link>
      <pubDate>Fri, 17 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2020_01_17_sqlite_triggers_android_room/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/sqlite-triggers-android-room-2e7120bb3e3a&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://androidweekly.net/issues/issue-397&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-397-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;SQLite is one of the &lt;a href=&#34;https://www.sqlite.org/mostdeployed.html&#34;&gt;most used&lt;/a&gt; database. This is because it is used on almost all mobile devices in the world. As SQLite is very similar to SQL everyone already knows the basic concepts like querying, inserting, updating, deleting data; databases and tables; joining tables etc.&#xA;But SQLite also has some advanced features and this article is about one of such called Trigger.&lt;/p&gt;&#xA;&lt;p&gt;If we try to speculate on the name “Trigger” we might say that probably something will be done when some changes are made to the database. And we’re pretty close to the truth.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Decoding Handler and Looper in Android</title>
      <link>https://krossovochkin.com/posts/2019_12_24_decoding_handler_and_looper_in_android/</link>
      <pubDate>Tue, 24 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2019_12_24_decoding_handler_and_looper_in_android/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/decoding-handler-and-looper-in-android-d4f3f2449513&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Handler and Looper are one of the main low-level Android OS things, which almost nobody uses directly (at least nowadays). But they are at the core, so many other high-level solutions are based on them. Therefore one should know what Handler and Looper are, what and how they are doing.&lt;/p&gt;&#xA;&lt;p&gt;In this article we’ll try to understand Handler and Looper in Android. What, how and why we might need them.&#xA;We’ll start from some basic knowledge on classes and what they are doing, continue with relations between them. Then we’ll look at each class separately trying to dive deep into details. And will finish with some canonical examples on where they can be used.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Operator fusion in RxJava 2</title>
      <link>https://krossovochkin.com/posts/2019_11_02_operator_fusion_in_rxjava_2/</link>
      <pubDate>Sat, 02 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2019_11_02_operator_fusion_in_rxjava_2/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/operator-fusion-in-rxjava-2-dcd6612cffae&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://androidweekly.net/issues/issue-386&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-386-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;RxJava is a very powerful library, though it has some issues as well. Specifically performance and memory issues, which come from problems library tries to solve and how the solution is designed from technical perspective.&#xA;In order to minimize overhead in RxJava there are a number of optimizations, which are called “operator fusion”. And we’ll talk about them in this article.&#xA;But first let’s recap how RxJava reactive types work and what issues they have.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Random interview coding task retrospective</title>
      <link>https://krossovochkin.com/posts/2019_09_27_random_interview_coding_task_retrospective/</link>
      <pubDate>Fri, 27 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2019_09_27_random_interview_coding_task_retrospective/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://medium.com/@krossovochkin/random-interview-coding-task-retrospective-befa1b399f0d&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;It happens often that on interviews you’ve asked to perform some coding task. For unknown reason most of the times you’ve asked to write some code not in the IDE, but on piece of paper. I don’t like such tasks on an interview, because in real life one won’t write any kind of code on a paper. If you need to write something not in IDE you face issues like you can’t quickly change something or write new code in between the lines. You don’t get suggestions or autocomplete. Basically, you are out of you zone of comfort. Considering that interview by itself is a stress (no matter how confident you are in your knowledge) you might not complete the task successfully.&#xA;But anyway such tasks are pretty common so one should be prepared for them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SiMMMMpLLLLeDateFormat</title>
      <link>https://krossovochkin.com/posts/2019_07_21_simmmmplllledateformat/</link>
      <pubDate>Sun, 21 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2019_07_21_simmmmplllledateformat/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/simmmmplllledateformat-6bd326d17012&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Using SimpleDateFormat to format dates and times is a common thing (as Java 8 Time API is not that available on Android yet). Usually it looks like:&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-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;py&#34;&gt;formatter&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SimpleDateFormat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;dd MMMM yyyy&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Locale&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ENGLISH&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;formatter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;date&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;We can use different formats and locales with not only providing correct translations, but also some additional locale-specific formatting rules.&lt;/p&gt;&#xA;&lt;p&gt;One tricky thing about SimpleDateFormat formats is why we have M and L when they look identical?&lt;/p&gt;</description>
    </item>
    <item>
      <title>3x3x3 Rubik’s cube world (GIF alert)</title>
      <link>https://krossovochkin.com/posts/2019_07_07_3x3x3_rubiks_cube_world_gif_alert/</link>
      <pubDate>Sun, 07 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2019_07_07_3x3x3_rubiks_cube_world_gif_alert/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://medium.com/@krossovochkin/3x3x3-rubiks-cube-world-gif-alert-613d016d2ae7&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;I find Rubik’s cube an awesome puzzle. It has simple design, but quite difficult to solve (if you don’t know how to do that). At the same time it is possible to learn how to solve cube — there are a lot of algorithms for solving (for example &lt;a href=&#34;https://ruwix.com/the-rubiks-cube/advanced-cfop-fridrich/orient-the-last-layer-oll/&#34;&gt;Fridrich method&lt;/a&gt; describes quite a lot of them). These optimized algorithms made popular speedcubing — solving cube on time — with world record of &lt;a href=&#34;https://ruwix.com/blog/yusheng-du-record-347/&#34;&gt;less than 4 seconds&lt;/a&gt;.&#xA;But solving the cube using formulas is actually boring, because you don’t understand what exactly is happening and how that algorithm was invented. You don’t actually solve the cube by yourself — you apply someone’s solution by yourself. And personally I solve cubes for fun, and understanding what and why you are doing actually increases that fun.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Android Version Code Tricks</title>
      <link>https://krossovochkin.com/posts/2019_07_04_android_version_code_tricks/</link>
      <pubDate>Thu, 04 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2019_07_04_android_version_code_tricks/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/android-version-code-tricks-f63421285ee7&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Version code is a special integer value which works as an internal version number. It is not visible to end users. Android system uses this number to protect against application downgrades — it is not possible to install new application with version code lower than in currently installed application.&#xA;Developers can use version code for example for doing specific tasks on updating to specific version.&lt;/p&gt;&#xA;&lt;p&gt;Version code is placed inside &lt;em&gt;AndroidManifest&lt;/em&gt;, but usually it is inside *defaultConfig *in &lt;em&gt;build.gradle&lt;/em&gt; (from where it is populated to *AndroidManifest *during assemble).&#xA;Also it is possible to access version code from generated BuildConfig.VERSION_CODE.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Throttling in RxJava 2</title>
      <link>https://krossovochkin.com/posts/2019_06_24_throttling_in_rxjava_2/</link>
      <pubDate>Mon, 24 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2019_06_24_throttling_in_rxjava_2/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/throttling-in-rxjava-2-d640ea5f7bf1&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;I don’t know for what reason but I see from time to time same misunderstanding on different throttle operators in RxJava. Usually nobody says about throttle, instead by default everyone says that debounce can be used. Especially using debounce to avoid multiple clicks on buttons is commonly suggested, which I believe is a bad UX (some examples &lt;a href=&#34;https://www.aanandshekharroy.com/articles/2018-01/rxjava-flowables&#34;&gt;here&lt;/a&gt; and &lt;a href=&#34;https://stackoverflow.com/a/48168316/1533933&#34;&gt;here&lt;/a&gt;). Let’s finally look at available options in RxJava and find out when it is better to use what.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Java-C-Assembly Matryoshka</title>
      <link>https://krossovochkin.com/posts/2019_06_04_java_c_assembly_matryoshka/</link>
      <pubDate>Tue, 04 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2019_06_04_java_c_assembly_matryoshka/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://images.unsplash.com/photo-1544885353-f3e1da5bc721?ixlib=rb-1.2.1&amp;amp;ixid=eyJhcHBfaWQiOjEyMDd9&amp;amp;auto=format&amp;amp;fit=crop&amp;amp;w=1288&amp;amp;q=80&#34; alt=&#34;&#34;&gt;&#xA;&lt;em&gt;&lt;a href=&#34;https://unsplash.com/photos/9hhOVsf1lpU&#34;&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://medium.com/hackernoon/java-c-assembly-matryoshka-932193f071d3&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://hackernoon.com/java-c-assembly-matryoshka-932193f071d3&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-hackernoon-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Disclaimers&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;I’ll use Windows and more particularly Visual C++ with its Inline Assembler. If you use MacOs or Linux you will have significant differences comparing to what is described in the article.&lt;/li&gt;&#xA;&lt;li&gt;Everything below is shown mostly for demonstration purposes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Java is mature self-sufficient language, though as we all know it is possible to “connect” java to C (via Java-Native-Interface or JNI) to speed up some critical pieces of code.&#xA;Also for C/C++ it is possible to delegate some even more critical pieces of code directly to Assembly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>RxJava Observable to Single</title>
      <link>https://krossovochkin.com/posts/2019_05_27_rxjava_observable_to_single/</link>
      <pubDate>Mon, 27 May 2019 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2019_05_27_rxjava_observable_to_single/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/rxjava-observable-to-single-49c2a14da625&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://androidweekly.net/issues/issue-364&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/androidweekly-364-blue#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Transforming Single to Observable is simple, as Single satisfies Observable’s contract. Just call single.toObservable() and you’re good. But transforming Observable to Single is not that simple: if it happens that Observable emits exactly one value and completes (or terminates with error without emitting values) then it is pretty straightforward, otherwise one need to set up some additional rules.&lt;/p&gt;&#xA;&lt;p&gt;In RxJava there are a number of operators for transforming Observable to Single:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to structure learning for maximum return</title>
      <link>https://krossovochkin.com/posts/2019_04_10_how_to_structure_learning_for_maximum_return/</link>
      <pubDate>Wed, 10 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2019_04_10_how_to_structure_learning_for_maximum_return/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://cdn-images-1.medium.com/max/4096/0*KDsLhPCZc7cjse_D&#34; alt=&#34;Photo by Tim Gouw on Unsplash&#34;&gt;&lt;em&gt;Photo by &lt;a href=&#34;https://unsplash.com/@punttim?utm_source=medium&amp;amp;amp;utm_medium=referral&#34;&gt;Tim Gouw&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com?utm_source=medium&amp;amp;amp;utm_medium=referral&#34;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://medium.com/hackernoon/how-to-structure-learning-for-maximum-return-1fff987759de&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt; &lt;a href=&#34;https://hackernoon.com/how-to-structure-learning-for-maximum-return-1fff987759de&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-hackernoon-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;In IT, it’s very difficult to keep up-to-date. A full-time job doesn’t give you a chance to upskill or try new things because you’re too busy dealing with legacy code, developing features, etc.&lt;/p&gt;&#xA;&lt;p&gt;Yet, self-development is an important thing and I’ve tried my best over years to make it a habit.&lt;/p&gt;&#xA;&lt;p&gt;For the few past years, I’ve conducted a few experiments towards self-improvement, and I’d like to share a few of those here.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dart language bad design choices</title>
      <link>https://krossovochkin.com/posts/2019_04_08_dart_language_bad_design_choices/</link>
      <pubDate>Mon, 08 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2019_04_08_dart_language_bad_design_choices/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://medium.com/@krossovochkin/dart-language-bad-design-choices-6e35987dc693&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Before raising a point about some design choices we need to define some criteria.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Intent/Declaration &amp;gt; Usage/Implementation&#xA;Code one write should clearly state the intent.&#xA;Implementation is not that important than an intent.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Implicit is bad&#xA;Implicit things do not share the intention, therefore from the first point it means that any implicit thing hides true intent.&#xA;If anything hides intention — it can be considered bad.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Mixing different things together is bad.&#xA;Partially it relates to the first point about intention.&#xA;If you do the change and it is not clear whether it is because of one thing or another (which are mixed into one) — then intention is hidden and it is bad.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kotlin-android-synthetics performance analysis (with ButterKnife)</title>
      <link>https://krossovochkin.com/posts/2019_02_18_kotlin_android_synthetics_performance_analysis_with_butterknife/</link>
      <pubDate>Mon, 18 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2019_02_18_kotlin_android_synthetics_performance_analysis_with_butterknife/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://proandroiddev.com/kotlin-android-synthetics-performance-analysis-with-butterknife-90a54ca4325d&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-proandroiddev-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;After comment that &lt;a href=&#34;https://android-review.googlesource.com/c/platform/frameworks/support/+/882241&#34;&gt;synthetic is no longer recommended practice&lt;/a&gt; and &lt;a href=&#34;https://proandroiddev.com/the-argument-over-kotlin-synthetics-735305dd4ed0&#34;&gt;some arguments&lt;/a&gt; I decided to go deeper into issue with performance of &lt;em&gt;kotlin-android-synthetics&lt;/em&gt; by analyzing generated Java and byte code and comparing to other approaches (such as vanilla-*findViewById *and &lt;em&gt;ButterKnife&lt;/em&gt;).&lt;/p&gt;&#xA;&lt;h2 id=&#34;vanilla-findviewbyid&#34;&gt;Vanilla-findViewById&lt;/h2&gt;&#xA;&lt;p&gt;This is sample Activity we’ll work with throughout the article.&#xA;Approach with *findViewById *will be our baseline.&lt;/p&gt;&#xA;&lt;p&gt;Sample consists of:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;*Activity *class&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;One *TextView *property inside *Activity *with *lateinit *modifier&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scary movies</title>
      <link>https://krossovochkin.com/posts/2019_10_15_scary_movies/</link>
      <pubDate>Mon, 15 Oct 2018 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2019_10_15_scary_movies/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://medium.com/@krossovochkin/scary-movies-2c018cd6cca4&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;I don’t like horror movies.&#xA;But this short story is not about that particularly.&#xA;Horror movies are different: murders, ghosts, fantasy etc.&lt;/p&gt;&#xA;&lt;p&gt;I don’t like horror movies of any kind.&#xA;But I still can watch them.&#xA;1408, final destination, the saw etc.&lt;/p&gt;&#xA;&lt;p&gt;The only thing that scares me in horror movies are people.&#xA;Not blood, not ghosts.&lt;/p&gt;&#xA;&lt;p&gt;Here I’d like to share few movies, which traumatized my psyche in the childhood (and not only).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kotlin-Java interop: function references and SAM conversions</title>
      <link>https://krossovochkin.com/posts/2018_09_13_kotlin_java_interop_function_references_and_sam_conversions/</link>
      <pubDate>Thu, 13 Sep 2018 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2018_09_13_kotlin_java_interop_function_references_and_sam_conversions/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://medium.com/@krossovochkin/kotlin-java-interop-function-references-and-sam-conversions-3d0cd36f7967&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Though all the things below are pretty obvious if being careful while dealing with Kotlin-Java interop, I decided still to write short note about one particular issue with function references (from Kotlin side) and SAM conversions (from Java side).&lt;/p&gt;&#xA;&lt;h3 id=&#34;function-reference&#34;&gt;Function reference&lt;/h3&gt;&#xA;&lt;p&gt;Function reference is a good way to pass function as a parameter without explicitly using lambdas.&lt;/p&gt;&#xA;&lt;p&gt;For example, if we have function:&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-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fun&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;callback&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;n&#34;&gt;Input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Output&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;o&#34;&gt;..&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;then we can pass our function as a lambda with function call or as a function reference:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dynamic mobile client development. Problem and concept.</title>
      <link>https://krossovochkin.com/posts/2018_07_21_dynamic_mobile_client_development_problem_and_concept/</link>
      <pubDate>Sat, 21 Jul 2018 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2018_07_21_dynamic_mobile_client_development_problem_and_concept/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://medium.com/@krossovochkin/dynamic-mobile-client-development-problem-and-concept-df509891061&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Data and interfaces — are two of the most important things in development.&lt;/p&gt;&#xA;&lt;p&gt;Data usually comes from/to server and tells application what should be used (and therefore shown to the user on UI)&lt;/p&gt;&#xA;&lt;p&gt;One of the main challenges in mobile development is to be in sync with server.&#xA;Server is updated immediately (often along with web). Publishing to Play Store takes some time (even not talking about AppStore and their app review).&#xA;Also users might try to use older versions of app with newer versions of web/server (not updating application when newer version was published).&#xA;Even more difficult to handle compatibility issues when there might be multiple servers with different versions on them, and application has to be flexible to work with all of them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Программирование и музыка</title>
      <link>https://krossovochkin.com/posts/2018_06_24_programming_and_music/</link>
      <pubDate>Sun, 24 Jun 2018 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2018_06_24_programming_and_music/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://medium.com/@krossovochkin/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%BC%D1%83%D0%B7%D1%8B%D0%BA%D0%B0-88f1abbd21ae&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;предисловие&#34;&gt;Предисловие&lt;/h1&gt;&#xA;&lt;p&gt;Наушники — лучший друг разработчика (спасибо открытым пространствам и людям вокруг). Шум и разговоры отвлекают от работы и не дают сосредоточиться.&#xA;Решением являются отдельные комнаты для небольших команд (что встречается редко и все равно не является стопроцентным, потому что отвлекать может и просто клацание коллегами по клавиатуре) либо наушники плюс музыка в них.&#xA;Также у музыки на работе есть и другие преимущества. Например, она может выступать в роли якоря. Важные события могут вводить человека в определенные состояния, которые могут завязываться на какие-то внешние вещи — например музыку, которая играла в тот момент. Тогда песня становится своеобразным якорем и в следующий раз услышав её человек может вернуть себя в то состояние.&#xA;Поэтому песни, которые слушаешь на работе, становятся “рабочими” песнями. Услышав их вне работы можно случайно перейти в рабочий режим.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Сказки</title>
      <link>https://krossovochkin.com/posts/2018_06_17_fairytales/</link>
      <pubDate>Sun, 17 Jun 2018 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2018_06_17_fairytales/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://medium.com/@krossovochkin/%D1%81%D0%BA%D0%B0%D0%B7%D0%BA%D0%B8-d34dc346856a&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;В детстве я читал много сказок, и я думаю, что это оказало некоторое влияние на развитие моего мировоззрения.&#xA;По крайней мере неявно.&#xA;Конечно, не факт, что в лучшую сторону.&#xA;У меня было несколько книг, зачитанных до дыр, и собственно ими я хотел сейчас поделиться.&lt;/p&gt;&#xA;&lt;h2 id=&#34;прежде-всего&#34;&gt;&lt;strong&gt;Прежде всего:&lt;/strong&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Да, я читал и знаю большинство популярных русских народных сказок вроде Колобка, различных вариаций сказок про Бабу Ягу и Кощея Бессмертного, всяких Красных Шапочек и Волков с козлятами Братьев Гримм и Гадких утят, Дюймовочек (хотя “Новое платье короля” — это очень сильная сказка) Андерсена и прочих известных сказок.&#xA;Мне вообще иногда кажется, что немногие могут со мной посоревнваться в знании сказок.&#xA;Но тут речь больше не про них. Из-за их популярности сказки очень быстро приедаются, возможно поэтому сборники менее известных сказок меня привлекали больше.&#xA;Если посмотреть ниже по описаниям, то вероятно можно будет сделать вывод, что мне больше нравились сказки Азии. Отчасти это так и есть.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Neural Networks and Deep Learning</title>
      <link>https://krossovochkin.com/posts/2017_11_09_neural_networks_and_deep_learning/</link>
      <pubDate>Thu, 09 Nov 2017 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2017_11_09_neural_networks_and_deep_learning/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://medium.com/@krossovochkin/neural-networks-and-deep-learning-38aaca43ae0f&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;disclaimer&#34;&gt;Disclaimer&lt;/h1&gt;&#xA;&lt;p&gt;It is brief synopsis of &lt;a href=&#34;https://www.coursera.org/learn/neural-networks-deep-learning/home/welcome&#34;&gt;Neural Networks and Deep learning&lt;/a&gt; course on Coursera.&#xA;That course is a first part of Deep learning specialization.&#xA;Though course is great and very useful, I found that it has a lot of mathematics explanation (linear algebra — matrices, derivatives etc.), so sometimes it was difficult to wait for the actual useful information I didn’t know.&#xA;So, I think I might be interested in reviewing neural networks in the future, but won’t be able to review course information as there will be a lot of such noise.&#xA;So, I decided to briefly put everything into one page, so I will be able to quickly review this topic in the future.&#xA;There will be no code, just formulas as they were explained in a course with some notes on how I understood it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>[Android] Notifications Overview and Pitfalls</title>
      <link>https://krossovochkin.com/posts/2017_02_11_android_notifications_overview_and_pitfalls/</link>
      <pubDate>Sat, 11 Feb 2017 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/posts/2017_02_11_android_notifications_overview_and_pitfalls/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://medium.com/@krossovochkin/android-notifications-overview-and-pitfalls-517d1118ec83&#34;&gt;&lt;img src=&#34;https://img.shields.io/badge/original-medium-green#badge&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;Notifications are widely used in Android applications. Though API is pretty straightforward, there are some key things that one should know and understand. This article will try to be first step into understanding Notifications API.&lt;/p&gt;&#xA;&lt;h2 id=&#34;sending-single-notification&#34;&gt;Sending Single Notification&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;n&#34;&gt;Notification&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;singleNotification&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;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NotificationCompat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Builder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&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;na&#34;&gt;setContentTitle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Title&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;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setContentText&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Text&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;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setSmallIcon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;drawable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ic_notification&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;na&#34;&gt;build&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;n&#34;&gt;NotificationManagerCompat&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;notificationManager&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;NotificationManagerCompat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from&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;n&#34;&gt;context&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;n&#34;&gt;notificationManager&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;notify&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;notificationId&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;singleNotification&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;p&gt;&lt;img src=&#34;../../img/1_i_FZ2R1UInhmPkXVB1sC9Q.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Key things here:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;We use NotificationCompat.Builder to have single interface for creating notifications and let Support Library do all compatibility tricks;&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://krossovochkin.com/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://krossovochkin.com/about/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://avatars1.githubusercontent.com/u/1792204?size=200#circle&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Vasya Drobushkov @krossovochkin&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;about-me&#34;&gt;About me&lt;/h4&gt;&#xA;&lt;p&gt;Android developer with mathematical background.&#xA;Experienced in developing smart applications for Android, and also in mobile game development.&#xA;Punctual, always pay attention to details.&#xA;Fast learner, greedy for knowledge.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h4 id=&#34;links&#34;&gt;Links&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/in/vasyadrobushkov/&#34;&gt;LinkedIn&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://github.com/krossovochkin&#34;&gt;Github&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://stackoverflow.com/users/1533933/krossovochkin&#34;&gt;StackOverflow&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://www.goodreads.com/user/show/21544616-krossovochkin&#34;&gt;GoodReads&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://medium.com/@krossovochkin&#34;&gt;Medium&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://hackernoon.com/u/krossovochkin&#34;&gt;HackerNoon&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://www.facebook.com/vasya.drobushkov&#34;&gt;Facebook&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://twitter.com/krossovochkin&#34;&gt;Twitter&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://www.kaggle.com/krossovochkin&#34;&gt;Kaggle&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://speakerdeck.com/krossovochkin&#34;&gt;SpeakerDeck&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://www.reddit.com/user/krossovochkin&#34;&gt;Reddit&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://www.hackerrank.com/krossovochkin&#34;&gt;HackerRank&lt;/a&gt;&lt;br&gt;&#xA;&lt;a href=&#34;https://leetcode.com/krossovochkin/&#34;&gt;LeetCode&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h4 id=&#34;projects&#34;&gt;Projects&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/krossovochkin/FiberyUnofficial&#34;&gt;Fibery Unofficial&lt;/a&gt;&lt;br&gt;&#xA;Android client for &lt;a href=&#34;https://fibery.io&#34;&gt;fibery.io&lt;/a&gt;.&lt;br&gt;&#xA;MVVM, Android Architecture components, coroutines.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/krossovochkin/KWeather&#34;&gt;KWeather&lt;/a&gt;&lt;br&gt;&#xA;Android weather app.&lt;br&gt;&#xA;MVI, Kotlin MPP, Jetpack Compose.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/krossovochkin/chess.kt&#34;&gt;chess.kt&lt;/a&gt;&#xA;Kotlin multiplatform chess backend&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h4 id=&#34;speaking&#34;&gt;Speaking&lt;/h4&gt;&#xA;&lt;p&gt;[Android Academy Minsk] Intro to RxJava &lt;a href=&#34;https://drive.google.com/open?id=1d603jMjxT8x6EIMaINqt1ic7C_GjPl8-v6QMYoT9jHM&#34;&gt;Slides&lt;/a&gt; &lt;a href=&#34;https://www.youtube.com/watch?v=ltleF2ifnC0&#34;&gt;Video&lt;/a&gt;&lt;br&gt;&#xA;[Android Academy Minsk] Hello World — First Project &lt;a href=&#34;https://docs.google.com/presentation/d/15we1hxp8MdBOQN-IShMASKgYJ8OywwEoLT2-1OBS9mE&#34;&gt;Slides&lt;/a&gt; &lt;a href=&#34;https://www.youtube.com/watch?v=pX4ulg5Ytvo&#34;&gt;Video&lt;/a&gt;&lt;br&gt;&#xA;[Android Academy Minsk] Dark Theme &lt;a href=&#34;https://speakerdeck.com/krossovochkin/vasya-drobushkov-android-dark-theme&#34;&gt;Slides&lt;/a&gt; &lt;a href=&#34;https://youtu.be/nj1di9yJoPE&#34;&gt;Video&lt;/a&gt;&lt;br&gt;&#xA;Android Design Support Library &lt;a href=&#34;https://speakerdeck.com/krossovochkin/android-design-support-library&#34;&gt;Slides&lt;/a&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
