<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CHANGES.md</title><link>https://www.changes.md/</link><description>Recent content on CHANGES.md</description><generator>Hugo</generator><language>en</language><lastBuildDate>Tue, 15 Sep 2026 00:00:00 +0200</lastBuildDate><atom:link href="https://www.changes.md/index.xml" rel="self" type="application/rss+xml"/><item><title>Reactor 04: New Shift</title><link>https://www.changes.md/post/reactor-04-new-shift/</link><pubDate>Tue, 15 Sep 2026 00:00:00 +0200</pubDate><guid>https://www.changes.md/post/reactor-04-new-shift/</guid><description>I could put the electronics back in the cellar, or finally build something. They became a reactor game. Here is my introduction—and the machine’s increasingly puzzled account.</description></item><item><title>3D-printed portal gun replica</title><link>https://www.changes.md/post/portal/</link><pubDate>Sun, 28 Apr 2024 17:52:14 +0200</pubDate><guid>https://www.changes.md/post/portal/</guid><description>&lt;img src="https://www.changes.md/static/portal-gun.excalidraw-dark.png" alt="Hand-drawn Portal gun replica with orange accents."&gt;&lt;p&gt;Just finished my first large 3D-printing project.
For sure I couldn&amp;rsquo;t pass by when I saw &lt;a href="https://www.printables.com/model/217-portal-gun"&gt;this amazing portal gun replica&lt;/a&gt; from &lt;a href="https://www.printables.com/@KirbyDowney_65"&gt;@KirbyDowney_65&lt;/a&gt; on Printables.
Here I&amp;rsquo;d simply like to share some highlights and happy moments I had while doing it.&lt;/p&gt;
&lt;p&gt;I started by printing claws and assembling them, as they seemed the most fragile and tricky to assemble, but
not so time-consuming when printing.&lt;/p&gt;
&lt;img src="https://www.changes.md/static/claws-print.jpg" alt="resource"&gt;&lt;p&gt;A few more printing sessions and the remaining black parts were also done:&lt;/p&gt;</description></item><item><title>Databend on AWS/EKS</title><link>https://www.changes.md/post/databend/</link><pubDate>Sun, 04 Feb 2024 20:51:50 +0100</pubDate><guid>https://www.changes.md/post/databend/</guid><description>&lt;img src="https://www.changes.md/static/databend-dark.png" alt="Databend on AWS: EKS nodes, VPC peering, S3 storage, and SQL clients."&gt;&lt;p&gt;Over the Christmas silent period, I got my hands on &lt;a href="https://github.com/datafuselabs/databend"&gt;Databend&lt;/a&gt;, a data warehousing solution intended to provide an easily scalable, cloud-first, SQL-based data engine. The keywords bingo speaks for itself: it&amp;rsquo;s written in Rust, friendly with containers/Kubernetes (k8s), elastically scalable, and uses Raft as a consensus algorithm instead of Paxos. In short, it fits all the last five years&amp;rsquo; fashion trends in data warehousing. What specifically appealed to me was the ability to use cloud object storage as a storage backend and the isolation between compute and storage. Benchmarks comparing its performance with alternative open-source solutions &lt;a href="https://benchmark.clickhouse.com/"&gt;ClickBench&lt;/a&gt; and &lt;a href="https://medium.com/@databend/tpc-h-benchmark-databend-cloud-vs-snowflake-aa97971c32a0"&gt;with cloud alternatives&lt;/a&gt; show some interesting results.&lt;/p&gt;</description></item><item><title>Flipper Zero for testing old dusty electronic components</title><link>https://www.changes.md/post/flipper-zero/</link><pubDate>Tue, 18 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.changes.md/post/flipper-zero/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/m2_ccCqGI8Q?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;h2 id="dimmable-led"&gt;Dimmable LED&lt;/h2&gt;
&lt;p&gt;On high frequencies (&amp;gt; 50 Hz), blinking of a LED becomes undistinguishable from a bright light.
By using pulse width, the &amp;ldquo;brightness&amp;rdquo;, or it&amp;rsquo;s perception can be controlled.&lt;/p&gt;
&lt;h2 id="servo"&gt;Servo&lt;/h2&gt;
&lt;p&gt;When I first encountered this device &lt;a href="https://en.wikipedia.org/wiki/Servo_%28radio_control%29"&gt;servo&lt;/a&gt;, I got really confused,
as the way it actually moves towards a certain angle is rather cumbersome. For this specific servo (the one I got with my ARDX)
the following settings allowed me to control 180 degrees of angle with a step of 9 degrees:&lt;/p&gt;</description></item><item><title>ClojureD 2020</title><link>https://www.changes.md/post/2020-02-02-clojured/</link><pubDate>Mon, 02 Mar 2020 21:10:17 +0100</pubDate><guid>https://www.changes.md/post/2020-02-02-clojured/</guid><description>&lt;p&gt;Last saturday I visited my second ClojureD conference in Berlin.
It&amp;rsquo;s an amazing experience meeting people who indirectly influenced my choice of programming language for the past several years
(kudos to Alexander and Nikita).&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also very pleasant to see how many new things popped up recently in Clojure community.&lt;/p&gt;
&lt;p&gt;Here are few highlights I wanted to share:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.changes.md/static/babashka-dark.png" alt="Handwritten ClojureD 2020 notes on Babashka, its startup speed, scripting tools, and uses."&gt;
&lt;em&gt;Babashka by &lt;a href="https://twitter.com/borkdude"&gt;@borkdude&lt;/a&gt; (&lt;a href="https://github.com/borkdude/babashka"&gt;github&lt;/a&gt;)
Really appreciate how much effort Michael puts into the modern tooling for Clojure!&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Querying the databases from REPL</title><link>https://www.changes.md/post/2019-12-14-jdbc-next/</link><pubDate>Sat, 14 Dec 2019 13:56:14 +0100</pubDate><guid>https://www.changes.md/post/2019-12-14-jdbc-next/</guid><description>&lt;p&gt;For already quite some time I prefer using Clojure REPL instead of any other tools for querying the databases.
At work we have variety of the storage solutions available (Postgres, Aurora, Presto, Hive), and having
a single consistent SQL read-only API to them is crucial for productivity.
Additional benefit compared to the graphical tools available in the market is the ability of programmatic
post-processing of the data using higher-level language. Being very data-oriented, Clojure comes really handy.&lt;/p&gt;</description></item><item><title>Mastering the Tooling around Clojure Data Analysis</title><link>https://www.changes.md/post/2019-12-08-mastering-data/</link><pubDate>Sun, 08 Dec 2019 23:13:46 +0100</pubDate><guid>https://www.changes.md/post/2019-12-08-mastering-data/</guid><description>&lt;p&gt;My December present to myself was a series of books. One of them was called &amp;ldquo;&lt;a href="https://www.oreilly.com/library/view/mastering-clojure-data/9781783284139/"&gt;Mastering Clojure Data Analysis&lt;/a&gt;&amp;rdquo; by Eric Rochester.
It contains a comprehensive set of examples on analysing and visualising data using Clojure.
I found it quite interesting mainly because a couple of use-cases covered in the book correllated very well with
daily work, so I thought &amp;ldquo;why not?&amp;rdquo;.
Once I got the book, I realised what&amp;rsquo;d be the biggest challenge. It&amp;rsquo;s first written in 2014, and Clojure tooling made an enormous leap
in this 5 years.
Obstacle? No, challenge! I really wanted to get my hands dirty with some of the examples in there,
but I also resisted to use outdated libraries and tools. Also long time ago wanted to start using &lt;code&gt;deps.edn&lt;/code&gt; and it was also a good opportunity to
to do that.
So, long story short, the process began. I read through and roughly got 60% of the idea of the first Chapter (facebook graph analysis).
But for sure, real problem solving goes second, but setting up the tooling goes first!&lt;/p&gt;</description></item><item><title>Complicated data-driven applications</title><link>https://www.changes.md/post/stuff/</link><pubDate>Wed, 01 May 2019 12:09:08 +0200</pubDate><guid>https://www.changes.md/post/stuff/</guid><description>&lt;ol&gt;
&lt;li&gt;Any design is not perfect.&lt;/li&gt;
&lt;li&gt;There needs to be a way to evolve away from any decision.&lt;/li&gt;
&lt;li&gt;Components have different lifecycles.&lt;/li&gt;
&lt;li&gt;Components have different levels of criticality.&lt;/li&gt;
&lt;li&gt;Those components should have a very clean interface between each other and an outstanding level of isolation.&lt;/li&gt;
&lt;li&gt;Replaceable &amp;gt; Extendable, because the latter is more opinionated.&lt;/li&gt;
&lt;li&gt;The lifetime of the components should be challenged at all times.&lt;/li&gt;
&lt;li&gt;Proven technologies should be maintained in a conservative way.&lt;/li&gt;
&lt;li&gt;Solutions that open more opportunities should prevail the ones that put more restrictions on the follow-up design.&lt;/li&gt;
&lt;li&gt;The criticality of the components should be challenged at all times.&lt;/li&gt;
&lt;li&gt;If you&amp;rsquo;re not the light, it&amp;rsquo;s hard to reach it&amp;rsquo;s speed.&lt;/li&gt;
&lt;li&gt;Critical thinking &amp;gt; Lists from the internet, because the latter is more opinionated.&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Simple data-driven applications in Clojure</title><link>https://www.changes.md/post/simple-data-clojure/</link><pubDate>Sat, 06 Apr 2019 23:44:14 +0200</pubDate><guid>https://www.changes.md/post/simple-data-clojure/</guid><description>&lt;p&gt;Sometimes the information from the data lake/warehouse/pond/whatever simply needs to be exposed via the REST-api.
Just getting the tooling right sometimes may be troublesome.
Here&amp;rsquo;s an example on how things can work out in clojure.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s say we have an SQL-based engine like &lt;a href="https://prestosql.io/"&gt;Presto&lt;/a&gt; (or &lt;a href="https://prestodb.github.io/"&gt;Presto&lt;/a&gt;)
as the main interface to the datalake.
Let&amp;rsquo;s check how we can leverage the power of Clojure to build a simple application for fetching the data from Presto.&lt;/p&gt;</description></item><item><title>About</title><link>https://www.changes.md/about/</link><pubDate>Wed, 20 Mar 2019 00:00:00 +0000</pubDate><guid>https://www.changes.md/about/</guid><description>&lt;h1 id="notes-about-my-life"&gt;Notes about my life&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; 1996 2008 2009 2011 2015 2018 2021
-- Saint-Petersburg ------------------------------- Hamburg -------------------------
------- Programming --- Embedded ---- High load ---- Data -----------Tech leadership-
------- C/C++ ---- Python ------------ Erlang ----- Clojure -------------------------
------------- Guitar ------------------------------------------ Parenting -----------
--------------- Climbing --------- Biking ---- Snowboarding -------------------------
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>3 libraries to work with swagger in Clojure</title><link>https://www.changes.md/post/2019-03-30-3-clojure-swagger/</link><pubDate>Thu, 28 Feb 2019 00:00:00 +0000</pubDate><guid>https://www.changes.md/post/2019-03-30-3-clojure-swagger/</guid><description>&lt;p&gt;OpenAPI specification drills it&amp;rsquo;s ways into becoming a standard in many software companies.
Let&amp;rsquo;s say your organization wants to follow the API-first approach.
It means that before implementing any cross-team (or 3d party integration) functionality, the parties first agree on the contract,
and review it.&lt;/p&gt;
&lt;p&gt;I had this approach in mind since I&amp;rsquo;ve started working in a small payment provider company.
Contracts there meant everything, and negotiating the API/authentication process was basically 80% of the job.
When I joined Zalando in 2017 I was very happy to see this approach being adopted company-wise.&lt;/p&gt;</description></item><item><title>Working with me</title><link>https://www.changes.md/freelance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.changes.md/freelance/</guid><description>&lt;p&gt;I’m an IT consultant. I help systems and teams work together to solve real-world problems. I’ve done this as an engineer, team lead, and CTO, across payment processing, distributed systems, and data platforms.&lt;/p&gt;
&lt;p&gt;You can hire me to scope a problem, develop a first solution, or take responsibility for a larger piece of work. I work across product requirements, architecture, implementation, and the way teams organize around a system.&lt;/p&gt;
&lt;h2 id="how-i-approach-architecture"&gt;How I approach architecture&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Scope the problem.&lt;/strong&gt; Understand what needs to work, who depends on it, and the constraints: product requirements, existing systems, people, time, and cost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Draft a first solution or MVP.&lt;/strong&gt; Build enough to test the assumptions and learn what the problem actually requires.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decide what needs to last.&lt;/strong&gt; Identify the long-lived components and the short-lived parts based on the problem and product lifecycle. A component that supports a durable business need and an experiment that may disappear next month should be designed with different lifetimes in mind.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I use clear interfaces and isolation so those parts can evolve or be replaced independently. These boundaries need revisiting as the product changes. They also need owners: the architecture has to work for the people building and running it.&lt;/p&gt;</description></item></channel></rss>