RSSAmplifier

Blog

Piotr Wittchen

Recent content on Piotr Wittchen

wittchen.ioRSS feed ↗164 posts

Latest posts

Six weeks of agentic coding in Rust: AICTL

For the last month and a half I’ve been working on a new project called AICTL . It’s a native AI agent for the terminal and macOS desktop, written in Rust. Source code is available on GitHub . It started mostly out of curiosity. I wanted to see how far I can push agentic software engineering on a real greenfield project - not a toy example or a weekend script, but a complete piece of…

Experience

Below, you can see brief overview of my software development work experience and formal education. In all companies I worked as a software engineer , a senior software engineer or a software architect . For more details, please visit my linkedin profile . Work Years Company Tech stack 2025-now VCU (self-employed) Java, Kotlin, Rust 2026-now AI Forecast Kotlin 2025-2026 Beyond Identity Kotlin, Rust…

About

Hello! I’m Piotr Wittchen , and I’m glad you took the time to visit my personal website. I’m a Software Engineer from Poland with over a decade of professional experience in backend, data streaming, web, and mobile software development. I have given talks at tech conferences and meetups, and I share my knowledge on Stack Overflow . From time to time, I contribute to open-source…

Projects

Personal https://github.com/pwittchen/aictl (project website: https://aictl.app ) | Rust https://github.com/pwittchen/varun.surf (online: https://varun.surf ) | Java, Spring Boot, JS, Docker, Nginx https://github.com/pwittchen/ReactiveNetwork | Java, Android | ★ 2.5k+ https://github.com/pwittchen/NetworkEvents | Java, Android | ★ 450+ https://github.com/pwittchen/ReactiveWiFi | Java, Android | ★…

Setup

Here’s the list of equipment and software I use personally and professionally: Software OS: macOS shell: zsh + oh my zsh + p10k terminal: iTerm2 text editor: Vim non-terminal text editor: Zed + iA Writer IDE: JetBrains IDEs + Xcode (just for Apple stuff) VCS: Git web browser: Brave file manager: mc + Apple Finder music and podcasts: Spotify videos: VLC notes, spreadsheets, presentations and…

Talks

If you would like to invite me for the conference or a meetup to give a talk, feel free to contact me! 2021-12-29 Git - mini-szkolenie PL , Digital Fingerprints, internal training (Katowice, Poland / online) 2019-01-10 Brain-Computer Interfaces - Science Fiction or Reality? , Toast Meetup (Wrocław, Poland) 2018-11-19 Brain-Computer Interfaces - Science Fiction or Reality? , Øredev (Malmö, Sweden)…

Dynamic wallpaper for i3

Some time ago, I was using macOS. The thing I liked about this OS since Mojave version was the dynamic wallpaper feature. Wallpaper representing picture of the Mojave desert in California was dynamically changing during the day. In the morning, we could see the dawn and sunrise, later picture during the midday, in the evening, desert during the dusk and finally picture at night. I liked the fact…

Spotify song in i3 status bar

While customizing my i3 status bar, I wanted to have currently played Spotify song in it. Some time ago, I created an open source script in Python called spotify-cli-linux and I wanted to use it. When we want to put something custom into the i3 status bar, the easiest way to do it, is to save data into the file and then read the file. I created the following config inside ~/.config/i3status/config…

I switched to i3 WM

Introduction From a long time I wanted to try lightweight WM (Window Manager) for Linux. I installed i3 once a few years ago, but I had no idea how to use it, so I just closed this thing and got back to Gnome. Recently, I watched several videos and tutorials about Linux and i3 on youtube, which helped me to learn this WM, how it works and how to use it. I also read some part of docs and…

GitHub Actions in action!

Recently GitHub introduced really interesting feature to their service called Actions . Actions can be used for automating various tasks related to the repositories like CI, CD, testing, deployment and whatnot. The general concept is as follows: We can create so called action, which can be based on a JavaScript project or a Docker container. We can also use existing actions in the Marketplace .…

Fixing font rendering on Firefox and Arch Linux

After the recent Firefox update (70.0.1 64-bit), I’ve got a problem with font rendering on Arch Linux. I’ve installed this update probably on 31.10.2019 or 01.11.2019 (I’m not exactly sure right now). On several pages (e.g. Facebook or Github) fonts weren’t rendered correctly. It looked like fonts without anti-aliasing what was quite ugly. I figured out that I can go to the…

Fixing Gnome Boot problem

I recently had an issue with Gnome on Arch Linux during the system boot. After turning my computer on, I saw gray screen with message like: Oh no! Something has gone wrong. A problem has occurred and the system can't recover... and I couldn’t log in or do anything and started searching solutions for this problem via my phone. First, I switched to terminal mode with Alt+F2 (you can switch…

Cleaning root partition on Linux

Size of the root partition / on my system is 25 GB. I recently had a situation where I received notification from the system that there’s too little free space on that partition, which was around 1 GB. My first attempt was to clean pacman cache with sudo pacman -Sc . It helped for a moment, but I kept receiving this notification. I searched for the solutions regarding extending the root…

Formatting USB disk on Linux

Sometimes we may want to format external USB drive. I recently encountered a situation, where I had bootable USB drive with operating system ready to install, but I wanted to remove all this stuff and use disk for storing data. I couldn’t format this disk with GUI tools for some reason and I kept getting errors or information that it’s not possible. In case you don’t know, on…

Modifying mehtod's input parameters

During maintenance of the legacy projects, I sometimes see constructions like: void appendFooter ( Report report ); or void populate ( Data data ); I even saw something like this: void populate ( Source source , Target target ); What is wrong with these statements? They’re using so called output argument . In the examples above, we’re passing a report or data variable, which usually…

Get rid of the list null-checks

During development of the legacy Java applications, we still have to deal with null . It’s possible to avoid it completly when we’re designing application from the scratch, applying proper code constructions, static code analysis and we’re consistent during code reviews. Nevertheless in majority of the cases we will encounter null in daily projects. We may even expect them in the…

Arch Linux - installation notes no. 2 (GUI and utils)

Introduction In my previous article I roughly described Arch Linux installation process. After going through whole process, we will end up with clean terminal without any graphical environment etc. In most cases, we will need it on the desktop. Desktop Environment (DE) / Windows Manager (WM) There are two main types of the Linux graphical environments for desktop: Window Managers Desktop…

Arch Linux - installation notes

Introduction For a long time, I was considering switching from Ubuntu do Arch Linux distribution, but I didn’t have enough knowledge, time and energy to do this. I definitely knew it requires some specific knowledge and manual steps to perform. I also didn’t wat to spend too much time on reading the documentation. Moreover, I know that sometimes I could have specific issues related to…

Zen of the Java library release process

In my previous article I published information about publishing JAR/AAR library to the Maven Central Repository. A few steps of that process were automated, but a few of them were still manual. I mean closing and release process which had to be done by manual clicking on the Sonatype website. Fortunately, it’s possible to automate it. In order to do that, I used gradle-nexus-staging-plugin…

Publishing a JAR/AAR to the Maven Central

Introduction As a Java/JVM/Android developers we rely on the work of other people through frameworks and libraries. Many of them are open-source. Most of the developers are consumers of such projects. What if we would like to create our own library and distribute it to other developers? We can always create it and share a *.jar or *.aar file with others. Drawback of such solution is the fact that…

Kyma meets CCV2 hackathon summary

Introduction I recently I had an opportunity to join “Kyma meets CCV2 Hackathon” in the SAP Labs Poland office in Gliwice. The goal of the hackathon was to create a simple project, which will use Kyma to integrate external services with the SAP Hybris Commerce Platform . CCV2 stands for “Commerce Cloud Version 2”, which are basically SAP Hybris Commerce solutions deployed…

Brain-Computer Interfaces - Science Fiction or Reality?

Recently, I had an opportunity to speak at the software development conference abroad for the first time. I visited Malmö in Sweden and gave a talk during the Øredev 2018 conference. The main theme of the conference was Deus Ex Machina, so I decided to adapt to this topic and prepared presentation about Brain-Computer Interfaces, which is my interest since the end of my studies at the Silesian…

Creating a fat AAR

I recently wrote a new library called NeuroSky Android SDK . It’s used for writing Android apps using signals of the brain waves received from the NeuroSky MindWave Mobile headsets. Probably I’ll write a separate article about it because it’s quite interesting topic. This library uses ThinkGear library, which is distributed by the NeuroSky as a *.jar file, so I couldn’t use…

Separate execution of unit and integration tests in Gradle

During development process, we often write unit and integration tests. While unit tests verify corectness of the small pieces of code, integration tests verify software as a whole project and sometimes can treat it as a black box where concrete results are expected. During development of the REST API, we can write integration tests for such API with REST Assured . Integration tests are usually…

Excluding generated code from JaCoCo report

I recently wrote a simple java app with Dagger 2 as a DI container and Gradle as a build system. I wanted to generate unit test coverage report for this app, so I used Jacoco. In my build.gradle file I configured JaCoCo as follows: plugins { id 'jacoco' } jacocoTestReport { reports { xml . enabled = true html . enabled = true } } Now, I could type: ./gradlew test jacocoTestReport Report was…

Testing exceptions

In Java, we can test exceptions via unit tests in a few different ways. In this article, I’ll present common methods of doing that. Nevertheless, I suppose we there are different methods as well. First method is basically wrapping a method call with try-catch block, assigning an exception to a variable and performing appropriate assertion. In these examples, I’m using JUnit for unit…

Writing my first library in Kotlin

Introduction Recently, I decided to create a tiny Android library called RxBattery , which is monitoring battery state of the device with RxJava and RxKotlin. I created a few Java and Android libraries already and this time I decided to use Kotlin programming language instead of Java to learn something new and write something more complicated than “Hello World” app. Here are my…

Solving problems with AVD and KVM on Linux

I installed Android SDK and Android Studio on my new ThinkPad T470s with Ubuntu Linux 18.04.1 LTS. As usual, I wanted to create a new Android phone emulator called AVD (Android Virtual Device). I was able to create a new device, but unfortunately I encoutered problems. After opening AVD window, I saw the error message… /dev/kvm is not found KVM (Kernel-based Virtual Machine) is a full…

Poor Man's Dropbox

Dropbox abandons Linux users Recently, I’ve started receiving a notification from Dropbox desktop app on Linux that they’ll stop syncing my files in November. I couldn’t understand why. I’m using this service for some time and I find it really useful. Moreover, I want to backup several important files on the web server in case of my disk crashes or I’ll need to access…

Different ways of squashing commits

While creating a Pull Requests it’s good to squash all of our intermediate commits into one to avoid clutter in the git log, simplify analysis and allow for simple code revert when necessary. Solution #1 Some time ago I’ve found project http://rebaseandsqua.sh/ made by Jake Wharton. It’s really useful, handy and allows us to rebase and squash commits quite easily. We can just…

Releasing ReactiveNetwork v. 1.0.0 (paying the technical debt)

Today, I’ve released next version of my most popular open-source project - ReactiveNetwork . I’ve released version 0.12.4 for RxJava1.x and version 1.0.0 for RxJava2.x. Please note, RxJava1.x is no longer officially supported and I’m going to follow the same approach in my RxJava-based projects. It’s not the first release of this project, but I’m breaking the API and…

Debugging Google Pixel 2

I recently destroyed my good old Nexus 6 phone. It’s still working, but display screen is broken. Due to this fact, I’ve had an excuse to buy new Pixel 2 phone. It’s pretty expansive, but its quality is really good. As usual, I wanted to debug an app on this device and encountered problem related to device permissions. Once I connected the phone, to my laptop and typed adb…

Publishing Python package to PyPi

Introduction I have my own tiny Python project called spotify-cli-linux , which is (surprise!) command line interface for Spotify desktop app on Linux. Python is not my primary programming language and I work more with Java. Nevertheless, I find this language enjoyable and useful in many cases, so I try to learn something new about it from time to time. In the beginning, I’ve provided…

Avoiding merging master to master branch in Git

Problem If you are working with Git Version Control System, probably you have seen a commit messages in your git log like: Merge branch 'master' to 'master' or something similar. You might have even pushed such commits! Don’t worry, so did I ;-). In this article I’m going to explain why is it happenning and how to avoid it. Such situation happens when you performed changes locally and…

Deployment of the Java code to AWS Lambda

Introduction In the cloud computing era, companies start using services like Google Cloud Platform, Amazon Web Services or Microsoft Azure. We can hear about the term “Serverless”. It doesn’t mean that we don’t have any servers. It means that third-party services provide us server infsrastrucutre, monitoring and scaling capabilities, so we don’t have to care about…

Introducing ReactiveBus

Today, I’ve released my another tiny project. It’s a very simple implementation of Event Bus with RxJava 2 under the hood. This library is compatible with Java 1.7 or higher. I didn’t use Java 1.8 or 1.9 because I wanted to make it compatible with Android apps. You can use it as follows: Bus bus = ReactiveBus . create (); Disposable observer = bus . receive (). subscribe ( new…

New blog, new system, new domain

I’ve just finished migrating my personal website and blog from Wordpress to Hexo . I’ve been using Wordpress for more than 5 years and decided to check out something new. Hexo amazed me with its simplicity and ease of use. Probably this tool is more recognized around JavaScript developers, because it’s written in that language. I discovered it in the last month. Features of Hexo…

Automating generation of the on-line documentation for Java library

Introduction In one of my open-source projects - ReactiveNetwork I have a documentation in README.md file and I have JavaDocs as well. This project is an Android library written in Java and built with Gradle. Moreover, I develop this project on two separate Git branches - one for RxJava1.x and another one for RxJava2.x. Similar convention is in the RxJava repository, so I followed it. After each…

Quality Meetup no. 15 - Fixing a billion dollar mistake

On the 8th of February 2018, during Quality Meetup #15 , I gave a presentation titled “Fixing a billion dollar mistake”. Tony Hoare introduced Null Reference w in ALGOL language in 1965. He calls this decision a “billion dollar mistake”. It was so easy to implement and probably it caused a loss of millions of dollars due to the mistakes done in the software over the 40…

Air quality monitoring script for Argos (Linux) and BitBar (macOS)

From some time, I wanted to create my own app, which will display some data in top panel in macOS or Gnome environment on Linux. I collected some resources about that and I knew that for macOS I need to write an app in Obj-C and for Gnome I need to write a plugin in JavaScript. In both cases it requires some ceremony and preparation. Recently I’ve found a great app for macOS called BitBar…

Creating a Docker container with Alpine Linux including Java 8 and 9

Recently, I’ve decided to refresh my knowledge regarding Docker and created an image with Alpine Linux and Java 9, which can be a useful base for the future projects. I used Alpine as a base image because it became quite popular in the Docker world due to its simplicity and the fact that it’s pretty lightweight when we compare it to containers based on other Linux distributions. Pure…

DroidCon Poland 2017 - Is your app really connected?

Yesterday, I gave a presentation about connectivity in the Android apps during the DroidCon Poland 2017 Conference in Kraków. Below, you can see slides from this presentation. View slides on SpeakerDeck There’s also tweet related to this presentation from DroidCon Kraków : Piotr Wittchen tells us about how we can we keep the track of network 🌎 or Internet connectivity changes in our app…

Simple reactive HTTP client and server with RxJava, Vert.x and Android

During Hack Your Career event at the Silesian University of Technology, I’ve prepared a presentation titled Reactive Programming - Efficient Server Applications with a colleague from work. Arek told about theory of Reactive Programming, shown basic concepts, data types and a few examples in the code. During my part of the presentation, I’ve wrote a very simple server and client in Java…

5 ways to attend expensive IT conferences for (almost) free

Introduction In the past months, I’ve attended a few conferences and meetups related to IT. I also plan to attend a few more in the last quarter of the year as a speaker. I’d like to show you a few tips, which can encourage you to attend such events, be more involved in them and spend some time away from your desk ;-). If you are working in a software company, in the most cases you…

Meet and Code 2017 - "Git – tips & tricks" presentation

Recently, during Meet & Code event organized by Media 3.0 and SAP Hybris , I’ve gave a talk for university and high-school students about basics of Git. Presentation was titled Git - tips & tricks and was organized at the Silesian Univeristy of Technology in the AEI Department where I was studying a few years ago. Presentation covered quite essential usage of Git, which could be helpful for…

JDD 2017 - Get ready for java.util.concurrent.Flow! - summary

Recently on the JDD 2017 conference, I gave a presentation regarding introduction to Reactive Streams standard in Java 9. I also talked about existing implementations of this standard with the strongest focus on RxJava2 and created simple Reactive Streams implementation in pure Java 9 during the presentation. Below, you can find slides from this talk. View presentation on SpeakerDeck Code snippets…

Integrating ErrorProne and NullAway with an Android project

Recently, with the remote help of guys from Uber in California , I integrated NullAway and ErrorProne with the one of my open-source Android projects . What is NullAway? Basically, it’s a tool to help eliminate NullPointerExceptions (NPEs) in your Java code . It detects situations where NPE could occur at the compile time. Let’s have a look at the following code: static void log (…

Building and running SAP Hybris Commerce Platform via Gradle

Introduction I really like Gradle build system for JVM apps. It has flexibility like Ant and great dependency management capabilities like Maven . It addition, it doesn’t use XML notation, but Groovy programming language, so builds configurations are simple, concise, easier to read and easier to create. In my opinion, Gradle is truly modern build system for JVM apps. Nevertheless, there are…

Introducing ReactiveAirplaneMode

I’m continuing Rxfication of the Android. Recently I released brand new library called ReactiveAirplaneMode . As you may guess, it allows listening Airplane mode on Android device with RxJava observables. A usual I’ve hidden all implementation details, BroadcastReceivers and rest of the Android related stuff behind RxJava abstraction layer, so API is really simple. Just take a look on…

Using Tmux plugins with Tpm

Recently, I decided to organize my Unix dotfiles in a better way. I had a few custom scripts I used in my Tmux bottom bar. I kept these scripts in .scripts directory and during installation or upgrade of my personal configuration, install.sh script was copying them from .scripts directory to /usr/local/bin/ directory. I wanted to make this configuration more solid and consistent, so I decided to…