<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Mike my bytes</title>
        <link>https://mikemybytes.com/</link>
        <description>Recent content on Mike my bytes</description>
        <generator>Hugo</generator>
        <language>en-us</language>
        <copyright>Mike Kowalski (@mikemybytes)</copyright>
        <lastBuildDate>Wed, 10 Dec 2025 06:50:12 +0000</lastBuildDate>
        <atom:link href="https://mikemybytes.com/index.xml" rel="self" type="application/rss+xml" />
        <item>
            <title>Great engineers keep asking &#34;Why?&#34;</title>
            <link>https://mikemybytes.com/2025/12/10/great-engineers-keep-asking-why/</link>
            <pubDate>Wed, 10 Dec 2025 06:50:12 +0000</pubDate>
            <guid>https://mikemybytes.com/2025/12/10/great-engineers-keep-asking-why/</guid>
            <description>&lt;p&gt;I’ve had some health issues in the last few months. Moving from one doctor to another made me realise something important.
&lt;strong&gt;Great engineers, just like great doctors, keep asking &amp;ldquo;why?&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This question is not only about curiosity. It’s a tool. When we go to a doctor, we expect a diagnosis, not stating the
obvious. Cough, fever, stomach pain - these are not much different from timeouts, noisy logs, or odd metrics. In fact,
naming observed symptoms is usually easy enough, to be done by the patient alone.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Java 24 - Thread pinning revisited</title>
            <link>https://mikemybytes.com/2025/04/09/java24-thread-pinning-revisited/</link>
            <pubDate>Wed, 09 Apr 2025 05:12:42 +0000</pubDate>
            <guid>https://mikemybytes.com/2025/04/09/java24-thread-pinning-revisited/</guid>
            <description>&lt;p&gt;Back in 2023, I got extremely excited about the release of Java 21. It felt like a significant breakthrough, &lt;a href=&#34;https://mikemybytes.com/2023/10/03/is-21-the-new-java-8/&#34;&gt;similar to Java 8&lt;/a&gt;.
I was also one of the early adopters of virtual threads in my production code. Back then, &lt;a href=&#34;https://mikemybytes.com/2024/02/28/curiosities-of-java-virtual-threads-pinning-with-synchronized/&#34;&gt;thread pinning&lt;/a&gt; was the
main limitation of this promising solution.&lt;/p&gt;
&lt;p&gt;The negative impact of thread pinning was initially exaggerated. Shortly after the Java 21 release, many popular
frameworks and libraries were updated to become more virtual-threads-friendly. For many standard web apps,
updating dependencies was enough to enjoy great scalability and simplicity that virtual threads bring. Yet, I still found
it reasonable to keep an eye on thread pinning using Java Flight Recorder (JFR), as &lt;a href=&#34;https://mikemybytes.com/2024/04/17/continuous-monitoring-of-pinned-threads-with-spring-boot-and-jfr/&#34;&gt;I suggested in one of my articles&lt;/a&gt;.&lt;/p&gt;</description>
        </item>
        <item>
            <title>A year of scaling myself</title>
            <link>https://mikemybytes.com/2025/02/05/a-year-of-scaling-myself/</link>
            <pubDate>Wed, 05 Feb 2025 06:41:11 +0000</pubDate>
            <guid>https://mikemybytes.com/2025/02/05/a-year-of-scaling-myself/</guid>
            <description>&lt;p&gt;2024 was eventful, but professionally quiet. I didn’t speak at major tech conferences, write as many blog posts, or spend
as much time on technical deep dives. Still, it was one of the most important years in my almost 12-year career. It was
just a bit different.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2024 was a year of scaling myself&lt;/strong&gt;. Instead of working more, I&amp;rsquo;ve been exploring ways of making an impact differently.
I encouraged people to act, sponsored others&amp;rsquo; ideas, and even tried a bit of coaching. Working this way was rather new
to me. While I&amp;rsquo;ve been learning from my mistakes, I&amp;rsquo;m pretty satisfied with the results.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Continuous monitoring of pinned threads with Spring Boot and JFR</title>
            <link>https://mikemybytes.com/2024/04/17/continuous-monitoring-of-pinned-threads-with-spring-boot-and-jfr/</link>
            <pubDate>Wed, 17 Apr 2024 09:07:39 +0000</pubDate>
            <guid>https://mikemybytes.com/2024/04/17/continuous-monitoring-of-pinned-threads-with-spring-boot-and-jfr/</guid>
            <description>&lt;p&gt;In my &lt;a href=&#34;https://mikemybytes.com/2024/02/28/curiosities-of-java-virtual-threads-pinning-with-synchronized/&#34;&gt;previous article about Java Virtual Threads&lt;/a&gt;
I focused on different pinning cases caused by the &lt;code&gt;synchronized&lt;/code&gt; construct. Some of the presented cases were far
from being evident just by looking at the code. That&amp;rsquo;s why I believe that actively monitoring our apps for pinning is a must.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We don&amp;rsquo;t know if the pinning happens in our app if we&amp;rsquo;re not monitoring it&lt;/strong&gt;. We don&amp;rsquo;t know how frequently it occurs.
We don&amp;rsquo;t know for how long our treads are pinned. Without monitoring, we can only speculate about how pinning
affects our application&amp;rsquo;s performance. I prefer measuring than guessing.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Curiosities of Java Virtual Threads pinning with synchronized</title>
            <link>https://mikemybytes.com/2024/02/28/curiosities-of-java-virtual-threads-pinning-with-synchronized/</link>
            <pubDate>Wed, 28 Feb 2024 06:59:56 +0000</pubDate>
            <guid>https://mikemybytes.com/2024/02/28/curiosities-of-java-virtual-threads-pinning-with-synchronized/</guid>
            <description>&lt;p&gt;&lt;strong&gt;If you heard about Java Virtual Threads, you also heard about the pinning phenomenon&lt;/strong&gt;. Yet, many articles I found online
stop at &amp;ldquo;&lt;em&gt;replace &lt;code&gt;synchronized&lt;/code&gt; with &lt;code&gt;ReentrantLock&lt;/code&gt; and don&amp;rsquo;t use native methods or foreign functions&lt;/em&gt;&amp;rdquo;. While I don&amp;rsquo;t
want to discuss the second part here, I think good-old &lt;code&gt;synchronized&lt;/code&gt; deserves a bit more attention.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: If you are not familiar with Virtual Threads pinning, I suggest starting with the
&lt;a href=&#34;https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html#GUID-704A716D-0662-4BC7-8C7F-66EE74B1EDAD&#34;&gt;official Virtual Threads documentation&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;</description>
        </item>
        <item>
            <title>The trap of testing simple orchestration</title>
            <link>https://mikemybytes.com/2024/01/17/the-trap-of-testing-simple-orchestration/</link>
            <pubDate>Wed, 17 Jan 2024 06:38:32 +0000</pubDate>
            <guid>https://mikemybytes.com/2024/01/17/the-trap-of-testing-simple-orchestration/</guid>
            <description>Orchestration code organizes calls to other components (dependencies) into a certain process. Such pieces of code are sometimes called coordinators or controllers. Orchestration code is usually simple. There’s no (or almost no) conditional logic, or algorithmic complexity. Its main job is to delegate the work to appropriate dependencies in a specific order. Separating orchestration from the actual &amp;ldquo;heavy&amp;rdquo; work is a good thing. This way they can be tested independently. Theresulting code units are smaller and thus more testable. Yet, orchestration code itself rarely benefits from unit testing.</description>
        </item>
        <item>
            <title>Spoiled but enlightened</title>
            <link>https://mikemybytes.com/2023/12/07/spoiled-but-enlightened/</link>
            <pubDate>Thu, 07 Dec 2023 06:33:11 +0000</pubDate>
            <guid>https://mikemybytes.com/2023/12/07/spoiled-but-enlightened/</guid>
            <description>&lt;p&gt;Everybody knows that programmers are spoiled. When not enjoying free fruits in their fancy offices, they
probably work from the end of the world that looks like a paradise. Even during challenging economic conditions, the
market still tries to exceed their expectations&amp;hellip; A comfortable life and great earnings - who wouldn&amp;rsquo;t want that?&lt;/p&gt;
&lt;p&gt;In fact, there&amp;rsquo;s much more to appreciate. &lt;strong&gt;Most developers experience levels of organizational maturity that other
industries have never dreamed of&lt;/strong&gt;. The work culture that has developed over the years really stands out. Yet, we
programmers rarely notice that.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Kotlin &#39;equals ignoring fields&#39; using data classes</title>
            <link>https://mikemybytes.com/2023/11/28/kotlin-equals-ignoring-fields-using-data-classes/</link>
            <pubDate>Tue, 28 Nov 2023 06:07:47 +0000</pubDate>
            <guid>https://mikemybytes.com/2023/11/28/kotlin-equals-ignoring-fields-using-data-classes/</guid>
            <description>&lt;p&gt;&lt;em&gt;Equals ignoring fields&lt;/em&gt; is a pretty common operation. While often used within the test code to exclude selected fields
from equality assertions, it can also be handy in our domain code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With &lt;a href=&#34;https://kotlinlang.org/docs/data-classes.html&#34;&gt;Kotlin data classes&lt;/a&gt;, we can implement &lt;em&gt;equals ignoring fields&lt;/em&gt; without using reflection
or extra libraries&lt;/strong&gt;. This solution feels almost too simple to describe, but it&amp;rsquo;s interesting to compare it with the
available alternatives.&lt;/p&gt;
&lt;h2 id=&#34;status-quo&#34;&gt;Status quo&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s take a simple blog post representation as an example:&lt;/p&gt;</description>
        </item>
        <item>
            <title>Is 21 the new Java 8?</title>
            <link>https://mikemybytes.com/2023/10/03/is-21-the-new-java-8/</link>
            <pubDate>Tue, 03 Oct 2023 06:25:48 +0000</pubDate>
            <guid>https://mikemybytes.com/2023/10/03/is-21-the-new-java-8/</guid>
            <description>&lt;p&gt;&lt;strong&gt;Not all Java releases receive the same attention from the community&lt;/strong&gt;. The ones marked as &amp;ldquo;LTS&amp;rdquo; have a much higher chance of
broad adoption (even if many of us don&amp;rsquo;t fully understand &lt;a href=&#34;https://medium.com/nipafx-news/what-does-long-term-support-mean-ee23783310b6&#34;&gt;what the &amp;ldquo;LTS&amp;rdquo; means&lt;/a&gt;).
This alone makes the recently released Java 21 a serious contender.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I believe it&amp;rsquo;s the most influential Java release since Java 8&lt;/strong&gt;. Just not all of its groundbreaking aspects are already
evident to everybody&amp;hellip;&lt;/p&gt;
&lt;p&gt;Let me explain what makes this release so promising.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Centralizing the decision-making</title>
            <link>https://mikemybytes.com/2023/08/24/centralizing-the-decision-making/</link>
            <pubDate>Thu, 24 Aug 2023 07:15:37 +0000</pubDate>
            <guid>https://mikemybytes.com/2023/08/24/centralizing-the-decision-making/</guid>
            <description>&lt;p&gt;Imagine we&amp;rsquo;re building yet another e-commerce platform. One of its crucial business processes is, of course, processing
an order. After a successful payment, the &lt;em&gt;Orders&lt;/em&gt; module (domain) has to call &lt;em&gt;Warehouse&lt;/em&gt; asynchronously to prepare
purchased goods. Yet, they may not be there. Usually, it&amp;rsquo;s not a big deal, since we can get them from our suppliers.
But what if any of the items are not available anymore? The order has been already placed! Money has changed hands.
Our customer is already waiting for delivery. We have no choice - the order has to be canceled.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Content is king, I&#39;m still Mike - blog revamp</title>
            <link>https://mikemybytes.com/2023/08/16/content-is-king-im-still-mike-blog-revamp/</link>
            <pubDate>Wed, 16 Aug 2023 06:41:12 +0000</pubDate>
            <guid>https://mikemybytes.com/2023/08/16/content-is-king-im-still-mike-blog-revamp/</guid>
            <description>&lt;p&gt;I &lt;a href=&#34;http://mikemybytes.com/2020/11/10/introducing-mike-my-bytes/&#34;&gt;launched my own brand &amp;ldquo;Mike my bytes&amp;rdquo;&lt;/a&gt; in November 2020
as an experiment. Rebooting my existing blog (dated back to 2015!) along with becoming active on Twitter really paid
off. Apart from joy, it also brought thousands of people interacting with my content every month. Today, it&amp;rsquo;s high time
to make some adjustments. Refreshed &lt;a href=&#34;https://mikemybytes.com/&#34;&gt;mikemybytes.com&lt;/a&gt; design is just the beginning.&lt;/p&gt;
&lt;h2 id=&#34;content-is-king&#34;&gt;Content is king&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The Twitter I discovered in 2020 is no longer there&lt;/strong&gt;. X feels like a never-ending experiment with a rather uncertain
future. Its competition is segmented more than Android versions, without any clear successor (at least in the EU).
Yet, some tech people already gave up and moved somewhere else. It&amp;rsquo;s hard to blame them - the overall experience is much
worse now. At least without a paid subscription&amp;hellip;&lt;/p&gt;</description>
        </item>
        <item>
            <title>10 years of software development</title>
            <link>https://mikemybytes.com/2023/07/12/10-years-of-software-development/</link>
            <pubDate>Wed, 12 Jul 2023 07:00:41 +0000</pubDate>
            <guid>https://mikemybytes.com/2023/07/12/10-years-of-software-development/</guid>
            <description>&lt;p&gt;The calendar doesn&amp;rsquo;t lie. A decade of my professional career in software development has just passed. 10 years of experience always felt like a magical and very distant boundary. Am I a better engineer now? Am I a different person? Absolutely! Yet, it didn&amp;rsquo;t happen overnight.&lt;/p&gt;
&lt;p&gt;Reviewing these changes is a fascinating exercise. Sometimes I struggle to remember what I had for lunch the day before&amp;hellip; But 10 years?! That&amp;rsquo;s really a lot of time! Yet, I feel it was really worth the effort.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Introducing JUnit 5 FormattedSource</title>
            <link>https://mikemybytes.com/2023/05/03/introducing-junit5-formattedsource/</link>
            <pubDate>Wed, 03 May 2023 09:48:06 +0000</pubDate>
            <guid>https://mikemybytes.com/2023/05/03/introducing-junit5-formattedsource/</guid>
            <description>&lt;p&gt;Quite some time ago, JUnit&amp;rsquo;s &lt;code&gt;@CsvAnnotation&lt;/code&gt; caught my attention. It turned out so interesting, that I dedicated it a separate &lt;a href=&#34;https://mikemybytes.com/2021/10/19/parameterize-like-a-pro-with-junit-5-csvsource/&#34;&gt;blog post&lt;/a&gt; and a significant part of a &lt;a href=&#34;https://youtu.be/V6_rIa30YzE&#34;&gt;conference talk&lt;/a&gt;. It also inspired me to create a new way of writing parameterized tests with JUnit 5.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &lt;a href=&#34;https://github.com/mikemybytes/junit5-formatted-source&#34;&gt;JUnit 5 FormattedSource library&lt;/a&gt; allows defining test case arguments in a human-readable way, following a user-defined format&lt;/strong&gt;. As a result, it can be used to improve tests readability. Let&amp;rsquo;s have a look at an example:&lt;/p&gt;</description>
        </item>
        <item>
            <title>A simple pattern to keep your business logic together</title>
            <link>https://mikemybytes.com/2023/03/30/a-simple-pattern-to-keep-your-business-logic-together/</link>
            <pubDate>Thu, 30 Mar 2023 07:01:15 +0000</pubDate>
            <guid>https://mikemybytes.com/2023/03/30/a-simple-pattern-to-keep-your-business-logic-together/</guid>
            <description>&lt;p&gt;Keeping our domain (business) logic together is usually a really good idea. It not only makes it easier to reason about the most important part of our code but also increases its cohesion. Yet, decoupling the domain code from all the rest (orchestration, persistence, etc.) can be tricky.&lt;/p&gt;
&lt;p&gt;In this post, I&amp;rsquo;d like to share a simple pattern that helps me with that. &lt;strong&gt;The amazing &lt;a href=&#34;https://www.manning.com/books/unit-testing&#34;&gt;Unit Testing Principles, Practices, and Patterns&lt;/a&gt; book calls it the &lt;em&gt;CanExecute/Execute pattern&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Squashing DB migrations using Testcontainers</title>
            <link>https://mikemybytes.com/2023/02/01/squashing-db-migrations-using-testcontainers/</link>
            <pubDate>Wed, 01 Feb 2023 08:07:00 +0000</pubDate>
            <guid>https://mikemybytes.com/2023/02/01/squashing-db-migrations-using-testcontainers/</guid>
            <description>&lt;p&gt;Database migrations are a standard way of dealing with database schema changes, especially in the relational world. No matter which solution we choose (e.g. &lt;a href=&#34;https://flywaydb.org/&#34;&gt;Flyway&lt;/a&gt; or &lt;a href=&#34;https://www.liquibase.org/&#34;&gt;Liquibase&lt;/a&gt; in the Java ecosystem), the number of migrations usually grows together with the project itself. An unfortunate side effect is that the test execution time grows as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An effective way of speeding up our test execution in such cases is to squash (compact) all the existing migrations into a single file&lt;/strong&gt;. This allows one to set up everything in one take and avoids performing unnecessary operations like creating and updating a table that has been removed completely later.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Gazing into a crystal ball - my predictions for 2023</title>
            <link>https://mikemybytes.com/2022/12/30/gazing-into-a-crystal-ball-my-predictions-for-2023/</link>
            <pubDate>Fri, 30 Dec 2022 09:32:58 +0000</pubDate>
            <guid>https://mikemybytes.com/2022/12/30/gazing-into-a-crystal-ball-my-predictions-for-2023/</guid>
            <description>&lt;p&gt;The very last days of the old year are probably a good time to think about the next one. Although we already learned how inaccurate any predictions can be, it still feels like an interesting exercise to me. Let&amp;rsquo;s try to predict the tech future just a little bit&amp;hellip; 🔮&lt;/p&gt;
&lt;p&gt;I have to warn you, that everything you&amp;rsquo;ll read here is just a reflection of my own gut feeling. It&amp;rsquo;s a bunch of guesses based on news, observations, and discussions with my colleagues (👋). It comes with &lt;em&gt;ABSOLUTELY NO WARRANTY&lt;/em&gt;, just like a lot of software we&amp;rsquo;re using every day. Of course, these predictions are also biased by my experience and area of interest, which clearly has a lot to do with Java and JVM.&lt;/p&gt;</description>
        </item>
        <item>
            <title>What happens when you only limit the maximum heap size?</title>
            <link>https://mikemybytes.com/2022/11/15/what-happens-when-you-only-limit-the-maximum-heap-size/</link>
            <pubDate>Tue, 15 Nov 2022 06:50:00 +0000</pubDate>
            <guid>https://mikemybytes.com/2022/11/15/what-happens-when-you-only-limit-the-maximum-heap-size/</guid>
            <description>&lt;p&gt;&lt;strong&gt;The JVM has spoiled us with its cleverness&lt;/strong&gt;. It makes so many decisions behind the scenes, that lots of us gave up on looking at what&amp;rsquo;s inside. Memory-related discussions are probably more likely to appear at a conference or during a job interview than at &amp;ldquo;real&amp;rdquo; work. Of course, depending on what you work on.&lt;/p&gt;
&lt;p&gt;Java apps are often run in containers these days. Built-in &lt;a href=&#34;https://developers.redhat.com/articles/2022/04/19/java-17-whats-new-openjdks-container-awareness&#34;&gt;container awareness&lt;/a&gt; makes the JVM respect various container-specific limits (e.g. CPU, memory). This means, that even when running an app with a dummy &lt;code&gt;java -jar app.jar&lt;/code&gt; (which is usually not the best idea), everything should just work. That&amp;rsquo;s probably why the only memory-related option provided is often the &lt;code&gt;-Xmx&lt;/code&gt; flag (or any of its equivalents). In other words, &lt;strong&gt;we tend to only limit the maximum heap size&lt;/strong&gt;, like this:&lt;/p&gt;</description>
        </item>
        <item>
            <title>JSON, Kafka, and the need for schema</title>
            <link>https://mikemybytes.com/2022/07/11/json-kafka-and-the-need-for-schema/</link>
            <pubDate>Mon, 11 Jul 2022 05:35:00 +0000</pubDate>
            <guid>https://mikemybytes.com/2022/07/11/json-kafka-and-the-need-for-schema/</guid>
            <description>&lt;p&gt;When I started my journey with Apache Kafka, JSON was already everywhere. From Javascript UIs, through API calls, and even databases - it became a &lt;em&gt;lingua franca&lt;/em&gt; of data exchange. For many organizations adopting Kafka I worked with, the decision to combine it with JSON was a no-brainer.&lt;/p&gt;
&lt;p&gt;Yet, this post is not really about Kafka itself. It&amp;rsquo;s not another how-to guide either. &lt;strong&gt;Using Kafka made me less enthusiastic about JSON and more focused on data evolution aspects.&lt;/strong&gt; Here, I&amp;rsquo;d like to share some of my observations with you.&lt;/p&gt;</description>
        </item>
        <item>
            <title>The API should guide you</title>
            <link>https://mikemybytes.com/2022/03/23/the-api-should-guide-you/</link>
            <pubDate>Wed, 23 Mar 2022 06:15:00 +0000</pubDate>
            <guid>https://mikemybytes.com/2022/03/23/the-api-should-guide-you/</guid>
            <description>&lt;p&gt;We create APIs all the time - and I don&amp;rsquo;t have only libraries and frameworks in mind. &lt;strong&gt;Every piece of code that&amp;rsquo;s intended to be called by another piece of code is an API&lt;/strong&gt;, in some sense. It&amp;rsquo;s our job to define an interface, which will be used to achieve whatever is expected.&lt;/p&gt;
&lt;p&gt;While discussing various API designs, we often focus on &amp;ldquo;how it&amp;rsquo;s gonna look&amp;rdquo; first. &lt;em&gt;Does it allow fluent calls? Does it rely on annotations? Is the naming accurate?&lt;/em&gt; Don&amp;rsquo;t get me wrong - these are all valid questions. Yet, these &amp;ldquo;visuals&amp;rdquo; often distract us from the actual usability.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Java records &amp; compact constructors</title>
            <link>https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/</link>
            <pubDate>Wed, 16 Feb 2022 06:47:00 +0000</pubDate>
            <guid>https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/</guid>
            <description>&lt;p&gt;Java records should be no longer considered as a &amp;ldquo;new concept&amp;rdquo;. Introduced in early 2020 (with version 14) have already been adopted in many projects and organizations. Yet, while we all know that they provide getters, &lt;code&gt;equals&lt;/code&gt;, &lt;code&gt;hashCode&lt;/code&gt;, and &lt;code&gt;toString&lt;/code&gt; for free, there is one feature that still feels a bit unknown. &lt;strong&gt;Let&amp;rsquo;s see how &lt;em&gt;compact constructors&lt;/em&gt; can help us write more idiomatic code&lt;/strong&gt;.&lt;/p&gt;
&lt;h1 id=&#34;record-construction&#34;&gt;Record construction&lt;/h1&gt;
&lt;p&gt;Recent versions of Java come with concise syntax for declaring records:&lt;/p&gt;</description>
        </item>
        <item>
            <title>Go-live is a test of flexibility</title>
            <link>https://mikemybytes.com/2022/01/25/go-live-is-a-test-of-flexibility/</link>
            <pubDate>Tue, 25 Jan 2022 06:59:31 +0000</pubDate>
            <guid>https://mikemybytes.com/2022/01/25/go-live-is-a-test-of-flexibility/</guid>
            <description>&lt;p&gt;We want our applications to be maintainable, reliable, resilient, and scalable. All these features seem to share the same idea: being flexible. This flexibility is often manifested in the early design documents close to the buzzwords and technology names. But that&amp;rsquo;s only the marketing. &lt;strong&gt;The true test of flexibility comes with the first go-live&lt;/strong&gt;. &amp;ldquo;Production will verify&amp;rdquo; as my former colleagues used to say.&lt;/p&gt;
&lt;p&gt;Flexibility is usually a good thing. It means being able to adapt. Bending without breaking. Flexibility gives us a margin of error when something unexpected happens. Just like it was &amp;ldquo;made&amp;rdquo; with production in mind.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Pragmatic tests parallelization with JUnit 5</title>
            <link>https://mikemybytes.com/2021/11/24/pragmatic-test-parallelization-with-junit5/</link>
            <pubDate>Wed, 24 Nov 2021 06:12:00 +0000</pubDate>
            <guid>https://mikemybytes.com/2021/11/24/pragmatic-test-parallelization-with-junit5/</guid>
            <description>&lt;p&gt;Running tests sequentially seems to be the current status quo in the Java community, despite the number of CPU cores our computers have these days. On the other hand, executing all of them in parallel may look great on paper, but it&amp;rsquo;s often easier said than done, especially in the already existing projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With version 5.3, the JUnit framework has introduced experimental support for the parallel test execution&lt;/strong&gt;, which can &lt;strong&gt;allow selective test parallelization driven by the code&lt;/strong&gt;. Instead of an exhaustive overview of this feature (the official &lt;a href=&#34;https://junit.org/junit5/docs/current/user-guide/#writing-tests-parallel-execution&#34;&gt;User Guide&lt;/a&gt; does a great job here), I&amp;rsquo;d like to &lt;strong&gt;propose a pragmatic solution&lt;/strong&gt;, that should be applicable to many types of projects. You can think of it as a low-hanging fruit of test parallelization.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Parameterize like a pro with JUnit 5 @CsvSource</title>
            <link>https://mikemybytes.com/2021/10/19/parameterize-like-a-pro-with-junit-5-csvsource/</link>
            <pubDate>Tue, 19 Oct 2021 05:32:00 +0000</pubDate>
            <guid>https://mikemybytes.com/2021/10/19/parameterize-like-a-pro-with-junit-5-csvsource/</guid>
            <description>&lt;p&gt;Parameterized tests are definitely my favorite feature of JUnit 5. Defining multiple sets of arguments for the same test can significantly reduce the amount of the test code. Recent additions to the JUnit 5 enable us to write such tests in a whole different way, improving both readability and expressiveness.&lt;/p&gt;
&lt;p&gt;This article won&amp;rsquo;t be yet another primer/overview (like &lt;a href=&#34;https://nipafx.dev/junit-5-parameterized-tests/&#34;&gt;this great introduction&lt;/a&gt; from &lt;a href=&#34;https://twitter.com/nipafx/&#34;&gt;@nipafx&lt;/a&gt;). Instead, &lt;strong&gt;I&amp;rsquo;d like to show some not-so-obvious ways of defining test inputs in an elegant, tabular way with JUnit 5&lt;/strong&gt;. Probably, the fans of the &lt;a href=&#34;https://spockframework.org/&#34;&gt;Spock framework&lt;/a&gt; (and its &lt;a href=&#34;https://spockframework.org/spock/docs/2.0/data_driven_testing.html#data-tables&#34;&gt;Data Tables&lt;/a&gt;) would already have an idea of how it could look like, but it&amp;rsquo;s a non-goal to compare these two frameworks here.&lt;/p&gt;</description>
        </item>
        <item>
            <title>No need to hate Java default methods</title>
            <link>https://mikemybytes.com/2021/08/05/no-need-to-hate-java-default-methods/</link>
            <pubDate>Thu, 05 Aug 2021 05:44:00 +0000</pubDate>
            <guid>https://mikemybytes.com/2021/08/05/no-need-to-hate-java-default-methods/</guid>
            <description>&lt;p&gt;While browsing Twitter a few days ago, I&amp;rsquo;ve been reminded about a quite controversial topic in the Java community, which (apparently) still is using interface default methods. To be honest, I&amp;rsquo;ve been a bit skeptical as well when I&amp;rsquo;ve first seen them coming as a part of Java 8. However, today &lt;strong&gt;I&amp;rsquo;ll write a few words in defense of default methods, as when used carefully, they can turn out to be extremely handy&lt;/strong&gt;.&lt;/p&gt;</description>
        </item>
        <item>
            <title>SLA is the new CAP</title>
            <link>https://mikemybytes.com/2021/07/20/sla-is-the-new-cap/</link>
            <pubDate>Tue, 20 Jul 2021 06:04:38 +0000</pubDate>
            <guid>https://mikemybytes.com/2021/07/20/sla-is-the-new-cap/</guid>
            <description>&lt;p&gt;The world has changed quite a lot since 1999 when Eric Brewer formulated his famous conjecture, known as the &lt;a href=&#34;https://en.wikipedia.org/wiki/CAP_theorem&#34;&gt;CAP Theorem&lt;/a&gt; today. Back then, the systems were running mostly on a self-hosted and rather expensive infrastructure, often related to the software components in use (due to licensing, etc.). A proper understanding of availability &amp;amp; consistency trade-offs in the presence of network partitions was simply yet another responsibility on the list.&lt;/p&gt;
&lt;p&gt;Today, SaaS/PaaS/IaaS products have distracted us from many of those problems, while leaving promises of a carefree life focused on our business instead. After more than 20 years, SLA (&lt;a href=&#34;https://en.wikipedia.org/wiki/Service-level_agreement&#34;&gt;Service-Level Agreement&lt;/a&gt;) became the new CAP, defining the limits of the distributed systems we are building.&lt;/p&gt;</description>
        </item>
        <item>
            <title>How startup time affects reliability</title>
            <link>https://mikemybytes.com/2021/04/13/how-startup-time-affects-reliability/</link>
            <pubDate>Tue, 13 Apr 2021 06:27:49 +0000</pubDate>
            <guid>https://mikemybytes.com/2021/04/13/how-startup-time-affects-reliability/</guid>
            <description>&lt;p&gt;There seems to be a lot of interest in improving application startup time these days, driven by the discussions on languages and technologies (like Go, Node, or GraalVM), that provide almost instant startup for serverless functions (a.k.a. lambdas) being run in the cloud. However, such a speedup brings benefits to other types of processing as well.&lt;/p&gt;
&lt;p&gt;In this post, I&amp;rsquo;d like to present a different perspective on the topic of application startup time. Instead of focusing on serverless functions, I will &lt;strong&gt;show how faster startups can improve the reliability of a more &amp;ldquo;traditional&amp;rdquo; distributed system&lt;/strong&gt;.&lt;/p&gt;</description>
        </item>
        <item>
            <title>You can&#39;t afford to run Java 8</title>
            <link>https://mikemybytes.com/2021/03/16/you-cant-afford-to-run-java-8/</link>
            <pubDate>Tue, 16 Mar 2021 06:28:56 +0000</pubDate>
            <guid>https://mikemybytes.com/2021/03/16/you-cant-afford-to-run-java-8/</guid>
            <description>&lt;p&gt;Syntactic sugar (like the introduction of &lt;code&gt;var&lt;/code&gt;) is often not enough to convince somebody (especially non-developer) to move forward. This is one of the reasons why Java 8, almost 7 years after its first release, is still widely used. However, &lt;strong&gt;many things have improved apart from the syntax.&lt;/strong&gt; When taking all of them into account, it may turn out that &lt;strong&gt;you can&amp;rsquo;t afford to run Java 8&lt;/strong&gt;  &lt;strong&gt;anymore&lt;/strong&gt;. And no, I don&amp;rsquo;t mean migrating the code, but simply &lt;strong&gt;updating the JVM used as a runtime!&lt;/strong&gt;&lt;/p&gt;</description>
        </item>
        <item>
            <title>Closing Java Streams with AutoCloseable</title>
            <link>https://mikemybytes.com/2021/01/26/closing-java-streams-with-autocloseable/</link>
            <pubDate>Tue, 26 Jan 2021 23:31:40 +0000</pubDate>
            <guid>https://mikemybytes.com/2021/01/26/closing-java-streams-with-autocloseable/</guid>
            <description>&lt;p&gt;What could be kind of surprise even for some experienced Java programmers, the &lt;code&gt;java.util.Stream&lt;/code&gt; interface extends &lt;code&gt;java.lang.AutoCloseable&lt;/code&gt;. This (in theory) puts it on par with files, DB connections, and other resources requiring manual closing. &lt;strong&gt;Should we close all our Streams in the same way as any other resources?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this post, I&amp;rsquo;d like to explain which Streams have to be closed and how the closing actually works. We will also go through some of the interesting under-documented properties of this feature.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Single-partition Kafka topics</title>
            <link>https://mikemybytes.com/2021/01/11/single-partition-kafka-topics/</link>
            <pubDate>Mon, 11 Jan 2021 10:14:00 +0000</pubDate>
            <guid>https://mikemybytes.com/2021/01/11/single-partition-kafka-topics/</guid>
            <description>&lt;p&gt;&lt;a href=&#34;https://kafka.apache.org/&#34;&gt;Apache Kafka&lt;/a&gt; has been designed with scalability and high-performance in mind. Thanks to its architecture and &lt;a href=&#34;https://kafka.apache.org/intro#intro_concepts_and_terms&#34;&gt;unique ordering guarantees&lt;/a&gt; (only within the topic&amp;rsquo;s partition), it is able to easily scale to millions of messages. However, there are some specific situations when using a topic with just one partition (despite being against mentioned features) might be a valid and simple solution to some complex problems of the distributed world.&lt;/p&gt;
&lt;p&gt;In this post, I&amp;rsquo;d like to &lt;strong&gt;describe the so-called single-partition topic pattern and to list some valid use cases for it&lt;/strong&gt;.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Technical interview tips for valuing candidates&#39; time even more</title>
            <link>https://mikemybytes.com/2020/12/10/technical-interview-tips-for-valuing-candidates-time-even-more/</link>
            <pubDate>Thu, 10 Dec 2020 06:42:13 +0000</pubDate>
            <guid>https://mikemybytes.com/2020/12/10/technical-interview-tips-for-valuing-candidates-time-even-more/</guid>
            <description>&lt;p&gt;The end of the year is an especially intensive recruitment season for many IT companies &amp;amp; software houses. This does not mean that only HR departments have their hands (and calendars) full. As one of the last steps before offering (or not) a job, a technical interview has to take place. Selected &lt;strong&gt;engineers&lt;/strong&gt;, previously busy with technical stuff, &lt;strong&gt;have to now become recruiters&lt;/strong&gt;, verifying people&amp;rsquo;s skills and experience. And that&amp;rsquo;s quite of a challenge!&lt;/p&gt;</description>
        </item>
        <item>
            <title>Isolation issues with Helm umbrella charts</title>
            <link>https://mikemybytes.com/2020/11/25/isolation-issues-with-helm-umbrella-charts/</link>
            <pubDate>Wed, 25 Nov 2020 07:33:35 +0000</pubDate>
            <guid>https://mikemybytes.com/2020/11/25/isolation-issues-with-helm-umbrella-charts/</guid>
            <description>&lt;p&gt;In this post, I&amp;rsquo;d like to describe the issue I&amp;rsquo;ve recently encountered when using Helm umbrella charts. Long story short, &lt;strong&gt;it turned out that subcharts are not completely isolated from each other, contrary to what we probably would expect&lt;/strong&gt;. This feature has also some important consequences for building umbrella charts and combining different dependencies into one parent chart, which I want to outline as well.&lt;/p&gt;
&lt;h1 id=&#34;umbrella-charts-basics&#34;&gt;Umbrella charts basics&lt;/h1&gt;
&lt;p&gt;Helm umbrella charts are an easy and powerful way of installing multiple components as a single one. They allow us to set up pretty complex configurations like &lt;a href=&#34;https://github.com/confluentinc/cp-helm-charts&#34;&gt;Kafka cluster&lt;/a&gt; or &lt;a href=&#34;https://github.com/elastic/helm-charts&#34;&gt;Elastic stack&lt;/a&gt; with minimal effort - by installing just a single chart (one &lt;code&gt;helm install&lt;/code&gt; call).&lt;/p&gt;</description>
        </item>
        <item>
            <title>Introducing Mike my bytes</title>
            <link>https://mikemybytes.com/2020/11/10/introducing-mike-my-bytes/</link>
            <pubDate>Tue, 10 Nov 2020 06:40:33 +0000</pubDate>
            <guid>https://mikemybytes.com/2020/11/10/introducing-mike-my-bytes/</guid>
            <description>&lt;p&gt;People are using all their senses for recognition. Just think about how many jingles, slogans, images, or even actor faces unequivocally remind us of something. They are consistently building what we call a brand. It&amp;rsquo;s not a coincidence by the way - it&amp;rsquo;s called &lt;a href=&#34;https://www.independent.co.uk/news/science/advertising-synaethesia-multisensory-marketing-senses-linguistics-a8479056.html&#34;&gt;multisensory marketing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Software engineering loves consistency too - not only when &lt;a href=&#34;https://en.wikipedia.org/wiki/ACID&#34;&gt;ACID&lt;/a&gt; comes to play, but also in terms of technical content. Interestingly, only some of the tech companies I know managed to build a consistent, nice to look at visual identification or technical brand (surprisingly, the budget often seems not to be a reason for that). I and many of the technical people I know actually care about those things. One could say, the content is more important than its wrapping - sure! However, &lt;strong&gt;mediocrity is what we feel right at first look&lt;/strong&gt;. And in terms of marketing, &lt;strong&gt;nobody wants the first impression to be the last one&lt;/strong&gt;&amp;hellip;&lt;/p&gt;</description>
        </item>
        <item>
            <title>DYI security audits - half a year later</title>
            <link>https://mikemybytes.com/2019/06/02/dyi-security-audits-half-a-year-later/</link>
            <pubDate>Sun, 02 Jun 2019 22:07:54 +0000</pubDate>
            <guid>https://mikemybytes.com/2019/06/02/dyi-security-audits-half-a-year-later/</guid>
            <description>&lt;p&gt;At the end of 2018, I had a pleasure to give a talk at Testwarez - the oldest testing-oriented conference organized in Poland. The recording recently appeared on &lt;a href=&#34;https://www.youtube.com/watch?v=7b1dIpsI2HI&#34;&gt;YouTube&lt;/a&gt;, so I decided to take this opportunity to figure out what has changed through the past few months in terms of tools that I presented.&lt;/p&gt;
&lt;p&gt;The goal of my talk was to present some practices and open source tools for improving the overall security of Java-based projects. Including them as a part of the delivery pipeline (static code analysis, build process, Docker images creation, etc.) sets up a regular and automated &amp;ldquo;security audits&amp;rdquo; routine even without a dedicated security team. Please don&amp;rsquo;t get me wrong - it doesn&amp;rsquo;t mean that we don&amp;rsquo;t need pentesters (&amp;ldquo;security magicians&amp;rdquo; in general) or external audits anymore. I believe that if some of their work could be done in an automated manner every day then it should make our apps noticeably more secure and reduce the number of vulnerabilities that could be found later on.&lt;/p&gt;</description>
        </item>
        <item>
            <title>What could your luggage tell you about the cryptography?</title>
            <link>https://mikemybytes.com/2018/10/14/what-could-your-luggage-tell-you-about-cryptography/</link>
            <pubDate>Sun, 14 Oct 2018 13:36:43 +0000</pubDate>
            <guid>https://mikemybytes.com/2018/10/14/what-could-your-luggage-tell-you-about-cryptography/</guid>
            <description>&lt;figure class=&#34;kg-card kg-image-card kg-card-hascaption&#34;&gt;
        &lt;picture&gt;
            &lt;source srcset=&#34;https://mikemybytes.com/images/2018/10/lock_hu_4b917f1b425a8387.webp&#34; media=&#34;(max-width: 300px)&#34; width=&#34;300&#34; height=&#34;132&#34; type=&#34;image/webp&#34;&gt;
            &lt;source srcset=&#34;https://mikemybytes.com/images/2018/10/lock_hu_3967226830a59654.webp&#34; media=&#34;(max-width: 600px)&#34; width=&#34;600&#34; height=&#34;264&#34; type=&#34;image/webp&#34;&gt;
            &lt;source srcset=&#34;https://mikemybytes.com/images/2018/10/lock_hu_f613d24e0045c652.webp&#34; width=&#34;900&#34; height=&#34;396&#34; type=&#34;image/webp&#34;&gt;

            &lt;source srcset=&#34;https://mikemybytes.com/images/2018/10/lock_hu_379415e5a995c266.jpg&#34; media=&#34;(max-width: 300px)&#34; width=&#34;300&#34; height=&#34;132&#34; type=&#34;image/jpeg&#34;&gt;
            &lt;source srcset=&#34;https://mikemybytes.com/images/2018/10/lock_hu_7eb3ec4e0d91a23.jpg&#34; media=&#34;(max-width: 600px)&#34; width=&#34;600&#34; height=&#34;264&#34; type=&#34;image/jpeg&#34;&gt;
            &lt;source srcset=&#34;https://mikemybytes.com/images/2018/10/lock_hu_226e73d59ed9d5ec.jpg&#34; width=&#34;900&#34; height=&#34;396&#34; type=&#34;image/jpeg&#34;&gt;

            &lt;img src=&#34;https://mikemybytes.com/images/2018/10/lock_hu_226e73d59ed9d5ec.jpg&#34; width=&#34;900&#34; height=&#34;396&#34; loading=&#34;lazy&#34;
                
                    alt=&#34;Typical luggage case padlock&#34;
                
            /&gt;
        &lt;/picture&gt;
        
            &lt;figcaption&gt;
A typical luggage case padlock with 3 rings and TSA (backdoor) lock on the left
&lt;/figcaption&gt;
        
    &lt;/figure&gt;


&lt;p&gt;A combination of 3 digits - this is the level of protection offered by the vast majority of luggage cases on the market. 3 digits secret code, that should keep all your personal belongings safe at the aircraft, lobby and hotel room. Lots to expect for just 3 digits&amp;hellip;&lt;/p&gt;</description>
        </item>
        <item>
            <title>Project Lombok - beyond DRY</title>
            <link>https://mikemybytes.com/2018/05/27/project-lombok-beyond-dry/</link>
            <pubDate>Sun, 27 May 2018 17:49:27 +0000</pubDate>
            <guid>https://mikemybytes.com/2018/05/27/project-lombok-beyond-dry/</guid>
            <description>&lt;p&gt;I have to admit, that when I first saw &lt;a href=&#34;https://projectlombok.org/&#34;&gt;Project Lombok&lt;/a&gt; few years ago it was quite odd to me. The whole &amp;ldquo;annotation thing&amp;rdquo; and code pieces appearing &amp;ldquo;magically&amp;rdquo; inside the classes made me skeptical. A few years later, I&amp;rsquo;m now a fan of using Lombok in my Java projects for many reasons. Not all of its users know, that Lombok has more than just reducing the boilerplate code to offer. Let&amp;rsquo;s take a look at what&amp;rsquo;s behind its magic and what could you benefit from adding it to your projects. Instead of making a hello world example using features like &lt;code&gt;@Getter&lt;/code&gt;, &lt;code&gt;@Setter&lt;/code&gt; or &lt;code&gt;@Builder&lt;/code&gt;, this post is focused on some more complex concepts behind Lombok.&lt;/p&gt;</description>
        </item>
        <item>
            <title>Build docker images with Jenkins running in docker</title>
            <link>https://mikemybytes.com/2018/01/21/build-docker-images-with-jenkins-running-in-docker/</link>
            <pubDate>Sun, 21 Jan 2018 23:44:30 +0000</pubDate>
            <guid>https://mikemybytes.com/2018/01/21/build-docker-images-with-jenkins-running-in-docker/</guid>
            <description>&lt;p&gt;Building docker images within the CI pipeline isn&amp;rsquo;t something new or unusual these days. Normally it&amp;rsquo;s super easy - you just have to install Docker in your Jenkins CI environment and add &lt;code&gt;jenkins&lt;/code&gt; user to the &lt;code&gt;docker&lt;/code&gt; group. Problems appear when your Jenkins instance is a docker container itself.&lt;/p&gt;
&lt;h3 id=&#34;inception-begins&#34;&gt;Inception begins&lt;/h3&gt;
&lt;p&gt;How to make &lt;code&gt;docker&lt;/code&gt; available inside your container? Here is a three steps solution:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install docker in your container.&lt;/li&gt;
&lt;li&gt;Expose docker socket (&lt;code&gt;/var/run/docker.sock&lt;/code&gt;) to the Jenkins container.&lt;/li&gt;
&lt;li&gt;Expose host&amp;rsquo;s docker executable (&lt;code&gt;/usr/bin/docker&lt;/code&gt;) to the container.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At this point, you should already be able to use docker inside Jenkins&amp;rsquo; container. Nevertheless, all docker commands executing by Jenkins must start with &lt;code&gt;sudo docker&lt;/code&gt;. That requirement has been greatly explained in &lt;a href=&#34;https://docs.docker.com/engine/installation/linux/linux-postinstall/&#34;&gt;Post-installation steps for Linux&lt;/a&gt; chapter of docker&amp;rsquo;s docs. If it fits your needs &amp;amp; security restriction you can stop here - but please know, that there is a better solution ;)&lt;/p&gt;</description>
        </item>
        <item>
            <title>SolrCloud on production - the memory</title>
            <link>https://mikemybytes.com/2017/08/17/solrgoeslive-solrcloud-on-production-part-1-the-memory/</link>
            <pubDate>Thu, 17 Aug 2017 23:02:24 +0000</pubDate>
            <guid>https://mikemybytes.com/2017/08/17/solrgoeslive-solrcloud-on-production-part-1-the-memory/</guid>
            <description>&lt;p&gt;I want to share with you some of my thoughts about using &lt;em&gt;Apache Solr&lt;/em&gt; (especially &lt;em&gt;SolrCloud&lt;/em&gt;) on production. In one of the projects I&amp;rsquo;m participating in, we are using it to provide &lt;em&gt;Near-Real-Time&lt;/em&gt; (NRT) searching along with frequent updates to the indexes. Here are some tips, that helped our project stand still on production environment against hundreds of simultaneous requests per second.&lt;/p&gt;
&lt;p&gt;This post is focused on the memory related aspects of the Solr configuration. Most of the advice presented below apply to other large-heap Java applications as well.&lt;/p&gt;</description>
        </item>
        <item>
            <title>The uncertain future of Keyczar</title>
            <link>https://mikemybytes.com/2017/02/13/the-uncertain-future-of-keyczar/</link>
            <pubDate>Mon, 13 Feb 2017 00:39:27 +0000</pubDate>
            <guid>https://mikemybytes.com/2017/02/13/the-uncertain-future-of-keyczar/</guid>
            <description>&lt;p&gt;The cryptographic world changed a lot since 2008 when Google&amp;rsquo;s &lt;a href=&#34;https://github.com/google/keyczar&#34;&gt;Keyczar&lt;/a&gt; library showed up. However, one thing is still the same - effective cryptography is really hard to implement. Keyczar library was a quite successful attempt to provide easy to use crypto solutions based on current security standards to Java, Python and C++. Now, after 9 years of its development, the future doesn&amp;rsquo;t look so bright.&lt;/p&gt;
&lt;h3 id=&#34;aint-no-sunshine-when-its-old&#34;&gt;Ain&amp;rsquo;t no sunshine when it&amp;rsquo;s old&lt;/h3&gt;
&lt;p&gt;In the late 2016 Keyczar&amp;rsquo;s maintainers &lt;a href=&#34;https://github.com/google/keyczar/commit/3dff46f8e95c72bf7b23e8acd22888f96c393d57&#34;&gt;announced&lt;/a&gt; that:&lt;/p&gt;</description>
        </item>
        <item>
            <title>Still using @author for every file? Please don&#39;t...</title>
            <link>https://mikemybytes.com/2016/12/29/still-using-author-please-dont/</link>
            <pubDate>Thu, 29 Dec 2016 08:06:15 +0000</pubDate>
            <guid>https://mikemybytes.com/2016/12/29/still-using-author-please-dont/</guid>
            <description>&lt;h3 id=&#34;luke-i-am-your-father&#34;&gt;Luke, I am Your Father!&lt;/h3&gt;
&lt;p&gt;In his first day at the new job, Bob created the following class:&lt;/p&gt;
&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;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.Arrays&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&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;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.List&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&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&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;cm&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * Returns a sum of given numbers.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; * @author Bob
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;NumberSumCalculator&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;integers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;integers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;integer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;integers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;integer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sum&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;He was so proud of it, so he put the &lt;code&gt;@author&lt;/code&gt; &lt;em&gt;Javadoc&lt;/em&gt; tag with his name at the top. Two days later, his friend Eve performed so called &lt;em&gt;&amp;ldquo;cosmetic cleanup&amp;rdquo;&lt;/em&gt;:&lt;/p&gt;</description>
        </item>
        <item>
            <title>Welcome to HTTPS era with Let’s Encrypt!</title>
            <link>https://mikemybytes.com/2016/12/11/welcome-to-https-era-with-lets-encrypt/</link>
            <pubDate>Sun, 11 Dec 2016 20:10:51 +0000</pubDate>
            <guid>https://mikemybytes.com/2016/12/11/welcome-to-https-era-with-lets-encrypt/</guid>
            <description>&lt;p&gt;As you can already see in the browser&amp;rsquo;s address bar, my blog (along with other sites on &lt;a href=&#34;https://mkowalski.net&#34;&gt;mkowalski.net&lt;/a&gt; domain) received HTTPS support. Thanks to &lt;a href=&#34;https://letsencrypt.org/&#34;&gt;Let’s Encrypt&lt;/a&gt; everyone can get valid HTTPS certificate for free! Interested? Check out their&amp;rsquo;s &lt;a href=&#34;https://letsencrypt.org/getting-started/&#34;&gt;Getting Started Guide&lt;/a&gt;. If you are lucky enough your hosting provider may already support Let&amp;rsquo;s Encrypt automatically. In my case a manual configuration was required. Luckily, it have been documented well by &lt;a href=&#34;https://wiki.mydevil.net/Let&#39;s_Encrypt&#34;&gt;MyDevil team&lt;/a&gt;, so the process took me just a few minutes.&lt;/p&gt;</description>
        </item>
        <item>
            <title>How micro should a microservice be?</title>
            <link>https://mikemybytes.com/2016/10/20/how-micro-should-a-microservice-be/</link>
            <pubDate>Thu, 20 Oct 2016 22:47:00 +0000</pubDate>
            <guid>https://mikemybytes.com/2016/10/20/how-micro-should-a-microservice-be/</guid>
            <description>&lt;p&gt;Two days ago I&amp;rsquo;ve participated in a JUG meeting in Poznań which special guest was famous Java rock star Adam Bien with his presentation called &lt;em&gt;Microservices in 2016 — What Worked Well&lt;/em&gt;. The session was focused on the typical Bien&amp;rsquo;s stack: JEE microservices &amp;amp; Docker and overlapped with &lt;a href=&#34;https://www.youtube.com/watch?v=pbwZnzuHHao&#34;&gt;his presentation on Devoxx Poland 2016&lt;/a&gt;. But don&amp;rsquo;t get me wrong - it was totally worth it!&lt;/p&gt;
&lt;h3 id=&#34;the-biens-way&#34;&gt;The Bien&amp;rsquo;s way&lt;/h3&gt;
&lt;p&gt;One of the most controversial topics during the session was the preffered size and the granularity of microservices. Bien&amp;rsquo;s approach is to start with a monolith app (single WAR) and split it only when you have a good reason for it (like security requirements). He typically ends up with just a few microservices (eg. about 5), that not always have to encapsulate just one feature. At the same time they should be &amp;lsquo;micro&amp;rsquo; in terms of the WAR size and a minimalistic dependecy set - ideally limited only to JEE libs provided by the application server. Probably the most powerful feature of his development model is the speed - he packages and deploys WAR into dockerized application server blazingly fast (seconds!). But are his microservices really &amp;lsquo;micro&amp;rsquo;?&lt;/p&gt;</description>
        </item>
        <item>
            <title>Docker shared storage file permission problems</title>
            <link>https://mikemybytes.com/2016/09/11/docker-shared-storage-file-permission-problems/</link>
            <pubDate>Sun, 11 Sep 2016 22:30:16 +0000</pubDate>
            <guid>https://mikemybytes.com/2016/09/11/docker-shared-storage-file-permission-problems/</guid>
            <description>&lt;h3 id=&#34;case&#34;&gt;Case&lt;/h3&gt;
&lt;p&gt;Imagine the following scenario: your world-famous web application is hosted with two Docker containers (eg. with application server). Both containers have access to same host&amp;rsquo;s directories (passed with Docker&amp;rsquo;s &lt;code&gt;-v&lt;/code&gt; parameter) mounted as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/configuration&lt;/code&gt; - containing few configuration files,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/logs&lt;/code&gt; - storing log files outside containers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Arguably, there are lots of better solutions (including databases, log indexing systems etc.) but that&amp;rsquo;s the issue we need to face now.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The following user accounts are involved:&lt;/p&gt;</description>
        </item>
        <item>
            <title>Make your git commit verbose</title>
            <link>https://mikemybytes.com/2016/07/24/make-your-git-commit-verbose/</link>
            <pubDate>Sun, 24 Jul 2016 22:44:29 +0000</pubDate>
            <guid>https://mikemybytes.com/2016/07/24/make-your-git-commit-verbose/</guid>
            <description>&lt;p&gt;Even if committing changes with git is straightforward, sometimes you want to verify all changes before doing it (e.g. to come up with with a nice and meaningfull commit message). Luckily there is &lt;code&gt;--verbose&lt;/code&gt; switch for &lt;code&gt;git commit&lt;/code&gt;. According to the manual (&lt;code&gt;git commit --help&lt;/code&gt;):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;-v&lt;/code&gt;, &lt;code&gt;--verbose&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Show unified diff between the HEAD commit and what would be committed at the bottom of the commit message template to help the user describe the commit by reminding what changes the commit has.&lt;/p&gt;</description>
        </item>
        <item>
            <title>So you think you can skip tests? The &#34;dark side&#34; of Maven</title>
            <link>https://mikemybytes.com/2016/05/31/so-you-think-you-can-skip-tests-the-dark-side-of-maven/</link>
            <pubDate>Tue, 31 May 2016 00:19:26 +0000</pubDate>
            <guid>https://mikemybytes.com/2016/05/31/so-you-think-you-can-skip-tests-the-dark-side-of-maven/</guid>
            <description>&lt;p&gt;Tests are the light side of programming. Period. Running test cases is one of the fundamental duty of every build automation system - including Maven. Even if it&amp;rsquo;s a kind of ritual and the determinant of style, every experienced programmer knows that sometimes things just have to be &lt;a href=&#34;https://www.urbandictionary.com/define.php?term=macgyvered&#34;&gt;MacGavyered&lt;/a&gt; instantly. But how to fold up a late night app version using only Maven, bottle of ketchup and an old shoelace if our tests just don&amp;rsquo;t pass?&lt;/p&gt;</description>
        </item>
        <item>
            <title>Solving locale issues with docker containers</title>
            <link>https://mikemybytes.com/2016/05/16/solving-locale-issues-with-docker-containers/</link>
            <pubDate>Mon, 16 May 2016 22:28:44 +0000</pubDate>
            <guid>https://mikemybytes.com/2016/05/16/solving-locale-issues-with-docker-containers/</guid>
            <description>&lt;p&gt;When &lt;a href=&#34;https://www.docker.com/&#34;&gt;docker&lt;/a&gt; kicked in to the enterprise market many things started changing. Along with microservice-based architectures it became a must-have technology for any &amp;ldquo;modern&amp;rdquo; project (the containers idea itself isn&amp;rsquo;t new - docker has just made things much simplier). In analogy to Java related slogan from 1995 &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Write_once,_run_anywhere&#34;&gt;Write once, run anywhere&lt;/a&gt;&amp;rdquo; almost 20 years later docker enthusiasts say: &amp;ldquo;Build once, run everywhere&amp;rdquo;. In fact both ideas can coexist easily and that&amp;rsquo;s probably one of the reason they really do in practice nowadays. However, &lt;a href=&#34;https://en.wikipedia.org/wiki/There_ain%27t_no_such_thing_as_a_free_lunch&#34;&gt;there ain&amp;rsquo;t no such thing as a free lunch&amp;hellip;&lt;/a&gt;&lt;/p&gt;</description>
        </item>
        <item>
            <title>Apache FOP - center table cell vertically</title>
            <link>https://mikemybytes.com/2016/04/06/apache-fop-vertical-align-table-cell/</link>
            <pubDate>Wed, 06 Apr 2016 21:22:38 +0000</pubDate>
            <guid>https://mikemybytes.com/2016/04/06/apache-fop-vertical-align-table-cell/</guid>
            <description>&lt;p&gt;Nowadays we can argue if using &lt;a href=&#34;https://xmlgraphics.apache.org/&#34;&gt;Apache FOP&lt;/a&gt; is still the best solution for generating PDF documents. One of it&amp;rsquo;s biggest competitors is  probably &lt;a href=&#34;http://community.jaspersoft.com/project/jasperreports-library&#34;&gt;JasperReports Library&lt;/a&gt; which supports multiple file formats and does not require creating XML templates manually from scratch (thanks to
&lt;a href=&#34;http://community.jaspersoft.com/project/jaspersoft-studio&#34;&gt;Jaspersoft Studio&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;However, sometimes you just have to face the FOP&amp;rsquo;s XML monster :)&lt;/p&gt;
&lt;p&gt;The FOP&amp;rsquo;s way of styling elements (text blocks, tables etc.) is almost identical to the CSS. But what if you want table cell content centered vertically? Probably you will try with something like (CSS way):&lt;/p&gt;</description>
        </item>
        <item>
            <title>Checkout specific Git branch or tag using its name only</title>
            <link>https://mikemybytes.com/2016/01/19/checkout-specific-git-branch-tag-using-its-name-only/</link>
            <pubDate>Tue, 19 Jan 2016 23:49:20 +0000</pubDate>
            <guid>https://mikemybytes.com/2016/01/19/checkout-specific-git-branch-tag-using-its-name-only/</guid>
            <description>&lt;p&gt;For some compatibility reasons I needed to checkout specific branch or tag in the Git repository using only it&amp;rsquo;s name (last part without &lt;code&gt;refs/.../&lt;/code&gt; prefix) from a bash script.&lt;/p&gt;
&lt;p&gt;For Mercurial repositories it&amp;rsquo;s not a problem at all thanks to:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hg checkout $tagOrBranch
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I haven&amp;rsquo;t found similar solution using &lt;code&gt;git checkout&lt;/code&gt;, so as a workaround I&amp;rsquo;ve prepared the following bash script to do the job:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git fetch --all
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; git show-ref &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep &lt;span class=&#34;s2&#34;&gt;&amp;#34;refs/remotes/origin/&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$tagOrBranch&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&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;k&#34;&gt;then&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;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;It looks like a branch&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    git checkout -b &lt;span class=&#34;nv&#34;&gt;$tagOrBranch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    git pull origin &lt;span class=&#34;nv&#34;&gt;$tagOrBranch&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;k&#34;&gt;else&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;k&#34;&gt;if&lt;/span&gt; git show-ref --tags &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep &lt;span class=&#34;s2&#34;&gt;&amp;#34;refs/tags/&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$tagOrBranch&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;\$&amp;#34;&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;k&#34;&gt;then&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;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;It looks like a tag&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        git checkout tags/&lt;span class=&#34;nv&#34;&gt;$branchOrTag&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;k&#34;&gt;else&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;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;No branch / tag &amp;#39;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$branchOrTag&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#39; found&amp;#34;&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;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&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;k&#34;&gt;fi&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;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item>
        <item>
            <title>Hello world!</title>
            <link>https://mikemybytes.com/2015/12/19/hello-world/</link>
            <pubDate>Sat, 19 Dec 2015 22:50:31 +0000</pubDate>
            <guid>https://mikemybytes.com/2015/12/19/hello-world/</guid>
            <description>&lt;p&gt;This post couldn&amp;rsquo;t have started different - since I&amp;rsquo;m calling myself a developer.&lt;/p&gt;
&lt;p&gt;Why Yet Another Developer Blog? It’s always good to write down things before forgetting them - isn&amp;rsquo;t it a perfect excuse? Probably there is also another motivation…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you can&amp;rsquo;t explain it simply, you don&amp;rsquo;t understand it well enough.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Albert Einstein&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
        </item>
    </channel>
</rss>