<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Alexander Reelsen</title><link>https://spinscale.de/index.html</link><description>Recent content on Alexander Reelsen</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://spinscale.de/index.xml" rel="self" type="application/rss+xml"/><item><title>Understanding Lucene</title><link>https://spinscale.de/presentations/2026/understanding-lucene.html</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://spinscale.de/presentations/2026/understanding-lucene.html</guid><description>Introduction into Apache Lucene, with a strong focus on performance and practical use-cases helping you to keep in mind what is important.</description></item><item><title>Solar power monitoring with Elasticsearch and ES|QL</title><link>https://spinscale.de/posts/2025-10-07-solar-power-monitoring-with-elasticsearch-and-esql.html</link><pubDate>Tue, 07 Oct 2025 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2025-10-07-solar-power-monitoring-with-elasticsearch-and-esql.html</guid><description>&lt;p&gt;TLDR; This post explains how I used ES|QL with my three years of data of my
photovoltaic installation and how easy it was to write the queries and
create a dashboard.&lt;/p&gt;
&lt;p&gt;Two years ago I used &lt;a href="https://spinscale.de/posts/2023-11-14-a-year-of-solar-power-monitoring-using-jupyter-and-duckdb.html"&gt;Jupyter and
DuckDB&lt;/a&gt;
for the same task, but time to try something different. If you want to know
more about the setup and polling the data, read that previous blog post.&lt;/p&gt;
&lt;h2 id="importing-csv-data-into-elasticsearch"&gt;Importing CSV data into Elasticsearch&lt;/h2&gt;
&lt;p&gt;I have a cronjob that downloads the latest data via API in JSON format and
automatically creates two CSV files - one with daily data and one with five
minute intervals. As you guessed right, the big file has about 350k entries,
so we&amp;rsquo;re slightly short as a big data use case - maybe if someone sponsors
me a few thousand more installations to monitor 😂&lt;/p&gt;</description></item><item><title>Programming an Elgato Streamdeck with Java - Part 3</title><link>https://spinscale.de/posts/2025-04-06-programming-an-elgato-streamdeck-with-java-part-3.html</link><pubDate>Sun, 06 Apr 2025 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2025-04-06-programming-an-elgato-streamdeck-with-java-part-3.html</guid><description>&lt;p&gt;TLDR; This is a multi part series of using your Elgato Streamdeck with Java.
This is the third part, implementing DND, Elgato Airlight handling and
managing blinds.&lt;/p&gt;
&lt;p&gt;You can look a the &lt;a href="posts/2025-02-11-programming-an-elgato-streamdeck-with-java-part-1.html"&gt;first part dealing with USB
communiation&lt;/a&gt;
or the &lt;a href="https://spinscale.de/posts/2025-02-27-programming-an-elgato-streamdeck-with-java-part-2.html"&gt;second part dealing with event handling and
state&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="controlling-dnd-mode"&gt;Controlling DND mode&lt;/h2&gt;
&lt;p&gt;DND under osx is a tricky thing. There used to be CLI tools like
&lt;a href="https://github.com/sindresorhus/do-not-disturb"&gt;do-not-disturb&lt;/a&gt; for node
(which included a small binary), or desktop tools like
&lt;a href="https://muzzleapp.com/"&gt;Muzzle&lt;/a&gt; or
&lt;a href="https://github.com/dwarvesf/auto-dnd"&gt;AutoDND&lt;/a&gt;. At some point each tool
worked or stopped working, depending on the osx version. So just running one
of these binaries was not an option.&lt;/p&gt;</description></item><item><title>Programming an Elgato Streamdeck with Java - Part 2</title><link>https://spinscale.de/posts/2025-02-27-programming-an-elgato-streamdeck-with-java-part-2.html</link><pubDate>Thu, 27 Feb 2025 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2025-02-27-programming-an-elgato-streamdeck-with-java-part-2.html</guid><description>&lt;p&gt;TLDR; This is a multi part series of using your Elgato Streamdeck with Java.
This is the second part, which deals with event handling and creating a
stateful application on top of a stateless StreamDeck.&lt;/p&gt;
&lt;p&gt;You can read &lt;a href="https://spinscale.de/posts/2025-02-11-programming-an-elgato-streamdeck-with-java-part-1.html"&gt;part 1 here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this post we will implement a stateful application, even though the
StreamDeck does not know any state, but we want an application that has
subscreens and back buttons, so we need to put that into our Java app.&lt;/p&gt;</description></item><item><title>Programming an Elgato Streamdeck with Java - Part 1</title><link>https://spinscale.de/posts/2025-02-11-programming-an-elgato-streamdeck-with-java-part-1.html</link><pubDate>Tue, 11 Feb 2025 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2025-02-11-programming-an-elgato-streamdeck-with-java-part-1.html</guid><description>&lt;p&gt;TLDR; This is a multi part series of using your Elgato Streamdeck with Java.
This is the first part, which deals with the initial USB communication.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve owned an &lt;a href="https://www.elgato.com/de/en/p/stream-deck-plus-black"&gt;Elgato Stream
Deck+&lt;/a&gt; for quite some
time, but never really used it. At some point I tried to create a node.js +
typescript project to programmatically control it, because there are some
nice libraries available. There were some issues and I quickly got
frustrated for an evening project so I turned to my favorite programming
language to solve this: Java.&lt;/p&gt;</description></item><item><title>Shorts: Rolling up s3 logs using Bun</title><link>https://spinscale.de/posts/2025-02-02-rolling-up-s3-logs-using-bun.html</link><pubDate>Sun, 02 Feb 2025 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2025-02-02-rolling-up-s3-logs-using-bun.html</guid><description>&lt;p&gt;TLDR; This is a much shorter blog post than usual, as I just summarize things I
tested in a few hours over the weekend. My plan is to get back into some
writing rhythm over this year and come up with more but shorter posts.&lt;/p&gt;
&lt;p&gt;I am hosting this blog in a S3 bucket. I used various systems for logging and
getting statistics over the years. Over time all the JavaScript based solutions
get added to an ad blocker and so it is hard to figure out the amount of visits.
My current one is beam analytics, that is ad blocked, so I don&amp;rsquo;t have any
accurate numbers, as I suppose that most tech savvy folks have an ad blocker
enabled.&lt;/p&gt;</description></item><item><title>Shorts: Converting &amp; compressing a CSV file</title><link>https://spinscale.de/posts/2025-01-28-converting-and-compressing-a-csv-file.html</link><pubDate>Tue, 28 Jan 2025 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2025-01-28-converting-and-compressing-a-csv-file.html</guid><description>&lt;p&gt;TLDR; This is a much shorter blog post than usual, as I just summarize things I
tested in a few hours over the weekend. My plan is to get back into some
writing rhythm over this year and come up with more but shorter posts.&lt;/p&gt;
&lt;p&gt;I started reading a DuckDB post about &lt;a href="https://duckdb.org/2025/01/22/parquet-encodings.html"&gt;better compression more recent parquet
versions&lt;/a&gt; and wondered if
I could how compression works with own dataset.&lt;/p&gt;
&lt;p&gt;My testing dataset was quite small, so it does not represent any substantial. I
have collected a little more than two years of PV data in five minute
intervals, around 240k entries. Each entry consists of&lt;/p&gt;</description></item><item><title>Evolving Search at a Marketplace</title><link>https://spinscale.de/presentations/2024/evolving-search-at-a-marketplace.html</link><pubDate>Fri, 01 Nov 2024 00:00:00 +0000</pubDate><guid>https://spinscale.de/presentations/2024/evolving-search-at-a-marketplace.html</guid><description>Kaufland owns and runs an online marketplace, spanning several countries and languages, searching tens of millions of products, millions of times per day. Elasticsearch has been the product search engine at Kaufland e-commerce for more than a decade, surviving the move from data centers into the cloud and the internal shift from a Monolith to Microservices. Our team owns search from the microservices, maintaining the whole cluster up to improving relevance. We&amp;rsquo;ll cover the journey of continuous improvement over the last years, finding surprising performance improvements and how we plan to evolve the search in the next years.</description></item><item><title>From Keyword Search to Data Science</title><link>https://spinscale.de/presentations/2024/from-keyword-search-to-data-science.html</link><pubDate>Fri, 01 Nov 2024 00:00:00 +0000</pubDate><guid>https://spinscale.de/presentations/2024/from-keyword-search-to-data-science.html</guid><description>Elasticsearch serves as the product search engine on the Kaufland Marketplace, powering search across several european storefronts and serving millions of queries and updates a day. While keyword based search has served us well for over a decade, we&amp;rsquo;re working hard on the next evolution of search. How can we keep the speed of a keyword based search, while improving the search experience for the user? Scouring the internet for interesting approaches, we teamed up with our Data Science team for query rewriting and query expansion topics and came up with a few interesting query preprocessing steps that involve scripted queries and even ESQL. Let&amp;rsquo;s take a look!</description></item><item><title>Tracking my meeting time with Hammerspoon</title><link>https://spinscale.de/posts/2024-10-01-tracking-my-meeting-time-with-hammerspoon.html</link><pubDate>Tue, 01 Oct 2024 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2024-10-01-tracking-my-meeting-time-with-hammerspoon.html</guid><description>&lt;p&gt;TLDR; If you have a lot of meetings as an IC (individual contributor),
you&amp;rsquo;re often feeling less productive. Sometimes it&amp;rsquo;s true, sometimes those
meetings are necessary. I still would like to know, how much time I really
spent in meetings during my working hours. This blog post shows how to use
&lt;a href="https://www.hammerspoon.org/"&gt;Hammerspoon&lt;/a&gt; to figure this out.&lt;/p&gt;
&lt;h2 id="what-is-a-meeting"&gt;What is a meeting?&lt;/h2&gt;
&lt;p&gt;This is already hard to define. Is your monthly all hands a meeting?
Probably. Is your daily a meeting? Totally. Are regular 1:1&amp;rsquo;s with team
members a meeting? Absolutely. Is the spontaneous production outage where
you gather with everyone a meeting? I&amp;rsquo;d say so! Your manager calling?
Meeting! You typing furiously? Maybe. You watching YouTube? Not so much! You
reading email? Nah.&lt;/p&gt;</description></item><item><title>Node process permissions: An introduction</title><link>https://spinscale.de/posts/2024-07-23-node-process-permissions-permissions-an-overview.html</link><pubDate>Tue, 23 Jul 2024 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2024-07-23-node-process-permissions-permissions-an-overview.html</guid><description>&lt;p&gt;TLDR; This post will talk about &lt;a href="https://nodejs.org/api/permissions.html#process-based-permissions"&gt;node.js process based permissions
feature&lt;/a&gt;
behind the &lt;code&gt;--experimental-permission&lt;/code&gt; command line flag. We&amp;rsquo;ll also cover a
little bit of history and why I think that such a feature is so important in
an execution environment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This feature is still marked as Stability 1 - experimental and in
active development, so there are no guarantees of BWC and it&amp;rsquo;s possible that
new features are still being added. This article does not cover module based
permissions as those are marked for removal.&lt;/p&gt;</description></item><item><title>Indexing german Wikipedia articles for fun and vector search</title><link>https://spinscale.de/posts/2023-12-07-indexing-german-wikipedia-articles-for-fun-and-vector-search.html</link><pubDate>Thu, 07 Dec 2023 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2023-12-07-indexing-german-wikipedia-articles-for-fun-and-vector-search.html</guid><description>&lt;p&gt;TLDR; This article covers extracting and indexing german Wikipedia articles
into Elasticsearch by generating vector embeddings using the Deep Java Library
and a Hugging Face model.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: This is my first time venturing into vector search with
Hugging Face models, it&amp;rsquo;s likely I have made a ton of mistakes. Feel free to
notify me and point out every little one of them, allowing me to learn.&lt;/p&gt;
&lt;h2 id="but-why"&gt;But why?&lt;/h2&gt;
&lt;p&gt;My former colleague &lt;a href="https://twitter.com/karmiq"&gt;Karel&lt;/a&gt; published a
wonderful demo/presentation how to get started with semantic search and
vector embeddings creation. Take your time and check it out &lt;a href="https://karmi.github.io/talks/czpycon2023"&gt;over
here&lt;/a&gt;. There is also another
&lt;a href="https://nb.karmi.cz/semantic-search-with-elasticsearch/"&gt;wonderful blog
post&lt;/a&gt; in addition
using Elasticsearch from Karel. Thank you!&lt;/p&gt;</description></item><item><title>Goodbye DevRel… (for now)</title><link>https://spinscale.de/posts/2023-11-28-goodbye-devrel.html</link><pubDate>Tue, 28 Nov 2023 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2023-11-28-goodbye-devrel.html</guid><description>&lt;p&gt;After almost four years of developer advocacy as my main job, I am going
back to software engineering. This blog post is my venting rant about what I
think is going wrong with developer advocacy/devrel/you-name-it at the
moment and why it&amp;rsquo;s not for me at its current state.&lt;/p&gt;
&lt;p&gt;I think there is a major mismatch between company expectations what developer
relations are able to achieve and deliver and what happens in the real world,
especially if your product is closed source. Not being able to share
progress, no exposed roadmap, no way to discuss with developers it is more
complex for advocates to find topics to talk about and also lead technical
people into some kind of interest funnel that is not purely sales or leads
driven. Transparency is required for advocates to go to work.&lt;/p&gt;</description></item><item><title>A year of solar &amp; power monitoring using Jupyter and DuckDB</title><link>https://spinscale.de/posts/2023-11-14-a-year-of-solar-power-monitoring-using-jupyter-and-duckdb.html</link><pubDate>Tue, 14 Nov 2023 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2023-11-14-a-year-of-solar-power-monitoring-using-jupyter-and-duckdb.html</guid><description>&lt;p&gt;TLDR; This blog post takes a look at one year of collected solar cell/power
consumption data using &lt;a href="https://crystal-lang.org/"&gt;Crystal&lt;/a&gt;, shell scripts,
&lt;a href="https://jupyter.org/"&gt;Jupyter&lt;/a&gt;, &lt;a href="https://matplotlib.org/"&gt;matplotlib&lt;/a&gt; and a
little bit of &lt;a href="https://duckdb.org/"&gt;DuckDB&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you just care for the graphs, jump to &lt;a href="#finally-the-stats"&gt;this part&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Minor note: I do use &lt;code&gt;kw/h&lt;/code&gt; and &lt;code&gt;kwh&lt;/code&gt; interchangeably - I know strictly
speaking it is not 😀.&lt;/p&gt;
&lt;h2 id="polling-the-api"&gt;Polling the API&lt;/h2&gt;
&lt;p&gt;I am having an &lt;a href="https://www.alphaess.com/"&gt;AlphaESS solar setup&lt;/a&gt; (inverter,
battery, car charger). There already is a nice app, also used to control the
different charger settings like using only solar power, solar + battery or
regular charging and seeing realtime data. Luckily over the last year there
was an API added under &lt;a href="https://open.alphaess.com/"&gt;open.alphaess.com&lt;/a&gt; as
well as a &lt;a href="https://github.com/alphaess-developer/alphacloud_open_api"&gt;GitHub repository for
discussion&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Search Search Evolution</title><link>https://spinscale.de/presentations/2023/search-search-evolution.html</link><pubDate>Fri, 01 Sep 2023 00:00:00 +0000</pubDate><guid>https://spinscale.de/presentations/2023/search-search-evolution.html</guid><description>This talk is an introduction into search and focuses on the recent search trends in the last years. Search is not a solved problem. We start with the basics like relevance, extending over to learning to rank and vector search and will - of course - also cover LLMs and what might come in the future.</description></item><item><title>Create a custom Tailwind CSS build with Gradle in your Java project (2023 edition)</title><link>https://spinscale.de/posts/2023-07-13-using-gradle-to-create-custom-tailwindcss-build.html</link><pubDate>Thu, 13 Jul 2023 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2023-07-13-using-gradle-to-create-custom-tailwindcss-build.html</guid><description>&lt;p&gt;TLDR; This post will show how to create a custom &lt;a href="https://tailwindcss.com"&gt;Tailwind
CSS&lt;/a&gt; build in a Gradle based Java project. This post
is an update to &lt;a href="https://spinscale.de/posts/2021-02-15-using-gradle-to-create-custom-tailwindcss-build.html"&gt;the post made in
2021&lt;/a&gt;,
as the steps outlined in that one are completely unneeded.&lt;/p&gt;
&lt;p&gt;As of late December 2021 Tailwind features a &lt;a href="https://tailwindcss.com/blog/standalone-cli"&gt;CLI
install&lt;/a&gt;, which is a
node.js distribution packaged together with the tailwind code. All you need to
do is to install that binary and no need to fiddle with any node or npm setup.&lt;/p&gt;</description></item><item><title>The ultimate workshop-as-code approach</title><link>https://spinscale.de/posts/2023-06-20-the-ultimate-workshop-as-code-approach.html</link><pubDate>Tue, 20 Jun 2023 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2023-06-20-the-ultimate-workshop-as-code-approach.html</guid><description>&lt;p&gt;TLDR; This blog post describes my process of creating, preparing and
delivering a workshop, including content creation and how to tackle all of
this from an engineering perspective.&lt;/p&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;I was asked at my previous employer to create a workshop allowing prospects
could take a look at the platform and gather some first experience. The
workshop is optimized for engineers to be maintained and held.&lt;/p&gt;
&lt;h2 id="cant-we-just-use-google-slides-or-keynote"&gt;Can&amp;rsquo;t we just use Google Slides or keynote?&lt;/h2&gt;
&lt;p&gt;This will likely be the first question, once you outline a different
approach to running the workshop.&lt;/p&gt;</description></item><item><title>Mirror Mirror What Am I Typing Next</title><link>https://spinscale.de/presentations/2023/mirror-mirror-what-am-i-typing-next.html</link><pubDate>Sat, 01 Apr 2023 00:00:00 +0000</pubDate><guid>https://spinscale.de/presentations/2023/mirror-mirror-what-am-i-typing-next.html</guid><description>A practical introduction into auto suggest. A good search engine implementation shows relevant results to the user, but also helps getting there, as fast as possible. Often this is done using search as you type or suggest functionality, offering possible results while a user is typing. This talk will cover the underlying data structures and algorithms to explain implementations behind a fast search as you type functionality using radix trees, finite state automatons and dive into advanced topics like ranking and boosting using concrete Java code for explanations and live demos.</description></item><item><title>New Generation of Data Stores</title><link>https://spinscale.de/presentations/2023/new-generation-of-data-stores.html</link><pubDate>Sat, 01 Apr 2023 00:00:00 +0000</pubDate><guid>https://spinscale.de/presentations/2023/new-generation-of-data-stores.html</guid><description>Storing data is part of every application. The landscape has shifted dramatically in the last years, because of the cloud providers/hyperscalers. The race of storing ever-growing data at a cheaper price is bottomless and resulting in a seismic shift using hyper scale infrastructure in modern data stores, that are only running in cloud environments. The most visible result of this is the common mention of splitting storage and computing, but that is only part of it. This talk covers concepts in new data stores to reduce costs while staying competitive from a performance and pricing standpoint as well as the implications for developers.</description></item><item><title>Using Hammerspoon to enable lighting for meetings</title><link>https://spinscale.de/posts/2023-02-01-using-hammerspoon-to-enable-lighting-for-meetings.html</link><pubDate>Wed, 01 Feb 2023 00:00:00 +0000</pubDate><guid>https://spinscale.de/posts/2023-02-01-using-hammerspoon-to-enable-lighting-for-meetings.html</guid><description>&lt;p&gt;TLDR; I recently got my hands on some Elgato gear (holy cow, are those
expensive at recommended retail prices!). Time to use
&lt;a href="https://www.hammerspoon.org"&gt;Hammerspoon&lt;/a&gt; to automatically enable them, once a
camera turns on. The code applies also to other lights, if you have a way to
switch those lights with a command line tool.&lt;/p&gt;
&lt;p&gt;Just to quickly repeat: Hammerspoon is an awesome automation framework for OSX.
It&amp;rsquo;s one of the first things I install when setting up a new MacBook. You
can read an older post about &lt;a href="https://spinscale.de/posts/2016-11-08-creating-a-productive-osx-environment-hammerspoon.html"&gt;my
setup&lt;/a&gt;
from 2016 or a little bit newer post about properly &lt;a href="https://spinscale.de/posts/2020-10-30-using-hammerspoon-do-not-disturb-screen-sharing-zoom.html"&gt;supporting DnD
mode&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>