<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="https://ciesie.com/simple-rss.xslt"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ciesie.com</title>
    <link>https://ciesie.com/</link>
    <description>Recent content on ciesie.com</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language><managingEditor>ciesielskimm@gmail.com (Michał Ciesielski)</managingEditor><webMaster>ciesielskimm@gmail.com (Michał Ciesielski)</webMaster>
    <atom:link href="https://ciesie.com/index.xml" rel="self" type="application/rss+xml" /><item>
      <title>Parsing JSON-RPC in C</title>
      <link>https://ciesie.com/post/json_rpc_blows/</link>
      <pubDate>Sat, 31 Jan 2026</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/json_rpc_blows/</guid>
      <description>&lt;h1 id=&#34;yeah-youre-not-convincing-me-that-json-rpc-is-a-real-protocol&#34;&gt;Yeah you&amp;rsquo;re not convincing me that JSON-RPC is a real protocol&lt;a href=&#34;#yeah-youre-not-convincing-me-that-json-rpc-is-a-real-protocol&#34;&gt; &amp;lt;&lt;/a&gt;&#xA;  &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s deal with JSON-RPC in C! Something I don&amp;rsquo;t ever want to hear when sipping an iced coffee, during a sunny, June afternoon. Fortunately, it&amp;rsquo;s January and I haven&amp;rsquo;t seen the sun in a while! This article is sponsored by my lack of vitamin D!&lt;/p&gt;&#xA;&lt;p&gt;I have been building my own &lt;a href=&#34;https://moonraker.readthedocs.io/en/latest/&#34;&gt;Moonraker&lt;/a&gt; GUI client. Inspired by &lt;a href=&#34;https://docs.mainsail.xyz/&#34;&gt;Mainsail&lt;/a&gt; and &lt;a href=&#34;https://docs.fluidd.xyz/&#34;&gt;Fluidd&lt;/a&gt; but not a web application. I want to get more experience in immediate GUI paradigm and memory management through different types of allocators. I&amp;rsquo;ll write about that project soon, but today I&amp;rsquo;ll be focusing on a small part of it. That part is &amp;ldquo;parsing JSON-RPC messages using C, but honestly not fully even, just a part of them&amp;rdquo;.&lt;/p&gt;</description>
    </item><item>
      <title>Things I&#39;m looking forward to in 2026</title>
      <link>https://ciesie.com/post/looking_forward_2026/</link>
      <pubDate>Mon, 19 Jan 2026</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/looking_forward_2026/</guid>
      <description>&lt;h2 id=&#34;ai-wheels-coming-off&#34;&gt;AI wheels coming off&lt;a href=&#34;#ai-wheels-coming-off&#34;&gt; &amp;lt;&lt;/a&gt;&#xA;  &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Do you remember&#xA;&lt;a href=&#34;https://www.theguardian.com/technology/2022/jun/12/google-engineer-ai-bot-sentient-blake-lemoine&#34;&gt;people loudly proclaiming we’ve built a sentient intelligence&lt;/a&gt;?&lt;/p&gt;&#xA;&lt;p&gt;Because you should. Those people should be remembered as the first line of “intellectuals” that has fallen to the onslaught of AI propaganda. AI is a marketing term and in the last few years it has become a test, just like NFTs, testing your resilience to corporate propaganda.&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;div style=&#34;width: auto; height: auto; margin-left: auto; margin-right: auto;&#34;&gt;&#xA;  &lt;figure itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;&#xA;&#xA;    &lt;a href=&#34;https://ciesie.com/imgs/91baf3_ilyaBarelyConscious.jpg&#34;&gt;&#xA;      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://ciesie.com/imgs/91baf3_ilyaBarelyConscious.jpg&#34; alt=&#34;&amp;#39;Slightly&amp;#39; is doing a lot of heavy lifting here...&#34; style=&#34;max-width: 100%; height: auto; object-fit: scale-down;&#34;&gt;&#xA;    &lt;/a&gt;&#xA;      &lt;figcaption&gt;&#xA;        &amp;#39;Slightly&amp;#39; is doing a lot of heavy lifting here...&#xA;      &lt;/figcaption&gt;&#xA;&#xA;  &lt;/figure&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Many have fallen, many are still in the trenches, slowly falling for the trick that are LLMs.&#xA;I do recognize I might need to employ more empathy here. Seems AI&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Chatbot_psychosis&#34;&gt;triggers literal psychosis&lt;/a&gt; in some people.&lt;/p&gt;</description>
    </item><item>
      <title>Ender 3 and the power of 3D printing community</title>
      <link>https://ciesie.com/post/3dcommunity_is_literally_jesus/</link>
      <pubDate>Wed, 16 Jul 2025</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/3dcommunity_is_literally_jesus/</guid>
      <description>&lt;p&gt;I really like my Ender 3. After several necessary upgrades, I think I&amp;rsquo;ve reached a place where it&amp;rsquo;s&#xA;dependable and I know it well enough to fix most of the issues. Moving apartments forced me to&#xA;pull it apart. That became a perfect opportunity to build it back up into something better.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve always had an issue with leveling the bed - me, and everyone else who bought this printer.&#xA;For a short period I have managed with a glue stick. It was time to look into bed probes. At&#xA;this point there are some very precise solutions, like the&#xA;&lt;a href=&#34;https://cartographer3d.com/&#34;&gt;Cartographer 3D&lt;/a&gt;, but that felt like too much complexity and too much&#xA;fidelity for such an unsophisticated printer.&lt;/p&gt;</description>
    </item><item>
      <title>Well, it seems you just don&#39;t like programming</title>
      <link>https://ciesie.com/post/coding_with_ai/</link>
      <pubDate>Mon, 03 Feb 2025</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/coding_with_ai/</guid>
      <description>&lt;p&gt;I already tried to write a blog post about AI. An article, discussing AI generated art, still&#xA;festers in my drafts folder. As someone who enjoys 3D modelling, drawing, animating, someone&#xA;who believes in art lifting our spirits, I find it pointless and distasteful. Not much to&#xA;discuss.&lt;/p&gt;&#xA;&lt;p&gt;Here are some loose thoughts about AI, mostly from software development perspective, but not&#xA;unique to it.&lt;/p&gt;&#xA;&lt;p&gt;I see coding as both a skill, which enables me to build things I want to build, and an&#xA;intellectual exercise. Like any other discipline, it doesn&amp;rsquo;t have sharp borders. If you&amp;rsquo;re&#xA;receptive, if you pay attention, you&amp;rsquo;ll learn things that apply outside of computer science.&#xA;Underlying principles behind coding tell a bigger story, about systems, math, logic, or&#xA;effective communication of ideas. Diving deeper into these ideas can become a source of&#xA;great, personal satisfaction.&lt;/p&gt;</description>
    </item><item>
      <title>Update for December, &#39;here we go again&#39; 2024</title>
      <link>https://ciesie.com/post/update_01122024/</link>
      <pubDate>Sun, 01 Dec 2024</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/update_01122024/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been a while since I have written one of these. There&amp;rsquo;s definitely a cadence to these.&#xA;That cadence would be something between once and thrice a year. 2024 will have to make with&#xA;just one.&lt;/p&gt;&#xA;&lt;p&gt;I have spent a bit of time understanding the &lt;a href=&#34;https://github.com/ggerganov/ggwave&#34;&gt;ggwave&lt;/a&gt;&#xA;project, which allows for sending data over sound. It&amp;rsquo;s not an extremely complicated protocol.&#xA;I think the most difficult part to understand is the Reed-Solomon error correction, which is still&#xA;something I have not delved deep into. I have first started by understanding Fourier Transform&#xA;well. This started with a Jupyter notebook, but I have quickly moved to using&#xA;&lt;a href=&#34;https://github.com/marimo-team/marimo&#34;&gt;Marimo&lt;/a&gt;. You can find&#xA;&lt;a href=&#34;https://github.com/MrOneTwo/jupyter_experiments&#34;&gt;my repo here&lt;/a&gt;, but don&amp;rsquo;t expect it to be&#xA;polished and guests friendly.&lt;/p&gt;</description>
    </item><item>
      <title>Tagged Unions - bag them and tag them</title>
      <link>https://ciesie.com/post/tagged_unions/</link>
      <pubDate>Tue, 25 Jun 2024</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/tagged_unions/</guid>
      <description>&lt;p&gt;I have recently tried to update my Zig project from 0.11.0 version of Zig, to 0.12.0. Zig compiler brings in its own build system. Since Zig is still under development, that API changes. The 0.12.0 changes forced me to dive a bit deeper into Zig&amp;rsquo;s source code. I went through &lt;a href=&#34;https://ziglang.org/documentation/master/std/#src/std/Build.zig&#34;&gt;Build.zig&lt;/a&gt; and &lt;a href=&#34;https://ziglang.org/documentation/master/std/#src/std/Step.zig&#34;&gt;Step.zig&lt;/a&gt;. What caught my attention was the usage of &lt;a href=&#34;https://ziglang.org/documentation/master/#Tagged-union&#34;&gt;Tagged Unions&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Tagged unions aren&amp;rsquo;t nothing new. C has them&amp;hellip; kind of. In C, the tagged unions are more of a design pattern than a language feature.&lt;/p&gt;</description>
    </item><item>
      <title>Custom Linux build for Raspberry PI with Buildroot</title>
      <link>https://ciesie.com/post/buildroot_nnn/</link>
      <pubDate>Wed, 20 Mar 2024</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/buildroot_nnn/</guid>
      <description>&lt;p&gt;It seems working in embedded means you&amp;rsquo;ll, sooner or later, use a Raspberry PI.&#xA;At my current work place we use Raspberry PIs, connected to the hardware we&amp;rsquo;re developing for,&#xA;as Github CI runners.&#xA;Anytime we want to add a new runner we need to flash an SD card and manually install all&#xA;the dependencies and tools.&lt;/p&gt;&#xA;&lt;p&gt;What I&amp;rsquo;m looking for is an ability to generate Raspberry PI images, pre-installed with all&#xA;the necessary (+ some of my favourite) tools.&#xA;That can be achieved thanks to projects like Yocto or Buildroot. This post&#xA;relates to the latter, which is considered to be simpler and easier to get started with.&lt;/p&gt;</description>
    </item><item>
      <title>Emotional value of the bytes you don&#39;t own</title>
      <link>https://ciesie.com/post/bytes_you_dont_own/</link>
      <pubDate>Tue, 08 Mar 2022</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/bytes_you_dont_own/</guid>
      <description>&lt;p&gt;For a long while now I&amp;rsquo;ve been using &lt;em&gt;Google Photos&lt;/em&gt; service to store my photos. Few years ago I&amp;rsquo;ve switched to using &lt;em&gt;iOS&lt;/em&gt; devices and &lt;em&gt;Apple&lt;/em&gt;&amp;rsquo;s ecosystem. That made me start using &lt;em&gt;Apple Cloud&lt;/em&gt; service. I guess my life would be simple if not for the fact that these two places don&amp;rsquo;t store my entire photos collection. Some photos and videos are stored on my local drive, backed up on yet another cloud service.&lt;/p&gt;</description>
    </item><item>
      <title>Alternative social media and federation</title>
      <link>https://ciesie.com/post/alt_social_media/</link>
      <pubDate>Sun, 30 Jan 2022</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/alt_social_media/</guid>
      <description>&lt;p&gt;At this point most people are pretty cynical about social media. The worst offender in that&#xA;space is &lt;em&gt;Facebook&lt;/em&gt;, recently rebranded into &lt;em&gt;Meta&lt;/em&gt;. In a world constantly incentivized by&#xA;profit it&amp;rsquo;s difficult to imagine &lt;em&gt;Meta&lt;/em&gt; optimizing for anything else. The striking part&#xA;was always how cunning and ruthless they are in pursuing profit. Nevertheless, despite many&#xA;controversies around privacy, usage of personal data and &lt;em&gt;Meta&lt;/em&gt;&amp;rsquo;s political involvement&#xA;&lt;a href=&#34;https://www.statista.com/statistics/264810/number-of-monthly-active-facebook-users-worldwide/&#34;&gt;services like Facebook grow year after year&lt;/a&gt;.&lt;/p&gt;</description>
    </item><item>
      <title>Update for September, year of the new hope 2021</title>
      <link>https://ciesie.com/post/update_22092021/</link>
      <pubDate>Wed, 22 Sep 2021</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/update_22092021/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve not written one of those at all this year. Not surprisingly, the most productive year for this&#xA;website was 2020&amp;hellip; thanks global pandemic&amp;hellip;?&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve posted the &lt;a href=&#34;https://ciesie.com/post/rfid_explained/&#34;&gt;RFID Explained&lt;/a&gt; blog post. I&amp;rsquo;m trying to&#xA;gather everything I&amp;rsquo;ve learned, while working on my RFID project, in one place. This is an&#xA;assumption but in the maker&amp;rsquo;s space a lot of technologies are just an Arduino libraries. What I&#xA;mean by that is that very few people actually learn how a specific technology works. They build a&#xA;device using Arduino, using the most popular library. I don&amp;rsquo;t think there is anything wrong with&#xA;that. It was probably one of the goals of the Arduino creator: remove the technical obstacles to&#xA;make technology more approachable for people without deep technical knowledge. What if you want to&#xA;learn more? You need to read, often times badly written, documentation spread over multiple&#xA;websites and documents. Sometimes, if you really want to understand something, you should read the&#xA;documentation of the standard, which is a document you have to pay for&amp;hellip; My RFID blog post is&#xA;supposed to be a quickstart for those that want to understand the common RFID solutions.&lt;/p&gt;</description>
    </item><item>
      <title>[STM32] - part 4 - CPU goes brrrrr</title>
      <link>https://ciesie.com/post/stm32_part4/</link>
      <pubDate>Sat, 24 Jul 2021</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/stm32_part4/</guid>
      <description>&lt;p&gt;This is the final part of a series of articles. I&amp;rsquo;d suggest going through &lt;a href=&#34;https://ciesie.com/post/stm32_part1/&#34;&gt;part 1&lt;/a&gt;,&#xA;&lt;a href=&#34;https://ciesie.com/post/stm32_part2/&#34;&gt;part 2&lt;/a&gt; and &lt;a href=&#34;https://ciesie.com/post/stm32_part3/&#34;&gt;part 3&lt;/a&gt; first.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been working on a project (which you can find &lt;a href=&#34;https://gitlab.com/MrOneTwo/paw-usb&#34;&gt;here&lt;/a&gt;),&#xA;using &lt;a href=&#34;https://stm32-base.org/boards/STM32F103C8T6-Blue-Pill.html&#34;&gt;Bluepill&lt;/a&gt; board with a&#xA;&lt;em&gt;STM32F103C8T6&lt;/em&gt; microcontroller. It&amp;rsquo;s a USB keyboard project. It uses the &lt;em&gt;libopencm3&lt;/em&gt; project and&#xA;I&amp;rsquo;d consider this a pretty minimalistic, baremetal project. It&amp;rsquo;s great for analyzing what happens&#xA;when a &lt;em&gt;ARM Cortex-M&lt;/em&gt; processor boots.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s analyze the linker script and the final binary of that project to understand more about the&#xA;boot up of a &lt;em&gt;STM32&lt;/em&gt;.&lt;/p&gt;</description>
    </item><item>
      <title>You can’t create in a bad environment</title>
      <link>https://ciesie.com/post/environments/</link>
      <pubDate>Thu, 10 Jun 2021</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/environments/</guid>
      <description>&lt;p&gt;Recently I haven’t been as productive as I’d like. Sure, the pandemic took its toll.&#xA;The summer is coming and if there is a time to consume what life has to offer,&#xA;instead of producing what you have to offer, this is it. Productivity should&#xA;never be the goal in itself.&lt;/p&gt;&#xA;&lt;p&gt;Nevertheless, I could be better at focusing on what’s important. Significant amount&#xA;of time gets wasted. It’s rarely caused by an unexpected, huge time sinks. It’s&#xA;usually small things - one YouTube video here, one Twitter doom scrolling there.&#xA;It’s not about replacing all those moments with work. Your time isn’t something&#xA;you have to trade for money or self improvement, but it is something you should&#xA;trade for positive/beneficial things. Before you buy something, you usually ask&#xA;yourself “is this worth my money?”. The more important question is “is this worth my time?”.&lt;/p&gt;</description>
    </item><item>
      <title>[WIP] RFID Explained</title>
      <link>https://ciesie.com/post/rfid_explained/</link>
      <pubDate>Sat, 08 May 2021</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/rfid_explained/</guid>
      <description>&lt;p&gt;RFID is complex but It&amp;rsquo;s also fun. Personally I find this technology to be a bit underutilized.&#xA;I&amp;rsquo;d like to explain it in a simple way so you don&amp;rsquo;t have to do the &amp;ldquo;wait, what?&amp;rdquo; through the many, many&#xA;documentation PDFs. I hope to give you some confidence and maybe inspire you to do something fun with RFID.&lt;/p&gt;&#xA;&lt;p&gt;My experience is that you either grab the cheapest, most popular &lt;strong&gt;MFRC522&lt;/strong&gt; based RFID reader and hook&#xA;it up to Arduino or you go deep down the rabbit hole. I&amp;rsquo;d like to bridge that gap. Enough knowledge that&#xA;you know where to look for the answers and if you put in a bit of work you&amp;rsquo;ll hopefully be able to write&#xA;your own driver for a RFID reader. I won&amp;rsquo;t tell you how to design your own PCB with a custom antenna, which,&#xA;I agree, is a bummer.&lt;/p&gt;</description>
    </item><item>
      <title>Perks and difficulties of tech blogging</title>
      <link>https://ciesie.com/post/technical_blog/</link>
      <pubDate>Mon, 01 Feb 2021</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/technical_blog/</guid>
      <description>&lt;p&gt;Having your own blog is a very interesting experiment. Like any other project it will teach you&#xA;something. Your writing skills will improve (that&amp;rsquo;s an assumption but it&amp;rsquo;s difficult not to improve&#xA;if you do it regularly). If you&amp;rsquo;re not writing in your native language, you&amp;rsquo;ll improve in the&#xA;language you do write in. You&amp;rsquo;ll notice holes in your understanding of the subject you&amp;rsquo;re&#xA;describing. You&amp;rsquo;ll draw attention of others to your work and, hopefully, you&amp;rsquo;ll help others. There&#xA;is certainly more, good reasons to have a blog.&lt;/p&gt;</description>
    </item><item>
      <title>C as a scripting language thanks to TinyCC</title>
      <link>https://ciesie.com/post/tinycc_dynamic_compilation/</link>
      <pubDate>Thu, 21 Jan 2021</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/tinycc_dynamic_compilation/</guid>
      <description>&lt;p&gt;This year I&amp;rsquo;d like to play around with music. Mostly live looping. Live looping is a pretty specific&#xA;way of making music. It&amp;rsquo;s about recording short, simple music clips and overlaying those to create&#xA;more complex and interesting music.&lt;/p&gt;&#xA;&lt;p&gt;A recent googling session took me to &lt;a href=&#34;http://openavproductions.com/&#34;&gt;OpenAV&lt;/a&gt;&amp;rsquo;s website. It&amp;rsquo;s Harry Van Haaren&amp;rsquo;s initiative.&#xA;He&amp;rsquo;s focusing on making open source application&amp;rsquo;s for live music performances. You can find the&#xA;apps&amp;rsquo; code on &lt;a href=&#34;https://github.com/openAVproductions/openAV-Ctlra&#34;&gt;his Github page&lt;/a&gt;. I really recommend checking it out.&lt;/p&gt;</description>
    </item><item>
      <title>Update for December, year of total chaos 2020</title>
      <link>https://ciesie.com/post/update_06122020/</link>
      <pubDate>Sun, 06 Dec 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/update_06122020/</guid>
      <description>&lt;p&gt;This will be the last update for 2020. We&amp;rsquo;re almost on the other side! We shouldn&amp;rsquo;t expect much out&#xA;of 2021, since the time doesn&amp;rsquo;t care about our labels. Still, there is a feeling of hope that we&amp;rsquo;ll&#xA;be able to, slowly, transition to post pandemic world. How will that world look like? Time will&#xA;tell.&lt;/p&gt;&#xA;&lt;p&gt;Last few months have been very productive for me. For better or worse. It&amp;rsquo;s nice to create and have&#xA;a lot of fun ideas but&amp;hellip; there is only so much time in a day. Self isolation, working from home,&#xA;etc. help save time but that means I&amp;rsquo;m working way more than before pandemic. I&amp;rsquo;ll certainly need&#xA;some quality vacation soon.&lt;/p&gt;</description>
    </item><item>
      <title>My terminal, coding workflow - i3, Kakoune, nnn</title>
      <link>https://ciesie.com/post/i3_kakoune_nnn/</link>
      <pubDate>Tue, 17 Nov 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/i3_kakoune_nnn/</guid>
      <description>&lt;p&gt;If I&amp;rsquo;m working on code or tech related tasks, I&amp;rsquo;m doing it on &lt;em&gt;Linux&lt;/em&gt;. That&amp;rsquo;s because I enjoy&#xA;spending my time in terminal. I like playing around with new command line tools and fitting&#xA;them into my workflow. Improving my process is important so I often try to update parts of&#xA;my setup. The goal is to reduce the friction between my intention and execution.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Linux&lt;/em&gt; environment is full of various tools and utilities. I&amp;rsquo;ve always been a fan of &lt;em&gt;Vim&lt;/em&gt;&#xA;but quickly found &lt;em&gt;NeoVim&lt;/em&gt;, which is an attempt to modernize &lt;em&gt;Vim&lt;/em&gt;&amp;rsquo;s codebase. &lt;em&gt;Vim&lt;/em&gt; itself&#xA;is never enough so I&amp;rsquo;ve started integrating plugins, which in turn introduced me to a lot of&#xA;smaller tools that further improved my process. Some of those tools have been substituted by&#xA;a faster and more robust alternative (usually written in &lt;em&gt;Rust&lt;/em&gt;).&lt;/p&gt;</description>
    </item><item>
      <title>Communication with Blender via Python RPC</title>
      <link>https://ciesie.com/post/blender_python_rpc/</link>
      <pubDate>Sun, 25 Oct 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/blender_python_rpc/</guid>
      <description>&lt;p&gt;My current 3D graphics setup revolves around &lt;em&gt;Blender&lt;/em&gt;, &lt;em&gt;ZBrush&lt;/em&gt; and, less often, &lt;em&gt;Marmoset Toolbag 3&lt;/em&gt;.&#xA;Transferring the meshes between &lt;em&gt;ZBrush&lt;/em&gt; and &lt;em&gt;Blender&lt;/em&gt; is the constant dance of exporting and&#xA;importing (yes, I know about &lt;em&gt;GoB&lt;/em&gt; but it&amp;rsquo;s not good enough for me). I strongly dislike this&#xA;back and forth. I feel it adds a lot of friction, throws me off and wastes a lot of time.&#xA;That makes me experiment with inter process communication. This is one of those experiments.&lt;/p&gt;</description>
    </item><item>
      <title>Flexbile Python use in Blender</title>
      <link>https://ciesie.com/post/blender_flexible_python/</link>
      <pubDate>Fri, 16 Oct 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/blender_flexible_python/</guid>
      <description>&lt;p&gt;This post is about using Python in &lt;em&gt;Blender&lt;/em&gt;. It&amp;rsquo;s not a tutorial. It&amp;rsquo;s more of an inspiration&#xA;to learn and experiment with Python.&lt;/p&gt;&#xA;&lt;p&gt;Imagine you work on a piece. The first stage is very experimental. You look for what works and what&#xA;doesn&amp;rsquo;t. At some point the piece and the process take shape. Some things become repetitive. It&amp;rsquo;s&#xA;very useful to notice those patterns early and optimize them.&lt;/p&gt;&#xA;&lt;p&gt;Lets say I&amp;rsquo;m working in &lt;em&gt;ZBrush&lt;/em&gt; and I want to render in &lt;em&gt;Blender&lt;/em&gt;. The geometry moves between&#xA;those two pretty often. Exporting and importing takes quite a few clicks. All that clicking adds&#xA;up and nibbles at my, that day&amp;rsquo;s, energy.&lt;/p&gt;</description>
    </item><item>
      <title>(Basic) Thoughts on Nim</title>
      <link>https://ciesie.com/post/thoughts_on_nim_01/</link>
      <pubDate>Mon, 31 Aug 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/thoughts_on_nim_01/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;: this is a very opinionated post. I&amp;rsquo;m not claiming I&amp;rsquo;m right. I&amp;rsquo;m describing&#xA;my observations.&lt;/p&gt;&#xA;&lt;p&gt;This is a great time when it comes to new, fun programming languages. Languages&#xA;like &lt;em&gt;Rust&lt;/em&gt;, &lt;em&gt;Zig&lt;/em&gt;, &lt;em&gt;Odin&lt;/em&gt;, &lt;em&gt;Nim&lt;/em&gt;, &lt;em&gt;Jai&lt;/em&gt; bring something new to the table. Those&#xA;are only the languages I&amp;rsquo;m keeping tabs on. There is way more projects worth following.&lt;/p&gt;&#xA;&lt;p&gt;This post is about &lt;em&gt;Nim&lt;/em&gt;. I use a lot of &lt;em&gt;Python&lt;/em&gt; and I enjoy it less and less everyday.&#xA;It&amp;rsquo;s a good language with a great standard library. The community is thriving with great&#xA;projects. &lt;em&gt;Python2&lt;/em&gt; has been put in the freezer which means that soon there will only be&#xA;one, proper &lt;em&gt;Python&lt;/em&gt; version. There is a lot of fundamental things about &lt;em&gt;Python&lt;/em&gt; that&#xA;just don&amp;rsquo;t overlap with my opinions.&lt;/p&gt;</description>
    </item><item>
      <title>Update for August, year of total chaos 2020</title>
      <link>https://ciesie.com/post/update_18082020/</link>
      <pubDate>Tue, 18 Aug 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/update_18082020/</guid>
      <description>&lt;p&gt;Close to month and a half has passed since the last update. So many things have happened during that&#xA;time. I&amp;rsquo;ll only write about tech related topics. It&amp;rsquo;s not a hard constraint but it&amp;rsquo;s also not a&#xA;personal blog about my life.&lt;/p&gt;&#xA;&lt;p&gt;The project that takes most of my free time is the custom controller for CG artists. Unfortunately&#xA;the &lt;em&gt;BLE&lt;/em&gt; version is on hold. I have not been able to fix &lt;em&gt;Windows&lt;/em&gt; pairing problems. I have bought&#xA;&lt;a href=&#34;https://www.adafruit.com/product/2267&#34;&gt;The Bluefruit LE Friend&lt;/a&gt; and uploaded the sniffer firmware.&#xA;That helps me to fix the advertising packets. I was inspired by the &lt;em&gt;Logitech&lt;/em&gt; mouse&amp;rsquo;s sniffed,&#xA;advertising packets.&lt;/p&gt;</description>
    </item><item>
      <title>Song practice app concept</title>
      <link>https://ciesie.com/post/song_practice_app/</link>
      <pubDate>Tue, 07 Jul 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/song_practice_app/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;ve ever tried to get better at playing a particular song you want to learn, you might want&#xA;to first learn it in chunks. After you feel good with those chunks you start putting it all&#xA;together. Then you realize, you still suck at some of those chunks, so you practice them.&lt;/p&gt;&#xA;&lt;p&gt;It would be nice to have a tool that works well for that process. I didn&amp;rsquo;t feel like coding today&#xA;but I needed to export this idea out of my mind so here is a quick concept I&amp;rsquo;ve put together.&lt;/p&gt;</description>
    </item><item>
      <title>Update for July, year of total chaos 2020</title>
      <link>https://ciesie.com/post/update_06072020/</link>
      <pubDate>Mon, 06 Jul 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/update_06072020/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m trying something new. I&amp;rsquo;d like to regularly write some sort of an update which explains what&#xA;I&amp;rsquo;m working on. Since this website doesn&amp;rsquo;t generate any meaningful traffic, I&amp;rsquo;m doing this for&#xA;myself. I&amp;rsquo;m not imposing any strict time frame on this. I don&amp;rsquo;t want to do this too often, since&#xA;I don&amp;rsquo;t want my blog to be full of posts like this one. I want the blog section to be useful for&#xA;weary travellers who look for answers, in this world full of questions! Anyway, lets get to it.&lt;/p&gt;</description>
    </item><item>
      <title>Adding comments system to this website</title>
      <link>https://ciesie.com/post/comments_isso/</link>
      <pubDate>Fri, 12 Jun 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/comments_isso/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve started this website with the &lt;em&gt;Beautiful Hugo&lt;/em&gt; theme. At that point in time I was learning&#xA;how &lt;em&gt;Hugo&lt;/em&gt; works. I knew I wanted to design my own theme, only because I like customizing and&#xA;designing. The theme I&amp;rsquo;m currently using was designed and written by me. I&amp;rsquo;m not a web developer&#xA;so it&amp;rsquo;s not professional quality. It&amp;rsquo;s made by me - that&amp;rsquo;s what matters. I&amp;rsquo;ve never implemented a&#xA;comments system in my own theme. That has recently changed! This website doesn&amp;rsquo;t generate, what&#xA;people in this lovely place called &amp;ldquo;internet&amp;rdquo; call, traffic. This doesn&amp;rsquo;t change a thing though.&#xA;The goal was always to share what I&amp;rsquo;ve learned. Some problems don&amp;rsquo;t deserve to be solved twice.&#xA;If I&amp;rsquo;ve struggled with something silly, you shouldn&amp;rsquo;t. What if you struggle with something I didn&amp;rsquo;t&#xA;consider to be problematic? Then you should be able to easily ask me about it. That&amp;rsquo;s the reason&#xA;why introducing comment system seemed to be worth my time.&lt;/p&gt;</description>
    </item><item>
      <title>Connecting Ender3 to WiFi with ESP32</title>
      <link>https://ciesie.com/post/ender_esp/</link>
      <pubDate>Fri, 15 May 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/ender_esp/</guid>
      <description>&lt;p&gt;If you dabble in 3D printing, you&amp;rsquo;ve probably stumbled upon the &lt;a href=&#34;https://octoprint.org/&#34;&gt;OctoPrint project&lt;/a&gt;.&#xA;It&amp;rsquo;s a web interface for your printer. It&amp;rsquo;s a very cool project with lots of features. The typical&#xA;use case is to host &lt;em&gt;OctoPrint&lt;/em&gt; on a &lt;em&gt;Raspberry PI&lt;/em&gt;. That requires a bit of fiddling around if you&#xA;want to power it from the printer&amp;rsquo;s power supply. It&amp;rsquo;s a very popular project so finding instructions&#xA;on how to do it isn&amp;rsquo;t difficult.&lt;/p&gt;</description>
    </item><item>
      <title>Microphone stand for Novox NC-1 microphone</title>
      <link>https://ciesie.com/post/mic_stand_01/</link>
      <pubDate>Sat, 02 May 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/mic_stand_01/</guid>
      <description>&lt;p&gt;I like the idea of small, weekend projects. Something small you can make in a weekend. I&amp;rsquo;ve used&#xA;the last two days to play around with an idea for a microphone stand. That&amp;rsquo;s because the microphone&#xA;stand I&amp;rsquo;ve got when buying the microphone is really, really bad. It&amp;rsquo;s unstable and can barely hold&#xA;the weight of the microphone, which in my case is the &lt;em&gt;Novox NC-1&lt;/em&gt; microphone. It&amp;rsquo;s a good entry&#xA;level microphone, which I&amp;rsquo;ve used to record most of my YouTube videos.&lt;/p&gt;</description>
    </item><item>
      <title>Learning Zig - first hour...</title>
      <link>https://ciesie.com/post/zig_learning_01/</link>
      <pubDate>Tue, 31 Mar 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/zig_learning_01/</guid>
      <description>&lt;p&gt;Today I&amp;rsquo;ve played around with &lt;em&gt;Zig&lt;/em&gt;, the new, hip (is it hip?) programming language. I find it&#xA;pretty neat. I&amp;rsquo;m going to walk you (and myself) through my first, very short, piece of code.&lt;/p&gt;&#xA;&lt;p&gt;Below you can see the entirety of it. It basically allocates a 2MB buffer and reads a file into&#xA;it&amp;hellip; Yep, not particularly impressive, but this is a judgment free, learning zone, ok?!&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-zig&#34; data-lang=&#34;zig&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;@import&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;std&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;warn&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;@import&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;std&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;debug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;warn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Allocator&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mem&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Allocator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;readFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;allocator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Allocator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;u8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;u8&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Get the full path to the file.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;resolve&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;allocator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;defer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;allocator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;free&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Open file, allocate memory of the same size as the file, read file contents into that memory.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;openFileAbsolute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f_stat&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;stat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;allocator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;alloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;u8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f_stat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;errdefer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;allocator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;free&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read_result&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;pub&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;memory&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;u8&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;undefined&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;allocator&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;heap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FixedBufferAllocator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;memory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;allocator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;warn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Lets open a file...&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.{});&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file_contents&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;readFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;allocator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;][]&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;u8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Box.gltf&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;warn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;{x}&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file_contents&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;It starts with adding files to the build process with &lt;code&gt;@import&lt;/code&gt; built-in function. What&amp;rsquo;s interesting&#xA;is that source files are implicitly structs. That&amp;rsquo;s why a typical syntax for declaring variables&#xA;applies. In &lt;em&gt;Zig&lt;/em&gt; you can define methods inside a structure definition. That basically puts the&#xA;function in a namespace with the name of that struct. So if &lt;code&gt;std&lt;/code&gt; is a struct, the methods accessed&#xA;via &lt;code&gt;std&lt;/code&gt; are just functions in that structure namespace.&lt;/p&gt;</description>
    </item><item>
      <title>Cool, new language for 2020</title>
      <link>https://ciesie.com/post/new_language_2020/</link>
      <pubDate>Sat, 28 Mar 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/new_language_2020/</guid>
      <description>&lt;p&gt;A lot of new programming languages pop up here and there. It&amp;rsquo;s a very interesting moment to pick&#xA;a new one up. The ones I&amp;rsquo;m interested in are &lt;em&gt;Rust&lt;/em&gt;, &lt;em&gt;Nim&lt;/em&gt; and &lt;em&gt;Zig&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Rust&lt;/em&gt;? Might be a good choice but it&amp;rsquo;s intimidating. I&amp;rsquo;m not convinced yet that what it brings to&#xA;the table justifies its difficulty&amp;hellip; &lt;em&gt;Nim&lt;/em&gt; is pretty cool. Don&amp;rsquo;t have that much experience writing&#xA;&lt;em&gt;Nim&lt;/em&gt; though. It has a garbage collector, which you can turn off and use your own memory management&#xA;system. I&amp;rsquo;m not a fan of garbage collection. &lt;em&gt;Zig&lt;/em&gt;? C without its problems. At least that&amp;rsquo;s how it&#xA;markets itself. I&amp;rsquo;m intrigued. There is actually a lot of interesting things &lt;em&gt;Zig&lt;/em&gt; does. I&amp;rsquo;d like&#xA;to mention some of those here and explain we &lt;em&gt;Zig&lt;/em&gt; is my pick for &lt;em&gt;what to learn 2020 edition&lt;/em&gt;.&lt;/p&gt;</description>
    </item><item>
      <title>Derotating image with EXIF orientation</title>
      <link>https://ciesie.com/post/fspy_exif_orientation/</link>
      <pubDate>Sat, 21 Mar 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/fspy_exif_orientation/</guid>
      <description>&lt;p&gt;If you want to overlay a rendered graphics on top of an image or a static video in Blender&#xA;you should use the &lt;a href=&#34;https://fspy.io&#34;&gt;fSpy&lt;/a&gt; tool. It matches the camera to specified frame&#xA;of reference. Unfortunately it doesn&amp;rsquo;t support &lt;em&gt;EXIF&lt;/em&gt; meta information. That means that&#xA;it sometimes fails to properly orient an image.&lt;/p&gt;&#xA;&lt;p&gt;When it comes to an image orientation there are two factors: how image is encoded and the&#xA;&lt;em&gt;EXIF&lt;/em&gt; orientation value. A great explanation can be found&#xA;&lt;a href=&#34;https://www.impulseadventure.com/photo/exif-orientation.html&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
    </item><item>
      <title>Pointers to pointers in C</title>
      <link>https://ciesie.com/post/pointers_c/</link>
      <pubDate>Sat, 21 Mar 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/pointers_c/</guid>
      <description>&lt;p&gt;Pointers seem to be the most confusing part about C. It takes a while to fully understand them.&#xA;As soon as you start feeling what they are about you stumble on a pointer to a pointer. Technically&#xA;not that much changes but, again, it takes a while to create a solid understanding of what&amp;rsquo;s going&#xA;on. As they say: you don&amp;rsquo;t understand something if you can&amp;rsquo;t explain it in a simple way.&lt;/p&gt;</description>
    </item><item>
      <title>Communication with Blender via sockets</title>
      <link>https://ciesie.com/post/blender_sockets/</link>
      <pubDate>Sat, 15 Feb 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/blender_sockets/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m always curious about expanding functionality and improving workflow by connecting devices to&#xA;software that I already enjoy using. I love using &lt;em&gt;Blender&lt;/em&gt; and making custom controllers for&#xA;creating computer graphics is something very interesting to me.&lt;/p&gt;&#xA;&lt;p&gt;As long as a program has a scripting environment or a plugin support, you can usually connect&#xA;anything you like to it. In one of my previous experiments I&amp;rsquo;ve added a serial communication between&#xA;&lt;em&gt;Blender&lt;/em&gt; and a custom device. It was a bit clunky, obviously. Serial communication isn&amp;rsquo;t something&#xA;you want to be run as a &lt;em&gt;Blender&lt;/em&gt;&amp;rsquo;s subprocess.&lt;/p&gt;</description>
    </item><item>
      <title>What problem does it solve?</title>
      <link>https://ciesie.com/post/solving_which_problem/</link>
      <pubDate>Sat, 08 Feb 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/solving_which_problem/</guid>
      <description>&lt;p&gt;My experience in tech industry isn&amp;rsquo;t that big. It would be something around 5 years working as a&#xA;coder. This industry moves fast, things change, new technologies emerge on daily basis. In order&#xA;to do my job well I have to constantly learn something new. I enjoy that a lot. Learning is great.&#xA;It allows you to look at the world differently than you did before.&lt;/p&gt;&#xA;&lt;p&gt;Sometimes it&amp;rsquo;s exhausting and frustrating. It&amp;rsquo;s easy to be negative towards a new framework,&#xA;programming language or a build system, when it&amp;rsquo;s new and alien to you. In this industry you should&#xA;be sceptical. We are already drowning in a sea of a complexity, and when we can barely keep our&#xA;heads above the water we tend to save ourselves by adding another layer of abstraction.&lt;/p&gt;</description>
    </item><item>
      <title>SparkFun Thing Plus - Ambiq Apollo3 - part 1</title>
      <link>https://ciesie.com/post/sparkfun_thing_plus_part1/</link>
      <pubDate>Fri, 29 Nov 2019</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/sparkfun_thing_plus_part1/</guid>
      <description>&lt;p&gt;Driven by the idea of building a &lt;em&gt;Bluetooth&lt;/em&gt; keyboard like device, I&amp;rsquo;ve bought the &lt;em&gt;SparkFun Artemis Thing&#xA;Plus&lt;/em&gt; board. It&amp;rsquo;s a board designed for small, power efficient devices with &lt;em&gt;Bluetooth&lt;/em&gt; capability.&lt;/p&gt;&#xA;&#xA;&lt;div id=&#34;__3d_scene&#34; style=&#34;margin: auto; width: 100%;&#34;&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;script type=&#34;module&#34;&gt;&#xA;import * as THREE from &#39;https://cdn.skypack.dev/three@0.129.0/build/three.module.js&#39;;&#xA;import { GLTFLoader } from &#39;https://cdn.skypack.dev/three@0.129.0/examples/jsm/loaders/GLTFLoader.js&#39;;&#xA;&#xA;var insertPoint = document.getElementById(&#34;__3d_scene&#34;);&#xA;&#xA;var loader = new GLTFLoader();&#xA;var scene = new THREE.Scene();&#xA;var gltfScene = null;&#xA;const FOV = 25;&#xA;&#xA;const gltfSceneFilePath = &#34;https://ciesie.com/models/artemis_sparkfun.glb&#34;;&#xA;&#xA;loader.load(gltfSceneFilePath,&#xA;  function ( gltf ) {&#xA;    gltfScene = gltf.scene;&#xA;    scene.add( gltfScene );&#xA;  },&#xA;  undefined,&#xA;  function ( error ) {&#xA;    gltfScene = null;&#xA;    console.error( error );&#xA;  }&#xA;);&#xA;&#xA;const W = 640;&#xA;const H = 640 * 0.75;&#xA;var camera = new THREE.PerspectiveCamera(FOV, W/H, 0.1, 1000 );&#xA;&#xA;var light = new THREE.DirectionalLight( 0xffffff, 2.2 );&#xA;light.position.set( 0, 10, 0 );&#xA;scene.add( light );&#xA;var lightAmbient = new THREE.AmbientLight(0xffffff, 1.2);&#xA;scene.add( lightAmbient );&#xA;&#xA;var renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });&#xA;renderer.setSize(W, H);&#xA;insertPoint.appendChild(renderer.domElement);&#xA;&#xA;camera.position.z = 10;&#xA;camera.position.y = 13;&#xA;camera.lookAt(0, 0, 0);&#xA;&#xA;function resizeCanvasToDisplaySize() {&#xA;  const canvas = renderer.domElement;&#xA;  const widthTarget = insertPoint.getBoundingClientRect().width;&#xA;  const heightTarget = 0.75 * widthTarget;&#xA;&#xA;  if (canvas.width !== widthTarget || canvas.height !== heightTarget)&#xA;  {&#xA;    renderer.setSize(widthTarget, heightTarget, true);&#xA;    camera.aspect = widthTarget/heightTarget;&#xA;    camera.updateProjectionMatrix();&#xA;  }&#xA;}&#xA;&#xA;var animate = function () {&#xA;  resizeCanvasToDisplaySize();&#xA;  requestAnimationFrame( animate );&#xA;&#xA;  if ( gltfScene !== null )&#xA;  {&#xA;    gltfScene.rotation.y += 0.01;&#xA;  }&#xA;&#xA;  renderer.render( scene, camera );&#xA;};&#xA;&#xA;animate();&#xA;&lt;/script&gt;&#xA;&#xA;&lt;p&gt;The board carries an &lt;em&gt;Ambiq Apollo3&lt;/em&gt; processor. It&amp;rsquo;s an &lt;em&gt;ARM Cortex-M4F&lt;/em&gt; chip. Runs at 48MHz but&#xA;can, for a brief amount of time, go up to 96MHz. &lt;a href=&#34;https://www.ambiqmicro.com/mcu/&#34;&gt;Here&lt;/a&gt; you can&#xA;read more about the whole &lt;em&gt;Apollo&lt;/em&gt; line-up.&lt;/p&gt;</description>
    </item><item>
      <title>Blender - text with scanlines</title>
      <link>https://ciesie.com/post/blender_text_scanlines/</link>
      <pubDate>Fri, 20 Sep 2019</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/blender_text_scanlines/</guid>
      <description>&lt;p&gt;With the release of &lt;strong&gt;Blender 2.8&lt;/strong&gt; I went back to messing around with graphics.&#xA;I would like to be able to replicate some of the, already existing, effects.&#xA;Nothing fancy. Nothing new. At the same time looking&amp;hellip; good! I also would like&#xA;to explain the process to learn and improve.&lt;/p&gt;&#xA;&lt;p&gt;Lets look at a text with some scanlines.&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;div style=&#34;width: auto; height: auto; margin-left: auto; margin-right: auto;&#34;&gt;&#xA;  &lt;figure itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;&#xA;&#xA;    &lt;a href=&#34;https://ciesie.com/imgs/4905f8_final.png&#34;&gt;&#xA;      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://ciesie.com/imgs/4905f8_final.png&#34; alt=&#34;...&#34; style=&#34;max-width: 100%; height: auto; object-fit: scale-down;&#34;&gt;&#xA;    &lt;/a&gt;&#xA;&#xA;  &lt;/figure&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;The scene is pretty basic, text object and a scaled cube with an array modifier.&#xA;Both objects have their own &lt;em&gt;Collection&lt;/em&gt;. Each of them are also living in their&#xA;own &lt;em&gt;View Layers&lt;/em&gt;. That allows for separate rendering of the objects and easier&#xA;composition.&lt;/p&gt;</description>
    </item><item>
      <title>Debugging image resources</title>
      <link>https://ciesie.com/post/gdb_images/</link>
      <pubDate>Thu, 27 Jun 2019</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/gdb_images/</guid>
      <description>&lt;p&gt;I work a lot with image processing. There is a lot of transformations and sub&#xA;images extraction. Often, it would be great to actually see those images when&#xA;debugging. Quick Google search pointed me to the &lt;code&gt;dump&lt;/code&gt; command present in &lt;code&gt;gdb&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In short, to get the memory dump, you would do something like this:&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$source&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;pointer_to_the_memory&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$size_of_the_dump&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dump memory filename.bin &lt;span class=&#34;nv&#34;&gt;$source&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$source&lt;/span&gt;+size_of_the_dump&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;You have to know the size of your data. For an image it means: width, height,&#xA;color depth.&lt;/p&gt;</description>
    </item><item>
      <title>Node based GUI app</title>
      <link>https://ciesie.com/post/node_based_gui/</link>
      <pubDate>Sun, 16 Jun 2019</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/node_based_gui/</guid>
      <description>&lt;p&gt;Inspired by a horrible Jenkins CI workflow I thought about a GUI app that could&#xA;help compose and request/monitor CI jobs. Node based GUI seemed like an&#xA;interesting option for that. I&amp;rsquo;ve tested several technological stack to develop&#xA;something like that and here are my observations.&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;div style=&#34;width: auto; height: auto; margin-left: auto; margin-right: auto;&#34;&gt;&#xA;  &lt;figure itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;&#xA;&#xA;    &lt;a href=&#34;https://ciesie.com/imgs/929caa_concept.jpg&#34;&gt;&#xA;      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://ciesie.com/imgs/929caa_concept.jpg&#34; alt=&#34;...&#34; style=&#34;max-width: 100%; height: auto; object-fit: scale-down;&#34;&gt;&#xA;    &lt;/a&gt;&#xA;&#xA;  &lt;/figure&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;nodes-in-haxeheaps&#34;&gt;Nodes in Haxe/Heaps&lt;a href=&#34;#nodes-in-haxeheaps&#34;&gt; &amp;lt;&lt;/a&gt;&#xA;  &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve started with testing &lt;strong&gt;Haxe&lt;/strong&gt; + &lt;strong&gt;Heaps&lt;/strong&gt;. I like the flexibility &lt;strong&gt;Haxe&lt;/strong&gt; gives.&#xA;Outputting a web app based on &lt;em&gt;JavaScript&lt;/em&gt; is pretty easy. Unfortunately &lt;strong&gt;Heaps&lt;/strong&gt;&#xA;engine can&amp;rsquo;t be easily outputted as a &lt;em&gt;C++&lt;/em&gt; target.&lt;/p&gt;</description>
    </item><item>
      <title>Black magic probe out of cheap STLink programmers</title>
      <link>https://ciesie.com/post/black_magic_probe_stlink/</link>
      <pubDate>Thu, 03 Jan 2019</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/black_magic_probe_stlink/</guid>
      <description>&lt;p&gt;If you have ever worked with &lt;strong&gt;ARM Cortex M&lt;/strong&gt; processors you&amp;rsquo;ve probably used &lt;strong&gt;GDB&lt;/strong&gt; +&#xA;&lt;strong&gt;OpenOCD&lt;/strong&gt; combo for debugging. If you didn&amp;rsquo;t: &lt;strong&gt;OpenOCD&lt;/strong&gt; connects to the processor&#xA;via a &lt;strong&gt;STLink&lt;/strong&gt; programmer and opens a socket to which &lt;strong&gt;GDB&lt;/strong&gt; can connect. It will push&#xA;data necessary for debugging (and understandable for &lt;strong&gt;GDB&lt;/strong&gt;) through this socket.&#xA;That means that if you connect &lt;strong&gt;GDB&lt;/strong&gt; to this socket (so called remote debugging)&#xA;you can debug processor&amp;rsquo;s software like any other application on your PC.&lt;/p&gt;</description>
    </item><item>
      <title>Using txti.es &#43; Python as a data dashboard</title>
      <link>https://ciesie.com/post/txti_python/</link>
      <pubDate>Sun, 30 Dec 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/txti_python/</guid>
      <description>&lt;p&gt;Have you ever heard about &lt;a href=&#34;http://txti.es&#34;&gt;txti.es&lt;/a&gt;? It&amp;rsquo;s a basic web page creator. You can basically&#xA;create a very simple website by typing content into a form. I thought it might be used as a&#xA;very simple frontend.&lt;/p&gt;&#xA;&lt;p&gt;I always dabbled with automation. An example would be a scraping script that gets the job&#xA;postings from a specific website or one that checks when the bus I take every morning leaves&#xA;and sends this information by e-mail.&lt;/p&gt;</description>
    </item><item>
      <title>Creators responsibility</title>
      <link>https://ciesie.com/post/creators_responsibility/</link>
      <pubDate>Tue, 04 Dec 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/creators_responsibility/</guid>
      <description>&lt;p&gt;Recently I&amp;rsquo;ve enjoyed reading blog posts by &lt;a href=&#34;https://twitter.com/nikitonsky&#34;&gt;Nikita&lt;/a&gt;.&#xA;You can find the blog &lt;a href=&#34;tonksy.me&#34;&gt;here&lt;/a&gt;. One blog post I see quoted often is&#xA;&lt;a href=&#34;tonsky.me/blog/disenchantment&#34;&gt;this&lt;/a&gt; one (you can read it in 6 languages - that&#xA;says something). It&amp;rsquo;s about the disastrous state of current software development.&lt;/p&gt;&#xA;&lt;p&gt;The author brings a lot of good points. The message is that no one puts effort&#xA;into making software performant. We solve problems by adding complexity, never&#xA;actually solving the root cause. This comes at a cost. It&amp;rsquo;s all a slow, bloated&#xA;and complicated mess. Hard to disagree.&lt;/p&gt;</description>
    </item><item>
      <title>Setting up a PiHole</title>
      <link>https://ciesie.com/post/setting_pihole/</link>
      <pubDate>Sat, 17 Nov 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/setting_pihole/</guid>
      <description>&lt;h2 id=&#34;whats-a-pihole&#34;&gt;What&amp;rsquo;s a &lt;strong&gt;PiHole&lt;/strong&gt;?&lt;a href=&#34;#whats-a-pihole&#34;&gt; &amp;lt;&lt;/a&gt;&#xA;  &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;It&amp;rsquo;s basically a DNS sinkhole. DNS servers resolve domain names into IPs. DNS&#xA;sinkholes are basically faulty DNS servers. For example when you go to a website&#xA;your web browser will also download ads. In order to get them it has to&#xA;resolve the domain name of the ads provider into an IP. That&amp;rsquo;s what DNS server&#xA;does. &lt;strong&gt;PiHole&lt;/strong&gt; is just a local DNS server which say &amp;rsquo;nah&amp;rsquo; when you ask it to serve&#xA;a content from a blacklisted provider. You can add domains to the blacklist banning&#xA;their content but you can also whitelist those you want to support.&lt;/p&gt;</description>
    </item><item>
      <title>Setting your pc for remote access</title>
      <link>https://ciesie.com/post/pc_remote_access/</link>
      <pubDate>Sat, 13 Oct 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/pc_remote_access/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m not sure I need it. Maybe you will. It is an exercise in excess.&#xA;I rarely need something from my home PC because nowadays it&amp;rsquo;s so easy&#xA;to store things in the &lt;em&gt;magical cloud&lt;/em&gt;. Still, it&amp;rsquo;s a nice exercise.&lt;/p&gt;&#xA;&lt;p&gt;I have set up remote access on &lt;em&gt;Void Linux&lt;/em&gt; and I will describe the&#xA;process of doing so for that OS. You might encounter some problems&#xA;if you are using &lt;em&gt;Windows&lt;/em&gt;&amp;hellip; but if you do you have bigger things to&#xA;worry about (writing this around the time &lt;em&gt;M$&lt;/em&gt; update for &lt;em&gt;Windows&lt;/em&gt; bricked&#xA;some users&amp;rsquo; computers.&lt;/p&gt;</description>
    </item><item>
      <title>[STM32] - part 3 - Start your engine!</title>
      <link>https://ciesie.com/post/stm32_part3/</link>
      <pubDate>Tue, 19 Jun 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/stm32_part3/</guid>
      <description>&lt;p&gt;I think it&amp;rsquo;s time to go through what happens when you power on the &lt;strong&gt;STM32 Cortex-M&lt;/strong&gt; microcontroller.&#xA;There is a lot of resources on this topic (if you are reading this one&amp;hellip; thank you!).&#xA;I will explain this process in my own words.&lt;/p&gt;&#xA;&lt;p&gt;You have powered on your microcontroller. Less than a second has passed and it is already munching&#xA;through data, sending and receiving messages, controlling motors and blinking leds. In less than a&#xA;second (waaaay less) the micro sets everything up for it, to do everything you programmed it to do.&#xA;So what&amp;rsquo;s the process?&lt;/p&gt;</description>
    </item><item>
      <title>Shortcomings of todays human-computer interaction</title>
      <link>https://ciesie.com/post/shortcomings_of_human_computer_interaction/</link>
      <pubDate>Mon, 11 Jun 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/shortcomings_of_human_computer_interaction/</guid>
      <description>&lt;p&gt;I have spent a lot of time in front of a computer. That&amp;rsquo;s because you can do a lot of amazing stuff&#xA;with it. I don&amp;rsquo;t think I enjoy the process that much though. Sometimes there is so much clicking and&#xA;pointing to do simple stuff. I don&amp;rsquo;t think I would code without using &lt;em&gt;VIM&lt;/em&gt; or at least adding &lt;em&gt;VIM&lt;/em&gt;&#xA;bindings to the text editor I&amp;rsquo;m using. I just can&amp;rsquo;t use mouse when I code. Coding is discrete.&#xA;Smallest unit of code is a letter. If you use the mouse to move the cursor in your text editor you&#xA;actually move over space that doesn&amp;rsquo;t interest you, like letters themselves. What you are actually&#xA;after are the spaces between letters. Using only keyboard puts you in this discrete space you are&#xA;after - with keyboard you can move exactly one letter at a time by adding, removing or moving over&#xA;a letter. &lt;em&gt;VIM&lt;/em&gt; bindings expand this by giving you motions, simplest being moving over words.&#xA;When you code, your tool is the keyboard. We all know how keyboard looks and what should it do&amp;hellip; do we?&lt;/p&gt;</description>
    </item><item>
      <title>[Knowledge snippet] - STM32 bootloader</title>
      <link>https://ciesie.com/post/stm32_bootloader/</link>
      <pubDate>Sat, 09 Jun 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/stm32_bootloader/</guid>
      <description>&lt;p&gt;You programmed STM32 microcontroller using Nucleo or Discovery boards. That means you used&#xA;&lt;em&gt;Serial Wire Debug&lt;/em&gt; (&lt;em&gt;SWD&lt;/em&gt;) for programming/debugging. Now, you are designing a PCB with a STM32&#xA;microcontroller on it, which means you have to be able to program it. One solution is uploading&#xA;the code through a &lt;em&gt;bootloader&lt;/em&gt; - a small piece of software, made by &lt;em&gt;ST&lt;/em&gt; that has been saved in the&#xA;protected (read-only) memory of the microcontroller. It&amp;rsquo;s a simple program which reads data, sent&#xA;from the host (PC) using a specific protocol, and saves it into &lt;em&gt;FLASH&lt;/em&gt; memory.&lt;/p&gt;</description>
    </item><item>
      <title>[STM32] - part 2 - Lets look inside!</title>
      <link>https://ciesie.com/post/stm32_part2/</link>
      <pubDate>Fri, 27 Apr 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/stm32_part2/</guid>
      <description>&lt;p&gt;Still wondering why it all works? Why this black square does things? Lets go deeper.&lt;/p&gt;&#xA;&lt;p&gt;Previously I explained a bit about processor architecture. It&amp;rsquo;s the basis of the chip. It&amp;rsquo;s a&#xA;fundament. You won&amp;rsquo;t find anything about an UART in a&#xA;&lt;a href=&#34;http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0439b/ch01s05s01.html&#34;&gt;Technical Reference Manual of &lt;em&gt;Cortex-M4&lt;/em&gt;&lt;/a&gt;.&#xA;It&amp;rsquo;s just not a part of this fundament.&lt;/p&gt;&#xA;&lt;p&gt;When you get an &lt;em&gt;STM32&lt;/em&gt; microcontroller based on the &lt;em&gt;Cortex-M4&lt;/em&gt; architecture you just get&#xA;microcontroller made by &lt;em&gt;ST&lt;/em&gt; which uses this specific architecture. What stops them to add to it?&#xA;Nothing. That&amp;rsquo;s why you can find so many different models of families and models of processors.&#xA;Just look at &lt;em&gt;ST&amp;rsquo;s F&lt;/em&gt; and &lt;em&gt;ST&amp;rsquo;s L&lt;/em&gt; series. They are both &lt;em&gt;ARM Cortex-M&lt;/em&gt; but they do differ in many ways.&lt;/p&gt;</description>
    </item><item>
      <title>[STM32] - part 1 - Cortex what...?</title>
      <link>https://ciesie.com/post/stm32_part1/</link>
      <pubDate>Tue, 10 Apr 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/stm32_part1/</guid>
      <description>&lt;p&gt;Recently I wrote a short article about setting up an environment for programming &lt;em&gt;STM32&lt;/em&gt; microcontrollers&#xA;with the &lt;em&gt;libopencm3&lt;/em&gt; library. You can read it &lt;a href=&#34;https://ciesie.com/post/libopencm3_part1/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I wanted to write the second part as soon as possible but I found out that even though I could, I&#xA;didn&amp;rsquo;t understand everything well enough. I just didn&amp;rsquo;t feel comfortable with the subject. That&amp;rsquo;s&#xA;why I started this series. I want to explore what actually happens when you program a &lt;em&gt;STM32&lt;/em&gt;&#xA;microcontroller.&lt;/p&gt;</description>
    </item><item>
      <title>Adventures in libopencm3 - part 1</title>
      <link>https://ciesie.com/post/libopencm3_part1/</link>
      <pubDate>Sat, 31 Mar 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/libopencm3_part1/</guid>
      <description>&lt;p&gt;Recently, I&amp;rsquo;ve started working on a new project. It will take some time before the goal of the&#xA;project is even worth mentioning. The important part is that it is an electronics/hardware&#xA;project and it needs an energy efficient computing unit.&lt;/p&gt;&#xA;&lt;p&gt;For early development I chose an &lt;strong&gt;ARM Cortex M3 STM32F3&lt;/strong&gt; microcontroller. More precisely&#xA;&lt;strong&gt;STM32F303K8T6&lt;/strong&gt;, mostly because I have a &lt;strong&gt;Nucleo&lt;/strong&gt; board, with this chip, laying around.&#xA;It&amp;rsquo;s also a good time to try a new framework. Choices worth considering:&lt;/p&gt;</description>
    </item><item>
      <title>Compiling Raylib programs with SCons</title>
      <link>https://ciesie.com/post/building_raylib_with_scons/</link>
      <pubDate>Sun, 18 Mar 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/post/building_raylib_with_scons/</guid>
      <description>&lt;p&gt;If you like writing programs in C, are interested in game development and don&amp;rsquo;t enjoy all those&#xA;complicated and ancient build systems I think I&amp;rsquo;ve got something of interest to you. I belive there&#xA;is something enjoyable in the simple setup I&amp;rsquo;m describing below. Hope you will enjoy as well.&lt;/p&gt;&#xA;&lt;h2 id=&#34;raylib&#34;&gt;Raylib&lt;a href=&#34;#raylib&#34;&gt; &amp;lt;&lt;/a&gt;&#xA;  &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.raylib.com/&#34;&gt;Raylib&lt;/a&gt; is a C library made by &lt;a href=&#34;https://twitter.com/raysan5&#34;&gt;@Ray San&lt;/a&gt;.&#xA;On the Raylib&amp;rsquo;s website it says &amp;lsquo;&lt;em&gt;raylib is a simple and easy-to-use library to learn video games programming&lt;/em&gt;&amp;rsquo;.&#xA;Whole API can be browsed &lt;a href=&#34;https://www.raylib.com/cheatsheet/cheatsheet.html&#34;&gt;here&lt;/a&gt;.&#xA;It does abstract a lot of things important for game developement. It&amp;rsquo;s important to note because if&#xA;you chose to write something in C, performance is something you might care about.&#xA;High level abstraction usually takes a toll on performance. In this case mostly because you are not&#xA;tuning small parts of your code to suit your needs. Raylib wants to abstract those parts to make the&#xA;learning easier. In the end you have the power of C (which basically allows you to write &lt;em&gt;performant&lt;/em&gt; code)&#xA;and high level abstraction Raylib library provides you.&#xA;That&amp;rsquo;s a good starting point to write cool software, enjoyable for the end user.&lt;/p&gt;</description>
    </item><item>
      <title>Naive comments system</title>
      <link>https://ciesie.com/project/naive_comments/</link>
      <lastBuildDate>Thu, 15 Jan 2026 11:05:25 +0100</lastBuildDate>
      <pubDate>Sat, 02 Dec 2023</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/project/naive_comments/</guid>
      <description>&lt;p&gt;This website used &lt;a href=&#34;https://cactus.chat/&#34;&gt;Cactus&lt;/a&gt; comments system, which leverages&#xA;Matrix protocol. It was a nice little experiment but it&amp;rsquo;s a half baked project, which&#xA;didn&amp;rsquo;t grow in the last few years. I have decided to make my own comment system.&#xA;Something as simple as possible, where comments are stored in the most universal way possible.&#xA;Because systems change, but data? Data is forever.&lt;/p&gt;&#xA;&lt;p&gt;The simplest comment system is an interface to send text data, a way to store it in a&#xA;structured manner and an interface to retrieve that data or its subset, to present it.&lt;/p&gt;</description>
    </item><item>
      <title>1S Li-Po battery charger</title>
      <link>https://ciesie.com/project/lipo_charger/</link>
      <lastBuildDate>Tue, 25 Jun 2024 14:12:46 +0200</lastBuildDate>
      <pubDate>Mon, 10 Oct 2022</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/project/lipo_charger/</guid>
      <description>&lt;p&gt;One day I hope to design a product with quality of a commercial product. I do not feel I can go&#xA;through the entire process by myself. While I might never be able to do that, I still want to&#xA;close as much of that gap as possible.&lt;/p&gt;&#xA;&lt;p&gt;This time the exercise was to design a PCB that can charge a 1S Li-Po battery. The design is not&#xA;a product of my lacking, electronics knowledge. It&amp;rsquo;s a modified design of the &lt;a href=&#34;https://github.com/particle-iot/xenon&#34;&gt;Particle Xenon&lt;/a&gt;&#xA;board. Unfortunately, Particle doesn&amp;rsquo;t produce these boards anymore. I managed to buy two of them&#xA;some time ago. I find those great for &lt;em&gt;BLE&lt;/em&gt; prototyping.&lt;/p&gt;</description>
    </item><item>
      <title>MagKnob</title>
      <link>https://ciesie.com/project/magknob/</link>
      <lastBuildDate>Sun, 13 Aug 2023 17:34:08 +0200</lastBuildDate>
      <pubDate>Fri, 05 Nov 2021</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/project/magknob/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s control volume with a (moderately) fancy knob!&lt;/p&gt;&#xA;&lt;div style=&#34;max-width: 90%; margin-left: auto; margin-right: auto;&#34;&gt;&#xA;&lt;video  style=&#34;width: 100%; max-height: 640px;&#34; controls&gt;&#xA;&lt;source src=&#34;a72bc5_magknobVolume.mp4&#34; type=&#34;video/mp4&#34;&gt;&#xA;&lt;/video&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://ams.com/as5601&#34;&gt;AS5601&lt;/a&gt; might be my favourite sensor right now. It&amp;rsquo;s an on-axis magnetic&#xA;rotary position sensor. It generates a signal typical for encoders, but it does it by detecting the&#xA;change in a magnetic field of a diametrically magnetized, rotating magnet.&lt;/p&gt;&#xA;&#xA;&lt;div id=&#34;__3d_scene&#34; style=&#34;margin: auto; width: 100%;&#34;&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;script type=&#34;module&#34;&gt;&#xA;import * as THREE from &#39;https://cdn.skypack.dev/three@0.129.0/build/three.module.js&#39;;&#xA;import { OrbitControls } from &#39;https://cdn.skypack.dev/three@0.129.0/examples/jsm/controls/OrbitControls.js&#39;;&#xA;import { GLTFLoader } from &#39;https://cdn.skypack.dev/three@0.129.0/examples/jsm/loaders/GLTFLoader.js&#39;;&#xA;import { RGBELoader } from &#39;https://cdn.skypack.dev/three@0.129.0/examples/jsm/loaders/RGBELoader.js&#39;;&#xA;&#xA;var insertPoint = document.getElementById(&#34;__3d_scene&#34;);&#xA;&#xA;&#xA;let camera, scene, renderer;&#xA;const W = 640;&#xA;const H = 640 * 0.75;&#xA;const FOV = 25;&#xA;&#xA;renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });&#xA;renderer.setSize(W, H);&#xA;renderer.toneMapping = THREE.ACESFilmicToneMapping;&#xA;renderer.toneMappingExposure = 1.0;&#xA;renderer.outputEncoding = THREE.sRGBEncoding;&#xA;insertPoint.appendChild(renderer.domElement);&#xA;&#xA;scene = new THREE.Scene();&#xA;var gltfScene = null;&#xA;&#xA;const gltfSceneFilePath = &#34;https://ciesie.com/models/as5601_adapter_board.glb&#34;;&#xA;&#xA;function init() {&#xA;  camera = new THREE.PerspectiveCamera(FOV, W/H, 0.1, 1000 );&#xA;  camera.position.z = 2.5;&#xA;  camera.position.y = 1.8;&#xA;  camera.lookAt(0, .3, 0);&#xA;&#xA;  &#xA;&#xA;&#xA;  var pmremGenerator = new THREE.PMREMGenerator(renderer);&#xA;  &#xA;  pmremGenerator.compileEquirectangularShader();&#xA;&#xA;  new RGBELoader().load(&#34;/models/phalzer_forest_01_1k.hdr&#34;, function (texture) {&#xA;    texture.mapping = THREE.EquirectangularReflectionMapping;&#xA;&#xA;    var radianceMap = pmremGenerator.fromEquirectangular(texture).texture;&#xA;    pmremGenerator.dispose();&#xA;&#xA;    scene.environment = radianceMap;&#xA;    &#xA;  } );&#xA;&#xA;  var matPlastic = new THREE.MeshStandardMaterial({color: 0x0a0a0c, roughness: 0.55, metalness: 0.0});&#xA;&#xA;  const loader = new GLTFLoader();&#xA;  loader.load(gltfSceneFilePath, function ( gltf ) {&#xA;    scene.add(gltf.scene);&#xA;    gltfScene = gltf.scene;&#xA;&#xA;    &#xA;    gltfScene.rotation.y = 2.4;&#xA;&#xA;    &#xA;    gltfScene.traverse(function (child) {&#xA;      &#xA;      if (child.isMesh) {&#xA;        if (child.name == &#34;magknob_base&#34;) {&#xA;          child.material = matPlastic&#xA;        }&#xA;        if (child.name == &#34;magknob_knob&#34;) {&#xA;          child.material = matPlastic&#xA;        }&#xA;        if (child.name == &#34;magknob_tunnel&#34;) {&#xA;          child.material = matPlastic&#xA;        }&#xA;        if (child.name == &#34;magknob_bearing&#34;) {&#xA;          child.material = matPlastic&#xA;        }&#xA;      }&#xA;    } );&#xA;&#xA;  } );&#xA;&#xA;  &#xA;  &#xA;}&#xA;&#xA;&#xA;function resizeCanvasToDisplaySize() {&#xA;  const canvas = renderer.domElement;&#xA;  const widthTarget = insertPoint.getBoundingClientRect().width;&#xA;  const heightTarget = 0.75 * widthTarget;&#xA;&#xA;  if (canvas.width !== widthTarget || canvas.height !== heightTarget)&#xA;  {&#xA;    renderer.setSize(widthTarget, heightTarget, true);&#xA;    camera.aspect = widthTarget/heightTarget;&#xA;    camera.updateProjectionMatrix();&#xA;  }&#xA;}&#xA;&#xA;function animate() {&#xA;  resizeCanvasToDisplaySize();&#xA;  requestAnimationFrame( animate );&#xA;&#xA;  if ( gltfScene !== null )&#xA;  {&#xA;    gltfScene.rotation.y += 0.01;&#xA;  }&#xA;&#xA;  renderer.render( scene, camera );&#xA;};&#xA;&#xA;init();&#xA;animate();&#xA;&#xA;&lt;/script&gt;&#xA;&#xA;&lt;p&gt;The knob acts as a USB HID device. That means that, currently, it can do everything that a 2 button&#xA;keyboard could do.&lt;/p&gt;</description>
    </item><item>
      <title>Website... this website</title>
      <link>https://ciesie.com/project/this_website/</link>
      <lastBuildDate>Fri, 09 May 2025 13:40:41 +0200</lastBuildDate>
      <pubDate>Fri, 05 Nov 2021</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/project/this_website/</guid>
      <description>&lt;p&gt;You should start a website. It&amp;rsquo;s quite fun!&lt;/p&gt;</description>
    </item><item>
      <title>Bluetooth Graphics Controller</title>
      <link>https://ciesie.com/project/ble_graphics_controller/</link>
      <lastBuildDate>Fri, 09 May 2025 20:43:02 +0200</lastBuildDate>
      <pubDate>Sat, 06 Jun 2020</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/project/ble_graphics_controller/</guid>
      <description>&lt;h2 id=&#34;process&#34;&gt;Process&lt;a href=&#34;#process&#34;&gt; &amp;lt;&lt;/a&gt;&#xA;  &#xA;&lt;/h2&gt;</description>
    </item><item>
      <title>Time tracker</title>
      <link>https://ciesie.com/project/time_tracker/</link>
      <lastBuildDate>Fri, 25 Oct 2024 14:12:50 +0200</lastBuildDate>
      <pubDate>Tue, 21 May 2019</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/project/time_tracker/</guid>
      <description>&lt;h2 id=&#34;this-is-a-work-in-progress&#34;&gt;THIS IS A WORK IN PROGRESS&lt;a href=&#34;#this-is-a-work-in-progress&#34;&gt; &amp;lt;&lt;/a&gt;&#xA;  &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Below you will find log entries that describe the design/thinking process.&lt;/p&gt;&#xA;&lt;h2 id=&#34;idea&#34;&gt;Idea&lt;a href=&#34;#idea&#34;&gt; &amp;lt;&lt;/a&gt;&#xA;  &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The goal is to build a device that could allow me to comfortably measure time spent on a&#xA;project. I want to have a full history of the time spent on particular project. The time log&#xA;needs to be plain text, easily queried and human readable.&lt;/p&gt;&#xA;&lt;h2 id=&#34;process&#34;&gt;Process&lt;a href=&#34;#process&#34;&gt; &amp;lt;&lt;/a&gt;&#xA;  &#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;date-decorate&#34; style=&#34;margin-left:auto; margin-right:auto; text-align:center; color: #d30054&#34;&gt;&#xA;  &lt;img src=&#34;https://ciesie.com/imgs/triangle.svg&#34; style=&#34;transform: rotate(180deg); margin-top: 0px; height: 1em;&#34;&gt;&#xA;  &lt;div style=&#34;margin-top: 0px;&#34;&gt;2023-08-23&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;And here we go with another attempt at prototyping this device. 3D printing is great, as long as it&#xA;works. Any 3D printer issues can derail the entire process - I&amp;rsquo;m not here to practice my 3D&#xA;printing troubleshooting skills. Another thing about 3D prints is that they&amp;rsquo;re not a good base to&#xA;further refine the printed prototype. It&amp;rsquo;s a plastic shell and there&amp;rsquo;s not much you can do to&#xA;modify its shape, without redesigning and reprinting. There&amp;rsquo;s definitely way more to prototyping&#xA;than 3D printing.&lt;/p&gt;</description>
    </item><item>
      <title>Fuel gauge - Godot Engine</title>
      <link>https://ciesie.com/project/fuel_gauge_godot/</link>
      <lastBuildDate>Sat, 01 Jul 2023 20:01:55 +0200</lastBuildDate>
      <pubDate>Sun, 07 Apr 2019</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/project/fuel_gauge_godot/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve made a small visualization of a motorcycle fuel gauge in&#xA;&lt;strong&gt;&lt;a href=&#34;https://godotengine.org&#34;&gt;Godot engine&lt;/a&gt;&lt;/strong&gt;. It allows you to disassemble the gauge&#xA;and learn what&amp;rsquo;s inside without actually buying a motorcycle&amp;hellip; I did&#xA;that for you&amp;hellip;&lt;/p&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/iHdwGIxK8PU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;</description>
    </item><item>
      <title>Wii Nunchuk as a USB HID controller</title>
      <link>https://ciesie.com/project/wii_nunchuk_usb_controller/</link>
      <lastBuildDate>Tue, 22 Aug 2023 18:05:58 +0200</lastBuildDate>
      <pubDate>Sat, 02 Feb 2019</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/project/wii_nunchuk_usb_controller/</guid>
      <description>&lt;h1 id=&#34;tldr&#34;&gt;TL;DR&lt;a href=&#34;#tldr&#34;&gt; &amp;lt;&lt;/a&gt;&#xA;  &#xA;&lt;/h1&gt;&#xA;&lt;p&gt;You can find the source code &lt;a href=&#34;https://gitlab.com/bluewii&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I used the Wii Nunchuk controller to prototype one handed controller for creating&#xA;computer graphics. I used the &lt;strong&gt;Blue Pill&lt;/strong&gt; board which carries a &lt;strong&gt;STM32F1&lt;/strong&gt;&#xA;microcontroller with a &lt;strong&gt;built-in USB peripheral&lt;/strong&gt;. That allowed me to implement&#xA;it as a true &lt;strong&gt;USB HID (Human Interface Device)&lt;/strong&gt; for the &lt;strong&gt;Windows OS&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The results were disappointing. My &lt;strong&gt;USB HID&lt;/strong&gt; implementation was poor. I have fixed&#xA;several important bugs in &lt;a href=&#34;http://ciesie.com/project/ble_graphics_controller/&#34;&gt;another project&lt;/a&gt;.&lt;/p&gt;</description>
    </item><item>
      <title>Capacitive buttons keyboard</title>
      <link>https://ciesie.com/project/capacitive_buttons_keyboard/</link>
      <lastBuildDate>Fri, 09 May 2025 20:43:02 +0200</lastBuildDate>
      <pubDate>Thu, 05 Jul 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/project/capacitive_buttons_keyboard/</guid>
      <description>&lt;p&gt;A video showing the a keyboard made with capacitive buttons.&lt;/p&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/703gc3oGjSU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;cap_buttons.ino&#34;&gt;Source code&lt;/a&gt;&lt;/p&gt;</description>
    </item><item>
      <title>Blender analog controller</title>
      <link>https://ciesie.com/project/blender_three_knobs_controller/</link>
      <lastBuildDate>Wed, 31 Dec 2025 16:26:35 +0100</lastBuildDate>
      <pubDate>Wed, 13 Jun 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/project/blender_three_knobs_controller/</guid>
      <description>&lt;p&gt;In the digital age you stumble on concepts analog in their nature.&#xA;Modern graphics are created on a computer yet they originate in an analog process.&#xA;You constantly change the brush size yet the computer allows you to do it in&#xA;an increments. Do you actually care your color is &lt;em&gt;R=53, G=123, B=200&lt;/em&gt; in&#xA;numerical values except when moving the data?&lt;/p&gt;&#xA;&lt;p&gt;Concept of making an analog controller for art creation on the computer was&#xA;always interesting for me. An exercise in this was this small controller built&#xA;with &lt;em&gt;Arduino&lt;/em&gt;. It&amp;rsquo;s just a 3 potentiometers dividing voltage. Arduino reads this&#xA;voltage and sends the numeric values to Blender which can use them in various&#xA;ways thanks to built-in &lt;em&gt;Python&lt;/em&gt; environment. I used it to control color values.&lt;/p&gt;</description>
    </item><item>
      <title>Portable power for Yamaha Amplifier</title>
      <link>https://ciesie.com/project/portable_amplifier/</link>
      <lastBuildDate>Sat, 01 Jul 2023 20:01:55 +0200</lastBuildDate>
      <pubDate>Sat, 21 Apr 2018</pubDate><author>ciesielskimm@gmail.com (Michał Ciesielski)</author>
      <guid>https://ciesie.com/project/portable_amplifier/</guid>
      <description>&lt;div style=&#34;width: auto; height: auto; margin-left: auto; margin-right: auto;&#34;&gt;&#xA;  &lt;figure itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;&#xA;&#xA;    &lt;a href=&#34;https://ciesie.com/imgs/176aa1_ampPortablePower04.jpg&#34;&gt;&#xA;      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://ciesie.com/imgs/176aa1_ampPortablePower04.jpg&#34; alt=&#34;Voltage converter in 3D printed casing&#34; style=&#34;max-width: 100%; height: auto; object-fit: scale-down;&#34;&gt;&#xA;    &lt;/a&gt;&#xA;      &lt;figcaption&gt;&#xA;        Voltage converter in 3D printed casing&#xA;      &lt;/figcaption&gt;&#xA;&#xA;  &lt;/figure&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;I&amp;rsquo;m using Yamaha THR5 electric guitar amplifier. It&amp;rsquo;s possible to power it with batteries. It isn&amp;rsquo;t economically good solution though. Something rechargeable would be way better. Since I had a Li-Po battery lying around I made a small dongle which regulates the voltage.&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;div style=&#34;width: auto; height: auto; margin-left: auto; margin-right: auto;&#34;&gt;&#xA;  &lt;figure itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;&#xA;&#xA;    &lt;a href=&#34;https://ciesie.com/imgs/176aa1_ampPortablePower01.jpg&#34;&gt;&#xA;      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://ciesie.com/imgs/176aa1_ampPortablePower01.jpg&#34; alt=&#34;Voltage converter in 3D printed casing&#34; style=&#34;max-width: 100%; height: auto; object-fit: scale-down;&#34;&gt;&#xA;    &lt;/a&gt;&#xA;      &lt;figcaption&gt;&#xA;        Voltage converter in 3D printed casing&#xA;      &lt;/figcaption&gt;&#xA;&#xA;  &lt;/figure&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;The dongle in a 3D printed casing. Two switches allow breaking input and output circuit independently.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
