<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hi, I am Jakob Maier! on Jakob Maier</title><link>https://www.jakobmaier.at/</link><description>Recent content in Hi, I am Jakob Maier! on Jakob Maier</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 21 Feb 2026 21:10:55 +0100</lastBuildDate><atom:link href="https://www.jakobmaier.at/index.xml" rel="self" type="application/rss+xml"/><item><title>How to add LED strips to your Tiny Whoop</title><link>https://www.jakobmaier.at/posts/tiny-whoop-led-strips/</link><pubDate>Sat, 21 Feb 2026 21:10:55 +0100</pubDate><guid>https://www.jakobmaier.at/posts/tiny-whoop-led-strips/</guid><description>&lt;p&gt;&lt;em&gt;I&amp;rsquo;m definitely not an expert, so please take this with a grain of salt. This
article is primarily a way to document my own FPV journey; consider it a
personal roadmap first and a tutorial second.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="why-should-you-install-leds-on-your-quad"&gt;Why should you install LEDs on your quad?&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s face it: LEDs just make your quadcopter look cooler. Some FPV drone races
even require them, both to make it more interesting for viewers to follow along
as well as to make your quad easier for other pilots to see in order to avoid
crashing.&lt;/p&gt;</description></item><item><title>How I built a Raspberry Pi Birdhouse Camera</title><link>https://www.jakobmaier.at/posts/birdhouse-camera/</link><pubDate>Wed, 18 Feb 2026 15:41:38 +0100</pubDate><guid>https://www.jakobmaier.at/posts/birdhouse-camera/</guid><description>&lt;p&gt;&lt;a href="https://birdhouse.jakobmaier.at"&gt;The Livestream&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As a follow up project to the &lt;a href="https://www.jakobmaier.at/posts/motion-activated-bird-camera/"&gt;motion activated bird feeder camera&lt;/a&gt;
that my dad and I built last year, we decided to build a birdhouse with a camera to observe birds nesting in our garden.
Specifically, we would like to observe the &lt;a href="https://en.wikipedia.org/wiki/Common_starling"&gt;common starling&lt;/a&gt; nesting.&lt;/p&gt;
&lt;p&gt;As we did in our last project, my dad would build the birdhouse while I would
provide the electronics as well as the software.&lt;/p&gt;</description></item><item><title>How to fix 'RX Loss' on the BetaFPV Air65</title><link>https://www.jakobmaier.at/posts/betafpv-air65-external-elrs-receiver/</link><pubDate>Thu, 15 Jan 2026 21:10:55 +0100</pubDate><guid>https://www.jakobmaier.at/posts/betafpv-air65-external-elrs-receiver/</guid><description>&lt;p&gt;&lt;em&gt;I&amp;rsquo;m definitely not an expert, so please take this with a grain of salt. This
article is primarily a way to document my own FPV journey; consider it a
personal roadmap first and a tutorial second.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://betafpv.com/products/air65-brushless-whoop-quadcopter"&gt;&lt;em&gt;BetaFPV Air65&lt;/em&gt;&lt;/a&gt;
is a remarkable little FPV drone, agile and powerful all while being very
affordable. It was my first FPV drone and it&amp;rsquo;s what got me into the hobby.
Unfortunately, it also has some flaws: it&amp;rsquo;s quite well known that the &lt;em&gt;Air 5in1&lt;/em&gt;
flight controller (FC) is quite fragile. Especially the VTX (Video Transmitter)
and the ELRS (control signal receiver) chip are prone to breaking. And when after
some crashes I started getting &amp;lsquo;Telemetry Lost&amp;rsquo; and &amp;lsquo;RX Loss&amp;rsquo; errors, I knew what
was wrong - the ELRS receiver.&lt;/p&gt;</description></item><item><title>Radiomaster Pocket and BetaFPV Air65 - First Binding</title><link>https://www.jakobmaier.at/posts/radiomaster-pocket-and-air65-setup/</link><pubDate>Sun, 30 Nov 2025 11:35:19 +0100</pubDate><guid>https://www.jakobmaier.at/posts/radiomaster-pocket-and-air65-setup/</guid><description>&lt;p&gt;There are many ways to setup &amp;amp; bind the Radiomaster Pocket and BetaFPV Air65 or
Air75, but this method may be the simplest.&lt;/p&gt;
&lt;p&gt;On your Radio, press, &lt;strong&gt;Sys&lt;/strong&gt;, then scroll to &lt;strong&gt;ExpressLRS&lt;/strong&gt; using the scroll whell
on the left. Select &lt;strong&gt;ExpressLRS&lt;/strong&gt; by pressing the scroll wheel. Scroll down until
you find the &lt;strong&gt;Bind&lt;/strong&gt; option.&lt;/p&gt;
&lt;p&gt;On your drone, simply plug and unplug the battery three times. This puts the
ELRS receiver in bind mode, wich is indicated by the LED on the chip blinking
twice in a cycle. After that, press &lt;strong&gt;Bind&lt;/strong&gt; on your radio. That&amp;rsquo;s it - your
drone should now be connected.&lt;/p&gt;</description></item><item><title>What to Do in Vienna - My List</title><link>https://www.jakobmaier.at/posts/what-to-do-in-vienna/</link><pubDate>Sat, 29 Nov 2025 15:37:09 +0100</pubDate><guid>https://www.jakobmaier.at/posts/what-to-do-in-vienna/</guid><description>&lt;p&gt;I have lived in Vienna for about seven years now, and so I regularly get asked
about things to do in Vienna by friends and relatives. Whenever they do so I
have trouble coming up with a list in the moment, so this article is an attempt
to write some stuff down so I can link to if I get another such request.&lt;/p&gt;
&lt;p&gt;This list is work-in-progress, so it does not claim completeness!&lt;/p&gt;</description></item><item><title>A Lisp Interpreter for Linux Shell Scripting</title><link>https://www.jakobmaier.at/posts/lisp-interpreter/</link><pubDate>Sat, 04 Oct 2025 13:19:20 +0200</pubDate><guid>https://www.jakobmaier.at/posts/lisp-interpreter/</guid><description>&lt;h2 id="content"&gt;Content&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#content"&gt;Content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#motivation"&gt;Motivation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#what-is-lisp"&gt;What is Lisp?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#using-lisp"&gt;Using Lisp&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#getting-started"&gt;Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#shell-scripting"&gt;Shell Scripting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#try-it-yourself"&gt;Try it yourself!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;A few weeks ago, I started learning about &lt;a href="https://en.wikipedia.org/wiki/Lisp_(programming_language)"&gt;Lisp&lt;/a&gt;
and decided to write my own Lisp interpreter, mostly to understand the language
and it&amp;rsquo;s concepts better. Once I got the interpreter working, I natually wanted
to do something &lt;em&gt;useful&lt;/em&gt; with it. But writing a full-scale project entirely in
my own Lisp sounds like a recipe for disaster!&lt;/p&gt;</description></item><item><title>403 Forbidden</title><link>https://www.jakobmaier.at/error/403/</link><pubDate>Fri, 26 Sep 2025 13:13:21 +0200</pubDate><guid>https://www.jakobmaier.at/error/403/</guid><description/></item><item><title>401 Unauthorized</title><link>https://www.jakobmaier.at/error/401/</link><pubDate>Fri, 26 Sep 2025 13:13:19 +0200</pubDate><guid>https://www.jakobmaier.at/error/401/</guid><description/></item><item><title>404 Not Found</title><link>https://www.jakobmaier.at/error/404/</link><pubDate>Fri, 26 Sep 2025 13:13:16 +0200</pubDate><guid>https://www.jakobmaier.at/error/404/</guid><description>&lt;p&gt;The page you are looking for does not exist. If you think it should, consider
writing me an &lt;a href="mailto:jakob.g.maier@gmail.com"&gt;email&lt;/a&gt;. Maybe I can fix it!&lt;/p&gt;</description></item><item><title>Contact</title><link>https://www.jakobmaier.at/contact/</link><pubDate>Fri, 26 Sep 2025 13:11:57 +0200</pubDate><guid>https://www.jakobmaier.at/contact/</guid><description>&lt;p&gt;Feel free to reach out with any questions, ideas, or feedback on my projects.
I&amp;rsquo;ll get back to you as soon as possible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="mailto:jakob.g.maier@gmail.com"&gt;jakob.g.maier@gmail.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="more-links"&gt;More Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/gue-ni/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.printables.com/@gueni_3621809"&gt;Printables&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Tiny Whoops - My First Steps into the World of Tiny FPV Drones</title><link>https://www.jakobmaier.at/posts/micro-fpv-drone-flying/</link><pubDate>Thu, 26 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/micro-fpv-drone-flying/</guid><description>&lt;p&gt;Micro FPV (First Person View) drones, sometimes called &lt;em&gt;Tiny Whoops&lt;/em&gt;, are one of the
most exciting and affordable ways to experience the thrill of flying like a
bird. Weighing just a few grams - mine comes in at only 25g including the
battery - these tiny drones are incredibly agile and fast. Equipped with a
built-in camera and paired with FPV goggles, they give you a breathtaking,
immersive view from the sky, as if you were sitting in the cockpit yourself. And
thanks to their compact size, you can even fly them indoors, weaving through
tight spaces with ease.&lt;/p&gt;</description></item><item><title>Train and Weather Tracker with Raspberry Pi and E-Ink</title><link>https://www.jakobmaier.at/posts/raspberrypi-e-ink-monitor/</link><pubDate>Thu, 22 May 2025 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/raspberrypi-e-ink-monitor/</guid><description>&lt;p&gt;I use the public transport in my city (Vienna) daily, and
while the tram comes quite frequently, I still often see it drive away right in
front of me. And so I thought it would be a good idea to build a tracker in my
apartment that tells me when the next tram leaves.&lt;/p&gt;
&lt;p&gt;Fortunately, Wiener Linien provides open access to its &lt;a href="https://www.wienerlinien.at/open-data"&gt;real-time information&lt;/a&gt;,
so getting this information is very easy. I also want to display both the inside and outside
temperature on the tracker. This was also quite easy, as I already have a
Raspberry Pi in my apartment that measures the inside temperature. More on this
project can be found &lt;a href="https://github.com/gue-ni/temperature-sensor"&gt;here&lt;/a&gt;. For
the outside temperature, I use an API provided by Geosphere Austria.&lt;/p&gt;</description></item><item><title>FreeFlight - An Interactive 3D Model of Austria</title><link>https://www.jakobmaier.at/posts/free-flight/</link><pubDate>Mon, 14 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/free-flight/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;FreeFlight&lt;/em&gt; is a C++ project that uses OpenGL to create a dynamic and
interactive 3D model of Austria. By utilizing &lt;a href="https://en.wikipedia.org/wiki/Tiled_web_map"&gt;web map tiles&lt;/a&gt;,
&lt;em&gt;FreeFlight&lt;/em&gt; integrates a dynamically loaded &lt;a href="https://en.wikipedia.org/wiki/Digital_elevation_model"&gt;digital elevation model&lt;/a&gt; and aerial or statellite imagery,
allowing users to explore a detailed and realistic landscape. Currently, &lt;em&gt;FreeFlight&lt;/em&gt; is limited to Austria by
the available high-resolution elevation data, however the scope of the renderer can easily be extended by configuring a different tile server.&lt;/p&gt;</description></item><item><title>How I Built a Motion-Activated Birdfeeder Camera</title><link>https://www.jakobmaier.at/posts/motion-activated-bird-camera/</link><pubDate>Thu, 16 Jan 2025 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/motion-activated-bird-camera/</guid><description>&lt;p&gt;In order to see what birds visit our garden, my dad and I built an bird feeding
station with a motion activated camera. My dad, who is a much better at wood
working than me, built the feeding station itself, while I handled the
software and the Raspberry Pi. You can find the latest images captured by the
camera &lt;a href="http://www.jakobmaier.at/birds-of-gartenweg/"&gt;here&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;




 &lt;img src="http://www.jakobmaier.at/blob/media/bird-camera/9f79b530-c869-4622-a7e2-7f1bce703b61.jpg" alt="side view" /&gt;


&lt;/p&gt;
&lt;p&gt;The feeder is of a relatively simple design, it consists of a box with a angled
plexi glas window that contains the seeds, as well as a box at the top that
houses the Raspberry Pi. Power is supplied with a cable that runs from the
house, internet connectivity is avaiblable via WiFi. We actually had to upgrade
our router and get a repeater to get it working outside.&lt;/p&gt;</description></item><item><title>Fun with Path Tracing</title><link>https://www.jakobmaier.at/posts/fun-with-path-tracing/</link><pubDate>Fri, 29 Nov 2024 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/fun-with-path-tracing/</guid><description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Path_tracing"&gt;Path tracing&lt;/a&gt; is a ray tracing based rendering method for 3D scenes that is frequently used for non-real-time
applications due to it&amp;rsquo;s ability to accuratly simulate how light interacts with
various materials. It is the technique used at companies like Disney, Pixar and Marvel to create their CGI.&lt;/p&gt;
&lt;p&gt;The algorithm works by simulating a large number of rays from the viewpoint of
the camera into the scene, scattering them at various surfaces according to
mathematical models dependant on the material and thus estimating the light per
pixel.&lt;/p&gt;</description></item><item><title>Set Values With Imgui::Slider Over Getter and Setter Functions</title><link>https://www.jakobmaier.at/posts/imgui-slider-with-getter-and-setters/</link><pubDate>Sat, 30 Mar 2024 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/imgui-slider-with-getter-and-setters/</guid><description>&lt;p&gt;&lt;a href="https://github.com/ocornut/imgui"&gt;ImGui&lt;/a&gt; is a very popular immediate mode GUI library used by many game developers for
rapid prototyping. For me, some of the most useful features are the &lt;code&gt;ImGui::Slider*&lt;/code&gt; family of functions, that allow
for setting of values via sliders, as the name implies.&lt;/p&gt;
&lt;p&gt;These functions can be used like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; value &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0f&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ImGui&lt;span style="color:#f92672"&gt;::&lt;/span&gt;SliderFloat(&lt;span style="color:#e6db74"&gt;&amp;#34;Set value&amp;#34;&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;value, &lt;span style="color:#ae81ff"&gt;0.0f&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10.0f&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;




 &lt;img src="./img/imgui_slider.png" alt="ImGui::SliderFloat" /&gt;


&lt;/p&gt;
&lt;p&gt;In this case, we can use the slider to set &lt;code&gt;value&lt;/code&gt; to between 0 and 10. But what if &lt;code&gt;value&lt;/code&gt; is a private member
of a class and can only be accessed via getters and setters? Well for this reason, I have created a simple helper function:&lt;/p&gt;</description></item><item><title>Terrain Rendering</title><link>https://www.jakobmaier.at/posts/terrain-renderer/</link><pubDate>Tue, 23 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/terrain-renderer/</guid><description>&lt;h3 id="rendering-real-world-terrain-in-3d-with-data-from-web-map-tile-service"&gt;Rendering Real-World Terrain in 3D With Data From Web Map Tile Service&lt;/h3&gt;
&lt;p&gt;As part of my quest to create a flight simulator I have implemented a basic terrain renderer
that uses texture and heightmap data loaded from a &lt;a href="https://en.wikipedia.org/wiki/Tile_Map_Service"&gt;Tile Map Service&lt;/a&gt;,
the same technology that powers Google Maps.&lt;/p&gt;
&lt;p&gt;Part of any terrain renderer is some technique of managing &amp;rsquo;level of detail&amp;rsquo; (LOD), a way of rendering terrain that is
closer in more detail. In this implementation I use a &lt;a href="https://en.wikipedia.org/wiki/Quadtree"&gt;Quadtree&lt;/a&gt;, which lines
up perfectly with map tiles. The Quadtree is centered around the intersection of the camera ray with a plane,
so the area we are looking at should be the most detailed.&lt;/p&gt;</description></item><item><title>Three Weeks in Nepal</title><link>https://www.jakobmaier.at/posts/three-weeks-in-nepal/</link><pubDate>Wed, 28 Jun 2023 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/three-weeks-in-nepal/</guid><description>&lt;h3 id="annapurna-base-camp-trek-4130m"&gt;Annapurna Base Camp Trek (4130m)&lt;/h3&gt;
&lt;p&gt;If you visit Nepal it is basically mandatory to at least some trekking. After
all, Nepal is home to 8 out of 14 of the worlds eight-thousanders. But even if
you planning a more modest expedition, you have plenty of options. We chose the
Annapurna Base Camp Trek (ABC), as it is not very hard, going up to &amp;lsquo;only&amp;rsquo;
4130m, and can be completed in just 8 days.
&lt;a href="https://en.wikipedia.org/wiki/Annapurna"&gt;Annapurna&lt;/a&gt; itself is the worlds tenth
heighest mountain at 8091m and is widely regarded as one of the most dangerous.&lt;/p&gt;</description></item><item><title>Simple Physics-based Flight Simulation with C++</title><link>https://www.jakobmaier.at/posts/flight-simulation/</link><pubDate>Sun, 08 Jan 2023 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/flight-simulation/</guid><description>&lt;h3 id="content"&gt;Content&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#content"&gt;Content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#introduction"&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#simulating-a-generic-rigid-body"&gt;Simulating a Generic Rigid Body&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#creating-the-flightmodel"&gt;Creating the Flightmodel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#putting-it-all-together"&gt;Putting it all together&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sources"&gt;Sources&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;In this blog post I aim to show you how to create a reasonably realistic flight simulator in C++ from scratch, so no
physics engine needed.&lt;/p&gt;
&lt;p&gt;A little disclaimer: I am by no means a physics expert, so take everything you
read here with a grain of salt. What I show here is what I have learnt from reading various books on the subject,
so please do not use this post to create a flight simulator to be used for pilot training. 😉&lt;/p&gt;</description></item><item><title>Tracking and Analyzing My Location Data</title><link>https://www.jakobmaier.at/posts/tracking-my-location/</link><pubDate>Wed, 30 Nov 2022 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/tracking-my-location/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I enjoy exploring the city I live in (vienna) by walking it&amp;rsquo;s streets. However, I have
noticed a tendency to always walk the same routes. Especially when I am not actively
going somewhere my mind seems to always choose the same old routes, which is of course
not what I want. The solution that I have come up with is to record my location data
and render something like a heatmap of my location history. This way I would have a clear
visualisitaion of the routes I have traveled often and where I haven&amp;rsquo;t gone at all.&lt;/p&gt;</description></item><item><title>An Introduction to Ray Tracing In C</title><link>https://www.jakobmaier.at/posts/raytracing/</link><pubDate>Sun, 25 Sep 2022 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/raytracing/</guid><description>&lt;p&gt;To practice my C programming skills and to learn more about computer graphics I
wrote a simple raytracer (you can find the sourcecode on
&lt;a href="https://github.com/gue-ni/raytracer"&gt;github&lt;/a&gt;. My approach is based on
&lt;a href="https://raytracing.github.io"&gt;Raytracing in one Weekend&lt;/a&gt;,
&lt;a href="https://scratchapixel.com"&gt;scratchapixel.com&lt;/a&gt; and
&lt;a href="https://www.kevinbeason.com/smallpt/"&gt;smallpt&lt;/a&gt;. All of these authors use C++ to
implement the raytracing algorithm, but I decided to use C (C99 in particular)
for the aforementioned reason.&lt;/p&gt;
&lt;p&gt;There was actually another motivation behind my effort to write a raytracer: I
wanted to generate cool wallpapers to use on the computers that I work with
every day. In the past I used the Windows 95 default wallpaper, which is just
the color &lt;code&gt;#008080&lt;/code&gt;, so I wanted to have a similar color for my new background.
I also like the &lt;a href="https://en.wikipedia.org/wiki/Bisexual_lighting"&gt;bisexual
lighting&lt;/a&gt; color palette for
it&amp;rsquo;s cyberpunk feel, so that is something I also wanted to use&lt;/p&gt;</description></item><item><title>Reading Code - The Essential Skill Not Taught at University</title><link>https://www.jakobmaier.at/posts/reading-code/</link><pubDate>Fri, 19 Aug 2022 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/reading-code/</guid><description>&lt;p&gt;I&amp;rsquo;m a student at &lt;a href="https://tuwien.ac.at"&gt;TU Wien&lt;/a&gt; and have just started working
as a Java Developer. This puts me in the position of having to see how well the
theoretical training I have received stacks up in the real world.&lt;/p&gt;
&lt;p&gt;So far, I have noticed one thing: At university we spent most of our time
writing code, either &lt;em&gt;from scratch&lt;/em&gt; or using a small templates provided by the
professor. At my new job however, I have been mostly &lt;em&gt;reading&lt;/em&gt; code, exploring a
large codebase in order to understand what is going on and eventually make some
changes. And while knowing how to write Java helps of course, I would consider
&lt;em&gt;reading&lt;/em&gt; code a skill quite different from &lt;em&gt;writing&lt;/em&gt;. In fact, I think it can
sometimes be much harder. I could probably hack something together that makes
sense in my head, but making sense of someone elses thoughts and concepts can be
much harder.&lt;/p&gt;</description></item><item><title>Should you visit Dubrovnik?</title><link>https://www.jakobmaier.at/posts/dubrovnik/</link><pubDate>Fri, 29 Jul 2022 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/dubrovnik/</guid><description>&lt;p&gt;Dubrovnik is a beautiful town in Southern Croatia, famous for it&amp;rsquo;s historic
walled old town. In paricular, it has become very well known for being used as
the filming location for &lt;em&gt;Kings Landing&lt;/em&gt; in the HBO series &lt;em&gt;Game of Thrones&lt;/em&gt;.
But is it worth a visit?&lt;/p&gt;
&lt;p&gt;First of all, Dubrovnik is very &lt;strong&gt;expensive&lt;/strong&gt;, by far the most expensive town I
have been to in Croatia. A 0.5l beer can easily cost 35 to 45 kunar. If you want
to go on the town walls, which is really a must see, you will have to pay 250 or
150 kunar if you have a student card.&lt;/p&gt;</description></item><item><title>Voice Messages Are Terrible</title><link>https://www.jakobmaier.at/posts/voice-messages/</link><pubDate>Sat, 16 Jul 2022 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/voice-messages/</guid><description>&lt;p&gt;Voice message are quite popular among users of apps like whatsapp and telegram.
They are faster to send than text messages, especially if one wants to send a
long message.&lt;/p&gt;
&lt;p&gt;However, I don&amp;rsquo;t like voice messages, I don&amp;rsquo;t send them and I resent having to
listen to them. The reason is simple: compared to traditional text messages they
shift the effort to the recipient instead of the sender. With a text message,
the sender has to spend time more or less carefully crafting a message, which
can then be read by a glance by the recipient. A voice message is recorded in no
time, often containing many uhms and ahs. On the other end the recipient now has
to maybe put on headphones, maybe turn up the volume, to listen to a 1 minute
message that could have been a two line message read in about 5 seconds.&lt;/p&gt;</description></item><item><title>A Precision Platformer Game Inspired by Celeste</title><link>https://www.jakobmaier.at/posts/html5-platformer/</link><pubDate>Sat, 28 May 2022 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/html5-platformer/</guid><description>&lt;p&gt;I created this to test my entity-component-system in a small game. The inspiration came from
&lt;a href="http://www.celestegame.com/"&gt;Celeste&lt;/a&gt;, on of the best
platformer games in recent years. The character design was made by me, the tiles were created by
&lt;a href="https://killspika.itch.io/litle-tileset-pack-8x8"&gt;kill4spika&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The game works on desktop and mobile, so don&amp;rsquo;t hesitate to try it out!&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;The source code for this game is available on &lt;a href="https://github.com/gue-ni/ecs/tree/master/examples/platformer"&gt;github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These are some screenshots from the game which I took during various stages of the design process:&lt;/p&gt;</description></item><item><title>A Silly Usecase for Websockets</title><link>https://www.jakobmaier.at/posts/a-silly-usecase-for-websockets/</link><pubDate>Thu, 24 Feb 2022 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/a-silly-usecase-for-websockets/</guid><description>&lt;p&gt;I made this website on 04-07-2020, inspired by a friend who, for some reason,
really wanted a website where you
could flic a light on and off.&lt;/p&gt;
&lt;p&gt;At first you could do just that, but then someone asked whether other people
could see whether the light was turned
on or off. I thought that would be cool,
so I looked at how to do it. As it turns out, it is quite easy to do this
with
websockets. The result is a website where you can turn a lamp on or off for
everybody else to see.&lt;/p&gt;</description></item><item><title>Attributhülle Rechner</title><link>https://www.jakobmaier.at/posts/attributhuelle-rechner/</link><pubDate>Thu, 25 Nov 2021 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/attributhuelle-rechner/</guid><description>&lt;style&gt;
	.margin {
		margin-top: 1em;
		margin-bottom: 1em;
	}
&lt;/style&gt;

&lt;p&gt;Berechne die Attributhülle eines bestimmten Attributs aus einer Menge von funktionalen Abhängigkeiten.&lt;/p&gt;
&lt;p&gt;
	&lt;b&gt;Eingabe: &lt;/b&gt;
	&lt;ul&gt;
		&lt;li&gt;eine Menge an eine Menge funktionaler Abhängigkeiten &lt;b&gt;F&lt;/b&gt;&lt;/li&gt;
		&lt;li&gt;eine Menge von Attributen &lt;b&gt;&amp;alpha;&lt;/b&gt;&lt;/li&gt;
	&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
	&lt;b&gt;Ausgabe:&lt;/b&gt;
	&lt;ul&gt;
		&lt;li&gt;
			die Menge an Attributen, die sich aus &lt;b&gt;&amp;alpha;&lt;/b&gt; durch die Abhängigkeiten &lt;b&gt;F&lt;/b&gt; ableiten lässt.
		&lt;/li&gt;
	&lt;/ul&gt;
&lt;/p&gt;
&lt;div class="margin"&gt;
	&lt;label for=""&gt;&lt;b&gt;F&lt;/b&gt; = {
		&lt;input type="text" id="F" value="RS-&gt;T,U-&gt;VX,RX-&gt;W,T-&gt;RU" size="30" /&gt;
	}&lt;/label&gt;
&lt;/div&gt;
&lt;div class="margin"&gt;
	&lt;label for=""&gt;AttrHülle(&lt;b&gt;F&lt;/b&gt;, &lt;b&gt;&amp;alpha;&lt;/b&gt; = {
		&lt;input type="text" size="5" id="gamma" value="RS" /&gt;
	})
	&lt;/label&gt;
	&lt;span id="output"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="margin"&gt;
	&lt;button id="compute" style="padding: 1rem; border-radius: 0.5rem;"&gt;Compute&lt;/button&gt;
&lt;/div&gt;
&lt;div class="margin"&gt;
	&lt;span id="error" style="color: red"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;script&gt;
const input = document.querySelector("#F");
const error = document.querySelector("#error");
const output = document.querySelector("#output");
const compute = document.querySelector("#compute");
const gamma_input = document.querySelector("#gamma");

function AttrHuelle(FD, gamma) {
	let gamma_plus = gamma;

	let max_depth = 100;

	const subset = (A, B) =&gt; {
		for (let a of A) {
			if (!B.includes(a)) {
				return false;
			}
		}
		return true;
	};

	let found_something_this_round;
	while (FD.length &gt; 0 &amp;&amp; --max_depth &gt; 0) {
		found_something_this_round = false;

		FD = FD.filter(({ alpha, beta }) =&gt; {
			if (subset(alpha, gamma_plus) &amp;&amp; !subset(beta, gamma_plus)) {
				found_something_this_round = true;
				gamma_plus = [...new Set([...gamma_plus, ...beta])];
				return false;
			} else {
				return true;
			}
		});

		if (!found_something_this_round) break;
	}

	return gamma_plus.sort();
}

function clear_error() {
	error.innerText = "";
}

function display_error(msg) {
	error.innerText = msg;
	setTimeout(() =&gt; {
		clear_error();
	}, 5000);
}

function clean_input(str) {
	str = str.replace(/\s/g, "");
	str = str.replace(/→/g, "-&gt;");
	str = str.toUpperCase();
	return str;
}

compute.addEventListener("click", () =&gt; {	
	input.value = clean_input(input.value);
	gamma_input.value = clean_input(gamma_input.value);

	try {
		// some logging, to see if anybody is actually using this
		fetch('/204?page=attributhuelle-calculator' + input.value + "+" + gamma_input.value)
	} catch(e) {}
	
	if (!(gamma_input.value &amp;&amp; input.value)) {
		display_error("Fehler: Keine Eingabe");
		return;
	}

	let FD = [...input.value.split(",")];
	let gamma = [...gamma_input.value];

	FD = FD.map((tuple) =&gt; {
		try {
			let tmp = tuple.split("-&gt;");
			tmp = tmp.map((str) =&gt; str.trim());
			return { alpha: [...tmp[0]], beta: [...tmp[1]] };
		} catch (err) {
			console.log(err);
			display_error("Fehler: Eingabe nicht korrekt");
			return;
		}
	});

	let result = AttrHuelle(FD, gamma);
	output.innerText = `= { ${result.join(", ")} }`;
	clear_error();
});
&lt;/script&gt;</description></item><item><title>Building a Flight Simulator with Javascript and THREE.js</title><link>https://www.jakobmaier.at/posts/flight-simulator-in-javascript/</link><pubDate>Thu, 04 Mar 2021 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/flight-simulator-in-javascript/</guid><description>&lt;p&gt;Update: I have been working on a significantly improved simulator, you can find the article &lt;a href="https://www.jakobmaier.at/posts/flight-simulation/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When I was working on my F-16 flightsim project back in the first lockdown I
used raw OpenGL and C++ to build the game. After working on it for some time I
realized that I was in a bit over my head. I was spending a lot of time just
debugging OpenGL and fixing weird bugs in my arguably really bad C++ code. Never
having worked with C++ before I was just figuring it out as I went along. The
flight model was another thing, the physics and the flight control system proved
to be orders of magnitude more complicated than I had imagined. At first I
focused on building a sim for the MQ-9 Reaper combat drone, but I am now again
working on the F-16 Viper, which is just a much more interesting aircraft in my
opinion. The goal is to have a player controlled Viper and some type of opponent
aircraft controlled by AI as well as some Surface-to-Air Missiles that can
threaten the player. You can play a preliminary build
&lt;a href="https://www.jakobmaier.at/project/flightsim/"&gt;here&lt;/a&gt;, without installing anything, in your web browser.
The repository can be found &lt;a href="https://github.com/gue-ni/flightsim.js"&gt;on
github&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>First Person Shooter With THREE.js</title><link>https://www.jakobmaier.at/posts/javascript-first-person-shooter/</link><pubDate>Sun, 28 Feb 2021 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/javascript-first-person-shooter/</guid><description>&lt;p&gt;I discovered &lt;a href="https://threejs.org/"&gt;THREE.js&lt;/a&gt; and immediately thought about making a game.
After reading a Wikipedia article about &amp;ldquo;Bisexual Lighting&amp;rdquo; I immediately knew what kind of aesthetic I
wanted for my game. The game is optimized for mobile users. It still looks quite unpolished as I lost
interest at some point. Anyway, you can find it &lt;a href="https://www.jakobmaier.at/project/fps/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;




 &lt;img src="//www.jakobmaier.at/blob/media/projects/first-person-shooter.png" alt="FPS" /&gt;


&lt;/p&gt;</description></item><item><title>Simple Chess Engine</title><link>https://www.jakobmaier.at/posts/simple-chess-engine/</link><pubDate>Thu, 23 Jan 2020 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/simple-chess-engine/</guid><description>&lt;p&gt;After watching The Queens Gambit on Netflix I became very interested in chess and did some reading on
Wikipedia, where I stumbled on the article for
&lt;a href="https://en.wikipedia.org/wiki/Computer_chess"&gt;Computer Chess&lt;/a&gt;. The wikipedia articles on
this topic explain the algorithms used in chess engines very well and so I went about writing a chess
engine for myself.
I built &lt;a href="https://github.com/gue-ni/rachael"&gt;this&lt;/a&gt; engine in about two days, it supports the
basic chess rules but not promotion, en passant and castling. The engine implements the uci protocoll
and is able to interface with &lt;!-- raw HTML omitted --&gt;Lichess&lt;!-- raw HTML omitted --&gt;, a popular online chess
website. It consistently beats Stockfish at Level 2. The computer uses the
&lt;a href="https://en.wikipedia.org/wiki/Negamax"&gt;Negamax&lt;/a&gt; algorithm with alpha beta pruning to search
for the best possible moves to make.&lt;/p&gt;</description></item><item><title>Wiener Linien Monitor</title><link>https://www.jakobmaier.at/posts/wiener-linien-monitor/</link><pubDate>Mon, 20 Jan 2020 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/wiener-linien-monitor/</guid><description>&lt;p&gt;The real-time departure API for the Wiener Linien, Vienna&amp;rsquo;s public transport
company, is available for free. So I thought I could build a monitor just like
the ones that you can find all over vienna. I used a Raspberry Pi to connect to
the API and an Arduino to control the little LCD display. The two devices
communicate over the I2C protocol. Of course it would be possible to control the
LCD from the Raspberry Pi directly, but I thought this would also be a good
opportunity to learn more about electronics. You can find more information
&lt;a href="https://github.com/gue-ni/electronics"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Receiving NOAA Weather Satellite Images</title><link>https://www.jakobmaier.at/posts/receiving-weather-satellite-images/</link><pubDate>Thu, 06 Dec 2018 00:00:00 +0000</pubDate><guid>https://www.jakobmaier.at/posts/receiving-weather-satellite-images/</guid><description>&lt;p&gt;




 &lt;img src="http://www.jakobmaier.at/blob/media/sdr/NOAA19_2018-10-11_1449.jpg" alt="NOAA 19 at 11 Oct 2018 14:49:24 GMT" /&gt;


&lt;/p&gt;
&lt;p&gt;I received and decoded this image on October 11 2018 at 14:49. The cross marks
my location, Vienna. As you can see, it was a very sunny day in central europe.&lt;/p&gt;</description></item></channel></rss>