<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>100DaysToOffload on Dev notes</title>
    <link>https://blog.michal.pawlik.dev/tags/100daystooffload/</link>
    <description>Recent content in 100DaysToOffload on Dev notes</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 11 Jul 2023 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.michal.pawlik.dev/tags/100daystooffload/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Introduction to optics in Scala</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/optics/</link>
      <pubDate>Tue, 11 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/scala/optics/</guid>
      <description>&lt;p&gt;Throughout this blog I&amp;rsquo;ve mentioned the benefits of having a strong type system a multiple times. I&amp;rsquo;ve covered &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/refined/&#34;&gt;type refinement for value validation&lt;/a&gt;, &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/scala-derivations/&#34;&gt;beginner friendly&lt;/a&gt; and &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/scala-derivations-show/&#34;&gt;advanced approach&lt;/a&gt; to type-class derivation or type-safe approach to &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/pass4s-basics/&#34;&gt;messaging with pass4s&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The possibilities are endless though, so today I want to introduce another topic, that beginners in languages like Scala or Haskell might not be aware of.&lt;/p&gt;&#xA;&lt;p&gt;In this post I&amp;rsquo;ll talk about &lt;strong&gt;Optics&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;meet-optics&#34;&gt;Meet Optics&lt;/h2&gt;&#xA;&lt;p&gt;Optics is an umbrella term for accessing and transforming immutable data. We&amp;rsquo;ll explore the world of optics with the great library &lt;a href=&#34;https://www.optics.dev/Monocle/&#34;&gt;Monocle&lt;/a&gt;. Before we get started, let&amp;rsquo;s set the stage and with some problem we can refer to.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Intermediate&#39;s guide to derivations in Scala: Magnolia</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/scala-derivations-show/</link>
      <pubDate>Sun, 07 May 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/scala/scala-derivations-show/</guid>
      <description>&lt;p&gt;In the &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/scala-derivations/&#34;&gt;previous post&lt;/a&gt; about Scala derivation I&amp;rsquo;ve explained the idea of derivation and showed how we can benefit from it by using library-provided derivations. This time let&amp;rsquo;s dig deeper and implement our own derviation with &lt;a href=&#34;https://github.com/softwaremill/magnolia&#34;&gt;Magnolia&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; This post is intended for intermediate Scala users, if you are not familiar with the topic I recommend starting with the &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/scala-derivations/&#34;&gt;beginner introduction&lt;/a&gt; first&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;-recap&#34;&gt;♻️ Recap&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; you can skip this section if you remember the previous post, it&amp;rsquo;s just a recap&lt;/p&gt;</description>
    </item>
    <item>
      <title>Beginner&#39;s guide to derivations in Scala</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/scala-derivations/</link>
      <pubDate>Sun, 23 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/scala/scala-derivations/</guid>
      <description>&lt;p&gt;When learning about Scala, there are a few things that might be surprising. One of such mechanisms is code derivation. With this post I want to demystify the term for those of you who are learning Scala and functional programming in general.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; This post is intended for Scala beginners and does not go into the details of building your own derivation. Instead, it shows the client side of things, aiming to show the impact on the code simplification.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tech bytes #5 in Kraków recap</title>
      <link>https://blog.michal.pawlik.dev/posts/tech-bytes-5-krakow-recap/</link>
      <pubDate>Thu, 16 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/tech-bytes-5-krakow-recap/</guid>
      <description>&lt;p&gt;Last Thursday (13.04.2023) I had the pleasure to speak at the 5th edition of &lt;a href=&#34;https://www.meetup.com/pl-PL/tech-bytes-ocado-technology-krakow/events/292412394/&#34;&gt;Tech Bytes&lt;/a&gt; in Kraków.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; This post is a short recap of the event&lt;/p&gt;&#xA;&lt;h1 id=&#34;-the-right-tools-for-the-right-job&#34;&gt;🔧 The right tools for the right job&lt;/h1&gt;&#xA;&lt;p&gt;This edition had two talks scheduled, both focused on programming languages, specifically Scala and Elixir. &amp;ldquo;The right tools for the right job&amp;rdquo; was the topic of the meeting.&lt;/p&gt;&#xA;&lt;p&gt;The talks were:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;Get rid of boilerplate with Scala&lt;/em&gt; by myself&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;What is Elixir and what it can do with concurrency challenges? - sharing Elixirator insights&lt;/em&gt; by Józef Pawlikowski and Alexander Sosnovskiy&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Sadly Alexander wasn&amp;rsquo;t able to join us but Józef did his best to present his peer&amp;rsquo;s part.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Beginner&#39;s guide to toolkits in Scala</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/scala-toolkits/</link>
      <pubDate>Sat, 11 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/scala/scala-toolkits/</guid>
      <description>&lt;p&gt;So you are learning Scala and see all the news about &lt;a href=&#34;https://scala-cli.virtuslab.org/&#34;&gt;scala-cli&lt;/a&gt; and it becoming the new &lt;a href=&#34;https://github.com/scala/improvement-proposals/pull/46&#34;&gt;scala runner&lt;/a&gt;, &lt;a href=&#34;https://github.com/scala/toolkit&#34;&gt;Scala Toolkit&lt;/a&gt;, &lt;a href=&#34;https://github.com/typelevel/toolkit&#34;&gt;Typelevel Toolkit&lt;/a&gt; and things become a little confusing?&lt;/p&gt;&#xA;&lt;p&gt;This post is here to help you understand what&amp;rsquo;s going on. To make some sense of it, let&amp;rsquo;s tell a bit of a story.&lt;/p&gt;&#xA;&lt;h2 id=&#34;-scala-runner-and-scala-cli&#34;&gt;💻 Scala runner and scala-cli&lt;/h2&gt;&#xA;&lt;p&gt;First of all, what&amp;rsquo;s Scala runner? basically it&amp;rsquo;s the program that you launch by typing &lt;code&gt;scala&lt;/code&gt; in your terminal. It can launch a basic REPL or run provided Scala file, but not much more.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TIL: Launching flashlight with Typescript is insane</title>
      <link>https://blog.michal.pawlik.dev/posts/til/flashlight-using-typescript/</link>
      <pubDate>Wed, 08 Feb 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/til/flashlight-using-typescript/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; I wanted to launch a flashlight on Android device using Typescript and the experience was &lt;em&gt;far from ideal&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;the-task&#34;&gt;The task&lt;/h1&gt;&#xA;&lt;p&gt;Background: there&amp;rsquo;s a web application that runs a camera to scan for QR codes. Sometimes the light conditions are poor and scanning is difficult.&lt;/p&gt;&#xA;&lt;p&gt;The task: Launch the flashlight to improve the scanning experience.&lt;/p&gt;&#xA;&lt;p&gt;Doesn&amp;rsquo;t sound that difficult, does it?&lt;/p&gt;&#xA;&lt;h1 id=&#34;meet-the-camera-api&#34;&gt;Meet the camera API&lt;/h1&gt;&#xA;&lt;p&gt;So we want to obtain the camera stream, how do we do that? It seems the answer is simple. Meet the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia&#34;&gt;MediaDevices.getUserMedia()&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Your own Home Assistant add-on</title>
      <link>https://blog.michal.pawlik.dev/posts/smarthome/home-assistant-addons/</link>
      <pubDate>Sat, 04 Feb 2023 23:00:00 +0100</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/smarthome/home-assistant-addons/</guid>
      <description>&lt;p&gt;In the previous post in the series I described the process of externalizing you HA (Home Assistant) using my custom addon. Make sure to check &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/smarthome/expose-home-assistant/&#34;&gt;that out&lt;/a&gt; if you haven&amp;rsquo;t already. This time I&amp;rsquo;ll share the details of the add-on development process.&lt;/p&gt;&#xA;&lt;h1 id=&#34;first-steps&#34;&gt;First steps&lt;/h1&gt;&#xA;&lt;p&gt;When building the add-on my first steps obviously went towards the existing online resources. The first thing I&amp;rsquo;ve found was the extensive tutorial on &lt;a href=&#34;https://developers.home-assistant.io/docs/add-ons/tutorial&#34;&gt;https://developers.home-assistant.io/docs/add-ons/tutorial&lt;/a&gt;, but there seems to be an easier hands-on approach. Instead of following the tutorial we&amp;rsquo;ll use the official template from &lt;a href=&#34;https://github.com/home-assistant/addons-example&#34;&gt;https://github.com/home-assistant/addons-example&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wrocław Scala User Group #2</title>
      <link>https://blog.michal.pawlik.dev/posts/wsug-002/</link>
      <pubDate>Sun, 29 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/wsug-002/</guid>
      <description>&lt;p&gt;In this post I want to share a short recap of first Wrocław Scala User Group (WSUG) meetup. This will be kind of TIL entry, it doesn&amp;rsquo;t aim to cover the full presentation content. If you&amp;rsquo;d like to join the next meeting, join us at &lt;a href=&#34;https://www.meetup.com/pl-PL/wroclaw-scala-user-group/&#34;&gt;Wroclaw Scala User Group at meetup.com&lt;/a&gt;. The meetup was held in Polish so the slides are not translated.&lt;/p&gt;&#xA;&lt;h2 id=&#34;first-talk---pain-free-apis-with-smithy4s---jakub-kozłowski-kubukozhttpsgithubcomkubukoz&#34;&gt;First talk - ‘Pain-free APIs with Smithy4s’ - Jakub Kozłowski &lt;a href=&#34;https://github.com/kubukoz&#34;&gt;kubukoz&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;In this talk Jakub introduced us to Smithy - an IDL (Interface Definition Language) built for defining implementation agnostic API descriptions. During the talk we have focused on the aspects that are difficult when designing and evolving a system, namely the communication problems.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Externalize Home Assistant</title>
      <link>https://blog.michal.pawlik.dev/posts/smarthome/expose-home-assistant/</link>
      <pubDate>Fri, 20 Jan 2023 10:30:00 +0100</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/smarthome/expose-home-assistant/</guid>
      <description>&lt;p&gt;This is a third post in the Smart Home series. See the previous post if you haven&amp;rsquo;t already: &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/smarthome/zigbee-setup/&#34;&gt;https://blog.michal.pawlik.dev/posts/smarthome/zigbee-setup/&lt;/a&gt;. Last time I wrote about Zigbee and shown how to control smart home devices. In this post I want to show you one of many ways you can use to expose your HA (Home Assistant) instance to the internet.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-expose&#34;&gt;Why expose?&lt;/h2&gt;&#xA;&lt;p&gt;All of the examples in previous posts were referring to local instance of Home Assistant. To work with it you had to be with the same network. While it&amp;rsquo;s not a problem when you are at home, there are cases when you want to access HA from the external network. Those cases include controlling the heat, accessing monitoring, switching light etc. when you are not home.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wrocław Java User Group</title>
      <link>https://blog.michal.pawlik.dev/posts/wjug-0198/</link>
      <pubDate>Sat, 14 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/wjug-0198/</guid>
      <description>&lt;p&gt;In this post I want to share a short recap of first Wrocław Scala Java Group (WSUG) meetup. This will be kind of TIL entry, it doesn&amp;rsquo;t aim to cover the full presentation content. You can find the full agenda at the &lt;a href=&#34;https://www.meetup.com/pl-PL/wroclawjug/events/290615129/&#34;&gt;event page&lt;/a&gt;. If you&amp;rsquo;d like to join the next meeting, join us at &lt;a href=&#34;https://www.meetup.com/pl-PL/WroclawJUG/&#34;&gt;Wroclaw Java User Group at meetup.com&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;We just had one talk this time, and it was delivered by yours truly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Zigbee with Home Assistant - Smart Home</title>
      <link>https://blog.michal.pawlik.dev/posts/smarthome/zigbee-setup/</link>
      <pubDate>Thu, 05 Jan 2023 16:30:00 +0100</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/smarthome/zigbee-setup/</guid>
      <description>&lt;p&gt;This is a second post in the Smart Home series. See the previous post if you haven&amp;rsquo;t already: &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/smarthome/smart-home-getting-started/&#34;&gt;https://blog.michal.pawlik.dev/posts/smarthome/smart-home-getting-started/&lt;/a&gt;. Last time we have set up the HA (Home Assistant), in this post we&amp;rsquo;ll learn about Zigbee and control some devices.&lt;/p&gt;&#xA;&lt;h2 id=&#34;zigbee&#34;&gt;Zigbee&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Zigbee&#34;&gt;Zigbee&lt;/a&gt; is a specification for wireless communication protocols, very common solution for building home automation networks.&lt;/p&gt;&#xA;&lt;p&gt;Explaining new terms is always easier when there&amp;rsquo;s something well known you can relate to, so before describing Zigbee let&amp;rsquo;s recall something familiar, the typical WiFi network.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TIL: Debugging Hugo - fixing publish date</title>
      <link>https://blog.michal.pawlik.dev/posts/til/publish-date-in-hugo/</link>
      <pubDate>Wed, 04 Jan 2023 17:15:00 +0100</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/til/publish-date-in-hugo/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Today I learned how to fix post visibility by reading the documentation &lt;a href=&#34;https://gohugo.io/getting-started/usage/#draft-future-and-expired-content&#34;&gt;https://gohugo.io/getting-started/usage/#draft-future-and-expired-content&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Last night I&amp;rsquo;ve been finishing my first blog post this year. Upon finishing the text and finding the icon it&amp;rsquo;s time to fill the metadata. Midnight was minutes away so I set the publish date to &lt;code&gt;2023-01-04&lt;/code&gt; (next day) and set the &lt;code&gt;draft&lt;/code&gt; flag to &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;The problem&lt;/h2&gt;&#xA;&lt;p&gt;Imagine how surprising it was to notice that the article I just wrote doesn&amp;rsquo;t show up on the main page. Time to debug. First thing is to double check the &lt;code&gt;draft&lt;/code&gt; state - all good. Perhaps I&amp;rsquo;ve made it &lt;code&gt;2022-01-04&lt;/code&gt; and the post landed a year back? nope, date&amp;rsquo;s correct.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Let&#39;s build a smart home</title>
      <link>https://blog.michal.pawlik.dev/posts/smarthome/smart-home-getting-started/</link>
      <pubDate>Wed, 04 Jan 2023 00:01:00 +0100</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/smarthome/smart-home-getting-started/</guid>
      <description>&lt;p&gt;New year is always a good excuse to start something new. This post starts a series on building a smart home. It&amp;rsquo;s not going to be a tutorial written by an expert, quite the opposite, I want to share my thoughts and experiences while learning.&lt;/p&gt;&#xA;&lt;p&gt;At this point I want to give credit to Kinga and Mikołaj - friends of my who inspired me with their smart home setup and guidance through first steps.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Story of a burned down server</title>
      <link>https://blog.michal.pawlik.dev/posts/vps-from-ashes/</link>
      <pubDate>Tue, 27 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/vps-from-ashes/</guid>
      <description>&lt;p&gt;Do you know that feeling, waking up in the morning just to learn your website and self hosted services are down for unknown reason? That moment when you feel your VPS has &lt;strong&gt;literally&lt;/strong&gt; moved to the cloud?&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-fire&#34;&gt;The fire&lt;/h2&gt;&#xA;&lt;p&gt;This is exactly what happened to me one day of March in 2021. I woke up in the morning, checked the news and learned that there&amp;rsquo;s an fire incident in SBG2 (sources: &lt;a href=&#34;https://us.ovhcloud.com/press/press-releases/2021/fire-our-strasbourg-site&#34;&gt;reference1&lt;/a&gt; &lt;a href=&#34;https://www.datacenterknowledge.com/uptime/fire-has-destroyed-ovh-s-strasbourg-data-center-sbg2&#34;&gt;reference2&lt;/a&gt;). My first thought this is why we do backups, then I realized I&amp;rsquo;m really going to use them. My main VPS was there and it was not responding.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Personal blog: choosing a platform</title>
      <link>https://blog.michal.pawlik.dev/posts/blog-platform/</link>
      <pubDate>Fri, 23 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/blog-platform/</guid>
      <description>&lt;p&gt;Say you want to start a blog, perhaps even join &lt;a href=&#34;https://100daystooffload.com/&#34;&gt;#100DaysToOffload&lt;/a&gt;. There are some questions you need to ask yourself. How do I start? Do I create an account somewhere? Should I build a website?&lt;/p&gt;&#xA;&lt;p&gt;For the starters, you have two options. You can either go for using a platform or for self hosted.&lt;/p&gt;&#xA;&lt;h2 id=&#34;blogging-platforms&#34;&gt;Blogging platforms&lt;/h2&gt;&#xA;&lt;p&gt;Say you want someone to host the platform for you, then you have some better and worse choices. There is a plenty of platforms like medium.com, wordpress.com and alike. Some people try using platforms like instagram which I consider a terrible idea.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Caddy server as a reverse proxy</title>
      <link>https://blog.michal.pawlik.dev/posts/caddy-reverse-proxy/</link>
      <pubDate>Mon, 19 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/caddy-reverse-proxy/</guid>
      <description>&lt;p&gt;In this post I want to share a simple solution for the simple problem I wanted to solve some time ago. The problem definition is following:&lt;/p&gt;&#xA;&lt;p&gt;I have a top level domain and a VPS operating on it. I also have a blog you are reading now hosted with &lt;a href=&#34;https://docs.gitlab.com/ee/user/project/pages/&#34;&gt;Gitlab Pages&lt;/a&gt;. I want to host a website from my top level domain.&lt;/p&gt;&#xA;&lt;p&gt;Hosting pages using Gitlab pages (similarly to &lt;a href=&#34;https://pages.github.com/&#34;&gt;Github Pages&lt;/a&gt;) is very convenient to set up, you just set up a pipeline and a subdomain configure the subdomain.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TIL: Markdown presentations with Marp</title>
      <link>https://blog.michal.pawlik.dev/posts/til/presentations-with-marp/</link>
      <pubDate>Sun, 18 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/til/presentations-with-marp/</guid>
      <description>&lt;p&gt;Lately I&amp;rsquo;ve been working on preparing learning materials in Scala. Usually when I work on preparing slides for public speaking I would use &lt;a href=&#34;https://slides.com/majkp/&#34;&gt;https://slides.com/majkp/&lt;/a&gt;, but this time I was looking for something self hosted.&lt;/p&gt;&#xA;&lt;p&gt;In this situation &lt;a href=&#34;https://revealjs.com/&#34;&gt;Reveal.js&lt;/a&gt; seems like an obvious alternative, but if you want to set up, you either have to download a fixed version which makes the upgrade hard, or build an npm project and add reveal as the dependency.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scala type bounds - &lt;: vs &lt;:&lt;</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/type-bounds-symbols/</link>
      <pubDate>Fri, 16 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/scala/type-bounds-symbols/</guid>
      <description>&lt;p&gt;In this short entry I want to shed some light at the difference between &lt;code&gt;&amp;lt;:&lt;/code&gt; and &lt;code&gt;&amp;lt;:&amp;lt;&lt;/code&gt; in Scala.&lt;/p&gt;&#xA;&lt;p&gt;TL;DR&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;&amp;lt;:&lt;/code&gt; is a language feature built into the compiler: upper type bound&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;&amp;lt;:&amp;lt;&lt;/code&gt; is it&amp;rsquo;s generalization: generalized type constraints - it&amp;rsquo;s provided in the standard library&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s start with the first one. &lt;code&gt;&amp;lt;:&lt;/code&gt; is called the &lt;a href=&#34;https://docs.scala-lang.org/tour/upper-type-bounds.html&#34;&gt;upper type bound&lt;/a&gt;.&#xA;We use it to express type boundaries for generic types as for example here:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Recruitment homework considered harmful</title>
      <link>https://blog.michal.pawlik.dev/posts/recruitment-homeworks-considered-harmful/</link>
      <pubDate>Thu, 15 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/recruitment-homeworks-considered-harmful/</guid>
      <description>&lt;p&gt;Job interview is not an easy thing, neither for the candidate, nor the recruiters. From the candidate&amp;rsquo;s perspective it&amp;rsquo;s stressful to be questioned, the recruiters need to make a good judgement. Interview process is a thing that&amp;rsquo;s easy to make wrong and expensive to make right. Recruitment mistakes are difficult to fix, when you hire someone and you haven&amp;rsquo;t tested them well enough it&amp;rsquo;s not an easy mistake to revert.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TIL: Mimic value class in Typescript</title>
      <link>https://blog.michal.pawlik.dev/posts/til/value-class-typescript/</link>
      <pubDate>Thu, 15 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/til/value-class-typescript/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Today I learned how to mimic Scala-like value class in Typescript&lt;/p&gt;&#xA;&lt;p&gt;Doing day to day scala I often use value classes to model the data like:&lt;/p&gt;&#xA;&lt;div class=&#34;cyber-terminal&#34;&gt;&#xA;  &lt;div class=&#34;cyber-terminal__header&#34;&gt;&#xA;    &lt;span class=&#34;cyber-terminal__dot cyber-terminal__dot--red&#34;&gt;&lt;/span&gt;&#xA;    &lt;span class=&#34;cyber-terminal__dot cyber-terminal__dot--yellow&#34;&gt;&lt;/span&gt;&#xA;    &lt;span class=&#34;cyber-terminal__dot cyber-terminal__dot--green&#34;&gt;&lt;/span&gt;&#xA;    &lt;span class=&#34;cyber-terminal__title&#34;&gt;scala&lt;/span&gt;&#xA;    &lt;button class=&#34;cyber-terminal__copy&#34; type=&#34;button&#34; aria-label=&#34;Copy code&#34; data-copy&gt;&#xA;      &lt;i class=&#34;fa-regular fa-copy&#34;&gt;&lt;/i&gt;&#xA;    &lt;/button&gt;&#xA;  &lt;/div&gt;&#xA;  &lt;div class=&#34;cyber-terminal__body&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code class=&#34;language-scala&#34; data-lang=&#34;scala&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;UserId&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;value&lt;span style=&#34;color:#ff79c6&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#8be9fd&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;AnyVal&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;City&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;(&lt;/span&gt;value&lt;span style=&#34;color:#ff79c6&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#8be9fd&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;AnyVal&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;This is especially useful when you want to add some meaning to primitive types. It also makes the compiler help you to avoid passing irrelevant data to downstream methods.&lt;/p&gt;&#xA;&lt;p&gt;Read more about value classes in the documentation &lt;a href=&#34;https://docs.scala-lang.org/overviews/core/value-classes.html&#34;&gt;https://docs.scala-lang.org/overviews/core/value-classes.html&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wrocław Scala User Group - first meetup</title>
      <link>https://blog.michal.pawlik.dev/posts/wsug-001/</link>
      <pubDate>Tue, 13 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/wsug-001/</guid>
      <description>&lt;p&gt;In this post I want to share a short recap of first Wrocław Scala User Group (WSUG) meetup. This will be kind of TIL entry, it doesn&amp;rsquo;t aim to cover the full presentation content. You can find the full agenda at the &lt;a href=&#34;https://www.meetup.com/pl-PL/wroclaw-scala-user-group/events/290081999/&#34;&gt;event page&lt;/a&gt;. If you&amp;rsquo;d like to join the next meeting, join us at &lt;a href=&#34;https://www.meetup.com/pl-PL/wroclaw-scala-user-group/&#34;&gt;Wroclaw Scala User Group at meetup.com&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This is my second post in &lt;a href=&#34;https://100daystooffload.com/&#34;&gt;#100DaysToOffload&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;first-talk---scala-cli---whats-the-new-scala-runner-capable-of-by-łuksz-wroński-lwronskihttpsgithubcomlwronski&#34;&gt;First talk - Scala CLI - what&amp;rsquo;s the new Scala runner capable of? by Łuksz Wroński &lt;a href=&#34;https://github.com/lwronski&#34;&gt;lwronski&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;This talk was strictly focused on &lt;a href=&#34;https://scala-cli.virtuslab.org/&#34;&gt;scala-cli&lt;/a&gt;, a great command line utility for working with Scala. I&amp;rsquo;ve already introduced it in some of my articles (e.g. &lt;a href=&#34;https://blog.michal.pawlik.dev/posts/scala/refined/&#34;&gt;refined&lt;/a&gt;). If you&amp;rsquo;re not familiar with the tool, I strongly recommend visiting the &lt;a href=&#34;https://scala-cli.virtuslab.org/docs/getting_started&#34;&gt;getting started&lt;/a&gt; page, the documentation is really good and there&amp;rsquo;s no point rewriting it here.&lt;/p&gt;</description>
    </item>
    <item>
      <title>100 days to offload [1/100]</title>
      <link>https://blog.michal.pawlik.dev/posts/100-days-to-offload/</link>
      <pubDate>Mon, 12 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/100-days-to-offload/</guid>
      <description>&lt;p&gt;Today I&amp;rsquo;m joining the &lt;em&gt;100 Days To Offload&lt;/em&gt; challenge. Starting from today I aim to publish 100 blog posts by 12.12.2023.&lt;/p&gt;&#xA;&lt;p&gt;The idea is described in more detail at the project page &lt;a href=&#34;https://100daystooffload.com/&#34;&gt;https://100daystooffload.com/&lt;/a&gt;. Quoting the page:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Posts don’t need to be long-form, deep, meaningful, or even that well written. If there are spelling and grammar mistakes, or even if there’s no real point to the post, so what? What’s important is that you’re writing about the things you want to write about.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Global Day of Code Retreat 2022</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/gdcr-2022/</link>
      <pubDate>Sat, 05 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://blog.michal.pawlik.dev/posts/scala/gdcr-2022/</guid>
      <description>&lt;p&gt;In this article I want to share my experience from Global Day of Code Retreat 2022.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-initiative&#34;&gt;The initiative&lt;/h2&gt;&#xA;&lt;p&gt;GDCR is an annual event organized on site and virtually all over the world. As the event page describes it:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Coderetreats are free day-long, intensive practice events, focusing on the fundamentals of software development and design. By providing developers the opportunity to take part in focused practice, away from the pressures of &amp;ldquo;getting things done&amp;rdquo;, the coderetreat format has proven itself to be a highly effective means of learning and nurturing software development skills.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
