<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mardy</title><link>http://mardy.it/</link><description>My personal space in the internet. Here you'll find links to my projects, as well as my boring blog about programming, languages, politics, photography and a bit of anything that crosses my mind.</description><atom:link href="http://mardy.it/ia/rss.xml" rel="self" type="application/rss+xml"></atom:link><language>ia</language><copyright>Contents © 2026 &lt;a href="mailto:info@mardy.it"&gt;Alberto Mardegan&lt;/a&gt; </copyright><lastBuildDate>Sat, 11 Apr 2026 13:53:57 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Teaser: connecting Nintendo Switch controllers to the Wii</title><link>http://mardy.it/ia/blog/2026/04/teaser-connecting-nintendo-switch-controllers-to-the-wii.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;A few months ago I started playing with the Bluetooth controller embedded in
the Nintendo Wii, to see if it was possible to get it to connect to other
devices than just the Wii remotes. If you ask internet forums, you might fall
into the impression that the Wii is not using a standard Bluetooth controller,
or that it has been somehow "crippled" in order to restrict it to connect to
the Wiimotes only, but that's not the case: it's an ordinary controller from
its era, it's just that the Wii software (both the official SDK and the
homebrew libogc) only uses it for the Wiimotes.&lt;/p&gt;
&lt;p&gt;I first started looking into
&lt;a href="https://github.com/devkitPro/libogc/tree/master/lwbt"&gt;&lt;code&gt;lwBT&lt;/code&gt;&lt;/a&gt;, the bluetooth
stack used in libogc, but I quickly realized that it was impossible to get full
control over the controller via this library: it has been adapted to work with
the subset of the HID protocol used by the Wiimotes, and even if you can issue
bluetooth commands to the controller via the HCI layer, you cannot receive the
replies, since they are already intercepted by lwBT and there's no way to hook
into them.&lt;/p&gt;
&lt;p&gt;So I started writing my own little bluetooth stack,
&lt;a href="https://github.com/embedded-game-controller/bt-embedded"&gt;&lt;code&gt;bt-embedded&lt;/code&gt;&lt;/a&gt; which
from the ground up has been designed to be used by embedded devices and
covering the use case of serving different clients running in a single process,
and I've integrated it into
&lt;a href="https://github.com/embedded-game-controller/embedded-game-controller"&gt;&lt;code&gt;embedded-game-controller&lt;/code&gt;&lt;/a&gt;
(though this is not merged into the &lt;code&gt;master&lt;/code&gt; branch yet) in order to allow
connecting to bluetooth controllers. And in the last couple of days I've
written a little ugly program to visualize the controllers in a 3D scene, in
order to better test them:&lt;/p&gt;
&lt;iframe src="https://vkvideo.ru/video_ext.php?oid=-230221529&amp;amp;id=456239018&amp;amp;hash=7f8047b16af7164f&amp;amp;hd=1" width="640" height="360" allow="autoplay; encrypted-media; fullscreen; picture-in-picture; screen-wake-lock;" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;Yes, the 3D model sucks, it was a nice model when I downloaded it from a free
site, but then heavily reduced the number of polygons using Blender and went a
bit too far; I'll do a better model later. The accelerometer information is not
shown yet (I'd like to use it to actually tilt the controller, instead of using
the joystick), but that will not be hard.&lt;/p&gt;
&lt;p&gt;At the moment, the only supported controllers are the Nintendo Switch Pro
controller (I'm using a clone here) and the Joy-cons, so there's still quite
some work to do to add more.&lt;/p&gt;
&lt;p&gt;It's been a journey in which I learned a lot about Bluetooth and USB and, who
knows, maybe this will come handy in the future too.&lt;/p&gt;</description><guid>http://mardy.it/ia/blog/2026/04/teaser-connecting-nintendo-switch-controllers-to-the-wii.html</guid><pubDate>Sat, 11 Apr 2026 13:13:06 GMT</pubDate></item><item><title>Choreograph is still alive</title><link>http://mardy.it/ia/blog/2025/09/choreograph-is-still-alive.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;Back in 2023 I started writing a game -- which is still under development as
I'm dedicating very little time to it -- and at a certain point I found myself
in need of animating the movement of a few rectangles on the screen. Having
decided to code the game in C++ and to use just libSDL as a base (in order to
keep the game as portable as possible), I started looking around for existing
solutions which would do just what I need: animating points between two values,
while being display and platform agnostic.&lt;/p&gt;
&lt;h3&gt;Choreograph&lt;/h3&gt;
&lt;p&gt;I was happy to find the &lt;a href="https://github.com/sansumbrella/Choreograph"&gt;Choreograph
library&lt;/a&gt;, which promised to do
exactly what I needed, without bringing in any more dependencies. Integrating
it in my project proved to be extremely easy, and it took me a few minutes to
implement the animation.&lt;/p&gt;
&lt;p&gt;All was perfect, except one thing: the last commit to the repository happened
in 2016. I submitted a couple of minor fixes, and there was no reaction. Even
though I was very happy with the library, I decided not to get tied to a
project that was apparently dead, so I dropped this integration and instead
wrote my own implementation -- which was just enough to fill my immediate need,
but was unlikely to be reusable as a generic animation framework.&lt;/p&gt;
&lt;p&gt;Over time, though, several times I happened to bump into a situation where I
would have liked to add some animation, but given that I was not really happy
with my home-brew solution, I always held myself back from this desire and
focused on more substantial issues: so, no animations. In March this year I
decided to write to the author of Choreograph to check whether he was still
interested in maintaining the project, but got no answer.&lt;/p&gt;
&lt;h3&gt;A maintained fork&lt;/h3&gt;
&lt;p&gt;Well, one cannot certainly accuse me of being impatient in this case, since I
waited a few more months before finally deciding that I find Choreograph to be
too convenient to let it just rot. Here is my &lt;a href="https://github.com/mardy/Choreograph"&gt;&lt;em&gt;maintained&lt;/em&gt; (for how long,
we'll see!) fork of the Choreograph
project&lt;/a&gt;; so far I've added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A few commits to fix compilation warnings&lt;/li&gt;
&lt;li&gt;Recipes for the &lt;a href="https://mesonbuild.com/"&gt;Meson build system&lt;/a&gt;, to make it
  easier to build the project in Linux&lt;/li&gt;
&lt;li&gt;CI via GitHub actions&lt;/li&gt;
&lt;li&gt;Updated the tests and the samples to build without libCinder&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'm not yet able to announce what I'm going to work on next in Choreograph;
this will become clear as I'll be using it more. For the time being, it's
enough for you to know that such a project exists, and I'll be happy to accept
contributions in the form of code and ideas.&lt;/p&gt;</description><guid>http://mardy.it/ia/blog/2025/09/choreograph-is-still-alive.html</guid><pubDate>Fri, 26 Sep 2025 15:42:31 GMT</pubDate></item><item><title>No, libogc did not steal RTEMS code</title><link>http://mardy.it/ia/blog/2025/04/no-libogc-did-not-steal-rtems-code.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;&lt;em&gt;Update 09/05/2025:&lt;/em&gt; while the text below addresses a couple of specific blocks of code,
after publishing this article I've been contacted by some people providing more
evidence pointing that the similarity of the code goes beyond what one might
interpret as “inspiration”. There are also a couple of other bits on
information that the reader might want to take into account: first, a
&lt;a href="https://mas.to/@davejmurphy/114414723608693881"&gt;screenshot of an email&lt;/a&gt; in
which Shagkur tells his version of how the code came about (which seems to
point that, if a copyright infringement actually happened, this was done
without the knowledge of devkitPro's maintainers) and a &lt;a href="https://www.rtems.org/news/2025-05-06-rtems-devkit-libogc-response/"&gt;public statement by
RTEMS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All of a sudden the Wii homebrew community is in flames after Hector Martin
(&lt;a href="https://github.com/marcan"&gt;marcan&lt;/a&gt;, also known in the Linux Kernel
 community), co-author of “The Homebrew Channel” application, &lt;a href="https://github.com/fail0verflow/hbc"&gt;decided to close
the project&lt;/a&gt; and denounce libogc for its
“theft” of RTEMS's code:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It has recently been revealed that the threading/OS implementation in libogc is, in fact, stolen from RTEMS. The authors of libogc didn't just steal proprietary Nintendo code, but also saw it fit to steal an open source RTOS and remove all attribution and copyright information. This goes far beyond ignorance about the copyright implications of reverse engineering Nintendo binaries, and goes straight into outright deliberate, malicious code theft and copyright infringement.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A little below, Hector Martin provides this “proof”: &lt;em&gt;you can compare
&lt;a href="https://github.com/devkitPro/libogc/blob/52c525a13fd1762c10395c78875e3260f94368b5/libogc/lwp_threads.c#L580"&gt;this&lt;/a&gt;
function in libogc to
&lt;a href="https://github.com/atgreen/RTEMS/blob/2f200c7e642c214accb7cc6bd7f0f1784deec833/c/src/exec/score/src/thread.c#L385"&gt;this&lt;/a&gt;
function in a really old version of RTEMS&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;While I don't know the truth about libogc's history (I've started contributing
to it only in the last couple of years), and I'd welcome a first-hand
explanation from shagkur (Michael Wiedenbauer), I can confidently say that the
accusation is unfounded, by just looking at the code. To be more precise: I
cannot vouch for the whole of libogc, I can only say that this function, that
Hector Martin offers as example, actually hints that the code was not stolen.&lt;/p&gt;
&lt;p&gt;While it's obvious that the developer of libogc's code did have a look at
RTEMS's code, and this can be assumed because the variable names are very
similar (and in some cases they are so badly named, that they cannot be this
similar by accident!), the code only looks vaguely similar. Furthermore, for
some reason Hector Martin decided to pick a rather recent version of libogc's
code, but if we look at the &lt;a href="https://github.com/devkitPro/libogc/blob/e550333e6f2fc413fd42d6af9a9aaf036d9de9f6/libogc/lwp_threads.c#L469"&gt;first version that was
committed&lt;/a&gt;
(well, to git, at least), we see that similarities are much less striking.
Let's look at a small snippet of the function, where the thread object's
members are being initialized:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RTEMS from 1996:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;the_thread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_preemptible&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is_preemptible&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;the_thread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_timeslice&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is_timeslice&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;the_thread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isr_level&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;isr_level&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;the_thread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;current_state&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;STATES_DORMANT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;the_thread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;resource_count&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;the_thread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;real_priority&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;the_thread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;initial_priority&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;libogc from 2023:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;thethread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;budget_algo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prio&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LWP_CPU_BUDGET_ALGO_NONE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LWP_CPU_BUDGET_ALGO_TIMESLICE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;thethread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;is_preemptible&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is_preemtible&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;thethread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;isr_level&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;isr_level&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;thethread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;real_prio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prio&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;thethread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cur_state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LWP_STATES_DORMANT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;thethread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cpu_time_budget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;_lwp_ticks_per_timeslice&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;thethread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;suspendcnt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;thethread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;res_cnt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;libogc from before 2004:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;thethread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;isr_level&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;isr_level&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;thethread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;real_prio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prio&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;thethread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cur_state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LWP_STATES_DORMANT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;thethread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;suspendcnt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;thethread&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;res_cnt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Let's pay attention to the &lt;code&gt;is_preemtible&lt;/code&gt; variable, which is present in
current's libogc and in RTEMS, but not in the old libogc: it was added later.
Now, RTEMS has it since at least 1996, so, if libogc was actually copied from
it, how come this variable was not copied, too, but added at a later time?
Note, the accusation against libogc has been formulated in clear-cut terms:
&lt;em&gt;...steal an open source RTOS and remove all attribution and copyright
information...&lt;/em&gt;; it's clear that this is not what happened. It's much more
likely that libogc's developers did look at RTEMS code (which at that time
&lt;a href="https://github.com/atgreen/RTEMS/blob/2f200c7e642c214accb7cc6bd7f0f1784deec833/LICENSE"&gt;had another
license&lt;/a&gt;
and was known as the &lt;em&gt;Real Time Executive for Missile Systems&lt;/em&gt; or &lt;em&gt;Real Time
Executive for Military Systems&lt;/em&gt;) as a model and source of information, but
since the code was heavily adapted for libogc, they didn't feel they were
creating a “derivative work”. It's a grey area, but even myself, if I took a
project written in C++ and translated it into Rust or C#, for example, I'm
rather sure I wouldn't consider my work to be a derivative of the original; I'm
not a lawyer, so I might be plain wrong here, but I would be in good faith.&lt;/p&gt;
&lt;p&gt;At most, libogc could be accused of plagiarism, but in my humble opinion even
that would be a stretch: since we are not talking of some artistic work, but of
work of science/ingeneering, it's normal to build upon others' work. Yes,
credit should generally be given, but given that we are talking of a US
military-related project, I can see that there could be ethical reasons for not
wanting to do so.&lt;/p&gt;
&lt;h4&gt;Summing up&lt;/h4&gt;
&lt;p&gt;I'm consciously omitting the other old accusations about “stealing” Nintendo's
code, first because they are not new, and secondly because I don't consider
reverse-engineering as stealing. What I found most disturbing about this story
is that it smells hatred from far away, since I have a hard time to understand
why someone felt the need to look into libogc's origin and publicly smearing
the project and ultimately harming the whole of the Wii homebrew community.&lt;/p&gt;</description><guid>http://mardy.it/ia/blog/2025/04/no-libogc-did-not-steal-rtems-code.html</guid><pubDate>Mon, 28 Apr 2025 13:56:49 GMT</pubDate></item><item><title>Porting OpenGL games to the Nintendo Wii: chro.mono</title><link>http://mardy.it/ia/blog/2025/04/porting-opengl-games-to-the-nintendo-wii-chomono.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;More than one year has passed since my last blog post, and I'm a bit ashamed to
confess that today's post is again about porting games to the Nintendo Wii — I
always tell to myself that I'm soon going to move to something else, possibly
less geeky than this (by the way, there &lt;em&gt;is&lt;/em&gt; something else I could write
about, but I'll leave it for another post!), but the problems posed by porting
games to an old console are just way too stimulating, and my brain gets
attracted to them in a way that I cannot resist.&lt;/p&gt;
&lt;p&gt;Anyway, have you ever heard of &lt;a href="https://github.com/devkitPro/opengx"&gt;OpenGX&lt;/a&gt;?
It's a project aiming to write an OpenGL driver for the Nintendo GameCube and
Wii's GX API: while these consoles have good (at the time, at least) 3D
capabilities, they were programmed via an API not even remotely close to
OpenGL, so back in 2013 one developer by the name of David Guillen Fandos
started a project to investigate the possibility of wrapping the GX API in
OpenGL. The project was abandoned after reaching a very basic state, but it's
author was diligent enough to write a &lt;a href="https://github.com/davidgfnet/opengx/blob/master/doc/opengx.pdf"&gt;PDF
file&lt;/a&gt;
describing its design and some implementation details. Having bumped into this
document, I was inspired by it and felt it was a pity that such a project had
died -- especially given the fact that this didn't happen because of some
technical infeasibility. So exactly one year ago, in the spring of 2024, I
picked it up and tried porting the game BillardGL to the Wii; I had to add
quite a few things to OpenGX, and adjusting the lighting pipeline, but after
less than one month &lt;a href="https://github.com/mardy/billardgl/tree/wii-port"&gt;the port of BillardGL was
ready&lt;/a&gt;. In the following
months, I ported several other OpenGL 1.x games, gradually enhancing and
expanding OpenGX, until I got most of OpenGL 1.4 supported.&lt;/p&gt;
&lt;center&gt;
&lt;figure&gt;
  &lt;a href="http://mardy.it/archivos/imagines/blog/billardgl.png"&gt;&lt;img src="http://mardy.it/archivos/imagines/blog/billardgl.png" width="80%"&gt;&lt;/a&gt;
  &lt;figcaption&gt;A 23 year old game was just ported to a 19 year old console.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;Should I have stopped there? Probably. Because indeed the Wii's GPU, despite
allowing a good degree of complexity in setting up its shading engine (called
TEV, Texture Environment), does not support the modern GL shading language, and
trying to have the CPU compile the shaders into something that GX could
understand is a task doomed to fail, in part because this would eat up all the
computing power, but especially because there simply isn't an algorithm that
could translate GLSL into GX commands. Is this the end of the journey then?&lt;/p&gt;
&lt;p&gt;Well, the fact that OpenGL 2.0+ shaders can not be machine-translated into GX
commands does not mean that this task is impossible: we've still got the human
brain to use! The idea is the following: let the deveoper who is porting the
game write the GX code corresponding to the GLSL code by hand. Saying it like
this might feel like this is no better than saying “Just port the whole
rendering backend to GX!” but as a matter of facts, there's a big difference:
with this approach all the rest of the OpenGL code stays untouched, and the way
I have design this &lt;em&gt;shader substitution&lt;/em&gt; to work in OpenGX allows one to keep
the GX code isolated in its own source file, without having to change a single
line of the program, save from adding a line near the beginning (in &lt;code&gt;main()&lt;/code&gt;,
typically) to install the GX hooks. This means that your program will still
call &lt;code&gt;glUniform*()&lt;/code&gt;, &lt;code&gt;glVertexAttribPointer()&lt;/code&gt; and so on to setup the rendering
pipeline, but when the program will get to execute &lt;code&gt;glDrawArrays()&lt;/code&gt; OpenGX will
pass control to the hooks previously installed, which will receive the uniforms
and the attributes, and setup the pipeline using GX commands. It might seem
complicated, but &lt;a href="https://github.com/devkitPro/opengx/commit/f837fe9bd6b363bb6a33f298eae99f15e0cd8bfe"&gt;it really
isn't&lt;/a&gt;
(well, if you can deal with the GX API), and it's even more efficient than the
fixed pipeline of OpenGL 1.x, since here the GX commands are reduced to the
bare minimum required by the shader, whereas in the fixed pipeline we have to
follow predefined steps.&lt;/p&gt;
&lt;center&gt;
&lt;figure&gt;
&lt;iframe src="https://vkvideo.ru/video_ext.php?oid=-230221529&amp;amp;id=456239017&amp;amp;hd=1" width="640" height="360" allow="autoplay; encrypted-media; fullscreen; picture-in-picture; screen-wake-lock;" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
  &lt;figcaption&gt;chro.mono running on a Nintendo Wii.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/center&gt;

&lt;p&gt;The first (and for the time being, the last) OpenGL 2.0+ game I've ported to
the Wii is &lt;a href="https://thp.io/2013/chromono/"&gt;chro.mono&lt;/a&gt;, a nice puzzle game from
2013 whose source code has been released in 2021. It uses the FBO feature from
OpenGL 3.0, so I had to implement it in OpenGX as well. I'm quite satisfied
with the result, not only because the game runs at 60 FPS, but because it shows
how rather complex shaders (the game has more than a dozen of them) can be
realized in GX; to tell the truth, in couple of cases I had to implement the
fragment shader by converting its code to C and drawing to a temporary texture,
but luckily these shaders are used only during program startup to draw to an
FBO and don't negatively affect the game performance. You can download it &lt;a href="https://github.com/mardy/chromono/releases"&gt;from
here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Summing up, if you get really bored and would like to engage in something
unusual (read: useless), porting games to older consoles would definitely keep
you active for some time. Unfortunately there aren't that many OpenGL games
which are open source, so the candidates for porting are not that many (by the
way, feel free to suggest in the comments — well, not for me, but maybe
&lt;em&gt;someone else&lt;/em&gt; will do it).&lt;/p&gt;</description><guid>http://mardy.it/ia/blog/2025/04/porting-opengl-games-to-the-nintendo-wii-chomono.html</guid><pubDate>Tue, 22 Apr 2025 15:35:25 GMT</pubDate></item><item><title>libSDL2 and VVVVVV for the Wii</title><link>http://mardy.it/ia/blog/2024/02/libsdl2-and-vvvvvv-for-the-wii.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;Just a quick update on something that I've been working on in my free time.&lt;/p&gt;
&lt;p&gt;I recently refurbished my old Nintendo Wii, and for some reason I cannot yet
explain (not even to myself) I got into homebrew programming and decided to
port libSDL (the 2.x version -- a 1.x port already existed) to it. The result
of this work is already available via the &lt;a href="https://devkitpro.org/"&gt;devkitPro&lt;/a&gt;
distribution, and although I'm sure there are still many bugs, it's overall
quite usable.&lt;/p&gt;
&lt;p&gt;In order to prove it, I ported the game &lt;a href="https://thelettervsixtim.es/"&gt;VVVVVV&lt;/a&gt;
to the Wii:&lt;/p&gt;
&lt;iframe src="https://vk.com/video_ext.php?oid=7200355&amp;amp;id=456239302&amp;amp;hd=1" width="640" height="360" allow="autoplay; encrypted-media; fullscreen;
picture-in-picture;" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;During the process I had to fix quite a few bugs in my libSDL port and in a
couple of other libraries used by VVVVVV, which will hopefully will make it
easier to port more games. There's still an issue that bothers me, where the
screen resolution seems to be not totally supported by my TV (or is it the HDMI
adaptor's fault?), resulting in a few pixels being cut at the top and at the
bottom of the screen. But unless you are a perfectionist, it's a minor issue.&lt;/p&gt;
&lt;p&gt;In case you have a Wii to spare, or wouldn't mind playing on the Dolphin
emulator, &lt;a href="https://github.com/mardy/VVVVVV/releases/tag/v2.4.1_wii1"&gt;here's the link to the VVVVVV
release&lt;/a&gt;. Have fun! :-)&lt;/p&gt;</description><guid>http://mardy.it/ia/blog/2024/02/libsdl2-and-vvvvvv-for-the-wii.html</guid><pubDate>Fri, 02 Feb 2024 17:50:44 GMT</pubDate></item><item><title>Un canto russe, in italiano</title><link>http://mardy.it/ia/blog/2023/06/una-canzone-russa-in-italiano.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;Io vos propone mi traduction del canto russe “Porta me, fluvio” (&lt;a href="https://www.youtube.com/watch?v=iNe9BdtlS7M"&gt;Ты
неси меня река&lt;/a&gt; es le version
original):&lt;/p&gt;
&lt;p&gt;&lt;iframe src="https://vk.com/video_ext.php?oid=7200355&amp;amp;id=456239300&amp;amp;hash=0c629be9cd494d8e&amp;amp;hd=1" width="640" height="360" allow="autoplay; encrypted-media; fullscreen;
picture-in-picture;" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;Mi voce es un pochetto debile, alora si alicuno vole recantar lo melio, io
esserea solmente felice de isto!&lt;/p&gt;</description><category>cultura</category><category>interlingua</category><category>italiano</category><category>musica</category><category>Russia</category><guid>http://mardy.it/ia/blog/2023/06/una-canzone-russa-in-italiano.html</guid><pubDate>Sat, 24 Jun 2023 06:21:09 GMT</pubDate></item><item><title>Will the internet forget russophobia?</title><link>http://mardy.it/ia/blog/2023/06/will-the-internet-forget-russophobia.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;I've often wondering what will happen when this horrific war in Europe will
finally be over. I won't be discussing politics here, but what is mostly
interesting to me is how (and if) all the companies who made high proclaims
about not doing business with Russia will justify their getting back into the
Russian market. They will probably count on the fact that the war will be long,
and that people will forget what these companies' stance was. After all, the
world has forget about all the companies who collaborated with the Nazi regime,
so we can expect the same to happen with this war.&lt;/p&gt;
&lt;p&gt;But I don't think that's right: if you made a mistake, you should be held
accountable for it. You might be wondering what is the “mistake” I'm talking
about: that's &lt;strong&gt;russophobia&lt;/strong&gt;, indeed. To put it simply, and make a concrete
example: if The Qt Company stops doing business with Russian companies and
blocks its downloads page to Russian IP addresses because of the war, &lt;em&gt;without
being forced by the government to do so&lt;/em&gt;, but does not take similar measures
against other countries who wage wars which have caused way more deaths and
displacement of individuals, well, that's what I call “russophobia”. Of course,
I'm aware that there's way more than that, and that the hatred for all what is
Russian (including culture and sport competitions) is an even bigger issue, but
in this blog post I'm especially focused on the IT world, so please forgive my
semi-intentional narrow-mindness on this topic.&lt;/p&gt;
&lt;p&gt;Now, I'm fully aware that we live in a mediatic bubble that directs our
decisions in a way that is almost automatic, and I'm sure that most people
working for companies who took russophobic decisions are not themselves
russophobic at all (and I'm not dismissing the possibility that even the very
same people who took these decisions might not be russophobic) and that these
decisions were taken on impulse, because “everyone else is doing the same” and
due to the media pressure that if you don't do that, you might get accused of
supporting the “wrong” side of the war.&lt;/p&gt;
&lt;p&gt;But that's not an excuse, especially for “smart” people like IT engineers (and
I put the adjective between quotes &lt;a href="http://mardy.it/ia/blog/2022/11/the-idiotism-of-software-developers.html"&gt;for a
reason&lt;/a&gt;), and especially after
the initial heat has passed and when, after more than one year of war, we
should have been exposed to different point of views and be able to evaluate
the situation more rationally. It has been therefore especially stunning for me
to learn that the Linux Kernel community, and hence The Linux Foundation, has
recently given room to russophobic behaviours, refusing a patch coming from the
Russian company Baikal (a CPU maker). For the record, the incriminated patch
was not related to supporting hardware produced by this company (not that this
would make the deed less serious, but at least one could have argued that there
could be some spot of logic in it):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;From: Jakub Kicinski &amp;lt;kuba@kernel.org&amp;gt;
To: Serge Semin &amp;lt;Sergey.Semin@baikalelectronics.ru&amp;gt;
[...]

On Tue, 14 Mar 2023 01:42:24 +0300 Serge Semin wrote:
&amp;gt; From: Serge Semin &amp;lt;Sergey.Semin@baikalelectronics.ru&amp;gt;

We don't feel comfortable accepting patches from or relating 
to hardware produced by your organization.

Please withhold networking contributions until further notice.
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(&lt;a href="https://lore.kernel.org/all/20230314103316.313e5f61@kernel.org/"&gt;here&lt;/a&gt; the
link to the original discussion). One week later, someone denounced this as a
violation to the Code of Conduct committee (unfortunately the only link I could
find to this is coming from a &lt;a href="https://www.opennet.ru/openforum/vsluhforumID3/129994.html#529"&gt;Russian IT
forum&lt;/a&gt;, and any
other references seem to have been removed from DuckDuckGo and Google), only to
receive a reply that it was all fine.&lt;/p&gt;
&lt;p&gt;To me this is not fine. The war will end, sooner or later, but it bothers me
that we never learn from the past and repeat the same mistakes over and over.
We apparently know a lot about propaganda, yet we fail to recognize it when it
influences our own mind and actions. My humble contribution is the creation of
a page where I list the companies who have taken russophobic actions, and, on
the opposite side, companies (like Flickr and Zorin OS) who have stood out for
positive messages and helpful actions. My hope is that some of the listed
companies will find the courage to review their actions, and either correct
their stance, or at least clarify their reasons. So, I hereby present&lt;/p&gt;
&lt;p style="text-align: center; font-size: 130%"&gt;
  &lt;a href="https://github.com/mardy/russophobia"&gt;Denouncing russophobia&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;where you'll find some of the good and some of the bad companies. I'm sure I'm
missing plenty of them: I just started recollecting my memories and searching
online a couple of days ago. I created this as a GitHub project, because indeed
I'm looking forward for contributions, to help me make the lists more complete.
I need to stress that the fact that a company has announced the suspension of
its business in Russia does not automatically make it russophobic: what we need
to look at is the &lt;em&gt;reason&lt;/em&gt; for that decision: companies like LEGO and Nintendo,
for example, have suspended their operations citing logistic and financial
reasons; no judgement involved.&lt;/p&gt;
&lt;p&gt;Let me repeat it once more, just to make sure there are no misunderstandings:
it's perfectly fine for businesses to take a stance on politics, and sometimes
it might be even praiseworthy; but if a company is international, and does not
apply the same reasoning to other armed conflicts, or seem to care only about
certain human rights violations and not others, then it's a case of double
standards which we need to be aware of, and make the company think twice about
it. And that's also the reason why you won't find any Ukrainian company among
the “bad” ones, because in their case the reaction is perfectly understandable
and they can hardly be accused of adopting double standards (well, technically
speaking, they are adopting double standards, but when you are so directly
impacted I think it does not deserve a blame): if it's your house which burns,
you should definitely scream about it, even if you previously have been silent
about your neighbour house's burning.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I'm especially looking forward for more “good” companies&lt;/strong&gt;, who have shown empathy
towards the people affected by the war (and maybe even collected money to help
them) while refraining from taking the judging role and forgetting about all
the injustice and suffering that other wars have caused (including on that very
same piece of land that suddenly appeared on all newspapers' front pages on
February 24th, 2022). I hope that these companies can serve as an example of
positive action, humanity, and love.&lt;/p&gt;</description><guid>http://mardy.it/ia/blog/2023/06/will-the-internet-forget-russophobia.html</guid><pubDate>Sun, 04 Jun 2023 07:41:02 GMT</pubDate></item><item><title>Un editoriale di Marco Travaglio</title><link>http://mardy.it/ia/blog/2023/03/un-editoriale-di-marco-travaglio.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;Nonostante io non legga più Il Fatto Quotidiano (per i motivi spiegati
&lt;a href="http://mardy.it/ia/blog/2016/10/il-fatto-quotidiano-plagio-e-propaganda.html"&gt;qui&lt;/a&gt;, che restano tuttora
validi), continuo a imbattermi negli editoriali di Marco Travaglio, che spesso
apprezzo. Oggi invece mi sono imbattuto nell'introduzione del suo nuovo libro
&lt;a href="https://www.ilfattoquotidiano.it/in-edicola/articoli/2023/02/24/un-anno-di-bugie-per-mettere-agli-italiani-lelmetto-no-pax/7075675/"&gt;“Scemi di
guerra”&lt;/a&gt;,
e ve ne riporto un estratto che ho trovato particolarmente incisivo.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Abbiamo abolito la storia. È vietato raccontare ciò che è accaduto in Ucraina
prima del 24 febbraio 2022: gli otto anni di guerra civile in Donbass dopo il
golpe bianco (anzi, nero) di Euromaidan nel 2014 e le migliaia di morti e feriti
causati dai continui attacchi delle truppe di Kiev e delle milizie filo-naziste
al seguito contro le popolazioni russofone e russofile che, col sostegno di
Mosca, chiedevano l’indipendenza o almeno l’autonomia. Il tutto in barba ai due
accordi di Minsk. La versione ufficiale, l’unica autorizzata, è che prima del
2022 non è successo niente: una mattina Putin s’è svegliato più pazzo del
solito e ha invaso l’Ucraina. Se la gente scoprisse la verità, capirebbe che il
mantra atlantista “Putin aggressore e Zelensky aggredito” vale solo dal 2022:
prima, per otto anni, gli aggressori erano i governi di Kiev (l’ultimo, quello
di Zelensky) e gli aggrediti i popoli del Donbass. Fra le vittime, c’è il
giornalista italiano Andrea Rocchelli, ucciso dall’esercito ucraino… Abbiamo
abolito la geografia. Proibito mostrare la cartina dell’allargamento della Nato
a Est negli ultimi 25 anni (da 16 a 30 membri)… Eppure, che la Nato si sia
allargata a Est, accerchiando e assediando la Russia, minacciandone la
sicurezza con installazioni di missili nucleari sempre più vicine al confine,
in barba alle promesse fatte a Gorbaciov nel 1990, fino all’ultima provocazione
di annunciare l’imminente ingresso nell’Alleanza dei vicini di casa della
Russia – Georgia e Ucraina – è un fatto storico indiscutibile…&lt;/p&gt;
&lt;p&gt;L’altra cartina proibita è quella dei Paesi che non condannano o non sanzionano
la Russia, o se ne restano neutrali: quasi tutta l’Asia, l’Africa e l’America
Latina, cioè l’87% della popolazione mondiale. Ma al nostro piccolo mondo
antico occidentale piace far credere che Putin è isolato e noi lo stiamo
circondando. Sul fatto che Cina, India, Brasile e altri paesucoli stiano con
lui o non stiano con noi, meglio sorvolare: altrimenti lo capiscono tutti che
le sanzioni non funzionano… Solo abolendo la storia si può credere al
presidente Sergio Mattarella quando ripete che “l’Ucraina è la prima guerra nel
cuore dell’Europa nel dopoguerra”. E Belgrado bombardata anche dall’Italia nel
1999 dov’è, in Oceania? E chi era il vicepremier del governo D’Alema che
bombardava Belgrado? Un certo Mattarella… Abbiamo abolito il rispetto per le
altre culture. In una folle ondata di russofobia, abbiamo visto ostracizzare
direttori d’orchestra, cantanti liriche, pianiste di fama mondiale, fotografi,
atleti (anche paraolimpici), persino gatti e querce, soltanto perché russi. E
poi censurare corsi su Dostoevskij, cancellare dai teatri i balletti di
Cajkovskij, addirittura estromettere la delegazione russa dalle celebrazioni
per la liberazione di Auschwitz. Come se il lager l’avessero liberato gli
americani o gli ucraini e non l’Armata Rossa… i trombettieri della Nato
propagandano la bufala dell’“euroatlantismo” e gli scemi di guerra se la
bevono, senz’accorgersi che mai come oggi gli interessi dell’Europa sono
opposti a quelli dell’America. &lt;/p&gt;</description><guid>http://mardy.it/ia/blog/2023/03/un-editoriale-di-marco-travaglio.html</guid><pubDate>Wed, 01 Mar 2023 17:37:28 GMT</pubDate></item><item><title>A peace plan for Ukraine</title><link>http://mardy.it/ia/blog/2023/01/un-piano-di-pace-per-lucraina.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;Among the peace plans proposed by various European and U.S. politicians, to be
frank, I haven't read a single one which I would consider even remotely
feasible. My impression is that such plans have been redacted more for a need
to fool one's voters and present onself as a peace operator (whereas one
factually supports sending of weapons and tightening of sanctions) than for a
genuine peace effort, since every politician that had spent even just a few
minutes to document oneself on the situation around Ukraine would perfectly
know that these peace plans are not just unacceptable by the Russians, but
plainly unpresentable.&lt;/p&gt;
&lt;p&gt;A believable peace plan must first and foremost take into account the reasons
that pushed Russia to invade Ukraine and, above all, those who push the Russian
people to support the war. It's certainly legitimate, and even reasonable, to
doubt the official reasons: on the contrary, it's very likely that the reasons
who push Russia to continue this “special operation” are, at least in part,
others, economical in nature and to the benefit of a few especially powerful
individuals (arm producers above all). We can put our heart at rest, and
accept the fact that we'll never get to know the real reasons; but, on the
other hand, it's not even so important to know them, after all.&lt;/p&gt;
&lt;p&gt;What we really need to know is the mood of the Russian population, and
especially the reasons why president Putin's popularity has risen after the
invasion of Ukraine. The mainstream information we get in the West is not
helpful at all in this, because it's since 2014 that it omits reporting
important facts about the war in Donbass. Well, nowadays the Russian people are
constantly fed images of civilians dying in Donetsk and in other cities of the
Donbass, right in the center of the cities, where there are no military
targets. We can call it propaganda, sure, but the facts are real and are just
an aggravated continuation of what has been happening for the past 8 years, all
well documented by the OSCE mission and by the Office of the High Commissioner
of the Human Rights of the United Nations&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="http://mardy.it/ia/blog/2023/01/un-piano-di-pace-per-lucraina.html#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Besides, the massive transfer of weapons and the episodes of discrimination
against Russian artists, athletes, personalities of the culture and
entertainment, sometimes against the very Russian language, these are all
widely publicized by local mass media and get the Russians convinced that their
country is fighting an existential war against a horde of fascists, and,
militarily, against the whole of NATO.&lt;/p&gt;
&lt;p&gt;If the West had really the will to restore peace it should work to destroy this
representation of itself and disarm the Russian propaganda by removing the
facts on which it's built. Specifically, I'm persuaded that many of the
following points would be well received by the Western population and would
demotivate the Russian people (including many of the soldiers stationed at the
front) in fighting this fratricidal war:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Removal of every discrimination against Russian culture and its
   representatives and performers.&lt;/li&gt;
&lt;li&gt;Promise that Ukraine won't be let into NATO or in other military alliances
   that would go beyond the commitment to reciprocal defense (that is, no to
   joint military drills or foreign bases in the territory of Ukraine, yes to a
   promise of military intervention in case of attack).&lt;/li&gt;
&lt;li&gt;Pausing the shipment of weapons until Ukraine removes the title of hero of
   Ukraine to Stepan Bandera and other members of the &lt;a href="https://en.wikipedia.org/wiki/Massacres_of_Poles_in_Volhynia_and_Eastern_Galicia"&gt;nazist organisation
   UPA&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Pausing the shipment of weapons until Ukraine stops bombing civilian
   settlements devoid of military installations.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It should be noted that none of these points require collaboration or
agreements between states (even joining NATO can only happen after the
unanymous vote of all current members, as Turkey reminds us), so they all could
be immediately implemented by any willing state. The bigger the number of
Western countries pushing forward these policies, the more uncertainty will
grow among the Russian population, and will ultimately transform into
incomprehension and dissatisfaction, since this would destroy the ideological
reasons that make the Russians support the conflict.&lt;/p&gt;
&lt;p&gt;If we are to speak of a peace plan, agreed among NATO, Ukraine and Russia, then
it could be developed along these lines:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ukraine condemns the nazist ideology (therefore Bandera and friends),
   accepts to open an international commission of inquiry (including Russia as
   well) over the massacres of Maidan square and Odessa.&lt;/li&gt;
&lt;li&gt;Ukraine grants the status of second official language to the Russian
   language, similarly to how Swedish language is treated in Finland&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="http://mardy.it/ia/blog/2023/01/un-piano-di-pace-per-lucraina.html#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;Ukraine enacts laws to guarantee a limited autonomy to the 5 regions
   currently under Russian control (including Crimea) and amnesty for all those
   rebels that are not found guilty of war crimes (in other words, a sort of
   Minsk accords extended to all the occupied regions).&lt;/li&gt;
&lt;li&gt;Ukraine promises not to host military forces or equipment from other
   countries in its territory, and to not participate in joint military drills,
   without the consent of the Russian federation. It can, however, join
   defensive military alliances.&lt;/li&gt;
&lt;li&gt;Ukraine promises to never enact sanctions against Russia, nor to require
   visa from Russian citizens in order to cross its borders.&lt;/li&gt;
&lt;li&gt;The Russian army withdraws and gets temporarily replaced by the army of a
   third country, not member of NATO, chosen by Ukraine.&lt;/li&gt;
&lt;li&gt;New referendums, under the supervision of international observers (including
   Ukrainians and Russians) in the 5 contested regions. Times will be
   established by Ukraine. Russia and Ukraine commit to recognize and implement
   their results.&lt;/li&gt;
&lt;li&gt;The peace mission introduced in point 6 gets wrapped up.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It's of fundamental importance understanding that territorial questions are
only a secondary matter, and that what is most pressing for the Russian people
is to have good relations with the neighbouring countries: not having to worry
about coups, colour revolutions stirred up by the West or about other attempts
to use Ukraine as a weapon against Russia. If, for example, there were a
Russian region that desired to separate itself from the federation and join
Belarus, I'm convinced that this could happen in a peaceful way without serious
repercussions, since the relationships between the two countries are good and
Belarus is not perceived as a threat. This was also the situation with Ukraine
before 2014&lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="http://mardy.it/ia/blog/2023/01/un-piano-di-pace-per-lucraina.html#fn:3"&gt;3&lt;/a&gt;&lt;/sup&gt;, and it's the situation to which we should strive to return to.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;See for example the &lt;a href="https://www.ohchr.org/sites/default/files/Documents/Countries/UA/ReportUkraineMay-August2018_EN.pdf"&gt;report for the period May-August
  2018&lt;/a&gt;,
  page 5, point 22. More reports can be found &lt;a href="https://www.ohchr.org/en/documents-listing?field_content_category_target_id[180]=180&amp;amp;field_content_category_target_id[182]=182&amp;amp;field_geolocation_target_id[1136]=1136&amp;amp;field_entity_target_id[1349]=1349&amp;amp;field_published_date_value[min]=&amp;amp;field_published_date_value[max]=&amp;amp;sort_bef_combine=field_published_date_value_DESC&amp;amp;page=0"&gt;in this list&lt;/a&gt;. &lt;a class="footnote-backref" href="http://mardy.it/ia/blog/2023/01/un-piano-di-pace-per-lucraina.html#fnref:1" title="Jump back to footnote 1 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Note that Swedish in Finland is the native language for just 5% of the
  population, whereas in Ukraine Russian is the native language of about 30% of
  the population. &lt;a class="footnote-backref" href="http://mardy.it/ia/blog/2023/01/un-piano-di-pace-per-lucraina.html#fnref:2" title="Jump back to footnote 2 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Not exactly, since there had already been attempts at colour revolutions
  resulting in anti-Russian governments. But I hope you'll pass this
  oversimplification of mine here. &lt;a class="footnote-backref" href="http://mardy.it/ia/blog/2023/01/un-piano-di-pace-per-lucraina.html#fnref:3" title="Jump back to footnote 3 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description><guid>http://mardy.it/ia/blog/2023/01/un-piano-di-pace-per-lucraina.html</guid><pubDate>Sat, 21 Jan 2023 19:33:56 GMT</pubDate></item><item><title>Back to Maemo!</title><link>http://mardy.it/ia/blog/2023/01/back-to-maemo.html</link><dc:creator>Alberto Mardegan</dc:creator><description>&lt;p&gt;New year, new job. After &lt;a href="http://mardy.it/ia/blog/2022/12/leaving-canonical-again.html"&gt;leaving
Canonical&lt;/a&gt; I'm back to working on the same
software platform on which I started working back in 2006: &lt;a href="http://mardy.it/ia/blog/2023/01/maemo.org"&gt;Maemo&lt;/a&gt;.
Well, not exactly the vanilla Maemo, but rather its evolution known as &lt;a href="https://en.wikipedia.org/wiki/Aurora_OS_(Russian_Open_mobile_platform)"&gt;Aurora
OS&lt;/a&gt;,
which is based on &lt;a href="https://sailfishos.org/"&gt;Sailfish OS&lt;/a&gt;. This means I'm
actually back to fixing the very same bugs I introduced back then when I was
working in Nokia, since a lot of the middleware has remained the same.&lt;/p&gt;
&lt;p&gt;At the moment OMP (the company developing Aurora OS) is mostly (or even
&lt;em&gt;exclusively&lt;/em&gt;, AFAIK) targeting business customers, meaning corporations such
as the Russian posts and the railway company, whereas the consumer market is
seen as something in the far away future. Just in case you were curious whether
there were any devices on sale with Aurora OS.&lt;/p&gt;
&lt;p&gt;I should also explain why I've refused several very well paying job
opportunities from Western companies: it's actually for a reason that has been
bothering me since last March, and it's a very simple one. The fact is that
because of the sanctions against Russia I already had to change bank once (as
the one I was using fell under sanctions), and in these months I've always been
working with the fear of not being able to receive my salary, since new
sanctions are introduced every month and more and more banks are being added to
the blacklist. That's why I've restricted my job search to companies having an
official presence in Russia; and to my surprise (and from some point of view, I
could even say &lt;em&gt;disappointment&lt;/em&gt;) the selection and hiring processes were so
quick that I received three concrete offers while I was still working my last
weeks at Canonical, and I joined OMP on that very Monday after my last Friday
at Canonical.&lt;/p&gt;
&lt;p&gt;I mean, I could have rested a bit, at least until the Christmas holidays, but
no. ☺  Anyway, I'm so far very happy with my new job, and speaking Russian at
work is something totally new for me, both challenging and rewarding at the
same time.&lt;/p&gt;</description><guid>http://mardy.it/ia/blog/2023/01/back-to-maemo.html</guid><pubDate>Sun, 08 Jan 2023 19:48:52 GMT</pubDate></item></channel></rss>