<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Dev notes</title>
    <link>https://blog.michal.pawlik.dev/</link>
    <description>Recent content on Dev notes</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 05 Jan 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.michal.pawlik.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Hide irrelevant data in your PRs</title>
      <link>https://blog.michal.pawlik.dev/posts/til/cleaner-pr-diffs/</link>
      <pubDate>Fri, 05 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/til/cleaner-pr-diffs/</guid>
      <description>TL;DR Today I learned that you can hide irrelevant changes from Github PRs. The syntax for .gitattributes can be tricky though.
In my current project, it&amp;rsquo;s sometimes necessary to re-generate and commit a bunch of files to the repository. This can happen when you store some IaC or test data in the repository.
Sample repository To demonstrate the problem, here&amp;rsquo;s an example repository: https://github.com/majk-p/nice-pr-diffs that features two PRs:
The first one is hard to read https://github.</description>
    </item>
    
    <item>
      <title>Integration testing with Weaver and Localstack</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/weaver-localstack/</link>
      <pubDate>Fri, 29 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/scala/weaver-localstack/</guid>
      <description>When creating software that makes heavy use of cloud infrastructure, it is wise to test the integration in the end-to-end fashion. Doing so in cloud environment is one option, but it may not be viable for all cases. It can be pricy and you cannot do it in an local environment.
A popular solution to this problem is to run Localstack and test your code against it. In this post we&amp;rsquo;ll explore how to manage your Localstack resources for E2E tests using Testcontainers, Cats-effect Resource and Weaver.</description>
    </item>
    
    <item>
      <title>Type safety with Iron</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/iron/</link>
      <pubDate>Fri, 25 Aug 2023 00:00:00 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/scala/iron/</guid>
      <description>This article is a follow up to Type safety with refined, make sure to check it out if you haven&amp;rsquo;t.
In this one we&amp;rsquo;ll repeat the same thing but this time using iron.
Unsafe approach Similarly to the previous post, we&amp;rsquo;ll try to refactor the code below to eliminate the handwritten value checks. The goal is to express our business requirements using the type-system.
//&amp;gt; using scala &amp;#34;2&amp;#34; case class UnsafeOrderLine(product: String, quantity: Int) object UnsafeOrderLine { def safeApply(product: String, quantity: Int): UnsafeOrderLine = { if (product.</description>
    </item>
    
    <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>Throughout this blog I&amp;rsquo;ve mentioned the benefits of having a strong type system a multiple times. I&amp;rsquo;ve covered type refinement for value validation, beginner friendly and advanced approach to type-class derivation or type-safe approach to messaging with pass4s.
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.
In this post I&amp;rsquo;ll talk about Optics.</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>In the previous post 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 Magnolia.
TL;DR This post is intended for intermediate Scala users, if you are not familiar with the topic I recommend starting with the beginner introduction first
♻️ Recap TL;DR you can skip this section if you remember the previous post, it&amp;rsquo;s just a recap</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>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.
TL;DR 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.</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>Last Thursday (13.04.2023) I had the pleasure to speak at the 5th edition of Tech Bytes in Kraków.
TL;DR This post is a short recap of the event
🔧 The right tools for the right job 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.
The talks were:
Get rid of boilerplate with Scala by myself What is Elixir and what it can do with concurrency challenges?</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>So you are learning Scala and see all the news about scala-cli and it becoming the new scala runner, Scala Toolkit, Typelevel Toolkit and things become a little confusing?
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.
💻 Scala runner and scala-cli First of all, what&amp;rsquo;s Scala runner? basically it&amp;rsquo;s the program that you launch by typing scala in your terminal.</description>
    </item>
    
    <item>
      <title>Proxy large messages via S3 with pass4s</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/pass4s-s3-proxy/</link>
      <pubDate>Sun, 05 Mar 2023 00:00:00 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/scala/pass4s-s3-proxy/</guid>
      <description>In the previous post we have learned how pass JSON and XML messages via the SNS/SQS using pass4s. This time we&amp;rsquo;ll focus on another problem, often faced when implementing messaging in backend systems. We&amp;rsquo;ll learn how to handle large messages.
As with previous posts, you&amp;rsquo;ll find all code examples in the companion repository https://github.com/majk-p/pass4s-playground. Along the way I also might refer to the code in that repo.
The problem Let&amp;rsquo;s begin with how a typical SNS-SQS setup looks like.</description>
    </item>
    
    <item>
      <title>JSON and XML messaging with pass4s</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/pass4s-codecs/</link>
      <pubDate>Mon, 27 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/scala/pass4s-codecs/</guid>
      <description>In the previous post we have learned how implement the SNS/SQS based message flow using pass4s. The examples only shown how to exchange basic string messages. In this one I&amp;rsquo;ll show you how to exchange more complex types and serialize them in transport. Examples shown in this post are also available in https://github.com/majk-p/pass4s-playground/ so feel free to clone and play around.
Pass4s is elastic in terms of message encoding, it provides JSON and XML serialization mechanisms out of the box.</description>
    </item>
    
    <item>
      <title>Functional messaging in Scala with pass4s</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/pass4s-basics/</link>
      <pubDate>Sat, 25 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/scala/pass4s-basics/</guid>
      <description>The pass4s provides a functional abstraction for messaging in Scala. It provides implementations for AWS SQS/SNS and ActiveMQ.
In this post I want to show you the basic usage of the library to implement the messaging on top of SNS/SQS. All the examples in this post can be found in https://github.com/majk-p/pass4s-playground.
Localstack Before we see the Scala code, let&amp;rsquo;s setup localstack, set up a SNS (Simple Notification Service) topic, SQS (Simple Queue Service) queue and a subscription between them.</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>TL;DR I wanted to launch a flashlight on Android device using Typescript and the experience was far from ideal.
The task 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.
The task: Launch the flashlight to improve the scanning experience.
Doesn&amp;rsquo;t sound that difficult, does it?
Meet the camera API So we want to obtain the camera stream, how do we do that?</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>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 that out if you haven&amp;rsquo;t already. This time I&amp;rsquo;ll share the details of the add-on development process.
First steps 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 https://developers.home-assistant.io/docs/add-ons/tutorial, but there seems to be an easier hands-on approach.</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>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 Wroclaw Scala User Group at meetup.com. The meetup was held in Polish so the slides are not translated.
First talk - ‘Pain-free APIs with Smithy4s’ - Jakub Kozłowski kubukoz In this talk Jakub introduced us to Smithy - an IDL (Interface Definition Language) built for defining implementation agnostic API descriptions.</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>This is a third post in the Smart Home series. See the previous post if you haven&amp;rsquo;t already: https://blog.michal.pawlik.dev/posts/smarthome/zigbee-setup/. 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.
Why expose? All of the examples in previous posts were referring to local instance of Home Assistant.</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>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 event page. If you&amp;rsquo;d like to join the next meeting, join us at Wroclaw Java User Group at meetup.com.
We just had one talk this time, and it was delivered by yours truly.</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>This is a second post in the Smart Home series. See the previous post if you haven&amp;rsquo;t already: https://blog.michal.pawlik.dev/posts/smarthome/smart-home-getting-started/. Last time we have set up the HA (Home Assistant), in this post we&amp;rsquo;ll learn about Zigbee and control some devices.
Zigbee Zigbee is a specification for wireless communication protocols, very common solution for building home automation networks.
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.</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>TL;DR Today I learned how to fix post visibility by reading the documentation https://gohugo.io/getting-started/usage/#draft-future-and-expired-content
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 2023-01-04 (next day) and set the draft flag to false.
The problem Imagine how surprising it was to notice that the article I just wrote doesn&amp;rsquo;t show up on the main page.</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>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.
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.</description>
    </item>
    
    <item>
      <title>On automating stuff</title>
      <link>https://blog.michal.pawlik.dev/posts/on-automating-stuff/</link>
      <pubDate>Thu, 29 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/on-automating-stuff/</guid>
      <description>Note on automation A while back when I was working as an SRE. I&amp;rsquo;ve learned this one approach that has proven useful multiple times. Whenever I prototype something, even if it&amp;rsquo;s as simple as one liner in bash, I put it into the file, making it a script. In the process I&amp;rsquo;d usually prepare a few of the, trying my best to name them meaningfully, put up a concise readme and push them to some repo.</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>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 literally moved to the cloud?
The fire 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: reference1 reference2).</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>Say you want to start a blog, perhaps even join #100DaysToOffload. There are some questions you need to ask yourself. How do I start? Do I create an account somewhere? Should I build a website?
For the starters, you have two options. You can either go for using a platform or for self hosted.
Blogging platforms Say you want someone to host the platform for you, then you have some better and worse choices.</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>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:
I have a top level domain and a VPS operating on it. I also have a blog you are reading now hosted with Gitlab Pages. I want to host a website from my top level domain.
Hosting pages using Gitlab pages (similarly to Github Pages) is very convenient to set up, you just set up a pipeline and a subdomain configure the subdomain.</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>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 https://slides.com/majkp/, but this time I was looking for something self hosted.
In this situation Reveal.js 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.</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>In this short entry I want to shed some light at the difference between &amp;lt;: and &amp;lt;:&amp;lt; in Scala.
TL;DR
&amp;lt;: is a language feature built into the compiler: upper type bound &amp;lt;:&amp;lt; is it&amp;rsquo;s generalization: generalized type constraints - it&amp;rsquo;s provided in the standard library Let&amp;rsquo;s start with the first one. &amp;lt;: is called the upper type bound. We use it to express type boundaries for generic types as for example here:</description>
    </item>
    
    <item>
      <title>100 days to offload tracker</title>
      <link>https://blog.michal.pawlik.dev/posts/100-days-to-offload-list/</link>
      <pubDate>Thu, 15 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/100-days-to-offload-list/</guid>
      <description>This is a list of articles I wrote during my #100DaysToOffload:
https://blog.michal.pawlik.dev/posts/100-days-to-offload/ https://blog.michal.pawlik.dev/posts/wsug-001/ https://blog.michal.pawlik.dev/posts/recruitment-homeworks-considered-harmful/ https://blog.michal.pawlik.dev/posts/til/value-class-typescript/ https://blog.michal.pawlik.dev/posts/scala/type-bounds-symbols/ https://blog.michal.pawlik.dev/posts/til/presentations-with-marp/ https://blog.michal.pawlik.dev/posts/caddy-reverse-proxy/ https://blog.michal.pawlik.dev/posts/blog-platform/ https://blog.michal.pawlik.dev/posts/vps-from-ashes/ https://blog.michal.pawlik.dev/posts/smarthome/smart-home-getting-started/ https://blog.michal.pawlik.dev/posts/til/publish-date-in-hugo/ https://blog.michal.pawlik.dev/posts/smarthome/zigbee-setup/ https://blog.michal.pawlik.dev/posts/wjug-0198/ https://blog.michal.pawlik.dev/posts/smarthome/expose-home-assistant/ https://blog.michal.pawlik.dev/posts/wsug-002/ https://blog.michal.pawlik.dev/posts/smarthome/home-assistant-addons/ https://blog.michal.pawlik.dev/posts/til/flashlight-using-typescript/ https://blog.michal.pawlik.dev/posts/scala/pass4s-basics/ https://blog.michal.pawlik.dev/posts/scala/pass4s-codecs/ https://blog.michal.pawlik.dev/posts/scala/pass4s-s3-proxy/ https://blog.michal.pawlik.dev/posts/scala/scala-toolkits/ https://blog.michal.pawlik.dev/posts/tech-bytes-5-krakow-recap/ https://blog.michal.pawlik.dev/posts/scala/scala-derivations/ </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>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.</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>TL;DR Today I learned how to mimic Scala-like value class in Typescript
Doing day to day scala I often use value classes to model the data like:
final case class UserId(value: String) extends AnyVal final case class City(value: String) extends AnyVal 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.</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>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 event page. If you&amp;rsquo;d like to join the next meeting, join us at Wroclaw Scala User Group at meetup.com.
This is my second post in #100DaysToOffload.
First talk - Scala CLI - what&amp;rsquo;s the new Scala runner capable of?</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>Today I&amp;rsquo;m joining the 100 Days To Offload challenge. Starting from today I aim to publish 100 blog posts by 12.12.2023.
The idea is described in more detail at the project page https://100daystooffload.com/. Quoting the page:
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.</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>In this article I want to share my experience from Global Day of Code Retreat 2022.
The initiative GDCR is an annual event organized on site and virtually all over the world. As the event page describes it:
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.</description>
    </item>
    
    <item>
      <title>Type safety with refined</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/refined/</link>
      <pubDate>Thu, 14 Jul 2022 00:00:00 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/scala/refined/</guid>
      <description>Goal In this article we&amp;rsquo;ll learn how to use the Scala type system for avoiding runtime errors. On our way we&amp;rsquo;ll learn some basics about scala-cli.
Bootstrap In this article we&amp;rsquo;ll rely on simple examples, thus instead of sbt we&amp;rsquo;ll use scala-cli, a lightweight command-line utility to work with Scala.
First we&amp;rsquo;ll need to install the utility. For that visit https://scala-cli.virtuslab.org/install and select the method of your preference.
Once that&amp;rsquo;s done you should have scala-cli command available.</description>
    </item>
    
    <item>
      <title>OAuth2 Scala application with sttp-oauth2</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/oauth2-app-p2/</link>
      <pubDate>Wed, 14 Jul 2021 00:00:00 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/scala/oauth2-app-p2/</guid>
      <description>Building simple Scala web application with OAuth2 Github login - part 2 In the first part we have prepared a simple web application using Scala with Tapir and Http4s. It can be found in this commit. In this part we&amp;rsquo;ll integrate our application with Github, providing OAuth2 login and some basic API integration.
Before we get started make sure to register a Github application. This article will guide you through the process: https://docs.</description>
    </item>
    
    <item>
      <title>OAuth2 Scala application with sttp-oauth2, part 1</title>
      <link>https://blog.michal.pawlik.dev/posts/scala/oauth2-app-p1/</link>
      <pubDate>Wed, 07 Jul 2021 00:00:00 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/scala/oauth2-app-p1/</guid>
      <description>Building simple Scala web application with OAuth2 Github login - part 1 Welcome to the first article in the series. In following posts we&amp;rsquo;re going to build a web application using Scala.
Goal In this series we&amp;rsquo;ll learn how to:
Start project from scratch Create web service Implement user login using OAuth2 authorization code grant Interact with other web services via HTTP calls, using JSON for data serialization Refactor the application to follow tagless final pattern Tech stack We&amp;rsquo;re going to build our application using functional programming techniques and Final Tagless encoding.</description>
    </item>
    
    <item>
      <title>Reboot</title>
      <link>https://blog.michal.pawlik.dev/posts/reboot/</link>
      <pubDate>Tue, 06 Jul 2021 00:00:00 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/reboot/</guid>
      <description>It&amp;rsquo;s been around 5 years since last post. A lot has changed since then, and it&amp;rsquo;s a good time for a reboot. From now on my posts will be written in english, potentially making them useful for a wider audience.
All of my old posts are still available via direct links, but are no longer listed as most of them are already quite outdated. The only exception is Hacker howto, as it&amp;rsquo;s an official translation for http://www.</description>
    </item>
    
    <item>
      <title>How to become a hacker? Oficjalne tłumaczenie</title>
      <link>https://blog.michal.pawlik.dev/posts/hacker-howto/</link>
      <pubDate>Thu, 07 Jan 2016 09:23:08 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/hacker-howto/</guid>
      <description>Niniejszy dokument jest tłumaczeniem oryginału dostępnego na http://www.catb.org/esr/faqs/hacker-howto.html w wersji 1.50. Autorem oryginału jest Eric S. Raymond. Motywacją, dla której chcę podzielić się tłumaczeniem jest ogromna wartość edukacyjna dokumentu. W mojej opinii stanowi on zbiór bardzo cennych oraz inspirujących rad dla początkujących i rozwijających się programistów. Przed rozpoczęciem lektury warto zapoznać się z definicją pojęcia &amp;lsquo;hacker&amp;rsquo;. Zapraszam do lektury.
Aktualizacja: Dokument został zaakceptowany jako oficjalne tłumaczenie na stronie oryginalnego tłumaczenia.</description>
    </item>
    
    <item>
      <title>Wykrywanie ruchu z OpenCV</title>
      <link>https://blog.michal.pawlik.dev/posts/wykrywanie-ruchu-z-opencv/</link>
      <pubDate>Wed, 01 Jul 2015 09:48:37 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/wykrywanie-ruchu-z-opencv/</guid>
      <description>OpenCV (Open Source Computer Vision) jest otwartą, wieloplaformową biblioteką służącą do analizy obrazu w czasie rzeczywistym. Napisana w języku C posiada jednak nakładki pozwalające na jej wykorzystanie między innymi w językach C++, C# czy Python. Jak zwykle, zapoznanie z tą biblioteką przeprowadzimy w ostatnim z wymienionych języków.
W tym artykule chcę przedstawić kilka podstawowych możliwości, jakie daje OpenCV i być może zachęcić czytelnika do poszerzenia wiedzy na temat tej biblioteki. Przedstawione niżej przykłady omówią pokrótce zagadnienia wykrywania ruchu oraz detekcji kształtów na obrazach.</description>
    </item>
    
    <item>
      <title>Reverse engineering webaplikacji WRM</title>
      <link>https://blog.michal.pawlik.dev/posts/reverse-engineering-webaplikacji-wrm/</link>
      <pubDate>Mon, 18 May 2015 11:50:34 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/reverse-engineering-webaplikacji-wrm/</guid>
      <description>Analiza kodu webaplikacji zdecydowanie różni się od reverse engineeringu jaki znamy z analizy aplikacji desktopowych czy mobilnych. W przypadku webaplikacji nie mamy kodu backendu, więc musimy kierować się przesłankami na jego temat, które wynikają z danych wynikowych. Jedyny kod do analizy jaki otrzymujemy to JavaScript załączony do strony.
Na wstępie tego wpisu chcę zaznaczyć, że analizą webaplikacji zajmuję się jedynie hobbystycznie, nie mam profesjonalnego przygotowania i traktuję ją jako element poszerzania mojej wiedzy w dziedzinie web developmentu.</description>
    </item>
    
    <item>
      <title>OverTheWire - Solucje Natas 18 i 19</title>
      <link>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-18-19/</link>
      <pubDate>Tue, 31 Mar 2015 06:38:16 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-18-19/</guid>
      <description>Wpis jest kontynuacją rozwiązań hackme Natas na OverTheWire. Rozwiązania etapu 17 można znaleźć tutaj. Etapy 18 i 19 związane będzą z pojęciem sesji, a zatem również ciasteczek. Przed przystąpieniem do rozwiązania upewnij się, że posiadasz rozszerzenie pozwalające na modyfikacje ciastek w swojej przeglądarce.
Poziom 18 Analiza Po zalogowaniu na poziom 18 spoglądamy na kod źródłowy. Poniżej został on pozbawiony mylących komentarzy.
&amp;lt;?$maxid = 640; // 640 should be enough for everyonefunction isValidAdminLogin(){if ($_REQUEST[&amp;quot;username&amp;quot;] == &amp;quot;admin&amp;quot;) {/* This method of authentication appears to be unsafe and has been disabled for now.</description>
    </item>
    
    <item>
      <title>OverTheWire - Solucja Natas 17</title>
      <link>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-17/</link>
      <pubDate>Sat, 28 Mar 2015 09:53:15 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-17/</guid>
      <description>Wpis jest kontynuacją rozwiązań hackme Natas na OverTheWire. Rozwiązania etapu 16 można znaleźć tutaj. Etap 17 to kolejne zadanie związane z atakami SQLi, jest on rozwinięciem zadania numer 15. Polecam zapoznanie się z jego rozwiązaniem, gdyż będziemy nawiązywać do metody przedstawionej w poświęconym mu wpisie.
Analiza Po zalogowaniu na poziom 17 spoglądamy na kod źródłowy:
/*CREATE TABLE `users` (`username` varchar(64) DEFAULT NULL,`password` varchar(64) DEFAULT NULL);*/if(array_key_exists(&amp;quot;username&amp;quot;, $_REQUEST)) {$link = mysql_connect(&#39;localhost&#39;, &#39;natas17&#39;, &#39;&amp;lt;censored&amp;gt;&#39;);mysql_select_db(&#39;natas17&#39;, $link);$query = &amp;quot;SELECT * from users where username=\&amp;quot;&amp;quot;.</description>
    </item>
    
    <item>
      <title>OverTheWire - Solucja Natas 16</title>
      <link>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-16/</link>
      <pubDate>Mon, 02 Mar 2015 16:27:25 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-16/</guid>
      <description>Wpis jest kontynuacją rozwiązań hackme Natas na OverTheWire. Rozwiązania etapu 15 można znaleźć tutaj. Etap 16 powiązany jest bezpośrednio z etapem numer 9, którego rozwiązanie możemy przypomnieć sobie w tym poście.
Analiza Po zalogowaniu na poziom 16 spoglądamy na kod źródłowy:
&amp;lt;?$key = &amp;quot;&amp;quot;;if (array_key_exists(&amp;quot;needle&amp;quot;, $_REQUEST)) {$key = $_REQUEST[&amp;quot;needle&amp;quot;];}if ($key != &amp;quot;&amp;quot;) {if (preg_match(&#39;/[;|&amp;amp;`\&#39;&amp;quot;]/&#39;, $key)) {print &amp;quot;Input contains an illegal character!&amp;quot;;} else {passthru(&amp;quot;grep -i \&amp;quot;$key\&amp;quot; dictionary.</description>
    </item>
    
    <item>
      <title>OverTheWire - Solucja Natas 15</title>
      <link>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-15/</link>
      <pubDate>Wed, 25 Feb 2015 10:23:35 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-15/</guid>
      <description>Wpis jest kontynuacją rozwiązań hackme Natas na OverTheWire. Rozwiązania etapu 14 można znaleźć tutaj.
Analiza Używając hasła uzyskanego na poprzednim poziomie 15 logujemy się na poziom 16. Otrzymujemy formularz, który pozwala sprawdzić czy w bazie znajduje się użytkownik o zadanym loginie. Jest to kolejne zadanie, w którym wykorzystamy podatność typu SQL Injection, jednak tym razem w nieco innej formie.
Kod źródłowy:
&amp;lt;?/*CREATE TABLE `users` (`username` varchar(64) DEFAULT NULL,`password` varchar(64) DEFAULT NULL);*/if (array_key_exists(&amp;quot;username&amp;quot;, $_REQUEST)) {$link = mysql_connect(&#39;localhost&#39;, &#39;natas15&#39;, &#39;&amp;lt;censored&amp;gt;&#39;);mysql_select_db(&#39;natas15&#39;, $link);$query = &amp;quot;SELECT * from users where username=\&amp;quot;&amp;quot; .</description>
    </item>
    
    <item>
      <title>OverTheWire - Solucja Natas 14</title>
      <link>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-14/</link>
      <pubDate>Wed, 25 Feb 2015 09:58:34 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-14/</guid>
      <description>Wpis jest kontynuacją rozwiązań hackme Natas na OverTheWire. Rozwiązania etapu 13 można znaleźć tutaj.
Analiza Pozyskanym na poprzednim poziomie hasłem logujemy się do poziomu 14. Tym razem dany jest formularz logowania. Mamy również wgląd w kod źródłowy:
&amp;lt;?if (array_key_exists(&amp;quot;username&amp;quot;, $_REQUEST)) {$link = mysql_connect(&#39;localhost&#39;, &#39;natas14&#39;, &#39;&amp;lt;censored&amp;gt;&#39;);mysql_select_db(&#39;natas14&#39;, $link);$query = &amp;quot;SELECT * from users where username=\&amp;quot;&amp;quot; . $_REQUEST[&amp;quot;username&amp;quot;] . &amp;quot;\&amp;quot; and password=\&amp;quot;&amp;quot; . $_REQUEST[&amp;quot;password&amp;quot;] . &amp;quot;\&amp;quot;&amp;quot;;if (array_key_exists(&amp;quot;debug&amp;quot;, $_GET)) {echo &amp;quot;Executing query: $query&amp;lt;br&amp;gt;&amp;quot;;}if (mysql_num_rows(mysql_query($query, $link)) &amp;gt; 0) {echo &amp;quot;Successful login!</description>
    </item>
    
    <item>
      <title>OverTheWire - Solucja Natas 13</title>
      <link>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-13/</link>
      <pubDate>Tue, 24 Feb 2015 12:28:33 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-13/</guid>
      <description>Wpis jest kontynuacją rozwiązań hackme Natas na OverTheWire. Rozwiązania etapu 12 można znaleźć tutaj.
Analiza Hasłem uzyskanym na poprzednim etapie logujemy się do kolejnego poziomu. Kod różni się nieznacznie względem tego w poprzednim przykładzie. Odwiedzając stronę informowani jesteśmy o wprowadzeniu weryfikacji, czy wysyłany plik jest obrazem. Kod źódłowy:
&amp;lt;?function genRandomString(){$length = 10;$characters = &amp;quot;0123456789abcdefghijklmnopqrstuvwxyz&amp;quot;;$string = &amp;quot;&amp;quot;;for ($p = 0; $p &amp;lt; $length; $p++) {$string .</description>
    </item>
    
    <item>
      <title>OverTheWire - Solucja Natas 12</title>
      <link>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-12/</link>
      <pubDate>Mon, 23 Feb 2015 14:54:03 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/overthewire-solucja-natas-12/</guid>
      <description>Wpis jest kontynuacją rozwiązań hackme Natas na OverTheWire. Rozwiązania etapu 11 można znaleźć tutaj.
Analiza Hasłem uzyskanym na poprzednim etapie logujemy się do kolejnego poziomu. Na tym poziomie mamy do czynienia z formularzem wstawiania plików na serwer. Spójrzmy na kod:
&amp;lt;?function genRandomString(){$length = 10;$characters = &amp;quot;0123456789abcdefghijklmnopqrstuvwxyz&amp;quot;;$string = &amp;quot;&amp;quot;;for ($p = 0; $p &amp;lt; $length; $p++) {$string .= $characters[mt_rand(0, strlen($characters) - 1)];}return $string;}function makeRandomPath($dir, $ext){do {$path = $dir .</description>
    </item>
    
    <item>
      <title>OverTheWire - Solucja Natas 11</title>
      <link>https://blog.michal.pawlik.dev/posts/overthewire-solucje-natas-11/</link>
      <pubDate>Mon, 23 Feb 2015 10:23:27 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/overthewire-solucje-natas-11/</guid>
      <description>Wpis jest kontynuacją rozwiązań hackme Natas na OverTheWire. Rozwiązania etapów 6-10 przedstawione zostały w tym wpisie. W związku ze wzrostem skomplikowania zadań, rozwiązania stają się coraz dłuższe, więc kolejne rozwiązania będą pojawiać się w odrębnych artykułach.
Analiza Hasłem uzyskanym na poprzednim etapie logujemy się do kolejnego poziomu. Tym razem otrzymujemy formularz, dzięki któremu możemy zmienić tło strony. Dostępny jest również kod źródłowy:
&amp;lt;?$defaultdata = array(&amp;quot;showpassword&amp;quot; =&amp;gt; &amp;quot;no&amp;quot;,&amp;quot;bgcolor&amp;quot; =&amp;gt; &amp;quot;#ffffff&amp;quot;);function xor_encrypt($in){$key = &#39;&amp;lt;censored&amp;gt;&#39;;$text = $in;$outText = &#39;&#39;;// Iterate through each characterfor ($i = 0; $i &amp;lt; strlen($text); $i++) {$outText .</description>
    </item>
    
    <item>
      <title>Własny plugin do Spotlight</title>
      <link>https://blog.michal.pawlik.dev/posts/wlasny-plugin-do-spotlight/</link>
      <pubDate>Thu, 19 Feb 2015 19:35:23 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/wlasny-plugin-do-spotlight/</guid>
      <description>Flashlight to nieoficjalne API dla Spotlight (błyskawicznej wyszukiwarki dla OSX), umożliwiające programowe przetwarzanie zapytań i dodawanie własnych wyników wyszukiwania. Bliższy opis modułu można znaleźć na GitHubie. W tym wpisie przybliżę temat tworzenia własnego pluginu dla Flashlight. Artykuł jest inspirowany instrukcją opublikowaną na wiki projektu.
Zasada działania Każdy plugin rejestruje wyrażenia, na które będzie reagował. W ramach artykułu stworzymy plugin pozwalający wysłać mail z ustawionego jako domyślny klienta pocztowego. Pełny kod pluginu dostępny jest również w moim repozytorium GitHub.</description>
    </item>
    
    <item>
      <title>OverTheWire - Solucje Natas 6-10</title>
      <link>https://blog.michal.pawlik.dev/posts/overthewire-solucje-natas-6-10/</link>
      <pubDate>Wed, 18 Feb 2015 11:10:25 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/overthewire-solucje-natas-6-10/</guid>
      <description>Wpis jest kontynuacją rozwiązań hackme Natas na OverTheWire. Rozwiązania etapów 0-5 przedstawione zostały w tym wpisie.
Rozwiązania Natas6 Kożystając z hasła uzyskanego na poziomie 5 logujemy się do natas6. W tym przykładzie udostępniono nam kod źródłowy skryptu. Jego zawartość:
&amp;lt;?include &amp;quot;includes/secret.inc&amp;quot;;if(array_key_exists(&amp;quot;submit&amp;quot;, $_POST)) {if($secret == $_POST[&#39;secret&#39;]) {print &amp;quot;Access granted. The password for natas7 is &amp;lt;censored&amp;gt;&amp;quot;;} else {print &amp;quot;Wrong secret&amp;quot;;}}?&amp;gt;Zauważamy, że zawartość zmiennej secret porównywana jest z zawartością $secret.</description>
    </item>
    
    <item>
      <title>OverTheWire - Solucje Natas 0-5</title>
      <link>https://blog.michal.pawlik.dev/posts/overthewire-solucje-natas-0-5/</link>
      <pubDate>Tue, 17 Feb 2015 21:04:45 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/overthewire-solucje-natas-0-5/</guid>
      <description>Wpis ten rozpoczyna serię artykułów opisujących rozwiązania kolejnych poziomów hackme Natas na OverTheWire. Zaleca się uprzednio rozwiązać zagadki zawarte w grze Bandit, których rozwiązanie opisałem już na blogu, jednak nie jest to obowiązkowe.
Wstęp Seria Natas składa się z zadań dotyczących atakowania webaplikacji. W przeciwieństwie do Bandit na każdym etapie logujemy się loginem natasNR_POZIOMU oraz uzyskanym na poprzednim poziomie hasłem.
Rozwiązania W ramach pierwszego artykułu rozwiążemy zadania 0-5, następne rozwiązania ukazywać będą się cyklicznie w kolejnych artykułach.</description>
    </item>
    
    <item>
      <title>OverTheWire - solucje &amp;quot;Bandit&amp;quot;</title>
      <link>https://blog.michal.pawlik.dev/posts/overthewire-solucje-bandit/</link>
      <pubDate>Mon, 09 Feb 2015 17:36:41 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/overthewire-solucje-bandit/</guid>
      <description>OverTheWire to projekt społecznościowy hostowany na GitHub. Stanowi on kolekcję gier typu hackme, dzięki którym możemy sprawdzić i poszerzyć swoją wiedzę z dziedziny o *nixach i zabezpieczeniach. Wyróżniającą cechą OverTheWire jest forma zadań, które rozwiązujemy na rzeczywistych systemach.
W dzisiejszym wpisie opiszę rozwiązania wszystkich etapów gry Bandit. Celem wpisu jest pomoc osobom, które utknęły w trakcie rozwiązywania zadań.
Rozwiązania Do rozwiązania zadań potrzebny będzie klient SSH. Jeśli pracujesz w systemach Linux/Unix do połączenia posłuży Ci komenda ssh w terminalu.</description>
    </item>
    
    <item>
      <title>Obrazek śledzący - skrypt w Pythonie</title>
      <link>https://blog.michal.pawlik.dev/posts/obrazek-sledzacy-skrypt-w-pythonie/</link>
      <pubDate>Sat, 24 Jan 2015 23:33:32 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/obrazek-sledzacy-skrypt-w-pythonie/</guid>
      <description>Nie jest tajemnicą, że nasze postępowanie w sieci jest rejestrowane. Zajmują się tym w różnych celach różne podmioty. Najczęstszym celem stosowania mechanizmów śledzenia są mechanizmy analityki. W tym artykule pochylimy się nad tematem z nieco bardziej prywatnej perspektywy. Technika, którą przybliżę nazywana jest metodą obrazka śledzącego.
Zasada działania W celu zrozumienia tej metody, należy przeanalizować proces przeglądania obrazów za pośrednictwem przeglądarki. Jest on bardzo prosty. Niezależnie, czy obraz jest elementem strony internetowej czy odwiedzamy go bezpośrednio - w każdym przypadku mamy do czynienia z pobraniem zasobu z serwera.</description>
    </item>
    
    <item>
      <title>CrunchBang Linux</title>
      <link>https://blog.michal.pawlik.dev/posts/crunchbang-linux/</link>
      <pubDate>Sun, 21 Dec 2014 09:44:47 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/crunchbang-linux/</guid>
      <description>Od pewnego czasu zamierzałem zmienić system na netbooku. Dotychczas z pewnych względów musiałem używać systemu Windows 8.1, jednak teraz mogę powrócić do Linuxa. W mojej opinii system ten jest wydajniejszy, lepiej spełnia moje oczekiwania.
Wybór dystrybucji Zmieniając system kierowałem się przede wszystkim oczekiwaniem niskiego zużycia zasobów i dużej wydajności. Rozważałem kilka możliwości wybierając dystrybucję. Pierwszym pomysłem było Xubuntu, jednak uznałem, że wiązałoby się to w moim przypadku ze zmianą sporej części standardowo instalowanego oprogramowania.</description>
    </item>
    
    <item>
      <title>Podstawy jQuery #5</title>
      <link>https://blog.michal.pawlik.dev/posts/podstawy-jquery-5/</link>
      <pubDate>Wed, 17 Dec 2014 11:14:32 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/podstawy-jquery-5/</guid>
      <description>Po dłuższej przerwie powracamy do serii Podstawy jQuery. Dzisiejszy artykuł poświęcimy praktycznemu zastosowaniu poznanej wiedzy.
Założenia projektu Celem projektu będzie stworzenie skryptu, który pozwoli na utworzenie kolejki wczytywania obrazów na stronie. W internecie możemy znaleźć wiele rozmaitych stron zawierających jedynie memy czy inne obrazy. Częstym problemem takich stron jest powolne buforowanie obrazów, szczególnie gifów. Przedstawione tu rozwiązanie nie eliminuje problemu, jednak uzyskany efekt pozwoli poświęcić całe łącze użytkownika na wczytywanie każdego kolejnego obrazu, pozwalając na zachowanie płynności przeglądania.</description>
    </item>
    
    <item>
      <title>Podstawy jQuery #4</title>
      <link>https://blog.michal.pawlik.dev/posts/podstawy-jquery-4/</link>
      <pubDate>Sat, 20 Sep 2014 20:37:30 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/podstawy-jquery-4/</guid>
      <description>W kolejnej, czwartej już części serii dokończymy temat technologii AJAX. Na wstępie zaznaczam, że seria Podstawy jQuery nie pokryje całego spektrum możliwości, jakie niesie za sobą ta technologia, a jedynie wprowadza do tematu. Dzisiejszy (krótszy niż zwykle) artykuł zapozna nas z dwiema pozostałymi metodami.
getScript() Pierwszą z metod jest getScript(). Tworząc witryny, szczególnie takie, które wymagać będą zastosowania zewnętrznych mechanizmów JavaScript, pewne możliwości będą udostępniane użytkownikowi tylko pod pewnymi warunkami. Czasami źródło skryptu będzie różne w zależności od wyboru użytkownika bądź cech jego przeglądarki.</description>
    </item>
    
    <item>
      <title>Podstawy jQuery #3</title>
      <link>https://blog.michal.pawlik.dev/posts/podstawy-jquery-3/</link>
      <pubDate>Tue, 16 Sep 2014 17:12:10 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/podstawy-jquery-3/</guid>
      <description>W trzecim artykule z serii Podstaw jQuery zakończymy temat zdarzeń przeglądarki i przystąpimy do obsługi technologi AJAX.
Dynaimczna zawartość dokumentu Biblioteka jQuery pozwala nam, jak wspomniano w poprzednich częściach, modyfikować zawartość strony. Wspomniane w drugiej części serii metody obsługi zdarzeń mają pewną wadę związaną z dynamiczną zawartością. Polega ona na tym, że zdarzenie obsługiwane jest jedynie na obiektach obecnych w dokumencie w chwili wykonania metody. Kiedy rozważamy podstawowe zapotrzebowanie na obsługę zdarzeń nie stanowi to być może problemu.</description>
    </item>
    
    <item>
      <title>Nowy design portfolio oraz bloga</title>
      <link>https://blog.michal.pawlik.dev/posts/nowy-design-portfolio-oraz-bloga/</link>
      <pubDate>Mon, 15 Sep 2014 20:36:15 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/nowy-design-portfolio-oraz-bloga/</guid>
      <description>Ostatnia nieaktywność spowodowana była kilkoma czynnikami. Jednym z jej powodów było wprowadzenie nowej szaty graficznej. Nowy dobór barw, projekt strony głównej, a przede wszystkim logo zawdzięczam Norbertowi Kowalczykowi. Składam serdeczne podziękowania i zapraszam do zapoznania z Jego portfolio.
Już wkrótce trzecia odsłona podstaw jQuery. W planach również wstęp do tworzenia prostych web-aplikacji oraz tworzenie domowego serwera opartego o Debian Linux.
Zapraszam</description>
    </item>
    
    <item>
      <title>Podstawy jQuery #2</title>
      <link>https://blog.michal.pawlik.dev/posts/podstawy-jquery-2/</link>
      <pubDate>Fri, 22 Aug 2014 21:26:04 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/podstawy-jquery-2/</guid>
      <description>W drugim artykule z serii Podstaw jQuery dokładniej zapoznamy się z obsługą zdarzeń przeglądarki oraz możliwościami jQuery w zakresie modyfikacji treści strony internetowej. W trakcie pracy bazować będziemy na poprzednim artykule serii.
Zdarzenia przeglądarki Zdarzenia (events) to mechanizm JavaScript pozwalający na wykonanie określonego przez programistę kodu w chwili, kiedy wystąpi określone zdarzenie. Zdarzeniem takim może być kliknięcie w określony element strony, naciśnięcie klawisza czy zakończenie zapytania AJAX (co omówimy w dalszej części serii).</description>
    </item>
    
    <item>
      <title>Podstawy jQuery #1</title>
      <link>https://blog.michal.pawlik.dev/posts/podstawy-jquery/</link>
      <pubDate>Thu, 21 Aug 2014 17:34:48 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/podstawy-jquery/</guid>
      <description>Jest to pierwszy z planowanego cyklu artykułów na temat biblioteki jQuery. Celem cyklu jest przybliżenie możliwości biblioteki, przedstawienie jej użycia w sposób prosty i przystępny nawet dla osób niedoświadczonych w programowaniu. Przystępując do lektury tego kursu czytelnik powinien jednak mieć podstawową wiedzę w zakresie HTML i CSS. Zaczynamy!
Biblioteka jQuery to jeden z najlepszych projektów ułatwiających pracę w Java Script. Od swojego powstania w 2006r. do dziś projekt zaskarbił sobie sympatię twórców Front-endów i firm tworzących webaplikacje.</description>
    </item>
    
    <item>
      <title>System statystyk Piwik</title>
      <link>https://blog.michal.pawlik.dev/posts/system-statystyk-piwik/</link>
      <pubDate>Wed, 20 Aug 2014 17:19:21 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/system-statystyk-piwik/</guid>
      <description>Piwik to otwartoźódłowy system służący do analizy ruchu na witrynach www. Został napisany w języku PHP, opiera się o bazę danych MySQL. Jest bardzo dobrą alternatywą dla google analytics, ponieważ wszystkie dane i statystyki pozostają na naszym serwerze. Modułowa budowa systemu i pełne spolszczenie sprawiają, że korzystanie z systemu jest bardzo proste i intuicyjne. Więcej zalet Piwik&amp;rsquo;a można poznać w tym wpisie. W tym artykule opiszę proces instalacji z paczki debiana.</description>
    </item>
    
    <item>
      <title>Podstawowe mnemotechniki</title>
      <link>https://blog.michal.pawlik.dev/posts/podstawowe-mnemotechniki/</link>
      <pubDate>Wed, 20 Aug 2014 12:14:48 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/podstawowe-mnemotechniki/</guid>
      <description>Wielokrotnie zdarza się, że potrzebujemy zapamiętać listę przedmiotów czy czynności. W takiej sytuacji przydaje się notatnik czy aplikacja na smartfon jak Evernote. W tym artykule chcę jednak poruszyć inną metodę, która nie wymaga żadnego narzędzia. Miałem ostatnio okazję zapoznać się z dość starą już książką Tonego Buzana - Pamięć na zawołanie. Właśnie ta publikacja nauczyła mnie metody haków pamięciowych.
Haki pamięciowe to rodzaj zakładek, pomagających zapamiętać listę numerowaną od 1 do 10.</description>
    </item>
    
    <item>
      <title>Jailbreak Kindle keyboard</title>
      <link>https://blog.michal.pawlik.dev/posts/jailbreak-kindle-keyboard/</link>
      <pubDate>Tue, 19 Aug 2014 22:55:30 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/jailbreak-kindle-keyboard/</guid>
      <description>Jestem szczęśliwym posiadaczem Kindle 3. Ostatnio jednak zechciałem zmienić wygląd ekranu blokady. Okazuje się, że Amazon nie przewiduje standardowo takiej możliwości. Dzięki użytkownikom forum MobileRead jest to jednak możliwe. Wgranie modyfikacji umożliwiającej tę zmianę wymaga uprzedniego przeprowadzenia Jailbreaku. Jest to na szczęście legalne, Amazon udostępnił oprogramowanie Kindle jako OpenSource. Zmianę obrazów ekranu blokady umożliwia modyfikacja udostępniona przez Yifan Lu, udostępniona wraz z plikami jailbreaka w tym wątku. Sam proces jest bardzo prosty i szczegółowo opisany tutaj.</description>
    </item>
    
    <item>
      <title>Blog ruszył</title>
      <link>https://blog.michal.pawlik.dev/posts/pocztek-bloga/</link>
      <pubDate>Tue, 19 Aug 2014 17:52:45 +0000</pubDate>
      
      <guid>https://blog.michal.pawlik.dev/posts/pocztek-bloga/</guid>
      <description>Z dniem dzisiejszym rusza blog, mam nadzieję że przyda się on nie tylko mnie :) Celem bloga jest udokumentowanie i przedstawienie niektórych efektów mojej pracy. Planowana tematyka bloga to IT: programowanie, Linux i technologie webowe.</description>
    </item>
    
  </channel>
</rss>
