<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>André Jaenisch's blog</title>
    <link>https://jaenis.ch</link>
    <description>Sharing interesting things I found on the web</description>
    <lastBuildDate>Tue, 06 Feb 2024 16:38:24 +0000</lastBuildDate>
    <pubDate>2024-02-06T21:00:00Z</pubDate>
    <copyright>© 2023 André Jaenisch</copyright>
    <language>en</language>
    <managingEditor>André Jaenisch</managingEditor>
    <webMaster>André Jaenisch</webMaster>
    <item>
      <title>Recap 2024-01</title>
      <link>https://jaenis.ch/en/blog/2024/recap-2024-01/</link>
      <description><p>This post was only published <a href="/de/blog/2024/recap-2024-01/">in German</a>.</p>
</description>
      <pubDate>Tue, 06 Feb 2024 21:00:00 +0000</pubDate>
      <guid>https://jaenis.ch/en/blog/2024/recap-2024-01/</guid>
    </item>
    <item>
      <title>Recap 2024-01</title>
      <link>https://jaenis.ch/de/blog/2024/recap-2024-01/</link>
      <description><p>Wie ich im <a href="./masterplan-for-2024/"><span lang="en">Masterplan</span></a> angekündigt hatte,
möchte ich meine <span lang="en">Recaps</span> jetzt dieses Jahr auf
Monatsebene dokumentieren, nachdem ich es <a href="./recap-2023-q4/">im letzten Jahr quartalsweise</a>
hatte.</p>
<h2><abbr title="Kalenderwoche">KW</abbr> 1</h2>
<p>Ich habe mir etwas Altlasten aus dem alten Jahr mitgenommen. Mein Ziel war,
zum Jahreswechsel mit der Migration auf Vue 3 fertig zu sein. Aufgrund von
Verzögerungen hat das leider nicht ganz geklappt. Ich hatte aber zumindest
einmal feststellen können, dass ich prinzipiell nicht mehr viel zu tun hatte,
um die Arbeiten abzuschließen.</p>
<p>Dahingend kamen mir dann auch Gedanken, wie ich die neuen Kenntnisse am besten
festhalten könnte. Denn die Herausforderung, ein bestehendes Projekt aktuell
zu halten, haben viele Organisationen. Ich habe hier in meiner bisherigen
Laufbahn einiges an Erfahrungen sammeln dürfen, so dass ich mich derartigen
Situationen gewappnet sehe. Ich schwanke noch, ob ich es in einem Webinar
einfangen sollte, oder lieber doch einen Newsletter dazu starten.</p>
<p>Ich habe da auch schon etwas zusammengeklickt, falls du Interesse hast:</p>
<form
 action="https://buttondown.email/api/emails/embed-subscribe/Ryuno-Ki"
 method="post"
 target="popupwindow"
 onsubmit="window.open('https://buttondown.email/Ryuno-Ki', 'popupwindow')"
 class="embeddable-buttondown-form">
 <label for="bd-email">Gib deine E-Mail-Adresse ein</label>
 <input type="email" name="email" id="bd-email" />
 <input type="submit" value="Newsletter abonnieren" />
 <p>
  <a href="https://buttondown.email/refer/Ryuno-Ki" target="_blank" rel="noreferrer noopener">
	 Powered by Buttondown.
	</a>
 </p>
</form>
<p>Daneben betrieb ich Recherche zur Entwicklung von
<span lang="en">Android-Apps</span> mit Kotlin. Meine bisherigen Experimente
sind zu komplex, aber während eines Essens auswärts kam mir eine Idee, für die
ich nichts passendes gefunden habe, gleichzeitig aber leicht umsetzbar sein
sollte.</p>
<p>Ich habe in dieser Woche auch mit der <abbr title="Industrie- und Handelskammer">IHK</abbr> Stuttgart gesprochen, um die
Voraussetzungen zur Externenprüfung abzufragen. Die Hinweise dort habe ich
verarbeitet und mir eine Liste der weiteren Telefonate erstellt. Derartige
Gespräche erschöpfen mich regelmäßig, so dass ich die Terminabfragen etwas
verteilte.</p>
<p>Über die Feiertage sind mir auch einige Kleinigkeiten bei meinen bisherigen
<span lang="en">Web-Apps</span> aufgefallen, die ich dann bereinigen konnte.</p>
<p>Im Januar fallen einige Geburtstage in meiner Familie, so dass ich ein wenig
Geld in die Hand nehmen musste, um Geschenke aufzutreiben. Umso mehr hat es
mich gefreut, einer Künstlerin dabei auch eine Freude bereiten zu dürfen.
Apropos Künstler*in: Mir ist aufgefallen, dass einige Ko-fi als Dienst nutzen.
Nachdem ich darüber bereits schon Menschen unterstützen konnte, habe ich mir
auch ein Konto geklickt. Du kannst mir <a href="https://ko-fi.com/ryunoki79926">einen Tee spendieren</a>, wenn du
magst. Dies stellt eine Alternative zu PayPal dar.</p>
<p>Meine <span lang="en">Fedi-App</span> der Wahl,
<span lang="en">GoToSocial</span>, ist auch aus dem Winterschlaf erwacht, so
dass ich meine Frage stellen konnte. Sie konnte beantwortet werden, was mich in
die Lage versetzte, mehr Konten zu erstellen. Hier werde ich mittelfristig
Inhalte kuratieren. Im ersten Schritt heißt es aber, die
<span lang="en">Followings</span> nach und nach umzuziehen.</p>
<p>Ich habe auch endlich herausgefunden, wie ich mich in Grafana einloggen kann.
Schon gewusst, dass ein Konto erst erstellt werden sollte?</p>
<p>Als ich mich für <span lang="en">Updates</span> und Optimierungen dann auch bei
der Dokumentation für Matomo umsah, sind mir auch noch einige Punkte
aufgefallen, die ich besser machen könnte. Bisher liegen sie in meiner Ablage.
Ich hoffe auch, dass ich mein Wissen dort einbringen kann, weil die Doku nicht
optimal ist.</p>
<h2><abbr title="Kalenderwoche">KW</abbr> 2</h2>
<p>In dieser Woche standen die Anrufe bei Bildungsträgern an, die mich auf die
Externenprüfung vorbereiten würden. Ich finde es interessant, dass sie sich in
bestimmten Bereichen unterscheiden. Wie etwa den Grad der Präsenzpflicht, ob
ich flexibel zwischen <span lang="en">remote</span> und
<span lang="en">on-site</span> wechseln kann und wie das Ausstattung mit
<span lang="en">Hardware</span> konkret aussieht. Mich wurmt, dass ich mit
<span lang="en">Windows</span> arbeiten werden muss und dann auch noch Java
schreiben!</p>
<p>Als Ausgleich konnte ich auch einen anderen Senior-Entwickler
<span lang="en">Feedback</span> geben, der das Jahr
<a href="https://podcastindex.org/podcast/6744433">mit einem <span lang="en">Podcast</span> startete</a>. Ich habe bisher
jede Folge gehört.</p>
<p>Ich habe auch ein kleines wenig Lua schreiben können. Als
<span lang="en">Window Manager</span> verwende ich seit Jahren
<a href="https://awesomewm.org/"><span lang="en">AwesomeWM</a>, welcher in Lua konfiguriert wird.
Nachdem ich mir also ein paar <a href="https://ko-fi.com/s/e160cf866a">wunderschöne Hintergrundbilder</a>
„gekauft” habe, sind diese in einem Ordner entpackt worden.
Jetzt möchte ich ein kleines <span lang="en">Script</span> haben, dass beim
Start zufällig eines davon auswählt und als Hintergrund setzt. Lua hat kein
eigenes Modul zur Interaktion mit dem Dateisystem, aber es gibt ein beliebtes
Paket namens <a href="https://luarocks.org/modules/hisham/luafilesystem"><span lang="en">luafilesystem</span></a>.</p>
<p>Ergänze ich also die <a href="https://awesomewm.org/apidoc/sample%20files/rc.lua.html"><code>rc.lua</code></a> (neuerdings wird es auch in einer
<a href="https://awesomewm.org/apidoc/sample%20files/theme.lua.html"><code>theme.lua</code></a> gepflegt). Ich habe sie von einem System zum anderen
migeschliffen, so dass sich vielleicht noch veraltete Aufrufe darin finden.
Ich brauche dazu die Standardbibliothek <a href="https://awesomewm.org/apidoc/utility_libraries/gears.wallpaper.html"><span lang="en">Gears</span></a>,
die <span lang="en">Theme</span>-Bibliothek
<a href="https://awesomewm.org/apidoc/theme_related_libraries/beautiful.html#beautiful.wallpaper"><span lang="en">Beautiful</span></a>, sowie
<a href="https://www.lua.org/manual/5.3/manual.html#6.7"><span lang="en">math</span></a> und <a href="https://www.lua.org/manual/5.3/manual.html#6.9"><span lang="en">os</span></a> aus der
Standardbibliothek.</p>
<pre class="language-lua"><code class="language-lua"><span class="token comment">-- Standard awesome library</span>
<span class="token keyword">local</span> gears <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">"gears"</span><span class="token punctuation">)</span>
<span class="token comment">-- Theme handling library</span>
<span class="token keyword">local</span> beautiful <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">"beautiful"</span><span class="token punctuation">)</span>
<span class="token comment">-- Notification library</span>
<span class="token keyword">local</span> naughty <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">"naughty"</span><span class="token punctuation">)</span>

<span class="token keyword">local</span> <span class="token keyword">function</span> <span class="token function">set_wallpaper</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span>
    <span class="token comment">-- Wallpaper</span>
    <span class="token keyword">if</span> beautiful<span class="token punctuation">.</span>wallpaper <span class="token keyword">then</span>
        <span class="token keyword">local</span> wallpaper <span class="token operator">=</span> beautiful<span class="token punctuation">.</span>wallpaper
        <span class="token comment">-- If wallpaper is a function, call it with the screen</span>
        <span class="token keyword">if</span> <span class="token function">type</span><span class="token punctuation">(</span>wallpaper<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token string">"function"</span> <span class="token keyword">then</span>
            wallpaper <span class="token operator">=</span> <span class="token function">wallpaper</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span>
        <span class="token keyword">end</span>
        gears<span class="token punctuation">.</span>wallpaper<span class="token punctuation">.</span><span class="token function">maximized</span><span class="token punctuation">(</span>wallpaper<span class="token punctuation">,</span> s<span class="token punctuation">,</span> <span class="token keyword">true</span><span class="token punctuation">)</span>
    <span class="token keyword">end</span>
<span class="token keyword">end</span>

beautiful<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span>gears<span class="token punctuation">.</span>filesystem<span class="token punctuation">.</span><span class="token function">get_themes_dir</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">..</span> <span class="token string">"default/theme.lua"</span><span class="token punctuation">)</span>
<span class="token keyword">local</span> wallpapers <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
<span class="token keyword">for</span> filename <span class="token keyword">in</span> <span class="token function">dirtree</span><span class="token punctuation">(</span>os<span class="token punctuation">.</span><span class="token function">getenv</span><span class="token punctuation">(</span><span class="token string">"HOME"</span><span class="token punctuation">)</span> <span class="token operator">..</span> <span class="token string">"/Bilder/Fractals"</span><span class="token punctuation">)</span> <span class="token keyword">do</span>
	table<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span>wallpapers<span class="token punctuation">,</span> filename<span class="token punctuation">)</span>
<span class="token keyword">end</span>
math<span class="token punctuation">.</span><span class="token function">randomseed</span><span class="token punctuation">(</span>os<span class="token punctuation">.</span><span class="token function">time</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">local</span> wallpaperIndex <span class="token operator">=</span> math<span class="token punctuation">.</span><span class="token function">random</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">#</span>wallpapers<span class="token punctuation">)</span>
naughty<span class="token punctuation">.</span><span class="token function">notify</span><span class="token punctuation">{</span>
	title <span class="token operator">=</span> <span class="token string">"Wallpaper"</span><span class="token punctuation">,</span>
	text <span class="token operator">=</span> <span class="token string">"Index "</span> <span class="token operator">..</span> wallpaperIndex <span class="token operator">..</span> <span class="token string">" of "</span> <span class="token operator">..</span> <span class="token operator">#</span>wallpapers <span class="token operator">..</span> <span class="token string">" led to "</span> <span class="token operator">..</span> wallpapers<span class="token punctuation">[</span>wallpaperIndex<span class="token punctuation">]</span>
<span class="token punctuation">}</span>
beautiful<span class="token punctuation">.</span>wallpaper <span class="token operator">=</span> wallpapers<span class="token punctuation">[</span>wallpaperIndex<span class="token punctuation">]</span>

<span class="token comment">-- Re-set wallpaper when a screen's geometry changes (e.g. different resolution)</span>
screen<span class="token punctuation">.</span><span class="token function">connect_signal</span><span class="token punctuation">(</span><span class="token string">"property::geometry"</span><span class="token punctuation">,</span> set_wallpaper<span class="token punctuation">)</span>

awful<span class="token punctuation">.</span>screen<span class="token punctuation">.</span><span class="token function">connect_for_each_screen</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span>
    <span class="token comment">-- Wallpaper</span>
    <span class="token function">set_wallpaper</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span>

		<span class="token comment">-- Skip the rest</span>
<span class="token keyword">end</span><span class="token punctuation">)</span>
</code></pre>
<p>Ich baue mir hierbei eine Tabelle mit Dateipfaden zu den Bildern auf
(<code>wallpapers</code>), bestimme einen zufälligen Index daraus (Achtung! Der
Zufallszahlengenerator in Lua muss mit einem <span lang="en">Seed</span>
gestartet werden) und weise dann dem Hintergrund <code>beautiful.wallpaper</code> den
Eintrag aus der Tabelle an diesem Index zu. Zum Prüfen gebe ich mir noch eine
Benachrichtigung aus.</p>
<p>Daneben gibt es noch Funktionen, die sich um geänderte Auflösungen und weitere
Bildschirme kümmern.</p>
<p>Ich habe in dieser Woche auch ein Vorstellungsgespräch geführt, was  nicht
weiter verfolgt werden wird. Ich möchte hier nicht näher darauf eingehen.</p>
<p>Stattdessen freue ich mich, in dieser Woche meinen Geburtstag gefeiert haben zu
können.</p>
<h2><abbr title="Kalenderwoche">KW</abbr> 3</h2>
<p>Wie es bei amtlichen Vorgängen so üblich ist, muss manchmal hinterher gelaufen
werden. Ich habe hier meine früheren Arbeitgeber angeschrieben, um eine
Arbeitsbescheinigung anzufordern. Diese konnte entweder elektronisch abgegeben
werden oder muss vom Antragsteller auf Arbeitslosengeld hochgeladen werden.
Es lief teils so, teils so.</p>
<p>Ich habe auch meine <span lang="en">Software</span> aktualisieren können, denn
dies zeitnah zu erledigen ist wichtig und nicht viel Aufwand.</p>
<p>Spannend fand ich auch, dass <span lang="en">F-Droid</span> über eine neue
<span lang="en">App</span> namens <a href="https://f-droid.org/de/2024/01/11/twif.html"><span lang="en">AndroidIDE</span></a>
berichtete.</p>
<p>Die Woche verlief ansonsten eher ruhig, wenn man ein Kindergeburtstag als ruhig
bezeichnen mag.</p>
<h2><abbr title="Kalenderwoche">KW</abbr> 4</h2>
<p>Als hätte ich sie vermisst, war diese Woche wieder von Krankheit geprägt, so
dass nicht viel geschehen ist. Ich konnte
<a href="https://keyoxide.org/"><span lang="en">Keyoxide</span></a> ein wenig unterstützen. Der
Vorschlag, war eine <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy"><span lang="en">Content Security Policy</span></a> zu
setzen, wofür ich gerne <a href="https://addons.mozilla.org/de/firefox/addon/laboratory-by-mozilla/"><span lang="en">Laboratory</span></a> nutze.
Erfahrungsgemäß ist der Anfang meist verwirrend, so dass ich da noch
nachschärfen musste und wieder ein wenig Wissen weitergeben durfte.</p>
<p>Daneben ist es mir wichtig, <span lang="en">Simple Mobile Tools</span> durch
<a href="https://f-droid.org/de/2024/01/18/twif.html"><span lang="en">Fossify</span></a> zu ersetzen, weil diese den
<a href="https://github.com/SimpleMobileTools/General-Discussion/issues/245#issuecomment-1843562683">Besitzer wechselten</a> und der neue Eigentümer hat einen Ruf besitzt.</p>
<h2><abbr title="Kalenderwoche">KW</abbr> 5</h2>
<p>Nachdem die Familie wieder gesundete, setzte ein Streik ein. Also wieder nicht
viel mit produktiver Arbeit. Immerhin konnte ich noch ein Buch von Fuchskind
erwerben, ein wenig Svelte lernen und zu einem Projekt beitragen. Der
<span lang="en">Code</span> ist zu diesem Zeitpunkt noch nicht reif genug, um
ihn hochzuladen.</p>
<h2>Fazit</h2>
<p>Stark angefangen und dann wieder hart von Krankheit ausgebremst worden.
Im Februar geht es weiter.</p>
</description>
      <pubDate>Tue, 06 Feb 2024 21:00:00 +0000</pubDate>
      <guid>https://jaenis.ch/de/blog/2024/recap-2024-01/</guid>
    </item>
    <item>
      <title>Blog</title>
      <link>https://jaenis.ch/en/blog/</link>
      <description><h3><a href="2024">2024</a></h3>
<p>3 articles.</p>
<h3><a href="2023">2023</a></h3>
<p>20 articles.</p>
<h3><a href="2022">2022</a></h3>
<p>0 articles.</p>
<h3><a href="2021">2021</a></h3>
<p>0 articles.</p>
<h3><a href="2020">2020</a></h3>
<p>8 articles.</p>
<h3><a href="2019">2019</a></h3>
<p>33 articles.</p>
<h3><a href="2018">2018</a></h3>
<p>20 articles.</p>
<h3><a href="2017">2017</a></h3>
<p>10 articles.</p>
<h3><a href="2016">2016</a></h3>
<p>1 article.</p>
<h3>2015</h3>
<p>To be ported.</p>
<h3>2014</h3>
<p>To be ported.</p>
<h3><a href="2013">2013</a></h3>
<p>5 articles.</p>
<p>To be ported refers to my old blogs:</p>
<ul>
<li><a href="https://andrejaenisch.wordpress.com/">André Jaenisch on WordPress</a></li>
<li><a href="https://firefoxosundich.wordpress.com/">Firefox OS und Ich</a></li>
<li><a href="https://pubrika.wordpress.com/">Pubrika</a></li>
<li><a href="https://signthis.wordpress.com/">Sign this</a></li>
</ul>
</description>
      <pubDate>Tue, 06 Feb 2024 16:38:08 +0000</pubDate>
      <guid>https://jaenis.ch/en/blog/</guid>
    </item>
    <item>
      <title>Blog</title>
      <link>https://jaenis.ch/de/blog/</link>
      <description><h3><a href="2024">2024</a></h3>
<p>3 Artikel.</p>
<h3><a href="2023">2023</a></h3>
<p>20 Artikel.</p>
<h3><a href="2022">2022</a></h3>
<p>0 Artikel.</p>
<h3><a href="2021">2021</a></h3>
<p>0 Artikel.</p>
<h3><a href="2020">2020</a></h3>
<p>8 Artikel.</p>
<h3><a href="2019">2019</a></h3>
<p>33 Artikel.</p>
<h3><a href="2018">2018</a></h3>
<p>20 Artikel.</p>
<h3><a href="2017">2017</a></h3>
<p>10 Artikel.</p>
<h3><a href="2016">2016</a></h3>
<p>1 Artikel.</p>
<h3>2015</h3>
<p>Muss noch portiert werden.</p>
<h3>2014</h3>
<p>Muss noch portiert werden.</p>
<h3><a href="2013">2013</a></h3>
<p>5 Artikel.</p>
<p>Muss noch portiert werden bezieht sich auf meine früheren Blogs:</p>
<ul>
<li><a href="https://andrejaenisch.wordpress.com/">André Jaenisch on WordPress</a></li>
<li><a href="https://firefoxosundich.wordpress.com/">Firefox OS und Ich</a></li>
<li><a href="https://pubrika.wordpress.com/">Pubrika</a></li>
<li><a href="https://signthis.wordpress.com/">Sign this</a></li>
</ul>
</description>
      <pubDate>Tue, 06 Feb 2024 16:38:08 +0000</pubDate>
      <guid>https://jaenis.ch/de/blog/</guid>
    </item>
    <item>
      <title>Masterplan for 2024</title>
      <link>https://jaenis.ch/en/blog/2024/masterplan-for-2024/</link>
      <description><p>Like I mentioned in <a href="/en/blog/2024/recap-2023-q4/">my recap for fourth quarter of 2023</a> I went to the
jobcenter and declared myself jobless. In consequence they are trying to find
another mode of employment to me. I have no plans to give up on freelancing.</p>
<p>At least that’s what I thought. Here’s the thing: I studied mathematics on <abbr title="Bachelor of Science">BSc</abbr>.
But I failed my thesis. Therefore my highest qualification is the school exam.</p>
<h2>My motto for 2024</h2>
<p><strong>Get qualified</strong></p>
<p>So instead of getting pushed into another employment I learned that it is
possible to test for an external assessment as IT specialist.</p>
<p>This qualification would be of less value than another academic degree but it
also means I can utilise my eight years of experience in the industry to
shorten the time I need to learn. Depending on the institute I sign up with
I will have to learn for six to eight months (again, depends on the institute).
At the end, the Industry Chamber will exam me. If I pass, I can call myself an
IT specialist. Which is <em>something</em>.</p>
<p>I’m currently in the process of acquiring the respective paperwork to be
allowed to follow through on this. I want to be frank:
I’m nervous. The usual target group for exams like these are people leaving
the school. So I will be a few decades older than my peers. My interviews with
the institutes also made me learn that only a handful of people are going this
route each year. Which is fine?</p>
<p>Looking at the plan, I’m really disappointed to have to learn Java over the
course. It’s such a verbose programming language which has no significant
advantages over using something more elegant. Perhaps I can convince them to
write in Kotlin (which I learned for Android development) or Groovy?
The latter is used in Jenkins, a <abbr title="Continuous Integration">CI</abbr> system popular in many companies.
Or at least, in widespread use. That’s not the same, but whatever.</p>
<p>It’s frustrating to learn that each and every institute is requiring a Windows
system (at least I can use their hardware during that time). This operating
system is so awful to use for programming. The only upside I can see is that
it makes it easier for operations to administer the system fleet. Yes, there’s
a <abbr title="Windows Subsystem for Linux">WSL</abbr>, but at that point I could as well run Windows inside of a <abbr title="Virtual Machine">VM</abbr> and use
Linux as host. I’m not happy to face a system that spontaneously decides to
reboot whenever it pleases. I hope I can use git for version control to have
at least some guards against data loss. I haven’t read the fine print because
I need to get the paperwork behind me.</p>
<p>I will also have to accept presence requirements. Either from home over LAN
subjecting myself to a timetracking (and most likely keylogging software or
similar) or in the subsidiary of the institute (under the same surveillance but
at least on someone else’s infrastructure). The afternoons promise to be a bit
more flexible, but I’m working against a clock. That sucks. But the German
bureaucracy is slow to change. At least each option is in walking distance from
home.</p>
<p>Oh, and no vacation. Like, at all. That will be an interesting summer with kids
at home for six weeks.</p>
<p>If I pick up an employment, all state assistance will be nullified immediately.
My last job interview early January turned out to be different than what I
expected. I had to down the offer because I wouldn’t stay there for long.</p>
<p>Undergoing training and qualification means I have to cut down on the time I
can spend on the side as a freelancer. At most 15 hours per week are permitted.
That would translate to 3 hours per day. I had had conversations with people in
December and January informing them on this limitation to allow for
transparency and planning.</p>
<h2>Journaling</h2>
<p>Speaking of I realised that recapping each quarter is a little too long for my
taste. I’m trying to write a recap each month this year. In introspection I
learned that journaling is important for my mental health. I’m not at the point
at which my time estimates are accurate, but listing „wins of the day” helps me
get into a positive mindset. I need this. Over the course of the year I
developed a way to journal from whichever device I have at hand. There are a
handful of systems I still have to incorporate to keep an overview but the
data sources are available already.</p>
<h2>Contributions</h2>
<p>For the next couple of weeks I’m going to wrap up my contributions to
LernTools, so I can hand over the codebase to them. I feel like it will be in
a way better shape than before, allowing for easier development of new ideas.</p>
<h2>Ideas</h2>
<p>Speaking of ideas, there is an app idea I will develop in the first quarter and
submit to F-Droid. If that works, I perhaps take the bite and submit it to
Google Play Store as well, although their acceptance criteria got harder.</p>
<p>I picked something with low complexity to learn the fundamentals. I already
have one or two different apps in the working but need to study more before I
feel confident to submit them to an app store.</p>
<p>Learning about Android development will help me in my own product idea because
… no, this is going to be a secret for now. If you are curious,
<a href="mailto:andre.jaenisch.wdc@posteo.net">get in touch</a>.</p>
<h2>Others</h2>
<p>Also something I need to whip up is a portfolio page. I already have something
but I’m never satisfied with the results.</p>
<p>I’m not entirely sure whether I can stick to it but I want to blog more.
There’s also the idea to utilise the newsletter with Buttondown to educate
people of software challenges I faced and strategies to overcome them.
If I then have the time I am also recording a podcast on why
The Small Web Rocks! It’s one of those things I have bought a domain for.</p>
</description>
      <pubDate>Thu, 18 Jan 2024 20:20:00 +0000</pubDate>
      <guid>https://jaenis.ch/en/blog/2024/masterplan-for-2024/</guid>
    </item>
    <item>
      <title>Masterplan für 2024</title>
      <link>https://jaenis.ch/de/blog/2024/masterplan-for-2024/</link>
      <description><p>Wie ich im <a href="/de/blog/2024/recap-2023-q4/">meinem Recap zum vierten Quartal 2024</a> erwähnte, bin ich bei
der Agentur für Arbeit vorstellig geworden und habe mich arbeitslos gemeldet.
In der Folge unterstützen sie mich dabei, eine neue Beschäftigung für mich zu
finden. Ich hege nicht die Absicht, meine Selbstständigkeit aufzugeben.</p>
<p>Zumindest dachte ich das. Es ist nämlich so: Ich habe Mathematik auf <abbr title="Bachelor of Science">BSc</abbr>
studiert. Aber meine Thesis ist nicht bestanden. Demnach ist meine höchste
Qualifikation das Abitur.</p>
<h2>Mein Motto für 2024</h2>
<p><strong>Qualifizier dich</strong></p>
<p>Anstatt jetzt also in ein weiteres Anstellungsverhältnis gedrängt zu werden,
erfuhr ich, dass es möglich ist, eine Externenprüfung zum Fachinformatiker
abzulegen.</p>
<p>Diese Qualifikation ist weniger wert als ein akademischer Abschluss, aber es
bedeutet auch, dass ich meine achtjährige Berufserfahrung einsetzen kann, um
die Ausbildung abzukürzen. Je nach Bildungseinrichtung, für das ich mich
entscheide, muss ich dann noch sechs bis acht Monate auf die Prüfung lernen.
Am Ende wird diese von der <abbr title="Industrie- und Handelskammer">IHK</abbr> abgenommen. Wenn ich bestehe, darf ich mich
Fachinformatiker nennen. Das ist immerhin <em>etwas</em>.</p>
<p>Ich bin derzeit damit beschäftigt, den notwendigen Papierkram zu erledigen, um
zur Prüfung zugelassen zu werden. Ich möchte offen sein: Ich bin nervös.
Die übliche Zielgruppe für diese Prüfungen sind Menschen, die gerade die
Schule abgeschlossen haben. Ich erwarte also, einige Jahrzehnte älter zu sein.
Bei den Gesprächen mit den Bildungseinrichtungen habe ich auch erfahren, dass
sich jährlich nur eine Handvoll Menschen für diesen Weg entscheiden. Ich
schätze, dass ist dann okay so?</p>
<p>Wenn ich mir den Ausbildungsplan so anschaue, bin ich ziemlich enttäuscht, dass
ich nun doch Java lernen muss. Es ist in meinen Augen so eine geschwätzige
Programmiersprache, um Probleme zu beschreiben, die sich mit anderen Mitteln
viel eleganter lösen ließen. Vielleicht kann ich die Tutoren überzeugen, dass
ich Kotlin schreiben darf (was ich für Android-Entwicklung gelernt habe)?
Oder Groovy, was in Jenkins verwendet wird. Das ist ein <abbr title="Continuous Integration">CI</abbr> System, welches in
vielen Firmen eingesetzt wird.</p>
<p>Es ist frustrierend zu erfahren, dass jede einzelne Bildungseinrichtung
<span lang="en">Windows</span> voraussetzt (immerhin kann ich mir die Hardware
für die Zeit ausleihen). Dieses Betriebssystem ist so unbequem zum
Programmieren. Den einzigen Vorteil, den ich erkennen kann, ist die einfache
Administration der Systemflotte. Ja, es gibt <abbr title="Windows Subsystem for Linux">WSL</abbr>, aber an dem Punkt kann ich
genauso gut Windows in einer <abbr title="Virtual Machine">VM</abbr> laufen lassen und Linux als
<span lang="en">Host</span> einsetzen. Ich bin nicht froh darüber, mich mit
einem System beschäftigen zu müssen, welches spontan einmal beschließt, dass
jetzt der richtige Zeitpunkt für einen Neustart ist. Hoffentlich kann ich
zumindest <span lang="en">git</span> zur Versionskontrolle verwenden, um mich
gegen Datenverlust zu schützen. Ich habe mir noch nicht das Kleingedruckte
durchgelesen, weil ich erst einmal die Nachweise beibringen muss.</p>
<p>Ich werde mich auch auf Anwesenheitspflicht einstellen müssen. Entweder von
Zuhause aus mit LAN, wobei ich mich einer Zeiterfassung (und vermutlich auch
<span lang="en">Keylogging-Software</span> oder dergleichen) unterwerfen muss
oder von einer Zweigstelle vor Ort (unter vergleichbarer Überwachung, aber
zumindest nicht meiner Infrastruktur). Die Nachmittage versprechen, etwas
flexibler zu sein, aber ich arbeite gegen die Uhr. Das nervt. Aber die deutsche
Bürokratie bewegt sich nun einmal langsam. Immerhin ist jede Option in
Laufweite entfernt.</p>
<p>Oh, und es gibt keine Ferien. Also so gar nicht. Das wird spannend mit Kindern,
die über Sommer sechs Wochen daheim sein werden.</p>
<p>Wenn ich eine Anstellung annehme, enden sämtliche staatlichen Unterstützungen
augenblicklich. Mein letztes Vorstellungsgespräch von Anfang Januar verlief
anders, als ich es erwartet habe. Ich habe das Angebot ablehnen müssen, weil
ich dort nicht lange geblieben wäre.</p>
<p>Während der Ausbildung und Prüfung werde ich weniger Zeit in die
Selbstständigkeit stecken können. Höchstens 15 Stunden in der Woche sind
erlaubt. Das entspricht drei Stunden pro Tag. Ich habe in Unterhaltungen im
Dezember und Januar mein Gegenüber darauf aufmerksam gemacht, um Transparenz
zu schaffen und die Planung zu erleichtern.</p>
<h2>Rückschaus</h2>
<p>Wo wir gerade von Transparenz sprechen: ich habe für mich festgestellt, dass
quartalsweise Rückblicke für mich gefühlt zu lange sind. Daher versuche ich
dieses Jahr, monatsweise eine Rückschau zu schreiben. Während meiner
Introspektion ist mir auch bewusst geworden, wie wichtig
<span lang="en">Journaling</span> für meine mentale Gesundheit ist. Ich bin
noch nicht an dem Punkt, wo meine Zeiteinschätzungen zuverlässig sind, aber
meine <span lang="en">Wins of the day</span> festzuhalten, hilft mir, in eine
zuversichtlichere Haltung zu kommen. Ich brauche das. Im abgelaufenen Jahr habe
ich einen Weg gefunden, von jedem Gerät aus in mein
<span lang="en">Journal</span> zu schreiben. Es gibt noch eine Handvoll von
Systemen, die ich in meinen Überblick einpflegen muss, aber die Datenquellen
sind bereits vorhanden.</p>
<h2>Beiträge</h2>
<p>In den nächsten Wochen werde ich meine Beiträge zu LernTools abschließen, so
dass ich das Ergebnis an das Team übergeben kann. Ich habe das Gefühl, es ist
jetzt in einem deutlich besseren Zustand als vorher. Das erlaubt eine
einfachere Umsetzung neuer Ideen.</p>
<h2>Ideen</h2>
<p>Apropos, ich habe eine <span lang="en">App</span> im Sinn, die ich im ersten
Quartal entwickeln und bei <span lang="en">F-Droid</span> einreichen werde.
Falls das funktioniert, kann ich vielleicht auch die Pille schlucken und sie
im Google Play Store einreichen, auch wenn deren Akzeptanzkriterien kürzlich
verschärft wurden.</p>
<p>Ich habe mir etwas ausgesucht, was eine geringe Komplexität aufweist, um die
Grundlagen zu lernen. Ich habe auch schon ein oder zwei
<span lang="en">Apps</span> in der Mache, aber dafür muss ich noch mehr lernen,
bevor ich mich sicher genug fühle, sie in einem
<span lang="en">App-Store</span> einzureichen.</p>
<p>Mehr über <span lang="en">Android</span> zu lernen, wird mir bei meiner
Produktidee zu … nein, das ist vorerst ein Geheimnis. Wenn du neugierig bist,
<a href="mailto:andre.jaenisch.wdc@posteo.net">schreib mir eine Nachricht</a>.</p>
<h2>Sonstiges</h2>
<p>Ich muss mich auch endlich hinsetzen, und meine Portfolio-Seite live schalten.
Ich habe seit einige Zeit etwas, aber ich bin nie zufrieden mit dem Ergebnis.</p>
<p>Noch bin ich mir unsicher, aber ich will auch mehr bloggen. Da ist auch noch
die Idee, dass ich endlich den <span lang="en">Newsletter</span> bei
<span lang="en">Buttondown</span> aktiviere und andere über Herausforderungen
aufschlaue, die ich bei Software gegenüberstand und wie ich sie überwunden
habe.</p>
<p>Wenn ich dann noch Zeit habe, nehme ich einen <span lang="en">Podcast</span>
auf, warum <span lang="en">The Small Web Rocks</span>. Es ist schließlich
eine dieser Ideen, für die ich schon eine Domain gekauft habe.</p>
</description>
      <pubDate>Thu, 18 Jan 2024 20:20:00 +0000</pubDate>
      <guid>https://jaenis.ch/de/blog/2024/masterplan-for-2024/</guid>
    </item>
    <item>
      <title>Recap 2023 Q4</title>
      <link>https://jaenis.ch/en/blog/2024/recap-2023-q4/</link>
      <description><p>This post was only published <a href="/de/blog/2024/recap-2023-q4/">in German</a>.</p>
</description>
      <pubDate>Tue, 16 Jan 2024 21:00:00 +0000</pubDate>
      <guid>https://jaenis.ch/en/blog/2024/recap-2023-q4/</guid>
    </item>
    <item>
      <title>Recap 2023 Q4</title>
      <link>https://jaenis.ch/de/blog/2024/recap-2023-q4/</link>
      <description><p>Wieder einmal bin ich etwas spät dran. Dieses Mal kamen mir die Feiertage in
den Weg. Aufgrund schlechter Auftragslage habe ich in den Schulferien nach den
Kindern geschaut. Nichtsdestotrotz möchte ich noch auf das abgelaufene Quartal
zurückblicken. Ein Ausblick für 2024 wird es in einem eigenen Artikel geben.</p>
<p>Dies ist eine Fortsetzung meiner Reflektion vom <a href="/de/blog/2023/recap-2023-q1/">ersten</a>, <a href="/de/blog/2023/recap-2023-q2/">zweiten</a> und
<a href="/de/blog/2023/recap-2023-q3/">drittem</a> Quartal 2023.</p>
<h2>Oktober</h2>
<p>Ich habe angefangen, die Architektur meines Frameworks soweit zu überarbeiten,
dass ich es paketieren kann. Eine Handvoll von Paketen habe ich auf NPM
veröffentlicht. Mein Ziel ist es, dies auch in meiner Forgejo-Instanz zu tun,
weil es mir eine Unabhängigkeit einräumt. Leider haben hier die Dokumentation
nicht zum gewünschten Ergebnis geführt.</p>
<p>Ich werde diese Architektur zu einem Produkt ausbauen, mit dem ich Einnahmen
generieren möchte.</p>
<p>Um nicht an einer Zielgruppe vorbei zu entwickeln, begann ich auch damit, mich
in entsprechenden Foren anzumelden. Hier ist noch mehr Kontaktpflege notwendig.</p>
<p>Mein persönliches Highlight war ein Treffen der Genossenschaft. Hier habe ich
Menschen auch persönlich kennengelernt. Wir sind ein interessanter Haufen.
Mir hat gefallen, dass es regelmäßig Pausen zum Lüften gab.</p>
<p>Die Leipziger Lärchen kamen gut bei der Familie an.</p>
<p>Die zweite Oktoberhälfte war ich selbst oder der Nachwuchs krank.</p>
<h2>November</h2>
<p>Im November hat es mich auch einen Großteil auf die Bretter geworfen, so dass
ich nicht viel entwickeln konnte. Es reifte aber die Einsicht, dass sich die
Produktidee nicht schnell genug umsetzen lassen würde, so dass ich Gespräche
für Anstellungsverhältnisse aufnahm.</p>
<p>Nachdem ich den Großteil des Jahres geknausert habe, nahm ich etwas Geld in die
Hand, um Communities zu unterstützen, deren Arbeit ich seit Monaten verfolge.
Dabei habe ich mich auch in Ko-fi angemeldet. Vielleicht kann ich dem Beispiel
anderer Kreativen folgen, und einen Teil meiner Zeit für die Community durch
die Community finanzieren lassen. Es wird nicht zum Lebensunterhalt ausreichen,
aber es motiviert mich, das zu verfolgen, was mir Spaß macht.</p>
<h2>Dezember</h2>
<p>Im Dezember gingen dann Vorstellungsgespräche weiter. Ich muss feststellen,
dass es viele Firmen in meiner Region gibt, die es nicht hinbekommen, das
Framework ihrer Wahl auf dem Laufenden zu halten. Es wäre weniger tragisch,
würde es immer noch Support erhalten. Aber das ist nicht der Fall. Teilweise
sogar seit Jahren nicht mehr. Bin nur ich es, der daran Sicherheitsrisiken
sieht? Tipp: Freelancer dafür engagieren, die Codebase aufzuräumen. Saurer
Apfel, aber nach einem oder zwei Monaten seid ihr einen Großteil eurer
technischen Schuld los, wenn es gut läuft. Ohne das operative Geschäft massiv
zu beeinträchtigen. Interessiert? <a href="mailto:andre.jaenisch.wdc@posteo.net">Schreibt mich gerne an</a>.
Ich fühle mich mit Angular, React und Vue wohl, kann mich aber auch schnell in
andere Frameworks einarbeiten.</p>
<p>Ich habe in diesem Monat mit einer kleinen Handvoll Projekten gesprochen, bei
denen ich im Team an Aufgaben arbeiten kann, für die ich eine Bezahlung
erwarten darf. Ob die Finanzierung gesichert werden kann, ist leider ungewiss.</p>
<p>Ansonsten war auch dieser Monat stark durch Krankheit gezeichnet, der dann von
Schulferien abgelöst wurde.</p>
<p>Nachdem ich jezt also ein Jahr lang keine Einnahmen generieren konnte, habe ich
auch selbst eine Entscheidung treffen müssen, die mir nicht gefällt und mich
beim Arbeitsamt als arbeitssuchend und arbeitslos gemeldet.</p>
<p>Über das Ergebnis des Beratungsgesprächs werde ich im Ausblick für 2024
informieren.</p>
<h2>Ausblick</h2>
<p>Krankheit nervt. Ich muss mir meine Aufgabenpakete kleiner schneiden, so dass
ich auch die wenigen Stunden am Tag, an denen ich vielleicht Fortschritte
machen kann, optimal ausnutzen kann. Das bedeutet auch eine bessere
Organisation als bisher. Meine verfügbare Zeit 2024 wird noch einmal deutlich
eingeschränkter sein. Ich kann nur hoffen, dass ich auch den Rückhalt erhalte,
den ich brauche, um da durchzukommen.</p>
</description>
      <pubDate>Tue, 16 Jan 2024 21:00:00 +0000</pubDate>
      <guid>https://jaenis.ch/de/blog/2024/recap-2023-q4/</guid>
    </item>
    <item>
      <title>Recap 2023 Q3</title>
      <link>https://jaenis.ch/en/blog/2023/recap-2023-q3/</link>
      <description><p>This post was only published <a href="/de/blog/2023/recap-2023-q3/">in German</a>.</p>
</description>
      <pubDate>Wed, 15 Nov 2023 13:00:00 +0000</pubDate>
      <guid>https://jaenis.ch/en/blog/2023/recap-2023-q3/</guid>
    </item>
    <item>
      <title>Recap 2023 Q3</title>
      <link>https://jaenis.ch/de/blog/2023/recap-2023-q3/</link>
      <description><p>Dieser Beitrag ist lange überfällig. Ich werde auch ausführen, was für die
Verzögerung verursacht hat.</p>
<p>Dies ist eine Fortsetzung meiner Reflektion vom <a href="/blog/2023/recap-2023-q1/">ersten Quartal</a> und dem <a href="/blog/2023/recap-2023-q2/">zweiten Quartal</a>.</p>
<h2>Juli</h2>
<p>Im Juli war ich mit dem Umzug auf den <abbr title="Virtual Private Server">VPS</abbr> beschäftigt. Dies betrifft vor allem
erst einmal meine Code Repositories.</p>
<p>Daneben habe ich mich auf den <a href="https://sovereigntechfund.de/de/">Sovereign Tech Fund</a> beworben.</p>
<p>Während ich nach Aufträgen Ausschau gehalten habe, ist auch ein kleines Projekt
herausgefallen, was mich nur ein paar Stunden Aufwand gekostet hat:
<a href="https://md2plain.demo.jaenis.ch/"><span lang="en">Markdown to Plain text</span></a>.
Es hilft dabei, Changelog-Einträge aus einer Markdown-Datei in ein Format zu
überführen, wie es die App Stores erwarten. Damit hab ich einem Entwickler
geholfen, dessen App ich selber nutze. Die Markdown-Datei wird dabei im
<span lang="en">Code-Repository</span> zusammen mit der eigentlichen
Entwicklung gepflegt.</p>
<p>Mir sind noch mehr solcher Ideen aufgefallen, aber ich habe keine Idee, wie ich
sie monetarisieren könnte. Daher teile ich sie quelloffen unter einer Copyleft-
Lizenz mit der Gemeinschaft.</p>
<p>Es ist auch der Monat, in dem mich eine Krankheit das erste Mal in’s Bett
gezwungen hat. Aus irgendeinem Grund habe ich nicht damit gerechnet. Ich führe
aber Buch darüber, damit ich für kommende Jahre besser planen kann, wieviel
Kapazität realistisch sind.</p>
<p>Schlussendlich ist es auch der Monat, in dem ich
<a href="/de/blog/2023/eleventy-esm-storybook/">meine <span lang="en">Eleventy-Templates</span> in mein Design System</a>
überführen konnte. Ich möchte es erlauben, anderen den Gedankenprozess
nachzuvollziehen. Wenn ich nur auf den Code blicke, fehlt oft der Kontext.
Wenn ich Glück habe, kann ich einiges aus den
<span lang="en">Commit Messages</span> herauslesen.
Meiner Erfahrung nach, sind diese aber oft sehr minimalistisch gehalten. Ging
mir persönlich auch lange Zeit so, weil die eigentlichen Informationen im
Ticket-System standen. Jetzt habe ich aber auch erlebt, wie diese mit einem
Umzug auf ein anderes System nicht mitgenommen wurde. Dies hat mich motiviert,
mich dahingehend zu disziplinieren, ausführlichere Beschreibungen zu verfassen.
Das Design-System erlaubt darüber hinaus, auch Architektur zu beschreiben.</p>
<h2>August</h2>
<p>Im August war ich auch fleißig. Ich habe mich mit meinem Unternehmen
dahingehend beschäftigt, mir Gedanken zum Auftritt in der physischen Welt zu
machen. Wenn ich auf Veranstaltungen gehen möchte, um Kontakte zu pflegen,
wäre es hilfreich, etwas zu haben, was ich mitgeben kann. Ein Kernelement dazu
ist ein eigenes Logo. Im August habe ich <a href="/de/blog/2023/ive-made-a-logo/">mein Logo vorgestellt</a>.</p>
<p>Leider haben wir auch dieses Jahr den Entwickler hinter dem Vim-Editor verloren.
Vieles wurde von der Gemeinschaft bereits ausgedrückt. Ich fühle mich dann
immer abgehängt. Von daher habe ich <a href="/de/blog/2023/my-history-with-vim/">meine eigene Erfahrung mit Vim</a>
niedergeschrieben. Dies ist etwas, was niemand anderes hätte schreiben können.
Ich bleibe bei diesem Editor.</p>
<p>Im August hatte ich auch an einem Experten-Interview teilgenommen. Meines
Wissens nach werden die Ergebnisse allerdings nicht veröffentlicht, fließen
aber in die Überlegungen zur Weiterentwicklung ein. Neugierig zum Thema?
<a href="mailto:andre.jaenisch.wdc@posteo.net">Schreib mir doch eine Nachricht</a>.</p>
<p>Ich bin zwar nicht dazu gekommen, über das Aufsetzen eines Web-Servers zu
schreiben, habe aber einen Mailserver eingerichtet. Aktuell ist er so
vernagelt, dass ich keine Registrierungen erlaube. Vielmehr geht es darum,
Systemmeldungen versenden zu können. Nichtsdestotrotz habe ich regelmäßig
Besuch von <span lang="en">Script Kiddies</span>. Hintergrundrauschen im
Internet eben. Mittelfristig möchte ich die Domain zumindest verwenden können,
um Registrierungen abschließen zu können und so den Datenhandel im Netz
nachforschen zu können. Hierzu gibt es auch einiges zu schreiben.</p>
<p>Den Großteil des Monats hat aber Urlaub und
<a href="https://js13kgames.com/"><span lang="en">js 13k games</span></a> eingenommen.
Wie in den letzten Jahren gibt es hier regelmäßig Überschneidungen. Das hängt
vor allem mit den Schulferien und Schließtagen in der <abbr title="Kindertagesstätte">KiTa</abbr> zusammen. Ich konnte
aber wieder mittels Termux auf dem <span lang="en">Smartphone</span>
programmieren und so den schweren <span lang="en">Laptop</span> daheim lassen.
<span lang="en">Bluetooth</span>-Tastatur sei Dank!</p>
<h2>September</h2>
<p>Nach nur einem Monat war <a href="https://js13kgames.com/"><span lang="en">js 13k games</span></a>
auch schon wieder vorbei. Grund genug, die Erfahrungen in einem
<a href="/de/blog/js13kgames-postmortem-the-baltic-league/">Postmortem</a> festzuhalten.</p>
<p>Aber auch die Schule hat wieder angefangen, was mir mehr Freiraum in der
Tagesgestaltung eröffnet. Mir ist es wichtiger, nach den Kindern zu schauen,
als am Laptop zu sitzen. Folglich sollte ich in der Kapazitätsplanung also
nicht nur Krankheitstage berücksichtigen, sondern wohl auch Schulferien.</p>
<p>Den Großteil des Monats habe ich in mein nächstes Produkt gesteckt. Wenn ich
zu wenig Aufträge bekomme, versuche ich eben, mit einem Produkt am Markt
aufzutreten. Hier kann ich auch meine über die Jahre angesammelte Expertise
anwenden. Mehr dazu aber in einem anderen Beitrag.</p>
<h2>Ausblick</h2>
<p>Es war ein ziemlich aufregendes zweites Halbjahr bis jetzt. Leider ist
Corona noch nicht vorbei. Tatsächlich hat es mich erwischt und wieder einen
Monat lang auf’s Bett geworfen. Ich fühle mich noch nicht wieder voll fit, aber
möchte die Energie auch nutzen, um in’s Arbeiten zu kommen.</p>
<p>An dieser Stelle möchte ich auch bekannt geben, dass ich mich auf Positionen
als Angestellter in der Frontend-Entwicklung bewerbe. Falls du in dieser
Richtung suchst, <a href="mailto:andre.jaenisch.wdc@posteo.net">schreib mir eine Nachricht</a>.
Einen Lebenslauf schicke ich auf Anfrage.</p>
<p>Für Kalenderwoche 47 habe ich bereits ein erstes
<span lang="en">Interview</span> vereinbart.</p>
<p>Ich bin technologieoffen. <span lang="en">React</span>,
<span lang="en">Angular</span>, <span lang="en">Vue</span> oder auch
klassisches JavaScript oder TypeScript. Ich nehm alles.</p>
<p>Dafür bringe ich dann auch Expertise in Bereich Barrierefreiheit und
<span lang="en">Securit</span> sowie Software-Architektur mit.</p>
<p>Ich habe nicht vor, meine Selbstständigkeit aufzugeben. Sie wird aber in den
Nebenberuf geschoben, weil ich meine Ersparnisse auffrischen muss. Die
Grundlagen für die Produktentwicklung sind gelegt, so dass ich in kleinen
Schritten vorangehen kann.</p>
<p>Ich erwarte, dass dies in Gesprächen mit Hinblick auf Zeit und Ort
berücksichtigt wird.</p>
</description>
      <pubDate>Wed, 15 Nov 2023 13:00:00 +0000</pubDate>
      <guid>https://jaenis.ch/de/blog/2023/recap-2023-q3/</guid>
    </item>
    <item>
      <title>js13kgames Postmortem - The Baltic League</title>
      <link>https://jaenis.ch/en/blog/2023/js13kgames-postmortem-the-baltic-league/</link>
      <description><p>When I look back at my postmortems of <a href="https://www.js13kgames.com/">js13kgames</a> entries I
realise that the last one is already five years old. Far too long.
This post was also published <a href="/de/blog/2023/js13kgames-postmortem-the-baltic-league/">in German</a>.</p>
<p>So I want to write a new one as long as the memory is still somewhat fresh.
You can do me a favour and <a href="https://js13kgames.com/entries/the-baltic-league">play &amp; vote it</a>.</p>
<p>Given that js13kgames is advertised in different places
(GitHub, Frontend Masters et al.) I’m going to assume you have heard about it.
If not, go visit their website. Read their blog.</p>
<h2>The topic</h2>
<p>The topic for this year was <em>13th century</em>. When I look up the history books on
what happened in that time I come across the orders. The crusades. The Silk
Road (not the dark marketplace but the physical trade road through Asia).</p>
<p>I also realise that it is the beginning of The Hanseatic League.</p>
<h2>On Digital Colonisation</h2>
<p>When I talk to people from abroad, especially South America and Africa, I learn
about something called Digital Colonisation. To summarise it it’s the attitude
of people in the Western World to tell stories from cultures they don’t grew up
in.</p>
<p>For some time I feel like there are stories in Germany that have not been told.
We have a rich world of fantasy. Part of it is known. Others less so.
When I was a kid, I’ve read through dozens of books. Not only German folklore,
but also Czech and Russian. Fabulous.</p>
<p>I also remember having played a <a href="https://www.myabandonware.com/game/hanse-gd/play-gd">game on DOS on the Hanse</a>. By today’s
standards the graphics were abysmal. It piqued my interest nonetheless.
Learning about other countries. Trading goods.</p>
<p>When I researched more on the Hanseatic League I’ve learned that they managed
to pressure even kings to grant them privileges others (sometimes not even
their own peasants!) enjoyed. By bonding together and acting in unity.</p>
<p>So that quickly became the topic I wanted to go for. Given that the competition
always overlaps with our vacation I had not much time to set up my devices.
Yes, I coded during the vacation. Judge me. No, I haven’t taken my laptop with
me. Who do you think I am?</p>
<h2>Boilerplate</h2>
<p>Since I have <a href="https://code.jaenis.ch/">my own Forgejo instance</a> now, I created a repository there
and cloned it to my laptop. I’ve added the <code>package.json</code> to turn it into a
JavaScript project.</p>
<p>Luckily I was able to utilise the platform I polished the past couple of month
to create the boilerplate structure to get me going. I noticed that I missed a
few elements, but the competition allowed me to feed back the fixes.</p>
<p>That was basically everything I’ve done on my first day. Already saved me a
couple of hours. Had to pack for the rest of the days :)</p>
<p>When I tried it, nothing rendered. So much for a great start. It took me a bit
of thinking but I noticed the mismatch and fixed it. Second day under my belt.</p>
<p>The slow trajectory continued for a few days until I managed to get a slightly
bigger slice of the day to do what I wanted.</p>
<p>Turns out if I can focus I get things done. That’s something that frustrated me
over the last couple of months. It’s not easy with kids around you all the
time. I feel like there was a higher acceptance during the pandemic.</p>
<p>But now, I’m sitting most of the time at home and „can do the chores because
I am at home”. I doubt that my business will lift up if I invest no time in it.</p>
<p>By now the situation got better. Schools reopened. My laundry list of things
I want to do is growing and growing. That’s good. It means I’m still creative.</p>
<h2>The architecture</h2>
<p>I know the drill of my own framework sufficiently good by now.
It’s going to be part of <a href="https://design.jaenis.ch/?path=/docs/js13kgames-2023-architecture--docs">my design system</a>.</p>
<p>It boils down to be <a href="https://blog.bitsrc.io/using-jotai-in-your-react-application-de460568ac9d">state</a>-driven. With event listeners responsible
to dispatch actions that update the state via reducers.
The separation allows for easy testing.
Even more so as I can rely on the state alone to check the validity of actions
once I have covered the <abbr title="User Interface">UI</abbr> components with tests.</p>
<p>For them I’ve decided to go once again with HTML and SVG. It’s text based.
That means it will compress well. I can then focus on putting together the
different elements.</p>
<p>I was shocked to realise that I had virtually no tests in the last couple of
entries. That’s so unlike me. I usually have tests, but I guess I was so busy
with getting my ideas out. Still, this year the tests and TypeScript annotation
saved me a couple of hours. Especially towards the end when I refactored my
structure heavily and had to touch basically all files.</p>
<p>But there were also times when TypeScript got in my way. For a single person I
see not enough value to recommend it.</p>
<h2>Documentation</h2>
<p>This was a difficult subject to me. On the one hand I’ve managed to write
something down for every single day.</p>
<p>On the other hand, this did not happen on the same day as I coded it. Sometimes
the journal entry lagged several days behind. Then there is next to no
structure. I had built up a format the last couple of years but not adopted it
for this entry. I’m thinking about why. Perhaps I should have included it in
the boilerplate?</p>
<p>I especially miss the screenshots (good luck with that on mobile) and the diff.
Then I couldn’t remember the path format for displaying commit diffs on
Forgejo.</p>
<p>I omitted the Game Development Document entirely.</p>
<p>I’ve included JSDoc annotations. That’s something. It explains on a unit level
what each part is meant to do. I cannot help but feel that a single sentence is
providing not enough information. But where to place the details? The README?
Will get skimmed over. Inside the repository? Perhaps. For this year I’ve
decided to include it in the <a href="https://design.jaenis.ch/?path=/docs/js13kgames-2023-architecture--docs">Design System</a>. This is going to be the
hub of what I want to do anyway.</p>
<h2>Research</h2>
<p>I can tell you that it’s not easy to figure out the history of eight centuries
ago. The Internet isn’t as helpful as I’ve hoped. I downloaded some articles
from Wikipedia (PDF export) to read offline during the vacation. But even back
home and with proper Internet I wasn’t getting further. Luckily the library had
material. That surprised me. I wasn’t expecting to find anything given that the
town is so far away from the coast.</p>
<p>I only evaluated a fraction of the material. Even now, after I have submitted
the entry. During my studies I would have created BibTeX references and wrote
down the learnings. But I also noticed that I lack a proper structure to help
me make use of what I learn. I ended up putting the magazine and books next to
me and work directly from it.</p>
<p>Picking a font wasn’t easy either. There are several nautical fonts available
on the market. Almost all of them are for sale. I’m going to shout out the
<a href="https://velvetyne.fr/fonts/boeticher/">Velvetyne Type Foundry</a> for an Open Source font that evoked a sense
of the sea in me. My thanks also go out to Zach Leatherman for sharing
<a href="https://www.zachleat.com/web/css-tricks-web-fonts/">how to subset a font</a>. This allowed me to trim down the font to the
eleven glyphs I actually needed while converting it to WOFF2 format.</p>
<p>I have an open research task here in figuring out how to map the glyphs.
I’d prefer to have either lower or upper case in the writing but had to go with
a mixed style to actually match the glyphs in the font.</p>
<p>After I went back from vacation I also learned that
<a href="https://eslint.org/blog/2022/08/new-config-system-part-1/">ESLint has a new format for its config files</a>. So I’ve updated mine.
And broke everything. Turned out I need to adhere to an interface that not all
plugins have been updated to. So a handful of <abbr title="Pull Request">PR</abbr> here will follow. Everyone
will benefit.</p>
<p>Although I like the <a href="https://standardjs.com/">Standard</a> style I miss a formatter. Might go
with <a href="https://prettier.io/">Prettier</a> next time. <a href="https://editorconfig.org/">Editorconfig</a> alone did not
enforced everything.</p>
<p>Then there was this funny moment when the Terser plugin for Rollup was always
breaking. But only on my phone. I have to this day not figured out what exactly
is going on there. My gut feeling is that the case is too exotic to be worth
reporting. I might do once I have a fix handy.</p>
<h2>Development</h2>
<p>I have learned a handful of lessons from the development of this game.
Arrays are not the best data structure. I initially went with them because I
thought that it would ease my work with looping over the items in the
components. But <code>Object.entries</code> is a great alternative.</p>
<p>Using Objects with a type of <code>Record&lt;T, U&gt;</code> (not with generics, but with the
concrete types) helped me a lot. I was afraid of heaving to list every single
property in all cases but given that ZIP benefits from repetition this is not
a downside in the bundle size. In fact being smart increased the build time and
again to me. But by using an object I could dynamically access its properties,
could make TypeScript help me (especially when the keys are a defined union of
string literals) and avoid <code>null</code> and <code>undefined</code> checks.</p>
<p>So in summary: Think hard about your data structure.</p>
<p>I was surprised when I wanted to test the dispatching of different actions on
a single event. I could not figure out why the method wasn’t properly spied.
This is some advanced JavaScript internals going on here. I won’t go into the
details as this blog post is going to become long enough on its own.
<a href="mailto:andre.jaenisch.wdc@posteo.net">Write me an email</a> if you want me to write down the results of my
research. Once I stubbed the event object itself, things became easier.</p>
<p>Lovely, this programming languages. It’s never going to be boring with it.</p>
<h2>Usability</h2>
<p>I repeatedly built and played the game on my laptop (using keyboard mostly) and
my phone. I went with the browser form elements to stay accessible. My
frustration is mainly with the <code>range</code> input.</p>
<p>I want to offer something that allows for dragging. A number input would have
meant typing. This slows down the pace of the game. A range input also gives
an indicator of … well, the range of values you can pick. But it wasn’t the
perfect choice.</p>
<p>I need a form input that allows to pick a value from 0 to N. The N is not
necessarily the maximum though. Take a look at the market for example.
In my mind I would like to have an input, that allows to pick any number of a
certain good. The maximum available is limited by the remaining space of the
warehouse (which ended up being unlimited in size because I hit the byte limit)
and the money at hand. But the market could have more.</p>
<p>Then once you bought items the maximum shrink to the remaining number of items.
The input was confusing here. You had to watch the maximum number closely to
realise that it changed. The first time you have bought something it showed up
in the other <code>fieldset</code> so the system communicated that its state changed.</p>
<p>The range input was too coarse also. I only developed a fix in the last half an
hour but crossed the byte limit to include it.</p>
<p>Speaking of communication I feel like I could have done better. I tried hard to
provide relevant information but especially transitions are likely going to be
confusing, I am afraid.</p>
<p>My homework is going to be figuring out how to user test better. My family
didn’t show interest. I wasn’t able to get outside much either. Because child
care. My core logic was only completed on the last day of the competition
(and therefore way too late). I hope that the platform I’m building on is going
to accelerate this pace by several orders of magnitude. I have a clear picture
of what I want to have as a result. It’s mainly a question of sitting down and
doing the hard work.</p>
<h2>Designing</h2>
<p>I love SVG. I really do.</p>
<p>But I feel like I need to be able to handle it faster.
For example I spent hours (yes, literally hours) to trace the countries (sorry
Denmark! I’ve ran out of time) and fill the colours with it (based on the
magazine that I borrowed). I need a way to parse SVG into data points,
manipulate them visually and have the result fed back into the graphics.
I remember having seen part of it back in my Twitter days. By now I have enough
knowledge to build something that meets my needs.</p>
<p>XML is a great format. Challenge me.</p>
<p>I’m not able to run Storybook on my mobile (what’s up with your face?).
So in the aftermath of my entry I ported the components to my instance.
I realised that the dark mode affected the sea map in a way that is not
intended. I should have catched this during the development.</p>
<h2>Balancing</h2>
<p>The major upside of my architecture is the data-driven aspect.
In theory (because I don’t have the tools yet) I should be able to define an
algorithm (or even a Reinforcement Learning AI) that takes the input and comes
up with an optimal strategy to play the game.</p>
<p>I could even go so far and define relationship between values, tweak them and
have the algorithm go over the game again to see whether things changed.</p>
<p>There is not only the relationship between demand and supply but also between
the quantities and the capacity of a ship. In conjunction with the distance
between cities. I feel like those values could be thrown into a spreadsheet
and transformed into a meta value that represents the usefulness of a trade.
Would it make sense to sail all the way to buy something that is then sold on
the other end of the map? Or would it be more efficient to remain in a smaller
part of the map and grind?</p>
<h2>Taking notes</h2>
<p>I was doing a bad job on this this year. So many ideas were stuck in my mind
that I did not wrote down nor implemented. I feel like they have been lost now.
If I had a better way to keep track on them they could have been more useful.
If not for myself then perhaps for someone that stumbles upon them in the
future.</p>
<h2>Conclusion</h2>
<p>All in all I’m happy. For the first time in years it feels like I delivered a
complete game. Yes, it has it kinks. But that’s okay. It’s playable. That’s the
main part. I uncovered several areas on what I could do better. Where I would
benefit from a calculator (or computer) help me. This are opportunities for me
to take and get better over time.</p>
</description>
      <pubDate>Wed, 20 Sep 2023 11:00:00 +0000</pubDate>
      <guid>https://jaenis.ch/en/blog/2023/js13kgames-postmortem-the-baltic-league/</guid>
    </item>
    <item>
      <title>js13kgames Postmortem - The Baltic League</title>
      <link>https://jaenis.ch/de/blog/2023/js13kgames-postmortem-the-baltic-league/</link>
      <description><p>Wenn ich so auf meine Postmortem zu <a href="https://www.js13kgames.com/">js13kgames</a> Beiträgen
zurückblicke, wird mir bewusst, dass der letzte bereits fünf Jahre her ist.
Viel zu lange.
Dieser Beitrag ist auch <a href="/en/blog/2023/js13kgames-postmortem-the-baltic-league/">auf Englisch</a> erschienen.</p>
<p>Also möchte ich einen neuen verfassen, solange die Erinnerung noch halbwegs
frisch ist. Du kannst mir einen Gefallen tun und es
<a href="https://js13kgames.com/entries/the-baltic-league">spielen &amp; abstimmen</a>.</p>
<p>In Anbetracht dessen, dass js13kgames in verschiedenen Bereichen
(GitHub, Frontend Masters usw.) beworben wird, werde ich annehmen, dass du
bereits davon gehört hast. Falls nicht, besuch die Webseite. Lies das Blog.</p>
<h2>Das Thema</h2>
<p>Das Thema dieses Jahr war <em>13. Jahrhundert</em>. Sobald ich das Thema in
Geschichtsbüchern nachschlage, um herauszufinden, was in jener Zeit passiert
ist, stoße ich auf den Orden. Die Kreuzzüge. Die Seidenstraße.</p>
<p>Mir wird aber auch bewusst, dass es mit den Anfängen der Hanse zusammenfällt.</p>
<h2>Über Digitale Kolonialismus</h2>
<p>Nachdem ich mit Menschen von außerhalb gesprochen habe, insbesondere Südamerika
und Afrika, erfahre ich von etwas, das Digitale Kolonialismus genannt wird.
Zusammengefasst handelt es sich dabei um eine Einstellung von Menschen in der
Westlichen Welt, sich Geschichten von Kulturen zu eigen zu machen, in denen sie
nicht aufgewachsen sind.</p>
<p>Seit einer ganzen Weile habe ich schon das Bedürfnis, Geschichten aus
Deutschland zu teilen. Wir haben eine reiche Sagenwelt. Teile davon sind
bekannt. Andere eher weniger.
Als Kind habe ich mich durch Dutzende Bücher gelesen. Nicht nur deutsche
Folklore, sondern auch tschechische oder russische. Sagenhaft.</p>
<p>Ich erinnere mich auch an ein <a href="https://de.wikipedia.org/wiki/Hanse_(Computerspiel)">Hanse-Spiel für das DOS</a>. Nach heutigem
Maßstab natürlich mit grauenhafter Grafik. Es hat trotzdem mein Interesse
geweckt. Über andere Länder erfahren. Mit Gütern handeln.</p>
<p>Nachdem ich mehr zur Hanse recherchiert habe, erfuhr ich, dass die Kaufleute es
sogar geschafft haben, Könige dazu zu drängen, ihnen ihre Privilegien zu
erhalten. Teilweise hat nicht einmal die eigene Bevölkerung diese genießen
dürfen! Dadurch, dass sie zusammen hielten und als Einheit auftraten.</p>
<p>Das wurde als ganz schnell das Thema, mit dem ich arbeiten wollte. Natürlich
fiel der Wettbewerb wieder mit unserem Urlaub zusammen. Ich hatte also nicht
viel Zeit, meine Geräte entsprechend vorzubereiten. Ja, ich habe während meines
Urlaubs programmiert. Verurteile mich. Nein, ich habe meinen Laptop nicht
mitgenommen. Für wen hälst du mich?</p>
<h2>Grundlagen</h2>
<p>Weil ich jetzt ein <a href="https://code.jaenis.ch/">eigene Forgejo-Instanz</a> betreibe, habe ich dort ein
<span lang="en">Repository</span> angelegt und es auf meinen Laptop geklont.
Dort habe ich die <code>package.json</code> hinzugefügt, um es in ein JavaScript-Projekt
umzuwandeln.</p>
<p>Glücklicherweise war ich in der Lage, die Plattform zu benutzen, an der ich die
vergangen Monate schleife, um die grundlegende Struktur zu erstellen, die mich
tragen soll. Mir sind ein paar fehlende Elemente aufgefallen, aber der
Wettbewerb erlaubt es mir, die Behebungen einfließen zu lassen.</p>
<p>Das war im Grunde auch schon alles, was ich am ersten Tag erledigt habe. Es hat
mir bereits einige Stunden erspart. Den Rest des Tages war ich mit Packen
beschäftigt :)</p>
<p>Als ich es dann gebaut und ausgefüht habe, war der Bildschirm blank. So viel
also zu einem tollen Start. Ich habe etwas draufrumdenken müssen, aber habe die
Abweichung ausgemacht und behoben. Zweiter Tag erledigt.</p>
<p>Der langsame Fortschritt blieb auch ein paar Tage lang so bestehen, bis ich
etwas mehr Zeit freischaufeln konnte, um Dinge erledigt zu bekommen. Das ist
etwas, was mich schon seit Monaten wurmt. Es ist nicht einfach, mit Kindern
ständig um einen herum. Gefühlt war die Akzeptanz während der Pandemie aber
höher.</p>
<p>Heutzutage sitze ich aber die meiste Zeit daheim und „kann ja den Haushalt
erledigen, weil ich daheim bin”. Ich bezweifle, dass mein Unternehmen so auf
die Beine kommen wird, wenn ich nicht mehr Zeit dafür aufwende.</p>
<p>Mittlerweile ist die Situation aber auch schon wieder besser geworden. Die
Schulen sind wieder geöffnet. Meine Liste von Dingen, die ich erledigen will,
wächst und wächst. Das ist gut. Es bedeutet, dass ich immer noch kreativ bin.</p>
<h2>Die Architektur</h2>
<p>Ich kenne das Prozedere mit meinem <span lang="en">Framework</span>
mittlerweile ziemlich gut. Es wird Teil meines
<a href="https://design.jaenis.ch/?path=/docs/js13kgames-2023-architecture--docs"><span lang="en">Design System</span></a>.</p>
<p>Im Grunde ist es <a href="https://blog.bitsrc.io/using-jotai-in-your-react-application-de460568ac9d">Zustand</a>s-getrieben. Mit
<span lang="en">Event Listeners</span>, die dafür zuständig sind, Aktionen
auszulösen, die den Zustand über <span lang="en">Reducer</span> aktualisieren.
Diese Einteilung erlaubt ein einfaches Testen. Mehr noch, ich kann mich auf
den Zustand verlassen, um die Aktionen zu prüfen, wenn ich die Oberflächen
ausreichend mit Tests abgedeckt habe.</p>
<p>Diese erstelle ich wieder aus HTML und SVG. Es ist textbasiert.
Damit komprimiert es gut. Ich kann meinen Fokus darauf legen, die verschiedenen
Elemente zusammenzusetzen.</p>
<p>Ich war schockiert, als mir auffiel, dass in den letzten paar Beiträgen
praktisch keine Tests waren. Das sieht mir so gar nicht ähnlich. Üblicherweise
habe ich Tests, aber ich schätze, ich war zu beschäftigt damit, meine Ideen
aus dem Kopf zu bekommen. Dieses Jahr habe ich jedenfalls Tests und TypeScript-
Annotationen, die mir einige Stunden Arbeit ersparten. Insbesondere gegen Ende,
als ich die Struktur grundlegend umstellte und quasi alle Dateien anfassen
musste.</p>
<p>Aber es gab auch Zeiten, in denen mir TypeScript im Wege stand. Für
Einzelpersonen kann ich nicht genug Wert darin sehen, um es weiter zu
empfehlen.</p>
<h2>Dokumentation</h2>
<p>Das stellte sich als schwieriges Thema heraus. Einerseits habe ich es
geschafft, für jeden Tag etwas einen Tagebucheintrag zu erstellen.</p>
<p>Andererseits ist das nicht immer am selben Tag geschehen. Teilweise hat das
Tagebuch sogar einige Tage hinterhergehinkt. Dann besitzt es auch noch kaum
Struktur. In den letzten Jahren habe ich mir ein Format aufgebaut, aber nicht
für dieses Jahr übernommen. Ich überlege immer noch, warum eigentlich.
Vielleicht sollte ich es mit in die Grundlagen aufnehmen?</p>
<p>Insbesondere vermisse ich die Bildschirmfotos (viel Glück damit auf
Mobilgeräten) und den Vergleichslink. Ich konnte mich nicht mehr an das Format
für den Pfad der URL erinnern, mit denen <span lang="en">Commits</span> in
Forgejo verglichen werden können.</p>
<p>Ich habe das <span lang="en">Game Development Document</span> komplett
weggelassen.</p>
<p>Aber ich habe JSDoc-Annotationen eingefügt. Immerhin etwas. Sie erklären auf
der Ebene einer Code-Einheit, was die Aufgabe dieses Teils ist. Ich kann mir
nicht helfen, aber ein einzelner Satz erscheint mir reichlich wenig. Wo sollte
ich dann aber die Details unterbringen? In der LIESMICH? Die wird überflogen.
Innerhalb des <span lang="en">Repository</span>? Vielleicht. Für das aktuelle
Jahr habe ich entschieden, es im <a href="https://design.jaenis.ch/?path=/docs/js13kgames-2023-architecture--docs"><span lang="en">Design System</span></a>
unterzubringen. Dieses wird sowieso zum Sammelpunkt meiner Tätigkeiten.</p>
<h2>Forschung</h2>
<p>Ich kann dir sagen, es ist nicht einfach, herauszufinden, was vor acht
Jahrhunderten eigentlich passiert ist. Das Internet war nicht so hilfreich wie
erhofft. Ich habe ein paar Artikel aus Wikipedia (als PDF-Export)
heruntergeladen, um sie offline während des Urlaubs lesen zu können. Aber
selbst nachdem ich wieder daheim war und vernünftiges Internet besaß, kam ich
nicht weiter. Glücklicherweise hatte die Bibliothek Material. Das hat mich
überrascht. Ich habe nicht erwartet, überhaupt irgendetwas zu finden, wenn ich
in Betracht ziehe, dass wir soweit von der Küste entfernt sind.</p>
<p>Ich habe nur einen Bruchteil des Materials ausgewertet. Selbst jetzt, nachdem
ich das Spiel eingereicht habe. Während meiner Studienzeit hätte ich wohl
BibTeX-Referenzen erstellt und meine Erkenntnisse niedergeschrieben. Aber ich
habe auch bemerkt, dass mir eine vernünftige Struktur fehlt, die mir hilft,
aus dem Gelernten Nutzen zu ziehen. Schlussendlich saß ich schließlich mit dem
Heft neben mir und habe direkt daraus gearbeitet.</p>
<p>Eine Schriftfamilie zu wählen war auch nicht einfach. Es gibt einige mit
nautischem Motiv auf dem Markt. Fast alle davon sind kostenpflichtig. Ich
möchte mich an dieser Stelle bei
<a href="https://velvetyne.fr/fonts/boeticher/"><span lang="en">Velvetyne Type Foundry</span></a> für eine Open Source
Schriftfamilie bedanken, die ein Gefühl von Meer in mir geweckt hat. Mein Dank
geht auch an <span lang="en">Zach Leatherman</span> für das Teilen über das
<a href="https://www.zachleat.com/web/css-tricks-web-fonts/"><span lang="en">Subsetting</span> von Schriften</a>. Es hat mich dazu
befähigt, die Schriftfamilie auf die elf Glyphen zu reduzieren, die ich
benötigte und es im gleichen Atemzug in das WOFF2-Format zu überführen.</p>
<p>Ich habe noch eine Forschungsfrage offen, herauszufinden, wie ich ein Glyph auf
ein anderes abbilde. Mir ist es lieber, entweder durchgehend Klein- oder
Großbuchstaben zu vewenden anstelle des gemischten Textes, das ich benutzen
musste, damit die Schriftfamilie benutzt wird.</p>
<p>Nachdem ich aus dem Urlaub zurückkam, erfuhr ich auch über das
<a href="https://eslint.org/blog/2022/08/new-config-system-part-1/">neue Dateiformat, welches ESLint für die Konfigurationsdateien verwendet</a>.
Also habe ich meines aktualisiert. Und alles kaputt bekommen. Stellt sich raus,
dass ich zu einer bestimmten Schnittstelle konform sein muss und nicht alle
<span lang="en">Plugins</span> entsprechend aktualisiert wurden. Demnach werden
hier also einige <span lang="en"><abbr title="Pull Request">PR</abbr></span> folgen. Alle werden davon
profitieren.</p>
<p>Auch wenn ich den Stil von <a href="https://standardjs.com/">Standard</a> bevorzuge, habe ich einen
Formatierer vermisst. Gut möglich also, dass ich zu
<a href="https://prettier.io/"><span lang="en">Prettier</span></a> wechseln werde.
<a href="https://editorconfig.org/"><span lang="en">Editorconfig</span></a> allein hat auch nicht alles
erzwungen.</p>
<p>Dann gab es da noch diesen lustigen Augenblick, als das
<span lang="en">Terser</span>-<span lang="en">Plugin</span> für
<span lang="en">Rollup</span> jedes Mal fehlschlug. Aber nur auf meinem
Smartphone. Ich habe bis heute noch nicht herausgefunden, was genau da vor sich
geht. Mein Bauchgefühl ist, dass der Fall zu exotisch ist, als dass ich ihn
melden sollte. Vielleicht aber zusammen mit einer Behebung.</p>
<h2>Entwicklung</h2>
<p>Ich habe eine Handvoll von Lektionen während der Entwicklung dieses Spiels
gelernt. <span lang="en">Arrays</span> sind nicht die beste Datenstruktur.
Anfänglich habe ich sie verwendet, weil ich dachte, sie würden es mir einfacher
machen, über Einträge in den Komponenten zu gehen. Aber <code>Object.entries</code> ist
auch eine großartige Alternative.</p>
<p>Das Benutzen von <span lang="en">Objects</span> mit dem Typ <code>Record&lt;T, U&gt;</code>
(also jetzt nicht die <span lang="en">Generics</span>, sondern die konkreten
Typen) hat mir sehr geholfen. Ich habe mich davor gescheut, jede einzelne
Eigenschaft in allen Fällen auflisten zu müssen, aber ZIP profitiert von
Wiederholungen und es ist daher kein Nachteil für die Größe des
<span lang="en">Bundles</span>. Tatsächlich hat mein vermeintliches Cleversein
mir das Ergebnis immer wieder Mal aufgeblasen. Nachdem ich also Objekte
benutzte und auf die Werte dynamisch zugriff, konnte mir TypeScript helfen
(insbesondere dann, wenn die Schlüssel aus einer Auflistung konkreter
Zeichenketten bestand). Damit flogen dann Prüfungen auf <code>null</code> und <code>undefined</code>
aus dem Code.</p>
<p>Zusammengefasst: Denk intensiv über deine Datenstrukturen nach.</p>
<p>Ich war auch überrascht, als ich testen wollte, wie ein einzelnes Ereignis
mehrere Aktionen auslöste, aber die Methode nicht vernünftig beobachtet werden
konnte. Hier geht fortgeschrittenes JavaScript vor sich. Ich werde die Details
nicht in diesem Blog-Beitrag abhandeln, weil er auch so schon lang genug
werden wird. <a href="mailto:andre.jaenisch.wdc@posteo.net">Schreib mir eine E-Mail</a>, wenn du möchtest, dass ich die
Ergebnisse meiner Recherchen aufschreibe. Nachdem ich aber das Ereignis selber
nachbaute, wurden die Dinge wesentlich einfacher.</p>
<p>Herrlich, diese Programmiersprache. Es wird mit ihr nie langweilig.</p>
<h2>Bedienfreundlichkeit</h2>
<p>Ich habe das Spiel immer wieder gebaut und auf meinem Laptop (hauptsächlich
mit der Tastatur) und auf meinem Smartphone gespielt. Ich nahm vor allem die
Formularelemente des Browsers, um barrierearm zu bleiben. Mein Frust liegt
dabei vor allem am <code>range</code> Eingabefeld.</p>
<p>Ich möchte etwas anbieten, dass gezogen werden kann. Eine Nummereingabe würde
das Tippen erfordern. Das bremmst das Spiel nur unnötig aus. Eine <code>range</code>
Eingabe gibt auch Auskunft über einen Umfang
(englisch <span lang="en">Range</span>) der auswählbaren Werte. Es hat sich
aber nicht als die perfekte Wahl herausgestellt.</p>
<p>Ich brauchte ein Formularfeld, dass es erlaubt, einen Wert zwischen 0 und N zu
bestimmen. Das N ist dabei nicht notwendigerweise das Maximum. Nimm dir zum
Beispiel die Markt-Ansicht. Ich hätte jetzt gerne eine Eingabe, die es erlaubt,
irgendeine Anzahl von diesem Gut auszuwählen. Das Maximum ist dabei beschränkt
durch den verbleibenden Platz im Kontor (oder: Warenhaus. Im Spiel schließlich
unendlich groß, weil ich nicht mehr genug <span lang="en">Bytes</span> hatte,
um es zu ändern) und das eigene Geld. Aber im Markt könnte es dann noch mehr
geben.</p>
<p>Wenn ich dann Gegenstände gekauft habe, sinkt das Maximum auf die Anzahl der
übrigen. Das Eingabefeld hat hier verwirrt. Du musstest schon genau auf das
Maximum achten, um zu bemerken, dass es sich geändert hat. Beim ersten Mal hat
der Einkauf noch eine Änderung im anderen <code>fieldset</code> ausgelöst, so dass das
System die Zustandsänderung mitteilen konnte.</p>
<p>Außerdem war das <code>range</code> Eingabefeld zu grob. Ich hab in der letzten halben
Stunde noch eine Verbesserung programmiert, konnte sie aber aufgrund der Größe
nicht mehr mit aufnehmen.</p>
<p>Apropos Kommunikation. Ich habe das Gefühl, dass ich hier besser hätte sein
können. Ich habe mich angestrengt, relevante Informationen bereit zu stellen.
Aber insbesondere Übergänge werden wohl verwirrend sein, fürchte ich.</p>
<p>Meine Hausaufgaben bestehen darin, herauszufinden, wie ich besser mit
Menschen testen kann. Meine Familie hat kein Interesse gezeigt. Ich kam auch
nicht allzu viel raus. Wegen Kinderhüten. Meine Kernlogik wurde am letzten Tag
des Wettbewerbs fertig (und damit viel zu spät). Ich hoffe, dass die Plattform,
an der ich baue, hier die Geschwindigkeit um mehrere Größenordnungen
hochschrauben wird. Ich habe ein klares Bild davon, was ich als Ergebnis haben
will. Es ist hauptsächlich eine Frage des Hinsetzens und umsetzen.</p>
<h2>Gestalten</h2>
<p>Ich liebe SVG. Ich tue das wirklich.</p>
<p>Aber ich habe das Gefühl, ich muss in der Lage sein, es schneller zu
bearbeiten. Beispielsweise habe ich Stunden (ja, tatsächlich Stunden) damit
zugebracht, die Länder nachzufahren (tut mir Leid, Dänemark! Ich hatte keine
Zeit mehr) und diese mit Farben zu füllen (basierend auf dem Heft, dass ich
entliehen hatte). Ich brauche eine Möglichkeit, SVG in Datenpunkte zu
überführen, diese visuell zu bearbeiten und das Ergebnis wieder in eine Grafik
umzuwandeln.
Ich erinnere mich, in meinen Tagen auf Twitter etwas in der Richtung gesehen zu
haben. Mittlerweile habe ich genug Wissen, etwas zu bauen, was meinen
Bedürfnissen entspricht.</p>
<p>XML ist ein tolles Format. Fordere mich heraus.</p>
<p>Ich bin nicht in der Lage, Storybook auf meinem Smartphone zu bauen (was ziehst
du da für ein Gesicht?) Im Nachgang zu meinem Beitrag habe ich daher die
Komponenten in meine Instanz überführt. Dabei ist mir aufgefallen, dass die
Ansicht mit dunklem Farbthema („<span lang="en">Dark Mode</span>”) die
Seekarte auf eine Weise betraf, die nicht beabsichtigt war. Ich hätte das
während der Entwicklung bemerken müssen.</p>
<h2>Ausbalancieren</h2>
<p>Der Hauptvorteil meiner Architektur liegt in der datengetriebenen Ausrichtung.
Theoretisch (weil ich die entsprechenden Werkzeuge noch nicht habe) sollte ich
in der Lage sein, einen Algorithmus (oder gar
<span lang="en">Reinforcement Learning AI</span>) zu definieren, der die
Argumente entgegen nimmt und mit einer optimalen Strategie für das Spiel
aufwartet.</p>
<p>Ich könnte sogar soweit gehen und die Beziehung zwischen den Werten
beschreiben, diese dann leicht ändern und den Algorithmus noch einmal über das
Spiel laufen lassen und beobachten, ob sich etwas geändert hat.</p>
<p>Es gibt nicht nur einen Zusammenhang zwischen Angebot und Nachfrage, sondern
auch zwischen den Warenmengen und der Tragfähigkeit eines Schiffes. Sowie des
Abstands zwischen den Städten. Gefühlt könnte ich diese Werte in eine
Tabellenkalkulation werfen und in einen Meta-Wert umrechnen, der angibt, wie
nützlich ein Handel ist. Ist es sinnvoll, den ganzen Weg zurück zu legen, um
etwas zu kaufen, dass dann am anderen Ende der Karte wieder veräußert wird?
Oder wäre es effizienter, sich in einem kleinen Teil der Karte aufzuhalten und
dort kleine Brötchen zu backen?</p>
<h2>Notizen machen</h2>
<p>Ich habe dieses Jahr hier schlechte Arbeit abgeliefert. So viele Ideen spuken
mir im Kopf herum, die ich weder aufgeschrieben noch umgesetzt habe. Gefühlt
sind sie nun verloren.
Wenn ich einen besseren Weg hätte, sie zu erfassen, hätten sie nützlicher sein
können. Wenn schon nicht für mich selbst, so doch vielleicht für jemanden, der
in der Zukunft darüber stolpert.</p>
<h2>Zusammenfassung</h2>
<p>Alles in allem bin ich glücklich. Das erste Mal seit Jahren habe ich das
Gefühl, ein vollständiges Spiel eingereicht zu haben. Ja, es hat seine Macken.
Aber das ist schon okay. Es kann gespielt werde. Das ist das Wichtigste. Ich
habe mehrere Bereiche ausgemacht, in denen ich besser sein kann.
In denen mir ein Rechner helfen könnte. Dies sind Gelegenheiten, mit der Zeit
besser zu werden.</p>
</description>
      <pubDate>Wed, 20 Sep 2023 11:00:00 +0000</pubDate>
      <guid>https://jaenis.ch/de/blog/2023/js13kgames-postmortem-the-baltic-league/</guid>
    </item>
    <item>
      <title>My history with Vim</title>
      <link>https://jaenis.ch/en/blog/2023/my-history-with-vim/</link>
      <description><p>If you are using Vim you have properly heard the news:
Bram Moolenaar passed away recently. He was the author behind Vim and did a
great job on this.
My thoughts are with his family.</p>
<p>Many people have said everything already. I want to share my history with
this amazing editor. If you are interested in the editor itself, I can
recommend <a href="https://yt.artemislena.eu/watch?v=1grU6YbVZ1Q">the video by Brodie Robertson</a>.</p>
<h2>My history with Vim</h2>
<p>In 2013 – a decade ago – I was working as a student intern with a
local company. It was my first working relationship. During my studies we used
Debian machines. I wrote my homework in editors like <a href="https://apps.kde.org/kile/">Kile</a> or
<a href="https://apps.kde.org/kate/">Kate</a>. When I was about to learn something new at that company, I’ve
decided to pick up a terminal editor. I had the choice between the two:
Vim or Emacs. From a point of functionality both appeared to be on par.
So I went with Vim because of the keybindings. Having to reach out to the
<kbd>Ctrl</kbd> key for every other operation appeared to me not very
ergonomic. So back then I’ve learned Vim next to Ruby on Rails.</p>
<p>A few days in and I heard a colleague crashing his X server. That’s when he
turned around and told me that he should have learned a little Vim instead of
relying on <a href="https://www.jetbrains.com/ruby/">RubyMine</a> for everything. Don’t get me wrong, there are
people who benefit greatly from an <abbr title="Integrated Development Environment">IDE</abbr>. But they can’t compete on performance.</p>
<p>The <a href="https://langserver.org/">Language Server Protocol</a> wasn’t around back then but the community
wrote plenty of plugins. So I went all in and installed plenty of them.
There are different ways to do so, but I went with <a href="https://github.com/MarcWeber/vim-addon-manager">Vim Addon Manager</a>
instead. The syntax to add something new was concise.</p>
<p>If you want to learn Vim these days, play <a href="https://vim-adventures.com/">Vim Adventures</a> after
going through the <a href="https://vimhelp.org/usr_01.txt.html#vimtutor">vimtutor</a>. It’s worth your time.</p>
<p>After reading <a href="https://www.oreilly.com/library/view/practical-vim-2nd/9781680501629/">Practical Vim</a> I switched to <a href="https://github.com/junegunn/vim-plug">Plug</a> which I am
still using to this day. VimL isn’t easy to learn. Yes there is a
<a href="https://en.wikibooks.org/wiki/Learning_the_vi_Editor/Vim/VimL_Script_language">Wikibook</a> and a dedicated website to <a href="https://learnvimscriptthehardway.stevelosh.com/">learn Vim the hard way</a>.
But the appeal to use different programming languages as well as watching
<a href="https://frontendmasters.com/courses/vim-fundamentals/">Vim Fundamentals</a> made me migrate to NeoVim.</p>
<p>Every now and then I try an <abbr title="Integrated Development Environment">IDE</abbr>. Not only from the Jetbrains family but also
<a href="https://code.visualstudio.com/">VS Code</a> (respectively the <a href="https://vscodium.com/">superior derivate</a>). But time and
again I feel like they get in my way instead of supporting me in my work.</p>
<p>So I come back to Vim. And I learn new things about it. My
<a href="https://hackerpublicradio.org/eps/hpr3848/index.html">recent discovery</a> is about <a href="https://vimhelp.org/starting.txt.html#Session">Vim sessions</a>. I wasn’t aware that
it is possible to load specialised configurations on demand.</p>
<p>I want to thank the Vim community for all their amazing work. I hope we can
keep it up.</p>
</description>
      <pubDate>Fri, 11 Aug 2023 12:07:00 +0000</pubDate>
      <guid>https://jaenis.ch/en/blog/2023/my-history-with-vim/</guid>
    </item>
    <item>
      <title>My history with Vim</title>
      <link>https://jaenis.ch/de/blog/2023/my-history-with-vim/</link>
      <description><p>Dieser Artikel erschien nur <a href="/en/blog/2023/my-history-with-vim/">auf Englisch</a>.</p>
</description>
      <pubDate>Fri, 11 Aug 2023 12:07:00 +0000</pubDate>
      <guid>https://jaenis.ch/de/blog/2023/my-history-with-vim/</guid>
    </item>
    <item>
      <title>I&#39;ve made a logo!</title>
      <link>https://jaenis.ch/en/blog/2023/ive-made-a-logo/</link>
      <description><p>Allow me to share a milestone with you.
This post was also published <a href="/de/blog/2023/ive-made-a-logo/">in German</a>.</p>
<p>In this article, I’m going to take you through my journey of holding my first
logo in my hands. Made by yours truly. I’m going to share with you what took me
so long and what I learned along the way. Grab a cup of tea and take a comfy
seat.</p>
<h2>Why do you need a logo in the first place?</h2>
<p>Because I’m a company now. This means, I’m a brand of my own. As such, I need
some recall with the audience. Something that makes me stand out from the
competition and evokes positive emotions.</p>
<p>During my research I’ve learned that this is called Brand Identity. Before
putting something together, there are some questions that should be clarified
upfront. I’m bringing them up in a minute, but first, let me tell you why this
is a milestone in my view.</p>
<h3>Logo as a milestone</h3>
<p>Look, as a company it is important to be active in the market. If you don’t get
out, no client will notice you. Vienna isn’t waiting (German title to
<a href="https://en.wikipedia.org/wiki/Peopleware:_Productive_Projects_and_Teams">Peopleware</a>). I don’t need a mug with a logo just now. But I need
a digital representation of what I’m doing. I want to hand out business cards.
My mugshot is already a couple of years old (adults don’t change their
appearance that much luckily).</p>
<h2>What took you so long?</h2>
<p>Actually I reached out to a friend at the beginning of the year who offered to
create a logo. We had some video chats. But as so often, the communication
halted at some point. Nevertheless I learned a few lessons from him.
Manav, if you read this: Thank you! I owe you one!</p>
<p>So … life happened.</p>
<p>I didn’t took a stab on creating a logo myself because I was afraid. I’m
overthinking so much, that I am never satisfied with my creation. This isn’t
limited to art of any kind for that matter.</p>
<p>That being said, the inhibit to not participate in the market become so painful
that I had to do <em>something</em>. So one evening in late July 2023 I used the time
I have when bringing my youngest to bed to do some research.</p>
<h2>What have you learned?</h2>
<p>Logo design is a discipline in its own. I don’t want to diminish that. I have
not the skills to met a professional. That being said, I understand a little of
design because my aspiration is to learn enough about disciplines that I can
take matters in my own hand if necessary. That’s what I did.</p>
<p>Luckily there are designers who share a glimpse into their work. I want to
highlight some articles that have proven useful to me:</p>
<p>For example, in <a href="https://99designs.com/blog/logo-branding/how-to-design-logo/">How to design a Logo</a> Antonia Gesch emphasizes that
logo design starts with the personality of a brand. I’m going to share my
thoughts on this in this blog post as a point of time record but you
ultimately find the latest version in <a href="https://design.jaenis.ch/?path=/docs/atoms-logo--docs">my design system</a>.</p>
<p>Next I’ve read
<a href="https://www.customlogocases.com/blog/logo-design-tips/">10 Essential Logo Design Guidelines &amp; Brand Style Guide</a>
and learned about different logo types.
<q>These types of logos are ideal for companies with long names or names that
are not easy to remember.</q> sounds a lot like me.</p>
<p>Melanie Dimmitt seconds this in <a href="https://www.canva.com/learn/logo-design-principles/">10 logo design principles to follow</a> by
quoting Tamarin Morley with „Logos that are purely typographic can look very
classy and timeless”. I also note that I need to check my colour palette
(more on that in a second) in print and pantone colours. Right now I have black
on white because you can’t go wrong with that. I will add some colours in the
near future.</p>
<p>You see, in podcasts I experience that my name is hard to pronounce (with
English voice, read Janish).
Then I made my company overly long because legally I have to carry my name in
it but that doesn’t allow much for interpretation. As such, I have to shorten
it. Going with a lettermark as suggested here I can utilise knowledge I gained
with typography (mainly via LaTeX).</p>
<p>My key takeaway from reading that article is staying simple. The logo has to
work on small size (like a favicon) all the way up to posters. So adding detail
is hurting it. In fact, a lettermark can be timeless in that it is not
following trends. Typography has been around for centuries. Yet pairing two
types could be a bit too little. That’s where I can add my existing skills.
It’s way easier to tweak text than imagery. I won’t give away too much here.</p>
<h3>Logo, colours and typography</h3>
<p>These three are the pillars of a visual brand identity. I already have
<a href="/en/blog/2019/about-this-design-decisions/">chosen my colour palette and a type pair</a> in 2019. I was missing a
logo for quite some time. By and large my thoughts from back then still holds.
I pair the
<span class="colour-item" style="--colour-item:#EE9D2B;">orange</span> with
some <span class="colour-item" style="--colour-item:#00C8FF;">light cyan</span>
in the future. The orange is vibrant, even though it’s a little washed out.
This is meant to represent the eagerness with which I want to see a project to
completion. Whenever I see some warm orange, it makes me feel good. It reminds
me on my migration over to Ubuntu Jaunty Jackalope which marked an important
change in my life. Meanwhile I associate the cyan with the sky and the sea.
You see, I grew up in a rural area with lots of lakes around me. So going to
swim is something we did in my youth. But the sky is also a place of limitless
opportunities. I feel like the web is a similar well of creativity. Being close
to water calms me down. I can relax and enjoy life for a change.</p>
<p>My intention is to evoke an emotion of trust with the audience. Blue is
generally chosen for this albeit in a flavour that is closer to
<span class="colour-item" style="--colour-item:#002366;">royal blue</span> (I associate this with the
<a href="https://en.wikipedia.org/wiki/Blue_screen_of_death">Blue Screen of Death</a>, but what do I know?).</p>
<p>Regarding the typography I have chosen to pick <a href="https://web.archive.org/web/20140630200925/http://www.impallari.com/projects/overview/milonga">Milonga</a> and
<a href="http://vollkorn-typeface.com/">Vollkorn</a> for the logo again. Milonga is expressive. It’s associated
with Tango, a dance from Argentina. Now I haven’t been in Latin America in my
life. Yet I learned Spanish from someone from Venezuela, have met someone from
Panama who became a friend and general want to have closer ties to Latin and
South America. On top of that it is a beautiful and expressive font family.
In this regard, it is pairing with the orange colour I’ve mentioned before.</p>
<p>Vollkorn on the other hand is German. It’s grounded and represents
characteristics I want to be known for myself. I use it to evoke a sense of
trust and professionalism. You see, it is aligning towards the same goal.</p>
<h2>Brand personality</h2>
<p>Here are the questions taken from <a href="https://99designs.com/blog/logo-branding/how-to-design-logo/">99 designs</a> with my corresponding
answer. I learned that I need prompting questions like these to aid in soul
searching. „Do market research” or „craft a brand identity” feels so broad that
I don’t know where to start. After consulting several pages on a subject a set
of questions naturally emerge that helps me shape the image I seek.</p>
<h3>What are the beliefs and values that are important to me as a company?</h3>
<p>I belief, technologists should take on more social responsibility. Tech is not
neutral. The work accomplished in this industry has an impact on people.</p>
<p>Therefore I value qualitative work that takes humans into account. We are not
just numbers in a database. Instead, folks trust us that we will keep their
information safe. We must earn this trust by keeping our promises.</p>
<p>I value honest feedback. I myself speak my mind even if it hurts. I believe
that doing this allows for reflection and an overall improvement in the long
run. My reputation is to be spot on and knowledgeable.</p>
<h3>What do I do better than anyone else?</h3>
<p>I can see the big picture. I can point out areas that warrant deep thoughts
before advancing a strategy. This allows for reducing future costs.</p>
<h3>What makes me special?</h3>
<p>I have a background in mathematics. This education allows me to think through
problems and transfer insights.</p>
<p>I’m curious. I like to learn a lot about all kinds of things.
I enjoy passing knowledge forward. There is so much going on in the world and
not enough time to learn about everything. By curating resources I can tailor
my message to an audience.</p>
<h3>If I could describe my brand in three words, what would it be?</h3>
<p>Insightful, friendly, patient.</p>
<h3>What are the three words I would want my customers to use to describe me?</h3>
<p>Approachable, trustworthy, reliable.</p>
<h2>Finding inspiration</h2>
<p>Aside of the general design inspiration sources I’ve looked into logo makers.
Now, initially I highlighted that I value the craftspeople. That’s still true.
I have no intention to put results of such a tool into production. But they
allow me to get a better understanding of conversations I can expect to have
with a professional once I choose one.</p>
<p>Here are the ones I discovered that do not require a signup:</p>
<ul>
<li><a href="https://www.freelogodesign.org/logomaker-app/en/generator">FreeLogo Design</a></li>
<li><a href="https://myfreelogomaker.com/onboarding">my free logo maker</a></li>
<li><a href="https://smashinglogo.com/de/logo-maker/#tour-name">Smashing Logo Maker</a></li>
</ul>
<p>I want to close with one last resource: <a href="https://brandcolors.net/">BrandColors</a>. That page
allows to get a glimpse on which colour choices are popular with brands.</p>
</description>
      <pubDate>Thu, 10 Aug 2023 18:07:00 +0000</pubDate>
      <guid>https://jaenis.ch/en/blog/2023/ive-made-a-logo/</guid>
    </item>
    <item>
      <title>I&#39;ve made a logo!</title>
      <link>https://jaenis.ch/de/blog/2023/ive-made-a-logo/</link>
      <description><p>Erlaube mir, einen Meilenstein mit dir zu teilen.
Dieser Beitrag ist auch <a href="/en/blog/2023/ive-made-a-logo/">auf Englisch</a> erschienen.</p>
<p>In diesem Artikel werde ich dich auf meine Reise mitnehmen, an deren Ende ich
mein erstes Logo in Händen halte. Hergestellt vo meiner Wenigkeit. Ich werde
mit dir teilen, was mich so lange aufhielt und was ich auf dem Weg gelernt
habe. Schnapp dir eine Tasse Tee und mach es dir gemütlich.</p>
<h2>Warum brauchst du überhaupt ein Logo?</h2>
<p>Weil ich jetzt eine Firma bin. Das heißt, ich bin meine eigene Marke. Als
solche bin ich darauf angewiesen, dass ein Publikum sich an mich erinnert.
Etwas, das mich vom Wettbewerb abgrenzt und ein positives Gefühl auslöst.</p>
<p>Während meiner Recherche habe ich von etwas namens Markenidentität gehört.
Bevor also irgendetwas zusammengeschustert wird, gibt es einige Fragen, die
zunächst geklärt werden sollten. Ich komme dazu, aber zunächst möchte ich dir
mitteilen, warum dies so ein Meilenstein in meinen Augen ist.</p>
<h3>Logo als Meilenstein</h3>
<p>Schau mal, als Firma ist es wichtig, im Markt aktiv zu werden. Wenn du dich
nicht raus traust, wird dich kein Klient bemerken.
<a href="https://en.wikipedia.org/wiki/Peopleware:_Productive_Projects_and_Teams">Wien wartet nicht auf dich</a>. Ich brauche jetzt keine Tasse mit
meinem Logo. Aber ich benötige ein digitales Abbild dessen, was ich tue. Ich
möchte Visitenkarten verteilen können.
My Profilfoto ist bereits einige Jahre alt (zum Glück ändert sich das Aussehen
von Erwachsenen nicht mehr so stark).</p>
<h2>Warum hat das so lange gedauert?</h2>
<p>Tatsächlich habe ich mich erst einmal mit einem Freund am Anfang des Jahres zu
dem Thema kurz geschlossen, weil er anbot, mir ein Logo zu erstellen. Wir
hatten einige Video-Calls. Aber wie es mir so oft widerfährt, ist die
Kommunikation irgendwann abgebrochen. Nichtsdestotrotz habe ich einige
Lektionen von ihm gelernt. Manav, falls du dies liest: Danke. Ich schulde dir
was!</p>
<p>Also … wie das Leben so spielt.</p>
<p>Ich habe keinen weiteren Anlauf gewagt, weil ich Schiss hatte. Ich denke so
viel über meine Werke nach, dass ich nie mit ihnen zufrieden bin. Dies ist
nicht nur bei Kunstwerken der Fall.</p>
<p>Wie dem auch sei, der Blocker nicht am Markt teilnehmen zu können, wurde so
groß, dass ich <em>etwas</em> tun musste. Daher habe ich eines Abends im Juli 2023 die
Zubettgehzeit meines Jüngsten dafür genutzt, etwas zu recherchieren.</p>
<h2>Was hast du gelernt?</h2>
<p>Das Erstellen von Logos ist eine eigene Disziplin. Ich möchte das nicht
kleinreden. Ich besitze nicht die Fertigkeiten, mich mit einem Professional zu
messen. Nichtsdestotrotz verstehe ich ein wenig von Design, weil es mein
Anspruch ist, so viel von anderen Disziplinen zu lernen, dass ich notfalls die
Sache in die eigene Hand nehmen kann. Genau das tat ich.</p>
<p>Glücklicherweise gibt es Designer, die einen Einblick in ihre Arbeit geben. Ich
möchte einige Artikel hervorheben, die sich für mich als nützlich erwiesen:</p>
<p>Beispielsweise betont Antonia Gesch in
<a href="https://99designs.com/blog/logo-branding/how-to-design-logo/"><span lang="en">How to design a logo</span></a>, dass ein Logo Design
mit der Persönlichkeit einer Marke beginnt. Ich teile meine Gedanken dazu
später in diesem Artikel als eine Momentaufnahme, aber die aktuellste Version
wird in <a href="https://design.jaenis.ch/?path=/docs/atoms-logo--docs">meinem Design System</a> zu finden sein.</p>
<p>Als nächstes las ich
<a href="https://www.customlogocases.com/blog/logo-design-tips/"><span lang="en">10 Essential Logo Design Guidelines &amp; Brand Style Guide</span></a>
und erfuhr von verschiedenen Logo-Typen.
<q lang="en">These types of logos are ideal for companies with long names or
names that are not easy to remember.</q> klingt sehr nach mir.</p>
<p>Melanie Dimmitt unterstreicht diese Aussage in
<a href="https://www.canva.com/learn/logo-design-principles/"><span lang="en">10 logo design principles to follow</span></a>, indem sie
Tamarin Morley mit den Worten zitiert: <q lang="en">Logos that are purely
typographic can look very classy and timeless</q>. Ich habe mir auch notiert,
meine Farbpalette noch einmal auf Print und Pantone zu prüfen (dazu gleich
mehr). Aktuell habe ich Schwarz auf Weiß, weil damit nichts schief gehen kann.
Ich werde aber einige Farbe in naher Zukunft ergänzen.</p>
<p>Weißt du, aus Podcasts weiß ich, dass mein Name schwer auszusprechen ist.
Darüber hinaus habe ich meinen Firmennamen wohl auch zu lang gemacht, weil ich
rechtlich gesehen nur den eigenen Namen angeben muss, aber meine, dass dies
nicht genug Hinweise zur Interpretation liefert. Daher muss ich ihn kürzen.
Indem ich eine Buchstabenmarke (engl. <span lang="en">Lettermark</span>)
verwende, wie hier empfohlen, kann ich mein Wissen aus der Typografie
(hauptsächlich durch LaTeX) anwenden.</p>
<p>Meine Haupterkenntnis nach dem Lesen des Artikels besteht darin, es einfach zu
halten. Das Logo muss von ganz klein (wie etwa ein Favicon) bis ganz groß (wie
auf Postern) funktionieren. Wenn also Details hinzugefügt werden, hindert es
mehr als das es nützt. Tatsächlich kann so eine Buchstabenmarke insofern
zeitlos sein, als dass es nicht Trends folgt. Typografie gibt es schon seit
Jahrhunderten. Allerdings könnte die Auswahl von zwei Schriftfamilien auch
etwas zu wenig sein. Daher kann ich hier meine bereits erworbenen Fähigkeiten
einbringen. Es ist wesentlich einfacher mit Text zu arbeiten, als Bilder zu
manipulieren. Aber ich werde noch nicht zu viel verraten.</p>
<h3>Logo, Farben und Typografie</h3>
<p>Dies sind die drei Säulen, auf denen eine visuelle Markenidentität fußt. Ich
habe bereits 2019
<a href="/en/blog/2019/about-this-design-decisions/">meine Farbpalette und Schriftfamilienpaar ausgewählt</a>. Mir fehlte aber
eine ganze Weile lang ein Logo. Im Großen und Ganzen sind meine Gedanken von
damals immer noch gültig.
Ich kombiniere
<span class="colour-item" style="--colour-item:#EE9D2B;">orange</span> mit
etwas <span class="colour-item" style="--colour-item:#00C8FF;">Hellzyan</span>
in Zukunft. Das Orange ist lebhaft, auch wenn es etwas ausgewaschen aussieht.
Das soll den Eifer repräsentieren, mit dem ich ein Projekt bis zum Ende
durchsehen will. Wann auch immer ich ein warmes Orange sehe, fühle ich mich
gut. Es erinnert mich an meinen Umzug nach
<span lang="en">Ubuntu Jaunty Jackalope</span>, was für mich einen bedeutsamen
Wandel im Leben bedeutet. Währenddessen assoziiere ich Zyan mit dem Himmel und
dem Meer.
Weißt du, ich bin in einer ländlichen Gegend mit vielen Seen um mich herum
aufgewachsen. Schwimmen zu gehen war etwas, das wir in meiner Jugend gemacht
haben. Aber der Himmel ist auch ein Ort endloser Möglichkeiten. Für mich fühlt
sich das Web ähnlich kreativ an. Nah an Wasser zu sein beruhigt mich. Ich kann
mich entspannen und zur Abwechslung auch einmal das Leben genießen.</p>
<p>Meine Absicht ist es, ein Gefühl von Vertrauen im Publikum zu erzeugen. Blau
wird dafür üblicherweise genutzt, wenn auch in einer Variante, die eher an
<span class="colour-item" style="--colour-item:#002366;">Königsblau</span>
erinnert (ich assoziiere es mit dem
<a href="https://de.wikipedia.org/wiki/Bluescreen_(Windows)"><span lang="en">Blue Screen of Death</span></a>, aber was weiß ich schon?)</p>
<p>Im Hinblick auf Typografie habe ich mich wieder für <a href="https://web.archive.org/web/20140630200925/http://www.impallari.com/projects/overview/milonga">Milonga</a> und
<a href="http://vollkorn-typeface.com/">Vollkorn</a> für das Logo entschieden. Milonga ist ausdrucksstark. Es
wird mit Tango assoziiert, also einem Tanz aus Argentinien. Ich war zwar noch
nie in meinem Leben in Lateinamerika. Aber ich habe Spanisch von jemanden aus
Venezuela gelernt, habe jemanden aus Panama getroffen, der mir ein Freund wurde
und möchte allgemein mehr Bindungen mit Latein- und Südamerika aufbauen.
Darüberhinaus ist es eine wunderschöne und ausdrucksstarke Schriftfamilie.
In der Hinsicht passt es gut mit dem Orange, das ich eben erwähnte.</p>
<p>Vollkorn ist dagegen Deutsch. Es ist geerdet und steht für Eigenschaften, für
die ich selbst bekannt sein möchte. Ich benutze es, um ein Gefühl von
Vertrauen und Professionalität zu erzeugen. Wie du siehst, zahlt es auf das
gleiche Ziel ein.</p>
<h2>Markenpersönlichkeit</h2>
<p>Nachfolgend sind die Fragen von <a href="https://99designs.com/blog/logo-branding/how-to-design-logo/"><span lang="en">99 designs</span></a>
samt meinen zugehörigen Antworten aufgelistet. Ich habe für mich festgestellt,
dass Fragen wie diese mir dabei helfen, nach Antworten in mir zu suchen.
„Betreib Marktforschung“ oder „erstell eine Markenidentität” fühlen sich so
groß an, dass ich nicht weiß, wo ich anfangen soll. Nachdem ich einige Seiten
zum Thema durchgelesen habe, tauchten einige Fragen immer wieder auf, die mir
helfen, ein Bild davon zu formen, wonach ich eigentlich suche.</p>
<h3>Welche Überzeugungen und Werte sind dir als Firma wichtig?</h3>
<p>Ich bin überzeugt davon, dass Technologen mehr soziale Verantwortung übernehmen
sollten. Technologie ist nicht neutral. Die Arbeit in dieser Branche hat
Auswirkungen auf die Menschen.</p>
<p>Daher ist mir qualitative Arbeit wichtig, welche den Menschen berücksichtigt.
Wir sind nicht nur Zahlen in einer Datenbank. Ganz im Gegenteil: Menschen da
draußen vertrauen uns ihre Daten an, damit wir sie sicher aufbewahren. Wir
müssen uns dieses Vertrauens als würdig erweisen, indem wir unsere Versprechen
einhalten.</p>
<p>Ich schätze ehrliche Rückmeldungen. Ich selber nehme kein Blatt vor dem Mund,
selbst wenn es weh tut. Ich glaube daran, dass dieses Verhalten es ermöglicht,
zu reflektieren und auf lange Sicht zu einer gesamtheitlichen Verbesserung
führen wird. Mein Ruf besteht darin, auf den Punkt zu kommen und sehr viel
über alles mögliche zu wissen.</p>
<h3>Was kann ich besser als alle anderen?</h3>
<p>Ich kann das Große Ganze erfassen. Ich kann auf Bereiche hinweisen, die ein
tieferes Nachdenken erfordern, bevor eine Strategie weiter verfolgt wird.
Dadurch können künftige Kosten eingespart werden.</p>
<h3>Was macht mich besonders?</h3>
<p>Ich habe einen Hintergrund in Mathematik. Dieses Studium erlaubt mir, Probleme
zu durchdenken und Einsichten zu übertragen.</p>
<p>Ich bin neugierig. Ich mag es, viel über alles mögliche zu lernen.
Es bereitet mir Freude, Wissen weiterzugeben. In der Welt passiert so viel und
es ist leider nicht genug Zeit vorhanden, um alles zu lernen. Durch das
Kuratieren von Quellen kann ich meine Botschaft an die Zuhörerschaft anpassen.</p>
<h3>Wenn ich meine Marke in drei Worten beschreiben könnte, welche wären das?</h3>
<p>Einfühlsam, freundlich, geduldig.</p>
<h3>Welche drei Worte wünsche ich mir, dass Kunden mich damit beschreiben?</h3>
<p>Zugänglich, vertrauenswürdig, verlässlich.</p>
<h2>Inspiration finden</h2>
<p>Neben allgemeinen Design-Inspirationsquellen habe ich mir auch Logo-Ersteller
angeschaut. Jetzt ist es so, dass ich eingangs hervorhob, dass ich diese
Handwerker wertschätze. Das ist immer noch wahr. Ich habe nicht die Absicht,
die Ergebnisse eines solchen Werkzeugs im Produktivbetrieb einzusetzen. Aber
sie erlauben mir, ein besseres Verständnis über Unterhaltungen zu erlangen, die
ich erwarten kann, wenn ich mit Experten führen werde, wenn ich einen
beauftrage.</p>
<p>Dies sind die Angebote, welche ich entdeckte und die keine Anmeldung erfordern:</p>
<ul>
<li><a href="https://www.freelogodesign.org/logomaker-app/en/generator"><span lang="en">FreeLogo Design</span></a></li>
<li><a href="https://myfreelogomaker.com/onboarding"><span lang="en">my free logo maker</span></a></li>
<li><a href="https://smashinglogo.com/de/logo-maker/#tour-name"><span lang="en">Smashing Logo Maker</span></a></li>
</ul>
<p>Ich möchte mit einer letzten Quelle abschließen:
<a href="https://brandcolors.net/"><span lang="en">BrandColors</span></a>. Diese Seite erlaubt, einen
Eindruck davon zu gewinnen, welche Farbwahlen bei welchen Marken beliebt sind.</p>
</description>
      <pubDate>Thu, 10 Aug 2023 18:07:00 +0000</pubDate>
      <guid>https://jaenis.ch/de/blog/2023/ive-made-a-logo/</guid>
    </item>
    <item>
      <title>Eleventy, ESM and Storybook</title>
      <link>https://jaenis.ch/en/blog/2023/eleventy-esm-storybook/</link>
      <description><p>Update! This post was also published <a href="/de/blog/2023/eleventy-esm-storybook/">in German</a>.</p>
<p>This month I was down with different sicknesses. It slowed down my progress
significantly. But as it is the fate of freelancers I have to cope with those
downtimes on my own. Today I’m feeling a little bit better and spend the time
to pick up where I left my progress.</p>
<p>As you can tell from the footer, this website is built with <a href="https://11ty.dev/">Eleventy</a>.
As such I have full control over everything. Something I dreamt for <em>so long</em>
now was to combine Eleventy with <a href="https://storybook.js.org/">Storybook</a>. This way I can share
my templates across different projects to get closer to a coherent look and
feel. That is, build up brand recognition. I’m pleased to announce that today
I figured out how to do just that.</p>
<h2>Why Nunjucks?</h2>
<p>My templates are written in <a href="https://mozilla.github.io/nunjucks/">Nunjucks</a>. It’s a template engine
authored by Mozilla. The other day I took a look at it. Yes, the examples there
are dated. Neither Firefox OS Marketplace nor Webmaker are still around.
Nevertheless it meets my needs. In <a href="https://www.zachleat.com/web/jsparty-eleventy-2/">Celebrating Eleventy 2.0</a> Zach
was very proud on <a href="https://www.npmjs.com/package/@11ty/webc">WebC</a> and encouraged everyone to migrate to it.
I’d love to. But it’s not in the cards right now. Mainly, because I can’t run
it in the browser. That implies that I can’t use it with Storybook which
processes those templates in the browser.</p>
<p>I originally used Liquid, because I started out with Jekyll. Then I moved over
to EJS, but I hit some roadblocks with asynchronous processing. Nunjucks is
just right to me. I could use the JavaScript syntax, but I like to separate the
markup from the interactive parts.</p>
<h2>Why do you need templates in the browser?</h2>
<p>Because Storybook. My intention is to allow others to learn from me. I enjoy
teaching. Therefore I plan to build out my <a href="https://design.jaenis.ch/">Design System</a> going forward.
I was hesitant to deploy this on Uberspace although I would have been
technically able to, because there are some security concerns with the way they
wrote their application. Now with a VPS I have the chance to properly separate
the applications from each other. I tweaked my templates to allow for pull the
static assets from the Design System to further encourage reuse.</p>
<p>I’m happy that I could upgrade my Storybook setup to v7 and drop Webpack in
favour of Vite. It’s not the best builder for my needs but at this point I
consider everything better than Webpack. Their configuration is just so
spaghetti that I prefer not to have to work with it.</p>
<p>The upgrade of Storybook meant that I had to let go of some plugins and I was
not able to restore everything I formerly had yet. But I’m getting there.</p>
<h2>ESM vs. CommonJS</h2>
<p>I hit some roadblocks on my refactoring. For example, I would love to use
ECMAScript Modules everywhere, but <a href="https://github.com/11ty/eleventy/issues/836">Eleventy does not support it</a> yet.
That wouldn’t be such an issue if I could
<a href="https://github.com/11ty/eleventy/issues/614">return a Promise from the Eleventy configuration</a>, but that’s not
doable right now either. After several back and forth I settled on authoring
my code in ECMAScript modules and transpile to CommonJS using
<a href="https://esbuild.github.io/">esbuild</a>. It’s meh because it requires a handful of more steps but it
works. Once I upgrade to <a href="https://forgejo.org/2023-06-10-release-v1/">Forgejo v1.20</a> I can use the Actions and
automate away those tasks.
I’m looking forward to be able to have a push in one repository
(the design system) trigger updates in dependent repositories. For example, I’m
also in process in bringing my <a href="https://cheatsheets.jaenis.ch/">Cheatsheets</a> back online. I can
pull the styles and render the content, but the template needs refinement.</p>
<h2>Why Storybook</h2>
<p>Storybook allows me to have a central place to define all my markup and
document the thought process and decision making I have around those.
Especially the latter is something I feel it’s important, but also hidden in so
many projects. I want to be the change I want to see in the world here.</p>
<p>Blog posts are nice, but it’s a separation of the code. This poses a hurdle.</p>
<h2>Locales</h2>
<p>You might noticed that some links break. I’m aware of this. For years I
struggled on how to handle my German and English content. On the one hand I
want to write in English because that’s how I can connect which large parts of
the world. But I also want to meet those people who might not speak English.
In this month I started to move some blog posts to locale subdirectories
(<a href="https://jaenis.ch/en/"><code>/en/</code></a> and <a href="https://jaenis.ch/de/"><code>/de/</code></a>) and add redirects to old links when I get
around. I start from the early days and plan to move to more recent posts to
reduce the noise this will inevitably cause in the early phase.</p>
<p>You can expect to find more blog posts in both languages going forward that
link to the counterpart in the other language. I also will provide more RSS
feeds so you can choose whether you want to subscribe to information in one or
both languages. My templates are not updated everywhere, so you will likely see
some doubled content for a few weeks until I got around to them.</p>
<h2>Webmentions</h2>
<p>One last update before I close up this blog post: I am migrating my Webmention
endpoint. For years I’ve used <a href="https://webmention.io/">webmention.io</a> to act as a provider.
However, looking into the last records it’s from my time on Twitter. Something
that got also lost on <a href="https://brid.gy/">Brid.gy</a> because I consumed it less and the
database got cleaned up. I don’t hold this against them.</p>
<p>Now I don’t want to host a Ruby application here. I looked around what the
community has developed in the meantime and decided to adopt
<a href="https://github.com/voxpelli/webpage-webmentions">webpage-webmentions</a>. Therefore my new endpoint is going to be at
<a href="https://webmentions.jaenis.ch/">webmentions.jaenis.ch</a>. I expect to submit patches upstream to improve the
service for myself and all other consumers this year.</p>
<p>And that’s it for today. Thank you for reading.</p>
</description>
      <pubDate>Fri, 28 Jul 2023 16:30:00 +0000</pubDate>
      <guid>https://jaenis.ch/en/blog/2023/eleventy-esm-storybook/</guid>
    </item>
    <item>
      <title>Eleventy, ESM und Storybook</title>
      <link>https://jaenis.ch/de/blog/2023/eleventy-esm-storybook/</link>
      <description><p>Update! Dieser Beitrag ist auch <a href="/en/blog/2023/eleventy-esm-storybook/">auf Englisch</a> erschienen.</p>
<p>Mich hat diesen Monat wiederholt Krankheit auf’s Bett geworfen. Dadurch ist
mein Fortschritt signifikant gesunken. Aber wie es nun einmal das Schicksal
von Selbstständigen ist, muss ich mit diesen Auszeiten selber klar kommen.
Heute fühle ich mich ein wenig besser und habe Zeit darauf aufgewendet, meine
Arbeit fortzusetzen.</p>
<p>Wie du im Footer sehen kannst, ist diese Website mit <a href="https://11ty.dev/">Eleventy</a> gebaut
worden. Dadurch habe ich die volle Kontrolle über alles. Etwas, was ich schon
<em>so lange</em> machen wollte, ist Eleventy mit <a href="https://storybook.js.org/">Storybook</a> zu
kombinieren. Auf die Weise kann ich meine Templates über verschiedene Projekte
teilen und mich einem kohärenten Aussehen und Verhalten annähern. Mit anderen
Worten, meine Marke erkennbarer machen. Ich freue mich mitteilen zu können,
dass ich heute herausgefunden habe, wie ich genau das umsetzen kann.</p>
<h2>Warum Nunjucks?</h2>
<p>Meinte Templates sind in <a href="https://mozilla.github.io/nunjucks/">Nunjucks</a> geschrieben. Dies ist eine
Template-Sprache von Mozilla. Erst kürzlich warf ich wieder einen Blick auf die
Homepage des Projekts, Ja, es ist etwas veraltet. Weder der Firefox OS
Marketplace noch Webmaker sind mehr online. Aber es erfüllt meine Bedürfnisse.
In der Episode <a href="https://www.zachleat.com/web/jsparty-eleventy-2/">Celebrating Eleventy 2.0</a> war Zach sehr stolz auf
<a href="https://www.npmjs.com/package/@11ty/webc">WebC</a> und ermutigte alle, ihre Seiten dahin zu migrieren. Ich würde das
gerne. Aber es ist mir derzeit nicht möglich. Hauptsächlich deshalb, weil ich
die Templates nicht im Browser ausführen kann. Dadurch kann ich sie nicht in
Storybook benutzen, welche die Templates im Browser verarbeitet.</p>
<p>Ursprünglich habe ich Liquid verwendet, weil meine Ursprünge in Jeykll liegen.
Dann bin ich zu EJS gewechselt, habe aber dort einige Stolpersteine mit
asynchroner Verarbeitung gesehen. Nunjucks ist für meine Bedürfnisse perfekt.
Ich könnte jetzt auch die JavaScript-Syntax benutzen, aber ich bevorzuge es,
Markup von den interaktiven Teilen zu trennen.</p>
<h2>Warum brauchst du Templates im Browser?</h2>
<p>Wegen Storybook. Meine Absicht ist, dass andere von mir lernen können. Ich mag
es, Wissen weiterzugeben. Aus dem Grund möchte ich auch mein
<a href="https://design.jaenis.ch/">Design System</a> noch weiter ausbauen. Ich habe gezögert, es mit Uberspace
auszurollen, auch wenn ich technisch dazu in der Lage gewesen wäre. Das Ding
ist, dass Storybook’s Art und Weise, die Anwendung zu schreiben, einige
Sicherheitsbedenken mit sich bringt. Jetzt mit einem VPS habe ich aber die
Chance, meine Anwendungen entsprechend voneinander zu trennen. Ich habe bereits
Templates dahingehend angepasst, dass sie statische Inhalte aus dem Design
System beziehen, um Wiederverwendung zu motivieren.</p>
<p>Ich freue mich auch, dass ich Storybook auf v7 aktualisieren konnte und in dem
Zuge endlich Webpack zugunsten von Vite loswerden konnte. Dieser ist zwar nicht
der beste Builder für meine Bedürfnisse, aber ich bin an einem Punkt angelangt,
bei dem ich alles besser als Webpack betrachte. Deren Konfiguration ist einfach
nur noch Spaghetti, so dass ich bevorzuge, nicht damit arbeiten zu müssen.</p>
<p>Leider hat das Upgrade auch bedeutet, dass ich einige Plugins aufgeben musste.
Ich war noch nicht dazu gekommen, sämtliche Funktionalität von früher
wiederherzustellen, aber das wird schon noch.</p>
<h2>ESM vs. CommonJS</h2>
<p>Ich bin auf einige Stolpersteine während meines Umbaus gestoßen. Zum Beispiel
würde ich gerne überall ECMAScript Module benutzen, aber
<a href="https://github.com/11ty/eleventy/issues/836">Eleventy unterstützt das noch nicht</a>. Das wäre an sich ja kein Problem,
aber ich kann auch
<a href="https://github.com/11ty/eleventy/issues/614">kein Promise aus der Eleventy-Konfiguration zurückgeben</a>. Nach einigem
Vor und Zurück habe ich nun schlussendlich mich darauf eingeschossen, meinen
Code in ECMAScript Modulen zu schreiben und anschließend mit <a href="https://esbuild.github.io/">esbuild</a>
nach CommonJS umzuwandeln. Es ist nicht ideal, weil es eine Handvoll weiterer
Schritte bedeutet. Aber sowie ich auf <a href="https://forgejo.org/2023-06-10-release-v1/">Forgejo v1.20</a> aktualisiert
habe, kann ich deren Actions benutzen, um diese Schritte wegzuautomatisieren.
Ich freue mich darauf, in der Lage zu sein, ein Repository zu aktualisieren
und dies so einzurichten, dass abhängige Repositories ebenfalls darauf
reagieren. Zum Beispiel habe ich gerade meine <a href="https://cheatsheets.jaenis.ch/">Cheatsheets</a> wieder
online zu bringen. Ich kann bereits Styles ziehen und Inhalte verarbeiten, aber
das Template braucht noch etwas Feinschliff.</p>
<h2>Warum Storybook</h2>
<p>Storybook erlaubt es mir, eine zentrale Stelle zu haben, an der ich all mein
Markup definiere und meinen Gedanken und Entscheidungen drumherum zu
dokumentieren. Gerade letzteres ist wichtig, wie ich denke. Aber es ist auch
etwas, dass in vielen Projekten nicht sichtbar ist. Ich möchte hier die
Veränderung sein, die ich gerne in der Welt sehen will.</p>
<p>Blog-Beiträge sind nett, aber sie sind vom Code getrennt. Dies stellt eine
Hürde dar.</p>
<h2>Sprachteilung</h2>
<p>Es ist dir vielleicht aufgefallen, dass einige Links kaputt gegangen sind.
Das ist mir bewusst. Seit Jahren schon hadere ich damit, wie ich mit meinen
deutschen und englischen Inhalten umgehen soll. Auf der einen Seite möchte ich
auf Englisch schreiben, weil ich so mit großen Teilen der Welt in Verbindung
trete. Auf der anderen Seite möchte ich den Menschen begegnen, die vielleicht
kein Englisch sprechen. Diesen Monat habe ich daher angefangen, einige
Blog-Beiträge in Sprach-Unterverzeichnisse (<a href="https://jaenis.ch/en/"><code>/en/</code></a> und <a href="https://jaenis.ch/de/"><code>/de/</code></a>) zu
verschieben und Umleitungen der alten Links einzurichten, wenn ich dazu komme.
Ich fange bei meinen frühen Beiträgen an und arbeite mich zu mehr aktuelleren
Inhalten, um möglichst wenig zu stören.</p>
<p>Du kannst damit rechnen, mehr Blog-Beiträge in beiden Sprachen vorzufinden, die
auf das Gegenstück in der anderen Sprache verweisen. Ich werde auch mehr
RSS-Feeds bereitstellen, so dass du dich entscheiden kannst, ob du
Informationen in einer oder beiden Sprachen abonnieren möchtest. Meine
Templates sind noch nicht überall aktualisiert, so dass es vorübergehend
doppelte Inhalte geben wird, bis ich in den kommenden Wochen dies gerade
gezogen habe.</p>
<h2>Webmentions</h2>
<p>Eine letzte Sache noch, bevor ich diesen Blog-Beitrag abschließe:
Ich migriere meinen Webmention-Endpunkt. In den vergangenen Jahren habe ich
<a href="https://webmention.io/">webmention.io</a> als Dienstanbieter genutzt. Als ich jedoch in die
letzten Einträge reingeschaut habe, sah ich, dass sie noch Inhalte von Twitter
auflisteten. Etwas, dass mir auch bei <a href="https://brid.gy/">Brid.gy</a> verloren gegangen ist,
da ich den Dienst weniger genutzt habe und wohl die Datenbank bereinigt wurde.
Ich hege keinen Groll gegen diese Dienste.</p>
<p>Jetzt möchte ich aber ungern eine Ruby-Anwendung betreiben. Ich habe mich daher
umgeschaut, was die Community in der Zwischenzeit entwickelt habe und mich dazu
entschieden, <a href="https://github.com/voxpelli/webpage-webmentions">webpage-webmentions</a> zu adoptieren. Mein neuer Endpunkt
wird daher <a href="https://webmentions.jaenis.ch/">webmentions.jaenis.ch</a> sein. Ich erwarte, in diesem Jahr auch
einige Verbesserungen gegen den Entwickler hinter dem Projekt einzureichen, um
den Dienst für mich und alle anderen zu verbessern.</p>
<p>Und damit bin ich für heute fertig. Danke für’s Lesen.</p>
</description>
      <pubDate>Fri, 28 Jul 2023 16:30:00 +0000</pubDate>
      <guid>https://jaenis.ch/de/blog/2023/eleventy-esm-storybook/</guid>
    </item>
    <item>
      <title>Recap 2023 Q2</title>
      <link>https://jaenis.ch/blog/2023/recap-2023-q2/</link>
      <description><p>Wie die Zeit verfliegt. Jetzt ist auch schon das zweite Quartal fast vergangen.
Ich möchte ein wenig zurückblicken, was geschehen ist, nachdem ich bereits
<a href="/blog/2023/recap-2023-q1/">über das erste Quartal</a> geschrieben habe.</p>
<h2>April</h2>
<p>Aus dem Online-Kurs ist leider nichts geworden. Ich bin zwar mit den
Vorbereitungen gut vorangekommen und habe auch schon die ersten Probeaufnahmen
angefertigt, aber zum einen zickt meine Grafikkarte immer noch herum, zum
anderen ist mir ein anderer Termin dazwischen gekommen, der mich für den
Großteil des Aprils in Anschlag nahm: <a href="https://gamedevjs.com/competitions/gamedev-js-jam-2023-start-and-theme-announcement/">GameDevJS</a>.</p>
<p>Ich habe aber geschrieben und werde unter Umständen in eine spätere Runde
aufgenommen.</p>
<p>Für mich hat GameDevJS eine bedeutende Rolle. Es ist ein definierter
Zeitrahmen, in dem ich mich intensiv mit Forschung und Entwicklung auseinander
setze. Oftmals profitiere ich von dem Gelernten noch Monate später.</p>
<h2>Mai</h2>
<p>Im Mai habe ich dann die Gelegenheit genutzt, beim
<a href="/blog/2023/itfs/">Internationalen Trickfilmfestival</a> vorbei zu schauen. Ich habe es mit
gemischten Gefühlen verlassen.</p>
<p>Ich habe hier auch begonnen, <a href="/en/blog/2023/learning-kotlin/">etwas Kotlin zu lernen</a>, um mit Android
Studio und NeoVim Android-Apps zu entwickeln. Hintergrund hier sind fehlende
Anwendungen im <a href="https://f-droid.org/de/">F-Droid-Store</a>. Teilweise fehlen sie auch im Google
PlayStore. Nachdem ich schnell erste Ergebnisse erzielen konnte, werde ich mich
hier weiter einlesen und habe mir Literatur besorgt.</p>
<p>Ich sehe es jedenfalls nicht als mein Standbein, auch wenn ich einige
Ideen für Apps habe.</p>
<p>Daneben nutzte ich die Zeit, um ein altes Projekt wieder aufzufrischen.
Hierbei geht es darum, dass ich ganze Anwendungen deklarativ zusammenbauen
kann. Das Framework dafür ist auch aus den GameDevJS-Projekten entstanden.
Zusammen mit der Beschäftigung mit <a href="https://astexplorer.net/">ASTs</a> als
<a href="https://github.com/11ty/eleventy/issues/1464">Beitrag zu Eleventy</a> habe ich einen Ansatz, der bisher positiv fruchtet.
Ich sehe sogar Potential, mit einer Codebase verschiedene Plattformen zu
bedienen.</p>
<p>Im Mai habe ich auch endlich einen weiteren Schritt gewagt und
<a href="https://hackerpublicradio.org/correspondents/0419.html">meine ersten Podcasts aufgenommen</a>. Zum Zeitpunkt der Veröffentlichung
dieses Beitrags sind sie auch schon online.</p>
<h2>Juni</h2>
<p>Während der Produktentwicklung aus dem Mai habe ich natürlich noch weiterhin
Plattformen bespielt, um vielleicht doch noch Aufträge zu ergattern. Leider
gab es meistens nur einen Anruf, worauf vielleicht (nicht immer) eine E-Mail
folgte, mit der ich mich auf ein Interview bewerben konnte.</p>
<p>Als mein persönliches Highlight konnte ich aber einen Auftrag gewinnen, der es
mir erlaubt, mit einem meiner liebsten Frameworks zu arbeiten. Ich bin positiv,
dass dies der Auftakt zu weiteren Arbeiten werden wird. Nur um dann wenige Tage
später zu erfahren, dass sich der Auftraggeber umentschied und den Auftrag
stornierte. Die Plattform hat mir dann zum erfolgreich abgeschlossenen Auftrag
gratuliert oO</p>
<p>Ich habe auch endlich den Schritt gewagt, mir einen
<a href="https://greenhost.net/">Virtual Private Server</a> zu klicken. Etwas, was bei mir deutlich die
Hosting-Kosten nach unten drücken wird. Ich bin bereits auf Jahren nach einem
Hoster, der meinen Vorstellungen entspricht. Leider gibt es viele, bei denen
die Oberfläche schon Sicherheitslücken aufweist (und sie selbst auf Hinweis
kein Handlungsbedarf sehen) oder aber als Reseller für irgendeine Cloud
auftreten. Die Cloud deckt aber nicht meinen Bedarf. Warum sollte ich mich
unter die Herrschaft von einer Handvoll größerer Firmen werfen? Wenn sie es
nicht einmal schaffen, bei der eigenen Politik dafür zu lobbyieren, dass der
Geheimdienst nicht in Kundendaten schnüffelt und damit ein um das andere Mal
die Zusammenarbeit mit uns Europäern auf tönerne Füße stellt?</p>
<p>Nein, ich denke, dass self-hosting immer noch wertvoll ist. Dazu werde ich auch
künftig mehr schreiben, um anderen Menschen die Möglichkeit zu geben, es nach
zu machen. Leider gibt es nicht genug Menschen, die von Development und
Operations genug verstehen und dazu Application Security-Wissen einbringen
können. Ich kann mir auch gut vorstellen, für andere Unternehmen oder
Organisationen das Hosting zu übernehmen. Bei Interesse,
<a href="mailto:andre.jaenisch.wdc@posteo.net">schreiben Sie mir eine E-Mail</a>.</p>
</description>
      <pubDate>Thu, 29 Jun 2023 19:00:00 +0000</pubDate>
      <guid>https://jaenis.ch/blog/2023/recap-2023-q2/</guid>
    </item>
    <item>
      <title>Learning Kotlin</title>
      <link>https://jaenis.ch/en/blog/2023/learning-kotlin/</link>
      <description><p>This post was also published <a href="/de/blog/2023/learning-kotlin/">in German</a>.</p>
<p>In the past two weeks I started something new to bridge the time until I can
secure a job. So in between talking to recruiters I picked up projects that
were wabbering in my head since years.</p>
<p>One of them is learning Android app development. Last time I touched that
subject it was only doable with Java, which I won’t get into. It would lead
to all sorts of offers I have no interest in whatsoever. The reasons for it
will become clear in a moment.</p>
<p>Being a web development person I also tried React Native, because Ionic is
based on Angular which I would like to avoid if possible. Mainly because I
have different opinions on how to write components.</p>
<p>Now there are other options like Flutter but I did not look into them.</p>
<h2>Android Studio</h2>
<p>So how do I develop an Android app? Well, it appears that the preferred method
is to download and run <a href="https://developer.android.com/studio">Android Studio</a>. That’s an
<abbr title="Integrated Development Environment">IDE</abbr> like WebStorm or PyCharm that does all sorts of stuff for you. And it
suffers from the same pain points I see in every <abbr title="Integrated Development Environment">IDE</abbr> I tried so far: it’s slow.
It does too much and gets in my way.</p>
<p>That being said, I downloaded the tarball and unpacked it on this Debian
machine I am using for development work. On first start it downloads who knows
what so enjoy your meal while you are waiting.</p>
<p>I had to create a <code>.desktop</code> file to make the tarball appear in my application
launcher:</p>
<pre><code>#!/usr/bin/env xdg-open

[Desktop Entry]
Name=Android
StartupWMClass=android
Comment=Develop Android applications.
GenericName=Android Studio
Icon=android
Type=Application
Categories=Development;
Path=$HOME/src/android/AndroidStudioProjects/
Terminal=false
Icon=$HOME/bin/tar/android-studio/bin/studio.png
Exec=$HOME/bin/tar/android-studio/bin/studio.sh
</code></pre>
<p>Replace <code>$HOME</code> with the absolute part. I have the convention to place
downloaded binaries in a <code>bin</code> directory and categorise it by format.
In the same spirit my source code is organised in <code>src</code> within my <code>$HOME</code>
and then sorted by programming language. I have other Android apps cloned
there as well. So in order to separate them from my own I have an additional
directory level for my work.</p>
<p>Now I learned Kotlin by watching videos and reading things up. From the
official documentation as well as Stack Overflow (where else?).</p>
<h2>App idea</h2>
<p>I won’t go into too much details about the app itself at this point. If you
are interested, <a href="mailto:andre.jaenisch.wdc@posteo.net">write me an email</a>. I am looking for testers who know
how to load a debug <abbr title="Android Package">APK</abbr> on their phone and provide feedback. Yes, technical
experience required at this point. I am aware that there are solutions to
distribute it in a more elegant way.</p>
<p>Suffice to say that the app will provide aid in chores at home. I found a niche
in which I don’t see many apps - even on Google Play Store!</p>
<h3>Constraints</h3>
<p>In the beginning I am focussing on F-Droid compatibility, however. I miss so
many apps there that my source code will be Free Software. That won’t prevent
me from selling it but allows others to learn and improve it.</p>
<p>Also I want to avoid Google services and components as far as I can.
Turns out that limits my choices vastly. It really surprises me that there is
so little choice here.</p>
<p>But this can be a good thing. It sparks creativity. I am aware that a
consistent look and feel is more important for native apps than it is online.</p>
<p>The bottom line will be using LinearLayout and ConstraintLayout for the most
part and use some widget.</p>
<p>I am also working offline completely (at this point) by providing the person
the ability to manage the aspects of the app themselves instead of hosting it
online. That’s also a bonus on privacy.</p>
<p>Luckily Android ships SQLite natively so I can use a
<abbr title="Create Read Update Delete">CRUD</abbr> architecture with a database backend. Will be fine.</p>
<h3>Learnings</h3>
<p>So I know that <abbr title="Input / Output">I/O</abbr> is an asynchronous operation that should not block the main
thread. Looking up how tos pointed me towards Coroutines in Kotlin. So I
learned that. I also learned how to wire them up with partials in a
RecyclerView for performance reasons. Not that I believe I will reach a limit
that warrants these widget but I want to follow Best Practices while I am it.</p>
<p>I was pleasantly surprised to learn that Kotlin has a
<a href="https://developer.android.com/kotlin/style-guide">recommended code format</a> that will lead to a consistent structure
across applications. I am using Android Studio for formatting. Also creating
new files, imports and refactoring is done through it.</p>
<h3>Drawbacks</h3>
<p>My machine is a little dated. It’s a ThinkPad X250 with four cores and 3.5 GB
of RAM. Turns out Java is even more hungry than Chromium! During development
my machine is repeatedly freezing. I have to hard reboot to get back to work.</p>
<p>Android Studio does not like that. I observed loss of work. Sometimes my
changes wasn’t saved. Other times the whole file got wiped. Luckily I have git
to save me. So once I have done my things in Android Studio I close the program
and kill Java process from the command line (hey, why should it free resources?
It’s an <abbr title="Integrated Development Environment">IDE</abbr>, d’oh) and open the files in NeoVim.</p>
<p>I had the clever idea to install a <a href="https://github.com/weirongxu/coc-kotlin">language server for Kotlin</a> but that
yielded the same performance characteristics. So plain formatting only.</p>
<p>Running Android Studio alone is already taxing. I tried to use the emulator
but no dice. So I am using the <a href="https://developer.android.com/build/building-cmdline">gradle wrapper</a> to build a debug build
and load it on my Android phone using <abbr title="Android Debug Bridge">ADB</abbr>:</p>
<pre><code>./gradlew assembleDebug
./gradlew --stop
adb -d install app/build/outputs/apk/debug/app-debug.apk
adb logcat
</code></pre>
<p>Oh, and gradle is spanning as many workers as cores are available and keeps
them around for reuse afterwards. So I have to stop them (instead of outright
killing those processes). Not cool but better than this overblown <abbr title="Integrated Development Environment">IDE</abbr>.</p>
<p>A logcat can be used to see the stack trace and logging messages (of everything
that’s running on Android, so quite noisy).</p>
<p>I am quite disappointed that even though Android has
<a href="https://developer.android.com/guide/topics/ui/accessibility/principles">documentation on accessibility</a> I barely see it reflected in the
learning material I came across. I only stumbled upon it because I was looking
for roles to mark up my elements for headlines, buttons and the like. It
appears that it can’t beat HTML on this front. Nevertheless there are still
things that can’t be done. But if you don’t include them in your videos and
documentation developers won’t know about it.</p>
<p>Speaking of documentation: It’s lacking. See, I’m used to non-inclusive
documentation by Google at this point since I have to use Angular for projects
and it’s the same over there. That is, the code snippets are incomplete, they
don’t tell you where to put the code into, how to name files, in which
directory et cetera. I have to figure it out by myself using the bits that I
can find. So disappointing but what do you expect from a multi-million company?</p>
<h2>Conclusion</h2>
<p>So I see an opportunity to educate on Kotlin Android app development while
figuring out the parts I wish I knew as I go. This will help me scratch my own
itch while perhaps even make some money on the side. I invite you to join me.</p>
</description>
      <pubDate>Mon, 22 May 2023 14:25:00 +0000</pubDate>
      <guid>https://jaenis.ch/en/blog/2023/learning-kotlin/</guid>
    </item>
    <item>
      <title>Learning Kotlin</title>
      <link>https://jaenis.ch/de/blog/2023/learning-kotlin/</link>
      <description><p>Dieser Beitrag ist auch <a href="/en/blog/2023/learning-kotlin/">auf Englisch</a> erschienen.</p>
<p>In den vergangen zwei Wochen habe ich etwas neues begonnen, um die Zeit zu
überbrücken, bis ich eine Arbeit bekomme. Damit habe ich zwischen zwei
Gesprächen mit <span lang="en">Recruiter</span> ein Projekt aufgegriffen, das
mir schon seit Jahren im Kopf umherspukt.</p>
<p>Konkret geht es um das Lernen, wie <span lang="en">Android apps</span>
entwickelt werden. Als ich es das letzte Mal versuchte, ging es nur mit Java.
Darauf werde ich mich nicht einlassen. Ansonsten darf ich mich allen möglichen
Anfragen ausgesetzt sehen, an denen ich keinerlei Interesse habe. Warum wird
gleich klar.</p>
<p>Der <span lang="en">Web</span>-Entwickler, welcher ich nun einmal bin, habe ich
mich auch einmal an <span lang="en">React Native</span> versucht, denn
<span lang="en">Ionic</span> basiert auf <span lang="en">Angular</span>,
welches ich nach Möglichkeit lieber vermeiden möchte. Hauptsächlich deswegen,
weil meine Vorstellung darüber, wie Komponenten geschrieben werden sollten,
von deren abweicht.</p>
<p>Daneben gibt es noch weitere Möglichkeiten wie etwa
<span lang="en">Flutter</span>, aber die habe ich mir nicht angeschaut.</p>
<h2><span lang="en">Android Studio</span></h2>
<p>Wie wird denn nun eine <span lang="en">Android app</span> entwickelt? Nun, es
scheitn, als wäre die bevorzugte Methode das Herunterladen und Starten von
<a href="https://developer.android.com/studio"><span lang="en">Android Studio</span></a>.
Dabei handelt es sich um eine <abbr title="Integrierte Entwicklungs-Umgebung">IDE</abbr> wie <span lang="en">WebStorm</span> oder
<span lang="en">PyCharm</span>, die alles mögliche für dich erledigt. Es leidet
unter den gleichen Schmerzen, die ich bisher bei jeder <abbr title="Integrierte Entwicklungs-Umgebung">IDE</abbr> beobachten musste:
Es ist schnarchlangsam. Es macht zu viel und kommt mir in die Quere.</p>
<p>Nichtsdestotrotz habe ich den <span lang="en">Tarball</span> heruntergeladen
und auf dieser <span lang="en">Debian</span>-Maschien ausgepackt, die ich für
Entwicklungsaufgaben nutze. Beim ersten Start lädt es ziemlich viel Kram aus
dem Netz, so dass ich genauso gut auch erst einmal etwas Essen gehen kann.</p>
<p>Ich musste mir eine <code>.desktop</code>-Datei anlegen, damit die Anwendung in meinem
Starter auftauchte:</p>
<pre><code>#!/usr/bin/env xdg-open

[Desktop Entry]
Name=Android
StartupWMClass=android
Comment=Develop Android applications.
GenericName=Android Studio
Icon=android
Type=Application
Categories=Development;
Path=$HOME/src/android/AndroidStudioProjects/
Terminal=false
Icon=$HOME/bin/tar/android-studio/bin/studio.png
Exec=$HOME/bin/tar/android-studio/bin/studio.sh
</code></pre>
<p>Ersetze <code>$HOME</code> durch den absoluten Teil. Ich habe mir angewöhnt,
heruntergeladene ausführbare Dateien in einen Ordner namens <code>bin</code>
herunterzuladen und dort noch einmal nach Kategorien zu unterteilen.
In diesem Sinne organisiere ich meinen Quellcode auch in <code>src</code> innerhalb meines
<code>$HOME</code> nach der jeweiligen Programmiersprache. Ich habe mir auch andere
Android-Anwendungen dorthin gecloned. Damit ich sie von meiner eigenen Arbeit
unterscheiden kann, gibt es eine Ebene extra.</p>
<p>Jetzt habe ich Kotlin vorwiegend durch das Schauen von Filmen und
anschließender Recherche im Netz gelernt. Also der offiziellen Dokumentation
und <span lang="en">Stack Overflow</span> (wo auch sonst?).</p>
<h2>Idee für eine <span lang="en">App</span></h2>
<p>Ich werde hier nicht zu sehr in die Details über die <span lang="en">App</span>
selbst gehen. Wenn es dich interessiert, <a href="mailto:andre.jaenisch.wdc@posteo.net">schreib mir eine E-Mail</a>.
Ich bin auf der Suche nach Testern, die wissen, wie sie eine Debug <abbr title="Android Package">APK</abbr> auf ihr
Gerät laden und Rückmeldungen geben können. Ja, hier ist derzeit etwas
technische Erfahrung nötig. Mir ist bewusst, dass es andere Lösungen gibt, um
<span lang="en">Software</span> eleganter zu verteilen.</p>
<p>Es genügt zu sagen, dass die <span lang="en">App</span> bei Hausarbeiten helfen
wird. Ich habe eine Nische gefunden, in der ich nicht viel Konkurrenz sehe</p>
<ul>
<li>selbst im <span lang="en">Google Play Store</span>!</li>
</ul>
<h3>Rahmenbedingungen</h3>
<p>Zu Beginn konzentriere ich mich jedenfalls darauf, mit
<span lang="en">F-Droid</span> kompatibel zu werden. Ich vermisse dort so viele
<span lang="en">Apps</span>, dass ich meinen Quellcode als Freie
<span lang="en">Software</span> bereitstellen werde. Das wird mich vielleicht
vom Verkaufen abhalten, aber es erlaubt anderen, davon zu lernen und besser zu
werden.</p>
<p>Ich möchte auch <span lang="en">Google</span>-Dienste und -Komponenten so weit
es geht vermeiden. Es stellt sich heraus, dass dies meine Möglichkeiten
drastisch einschränkt. Ich bin ehrlich überrascht, dass es hier so wenig
Auswahl gibt.</p>
<p>Aber es kann auch etwas Gutes sein. Es entfacht Kreativität. Mir ist bewusst,
dass ein einheitliches Aussehen und Erlebnis bei nativen
<span lang="en">Apps</span> als wichtiger angesehen wird als
<span lang="en">online</span>.</p>
<p>Im Effekt werde ich <code>LinearLayout</code> und <code>ConstraintLayout</code> sowie einige
<span lang="en">Widgets</span> zu großen Teilen einsetzen.</p>
<p>Ich arbeite (derzeit) auch komplett <span lang="en">offline</span>, indem ich
der Person die Möglichkeit einräume, die Aspekte der <span lang="en">App</span>
selbst zu verwalten, statt es <span lang="en">online</span> zu machen. Das
gibt Bonuspunkte auf die Privatsphäre.</p>
<p>Glücklicherweise bringt <span lang="en">Android</span> von Haus aus
<span lang="en">SQLite</span> mit, so dass ich eine <abbr title="Create Read Update Delete">CRUD</abbr> Architektur mit dieser
Datenbank hintendran nutzen kann. Wird schon.</p>
<h3>Erkenntnisse</h3>
<p>Mir ist bekannt, dass <abbr title="Input / Output">I/O</abbr> eine asynchrone Operation ist, die nicht den
Hauptprozess blockieren sollte. Als ich Erklärungen dazu nachschlug, wurde oft
Koroutinen in Kotlin als Strategie empfohlen. Also habe ich diese gelernt.
Ich habe auch mitbekommen, wie ich <span lang="en">Partials</span> in einer
<code>RecyclerView</code> für <span lang="en">Performance</span>-Optimierungen einsetzen
muss. Nicht dass ich erwarten würde, dass ich an Grenzen stoßen würde, die
solche ein <span lang="en">Widget</span> erforderlich machen würde, aber ich
möchte gleich von Beginn an die <span lang="en">Best Practices</span>
einsetzen, wenn ich schon einmal dabei bin.</p>
<p>ich war positiv überrascht davon, dass Kotlin eine
<a href="https://developer.android.com/kotlin/style-guide">empfohlene <span lang="en">Code</span>-Formatierung</a> hat, die dafür
sorgt, dass die Struktur über Anwendungen hinweg einheitlich aussehen wird.
Ich benutze <span lang="en">Android Studio</span> zum Formatieren. Ebenso
werden neue Dateien und Imports sowie <span lang="en">Refactorings</span>
dadurch erledigt.</p>
<h3>Nachteile</h3>
<p>Meine Maschine ist schon ein wenig Älter. Es ist ein
<span lang="en">ThinkPad</span> X250 mit vier Kernen und 3,5 <abbr title="GigaByte">GB</abbr> <abbr title="Random Access Memory">RAM</abbr>. Es stellt
sich heraus, dass Java selbst <span lang="en">Chromium</span> überflügelt, was
Hunger auf Speicher angeht! Während der Entwicklung ist mir mehrfach die
Maschine eingefroren. Nur ein harter Neustart hat noch geholfen.</p>
<p><span lang="en">Android Studio</span> mag das nicht. Ich habe Datenverlust
beobachtet. Manchmal wurden Änderungen nicht gespeichert. Ein anderes Mal hat
sich eine ganze Datei in Luft aufgelöst. Zum Glück habe ich Rückendeckung durch
<span lang="en">git</span>. Nachdem ich also meine Dinge in
<span lang="en">Android Studio</span> erledigt habe, schließe ich das Programm
und kille alle Java-Prozesse von der Kommandozeile (warum sollte es auch
Ressourcen wieder frei geben? Es ist immerhin eine <abbr title="Integrierte Entwicklungs-Umgebung">IDE</abbr>) und öffne die Dateien
in <span lang="en">NeoVim</span>.</p>
<p>Ich hatte die schlaue Idee, den
<a href="https://github.com/weirongxu/coc-kotlin"><span lang="en">language server</span> für Kotlin</a> zu installieren, aber
das hat das gleiche <span lang="en">Performance</span>-Verhalten gezeigt.
Also nur einfache Formatierung.</p>
<p>Allein das Ausführen von <span lang="en">Android Studio</span> ist schon
fordernd. Ich habe versucht, den Emulator zu benutzen, aber keine Chance.
Daher verwende ich den <a href="https://developer.android.com/build/building-cmdline"><span lang="en">Gradle wrapper</span></a>, um ein
<span lang="en">Debug-Build</span> zu erstellen und es auf mein
<span lang="en">Android</span>-Smartphone mittels <abbr title="Android Debug Bridge">ADB</abbr> zu laden:</p>
<pre><code>./gradlew assembleDebug
./gradlew --stop
adb -d install app/build/outputs/apk/debug/app-debug.apk
adb logcat
</code></pre>
<p>Oh und übrigens startet <span lang="en">Gradle</span> so viele
<span lang="en">Worker</span>-Prozesse wie Kerne zur Verfügung stehen.
Sie werden nach dem Beenden weiter betrieben. Also muss ich sie stoppen (statt
sie direkt zu killen). Nicht schön, aber besser als diese überbordende <abbr title="Integrierte Entwicklungs-Umgebung">IDE</abbr>.</p>
<p>Ein <span lang="en">logcat</span> kann benutzt werden, um den
<span lang="en">Stack Trace</span> einzusehen und Nachrichten mitzuschneiden
(von allem, was auf dem <span lang="en">Android</span> läuft, damit also sehr
geschwätzig).</p>
<p>Ich bin ziemlich enttäuscht, dass trotz
<a href="https://developer.android.com/guide/topics/ui/accessibility/principles">Dokumentation zur Barrierefreiheit</a> ich kaum Lernmaterial zu
<span lang="en">Android</span> sehe, dass diese berücksichtigt.
Mir ist es nur aufgefallen, weil ich herausfinden wollte, wie ich meinen
Elementen die Rolle einer Überschrift oder eines Knopfes <abbr title="und so weiter">usw.</abbr> zuweisen kann.
Es scheint mir, dass hier HTML nicht zu schlagen ist. Nichtsdestotrotz gibt es
Dinge, von denen Entwickler nichts mitbekommen werden, wenn sie nicht in Videos
oder Dokumentation eingebunden wird.</p>
<p>Während wir gerade über Dokumentation sprechen: Sie ist reichlich dürftig.
Mir ist schon klar, dass <span lang="en">Google</span> nicht sonderlich viel
Wert auf Inklusion legt, nachdem ich <span lang="en">Angular</span> in
Projekten einsetzen musste. Hier ist es das Gleiche.
Sprich, die <span lang="en">Code</span>-Beispiele sind unvollständig, sie
verraten dir nicht, wo du Dinge in deinen Quellcode einfügen musst, wie die
Dateien heißen müssen, in welchen Ordner sie gehören <abbr title="und so weiter">usw.</abbr> Ich muss es mir
selber zusammenreimen aus den Schnipsseln, die ich finde. Es ist so
enttäuschend, aber was erwartest du von einer Firma, die Millionen macht?</p>
<h2>Zusammenfassung</h2>
<p>Ich sehe eine Möglichkeit, Schulung in der <span lang="en">Android App</span>-
Entwicklung mit Kotlin anzubieten, während ich die Teile herausfinde, von denen
ich mir gewünscht hätte, sie wären von Anfang an da. Dies wird mir helfen,
meine eigenen Bedürfnisse zu befriedigen und vielleicht ein wenig Geld nebenher
zu verdienen. Ich lade dich ein, mich dabei zu begleiten.</p>
</description>
      <pubDate>Mon, 22 May 2023 14:25:00 +0000</pubDate>
      <guid>https://jaenis.ch/de/blog/2023/learning-kotlin/</guid>
    </item>
    <item>
      <title>ITFS</title>
      <link>https://jaenis.ch/blog/2023/itfs/</link>
      <description><p>Vor einigen Tagen ist das <a href="https://www.itfs.de/">Internationale Trickfilm-Festival Stuttgart</a>
zu Ende gegangen. Ich habe ein paar Mal dort vorbei geschaut. Ich möchte kurz
meinen Eindruck festhalten.</p>
<p>Vor einigen Jahren war das Festival gefühlt noch größer. Es hat auch mehr
Räume eingenommen. Ich erinnere mich etwa auch an Versuchsausstellungen zu
VR von der Hochschule der Medien. Finde ich spannend, dass es sich nicht nur
um Trickfilm dreht, sondern tatsächlich auch andere Medien umfasst.
Wenn ich die Wayback-Machine richtig bediene, wird das wohl 2017 gewesen sein.</p>
<p>Vor allem gab es zu ungefähr jeder Zeit irgendetwas zu betrachten.</p>
<p>Dieses Jahr war es mehr wie eine Messe. Die große Leinwand auf dem
Schlossplatz wurde bestenfalls in den Abendstunden bespielt. Ich kann
verstehen, dass dann vor allem die arbeitende Bevölkerung dort vorbei
schauen kann. Aber das Wetter hat auch nicht wirklich mitgespielt. Es war
nur an ein, zwei Tagen sonnig genug, als dass es sich dort zu flanieren
lohnte.</p>
<p>Stattdessen gab es wohl irgendwelche Pässe, die sich vorab bestellt werden
konnte, mit denen mensch wohl vor allem die Innenstadt-Kinos besuchen konnte.
Daneben dann noch irgendeine Preisverleihung und das war’s.</p>
<p>Die Gamezone richtete sich überwiegend an Kinder in Grundschule oder
Sekundarstufe I und hatte im Wesentlichen nur ein Stop-Motion-Setup bereit.
Das kann ich auch daheim haben. Dafür brauche ich kein Festival.</p>
<p>Die T-Shirt-Motive wiederholen sich auch. Da lohnt sich kein Kauf. Ich finde
es schade, denn dies ist eine Möglichkeit, die Kosten teilweise aufzufangen,
die solch eine Organisation sicherlich verschlingen wird.</p>
<p>Ich bin ziemlich enttäuscht. Vielleicht befindet sich das Festival auch
einfach derzeit in einer Schieflage, so dass sie ein anderes Publikum
adressieren mussten. Aber es ist eines der wenigen Freilicht-Veranstaltungen,
die nicht in übermäßigen Alkoholkonsum zu überzogenen Preisen in überfüllten
Zelten ausartet (#FCKWSN). Habe ich erwähnt, dass ich ein Introvert bin und
kein Alkohol trinke?</p>
<p>Ich werde nächstes Jahr aber wohl trotzdem noch einmal vorbei schauen.
Vielleicht überrascht es mich ja.</p>
<p>Dieses Jahr habe ich immerhin einiges an Flyern mitgenommen, so dass ich
Recherche-Material habe.</p>
</description>
      <pubDate>Sun, 07 May 2023 15:25:00 +0000</pubDate>
      <guid>https://jaenis.ch/blog/2023/itfs/</guid>
    </item>
    <item>
      <title>GameDevJS 2023</title>
      <link>https://jaenis.ch/blog/2023/gamedevjs-2023/</link>
      <description><p>Wie in den vergangenen Jahren habe ich auch dieses Jahr am
<a href="https://itch.io/jam/gamedevjs-2023">GameDevJS 2023</a> <a href="https://itch.io/jam/gamedevjs-2023/rate/2037100">teilgenommen</a>. Dabei handelt es sich um
einen Wettbewerb auf der Plattform <a href="https://itch.io/">itch.io</a>, an den prinzipiell jeder
teilnehmen kann. Ausgerichtet wird er von <a href="https://end3r.com/blog/">Andrzej Mazur</a>, der auch
<a href="https://js13kgames.com/">js13kgames</a> organisiert.</p>
<p>Jetzt stellt sich natürlich die Frage:</p>
<h2>Warum sollte jemensch an einen Spiele-Wettbewerb teilnehmen?</h2>
<p>Nun, dies hat verschiedene Gründe. Ich möchte diesen Blog-Beitrag dazu nutzen,
meine Motivation auszulegen. Vielleicht kann ich ja auch andere motivieren,
einmal etwas Zeit dafür zu organisieren?</p>
<h3>It’s fun</h3>
<p>Spiele sind ein Kulturgut. Sie erzählen viel von unserem Umgang miteinander.
Das entscheidende Kriterium: Sie machen Spaß. Die Teilnahme daran ist
freiwillig. Ansonsten ist es kein Spiel mehr.</p>
<p>Unser Leben ist so schon hart genug. In manchen Teilen der Welt mehr als in
anderen. Etwas Zerstreuung und Miteinander ist da durchaus willkommen.</p>
<h3>Zeitliche Begrenzung</h3>
<p>Diese Wettbewerbe haben in der Regel eine zeitliche Begrenzung. Oftmals 24 bis
48 Stunden. Dies ist ausreichend, um etwas zusammenzustellen. Wenn denn die
Zeit dafür bereitgestellt werden kann. Ich finde es als Familienvater eine
ziemliche Herausforderung. Andrzej hingegen lässt mehr Spielraum. Dieser Jam
hier etwa gewährt 13 Tage Zeit, um etwas zu entwickeln. Für mich war es
bisher immer motivierend. Ich hatte nach meiner Erwerbstätigkeit Zeit, mich
in das Projekt zu knien.</p>
<h2>Was lerne ich daraus?</h2>
<p>Ich nehme aus der Spiele-Entwicklung so einiges mit, was mir im professionellen
Alltag zu Gute kommt.</p>
<h3>Herausforderung angenommen</h3>
<p>Als Webentwickler bin ich gefordert, zuverlässigen Code zu erstellen, der auch
performant ist. Neben einer gewissen Industrie für Erwachsenenunterhaltung ist
die Spiele-Industrie die Branche, welche die Grenzen von Programmen ausreizt.
Ernsthaft, wenn ich nach Optimierungen suche, damit Code unter 60 FPS (Frames
per Second, Bildwiederholungsrate) läuft, dann finde ich sehr viel Wissen in
der Spieleindustrie. Fängt an von CPU-Optimierungen über Speicherverwaltung
bis hin zu hochoptimierten Code.</p>
<p>Das hilft mir, mich mit der Programmiersprache selber zu beschäftigen, statt
alles an Frameworks auszulagern, die für ein Millionenpublikum entwickelt
wurden.</p>
<h3>Research and Development</h3>
<p>Ich habe die vergangenen Jahre dazu genutzt, mich nicht nur mit
<a href="https://js13kgames.github.io/resources/">leichtgewichtigen JavaScript-Bibliotheken</a> auseinander zu setzen.
Diese konnte ich etwa dann in Bereichen einsetzen, die nicht nur JavaScript
verwendeten (sei es Django oder PHP). Nein, ich habe auch mehr über SVG
gelernt.</p>
<p>Die meisten Game Engines, welche ich in der Indie-Entwicklung sehe, setzen
auf Canvas API. Dies ist gewissermaßen eine Zeichenfläche, auf die dann Pixel
gemalt werden. Leider ist die Canvas-API komplett unzugänglich.</p>
<p>Mit meinem Hintergrund in Mathematik hat mich daher schon seit jeher die
mathematische Grundlage hinter Vektorgrafiken angezogen. Hier andere Wege
zu gehen hat nicht unbedingt zur Folge, dass ich Lehren aus der Canvas-
Technologie nicht anwenden könnte. Ganz im Gegenteil. Ideen wie Sprites lassen
sich durchaus übertragen.</p>
<p>Aber SVG bietet die Möglichkeit, auch Text-Repräsentationen wiederzugeben.
Damit lassen sich auch Ausgabegeräte nutzen, die nicht an Menschen gerichtet
sind, die über ein gutes Sehvermögen verfügen.</p>
<h3>Find your niche</h3>
<p>Interessanterweise fällt es mir leichter, meine Nische im Bereich der
Spiele-Entwicklung zu definieren, als dass ich sie im Web-Bereich benennen
könnte. Meine Spiele erlauben das Zusammenspielen mit anderen Menschen. Ich
<a href="https://jaenis.ch/hobbies/coding/repos/ryuno-ki/gamedevjs-2020">habe gelernt</a>, wie ich dies über das Netzwerk realisiere, aber auch
lokal an einem Gerät. Dabei möchte ich es aber nicht belassen. Stattdessen denke ich
über Möglichkeiten nach, wie ich das Szepter aus der Hand geben kann und die
Spieler ermutige, selber kreativ zu werden.</p>
<p>Zugegeben, die 13 Tage Entwicklungszeit reichen dafür nicht immer aus. Aber
ich habe über verschiedene Jahre all die Puzzleteile zusammen getragen, die
ich nur noch zusammenführen muss. Dies hat mich auch zur Erforschung einer
<a href="https://jaenis.ch/hobbies/coding/repos/ryuno-ki/guido.software">Low-Code-Umgebung</a> geführt (die auf die gleiche Architektur setzt wie
die so entwickelten Spiele).</p>
<p>Jetzt ist es bei Zusammenspielen oftmals so, dass Latenz, also die Zeit
zwischen Anfrage an und Antwort von einem System, eine kritische Bedeutung
zukommt (Optimierung!). Ich löse das dadurch, dass meine Spiele in der Regel
rundenbasiert sind. Ich mag selber nicht zu hektische Spiele spielen. Viel
lieber genieße ich Spiele, die ein Nachdenken ermuntern oder gar einfordern.</p>
<p>Damit sind bei mir oftmals Puzzle- oder Logikspiele zu finden.
Die Grafik ist dabei naturgegeben sehr geometrisch. Ich verwende Newton’sche
Mechanik. Alles in 2D.</p>
<p>Ich belasse es aber nicht dabei, alles selber zu entwickeln. Das erfordert
Wissen, welches ich nicht besitze. Dabei nutze ich aber auch die Gelegenheit,
mir meine Abhängigkeiten sorgfältig auszuwählen. Bei Interesse
<a href="https://github.com/xem/mini2Dphysics/issues/3">erkläre</a> ich auch gerne die mathematischen Hintergründe zu den
Algorithmen, welche programmiert wurden. Denn leider ist es oftmals so, dass
„ich den Code im Internet / Buch gefunden und abgeschrieben” habe.</p>
<p>Die Logik dahinter (etwa Matrizen-Algebra) habe ich in Eingangsvorlesungen
von Mathematik gelernt. Damit kann ich meinen Beitrag zur Community leisten.</p>
<h3>Does it scale?</h3>
<p>Denn wenn ein Algorithmus verstanden wird, sind auch die Grenzen leichter zu
verstehen. Wenn es auf Mathematik beruht, gibt es noch einen schönen Aspekt:
Die Voraussetzungen sind wohldefiniert. Es ist nämlich so, dass Mathematik
auf eine Handvoll Grundannahmen beruht (genannt Axiome) und sich alles andere
daraus ableitet. Wenn jetzt bei einem Algorithmus die Voraussetzungen nicht
erfüllt sind, lassen sich die Ergebnisse nicht garantiert. Ganz einfach.</p>
<p>In der numerischen Mathematik habe ich auch die <a href="https://de.wikipedia.org/wiki/Landau-Symbole">Landau-Notation</a>
kennen gelernt. In der Informatik fällt das unter Big-O-Notation. Damit lassen
sich Aussagen zur Effizienz von Algorithmen treffen. Etwa zur Abhängigkeit der
Laufzeit von den Eingabedaten.</p>
<p>Nun gibt es auch Spiele, die sich an ein Millionenpublikum richten. Diese
müssen so richtig effizient sein. Meine Spiele sind anders. Ich beschränke
mich auf ein menschliches Level. Wenn ich mir Brettspiele so anschaue, dann
sehe ich Spielerzahlen von höchstens einem halben Dutzend Menschen um einen
Tisch herum. Damit habe ich mehr Spielraum, um auch ineffizienten Code
schreiben zu dürfen. Ich nutze diesen, um den Code dafür verständlicher zu
machen.</p>
<h3>Playful learning</h3>
<p>Mein Paradigma ist dabei sehr an Funktionaler Programmierung ausgerichtet.
Dieses Jahr habe ich von <a href="https://changelog.com/podcast/522">Data-Oriented Programming</a> erfahren, welches
sich auch sehr nahe an dem spiegelt, was ich für mich als optimal ermittelt
habe.</p>
<p>Dabei nehme ich eine <a href="https://frontendmasters.com/courses/enterprise-patterns/">Lektion von React und Redux</a> und habe ein zentrales
Objekt, welches den Zustand meines Spiels zu jedem beliebigen Zeitpunkt
beinhaltet. Da ich nicht so viele bewegliche Teile in der Oberfläche habe,
kann ich dabei ein einziges Objekt hernehmen.</p>
<p>Aus diesem Zustand leitet sich die Oberfläche ab. Aus Klassen-basiertem React
nehme ich die Idee von Smart und Dumb Components. Die ersten haben dabei ein
Verständnis von Zusammenhängen und kümmern sich um Interaktionen.
Dumb Components interessiert das alles nicht. Sie bekommen einfach Eingaben
und rendern diese auf den Bildschirm. Falls es interessante Ereignisse gibt,
informieren sie die Vorfahren darüber.</p>
<p>Hier setze ich auf native Events, die vom Browser bereitgestellt werden.
Auch mein Wissen aus jQuery kommt mir hier zu gute, indem ich mich der
<a href="https://learn.jquery.com/events/event-delegation/">Event Delegation</a> bediene. Ich habe ein einziges Element
(etwa <code>&lt;body&gt;</code>), an dem ich Event Listener registriere. Da ich nicht zu einer
anderen Seite navigiere, muss ich mich auch nicht um Aufräumarbeiten kümmern.</p>
<p>Ankommende Events werden dabei dann analysiert und an die entsprechenden
Handler weitergereicht, die sich um die Aktualisierung des States kümmern.
Daraufhin wird die Oberfläche aktualisiert.</p>
<p><a href="https://frameworkless.js.org/">React ohne React</a>. Sondern mit Funktionen und etwas Nachdenken.
Damit bekomme ich die Ladezeiten auf einen Bereich herunter, den ich so bisher
noch nicht mit Frameworks erreichen konnte (ich kann mir aber vorstellen, dass
Svelte hier noch besser abschneiden könnte).</p>
<h3>Artificial Intelligence</h3>
<p>State-basierte Entwicklung hat aber auch noch weitere Vorzüge.
Da ich mich darauf verlassen kann, dass sich die Oberfläche alleine aus dem
Zustand ableitet, kann ich Berechnungen durchführen, ohne eine Oberfläche
hinzuziehen zu müssen.</p>
<p>Durch das Heranziehen von Primitiven wie Object und Array kann ich auch die
Daten analyiseren. Damit lassen sich etwa Methoden der Künstlichen Intelligenz
und Fuzzing anwenden. Jetzt nicht die KI wie ChatGPT, sondern gewissermaßen
Strategien, die basierend auf Daten Entscheidungen treffen sollen. Hier um
einen Computer als Gegenspieler anbieten zu können, der für fehlende
Mitspieler einspringen kann.</p>
<p>Aber auch das Prüfen von Extremwerten ist so einfacher. Ich brauche in der
Regel kein überkompliziertes Setup. Durch die Funktionale Programmierung
hantiere ich sowieso mit vielen kleinen Funktionen, die nur von ihren
Eingabedaten abhängen.</p>
<p>Meine Sicherheitsbedenken beschränken sich auf die Handler, welche
Nutzereingaben entgegennehmen (etwa ausgelöste Events) oder diese Ausgeben.</p>
<h3>Ready Player Two?</h3>
<p>Da ich mit Datenstrukturen arbeite, kann ich diese auch als JSON-Objekte
über das Netzwerk verteilen. Hier verwende ich gerne <a href="http://socket.io">socket.io</a>. Prinzipiell
würden aber auch andere Transport-Mechaniken (wie etwa WebRTC) funktionieren.
JSON ist in vielen Programmiersprachen implementiert.</p>
<p>Wenn ich daraufhin Event-Handler registriere, die auf Mitteilungen reagieren
und diese zum Aktualisieren des lokalen States verwenden, dann ist die
Architektur schnell in der Lage, auch über das Netzwerk zu agieren.</p>
<p>Bis zu <a href="https://de.wikipedia.org/wiki/Ereignisgesteuerte_Architektur">ereignis-gesteuerter Architektur</a> mit Kafka und Microservices ist
es da nicht mehr weit. Auch <a href="https://opentelemetry.io/">Telemetrie</a> wäre hier mit
überschaubaren Aufwand machbar. Ich habe bisher aber noch nicht den
Anwendungsfall gehabt.</p>
<p>Und wenn es sein muss, können auch bestimmte Objekte in ein NFT umgewandelt
werden, wenn jemensch diese Abzocke gefällt. Ich kann dem nichts abgewinnen.</p>
<p>Tatsächlich möchte ich lieber die Möglichkeit geben, Kulturgüter zu bewahren.
Für mich gehört dazu, den Quellcode zu teilen und die Möglichkeit zu geben,
eigene Instanzen zu betreiben und die Spiele darauf einzustellen.</p>
<p>Denn es wäre doch schade, wenn nicht mehr gespielt werden kann, nur weil eine
Firma meint, den Server dahinter abschalten zu müssen.</p>
<p>Dabei prägen Spiele uns Menschen so sehr.</p>
</description>
      <pubDate>Sun, 30 Apr 2023 16:25:00 +0000</pubDate>
      <guid>https://jaenis.ch/blog/2023/gamedevjs-2023/</guid>
    </item>
    <item>
      <title>Forgejo sacrifices inclusiveness and calls it healing</title>
      <link>https://jaenis.ch/blog/2023/forgejo-sacrifice-inclusiveness-and-calls-it-healing/</link>
      <description><p>This is going to be a blog post I wished I wouldn’t have to write.
Yet here I am. I am going to present you a little bit of background,
the facts and my interpretation and will close with my expectation.</p>
<h2>What is Forgejo?</h2>
<p>Forgejo is a forge. You may be familiar with GitHub, Bitbucket or
GitLab. You can think of them as forges. It is a soft-fork of Gitea
which is forked from Gog. The origin is linked to the foundation of
Gitea Ltd. which received the domain and trademark without seeking
input from the community. Read the <a href="https://gitea-open-letter.coding.social/">Gitea Open Letter</a> for
more. I am one of the signatories.</p>
<h2>The thorn in Forgejo’s side</h2>
<p>Now the <a href="https://forgejo.org/2023-03-monthly-update/#the-forgejo-community-is-healing">monthly report of Forgejo for March 2023</a> reports
about someone that caused mischief in the community. Now there is a
<a href="https://codeberg.org/forgejo/forgejo/issues/421#issuecomment-812283">story behind this</a>. It’s true that moderation was attempted on
multiple levels and that a ban was enacted. We observed that some
people announced to feel uncomfortable and move away from the project
before the ban. The remaining community members took on the work and
continued to thrive. But we also noticed a sudden turnaround and
<a href="https://codeberg.org/forgejo/meta/issues/187">announcement of a reboot</a>. Because that single person did
not <em>feel</em> comfortable with the existing structure and deemed it
necessary to create new ones and violate all previous communication
processes that the community agreed upon.</p>
<h3>No more moderation</h3>
<p>As part of the bootstrap of Forgejo, a
<a href="https://codeberg.org/forgejo/meta/issues/13">well-being and a moderation team</a> were formed to manage
the community and enforce moderation if necessary.
Shortly after, our community manage suddenly resigned from the
position and left the whole community after a series of direct
messages with the above person that felt unsafe.</p>
<p>A few months after the same pattern occured again, this time with our
<a href="https://codeberg.org/forgejo/meta/pulls/185">moderator resigning</a>. At this point there was only one
member in the well-being team left.</p>
<h3>The ban hammer</h3>
<p>Now there was a <a href="https://codeberg.org/forgejo/meta/issues/86">long discussion about relicensing Forgejo</a>.
No clear direction was visible, so we decided to have a <a href="https://codeberg.org/forgejo/meta/issues/183">vote</a>.
Enough arguments were exchanged to form an opinion and we had roughly
the same number of people engaging as with the votes for team members.</p>
<p>However once the results were in, the situation went ugly.
You see, there were community members like tallship, fsologureng and
myself really happy to see a forge deciding for a copyleft license.
Finally free software! We were so excited that we took to Matrix
channel and talked about it. This was felt as a distraction.
Out of nowhere dachary - who
<a href="https://codeberg.org/forgejo/meta/issues/152#issuecomment-791880">withdraw an application for this position</a> - granted
earl-warren - who <a href="https://codeberg.org/forgejo/meta/issues/195">applied for the position</a> - administration
permissions and then us three as well as circlebuilder were muted in
Matrix channels on 25th March. We were told that this was in order to
prepare for the release of Forgejo v1.19 and will last for two weeks.</p>
<p>Not only that, comments were deleted on the Forgejo issue tracker as
well. Only after another community member spoke up and called this
behaviour intransparent the comments were edited and changed to declare
an ongoing moderation enforcement.</p>
<p>I have yet to see the <a href="https://codeberg.org/forgejo/governance/issues/16">moderation report</a> to learn about why we
were silently removed from the Forgejo organisation without our consent
or information.</p>
<p>This behaviour is running against the proclaimed
<a href="https://en.wikipedia.org/wiki/Right_to_be_forgotten">right to be forgotten</a>. Not the affected people asked for
the deletion but it was enforced upon them.</p>
<p>There is also a forgejo-moderation account now with no visibility
whatsoever about who’s behind it.</p>
<p>There was not even an apology. The closest I know is that the
<a href="https://codeberg.org/forgejo/governance/issues/10#issuecomment-852660">action was deemed inadequate</a> and reverted (except the comments
that were deleted).</p>
<h2>Interpretation</h2>
<p>As far as I see it, <a href="https://codeberg.org/forgejo/website/pulls/175/files#issuecomment-832529">speaking up against a certain person</a> will lead
to backlash. So much so that the people who are engaged will leave the
community. This happened with fsologureng and tallship now, too. So a single
person managed to drive away at least four people over the course of a few
months. I don’t know about you, but this is not healing but a scar over the
damage that was done. I for one experience a <a href="https://en.wikipedia.org/wiki/Chilling_effect">chilling effect</a>
when interacting with these people and will limit my communication with them
to an absolute minimum. We have not only no community manager and moderator
in the team but also lost someone who’s engaging in public relations and
accessibility.</p>
<p>I still believe that Forgejo is a software that is needed. I don’t want to
move into a world that is dominated by a handful of players that dictate the
rules.</p>
<h2>Expectation</h2>
<p>In order to <em>heal</em> the community I expect dachary to give up administration
permissions in all channels. In the same vein I also expect earl-warren to
either disclose the people behind forgejo-moderation (because he granted the
profile permissions) and remove himself from those moderation and
administration permissions. I can see that both are not able to wield power
but instead use it to suppress opposing views.</p>
<p>Only then I have hope that the project has a chance of thriving.</p>
<p>If this is deemed too much then at the very least update the documentation and
remove claims you cannot stand by. Unless you also do not deem transparency to
be something to strive for.</p>
</description>
      <pubDate>Tue, 11 Apr 2023 08:30:00 +0000</pubDate>
      <guid>https://jaenis.ch/blog/2023/forgejo-sacrifice-inclusiveness-and-calls-it-healing/</guid>
    </item>
    <item>
      <title>Recap 2023 Q1</title>
      <link>https://jaenis.ch/blog/2023/recap-2023-q1/</link>
      <description><p>Das erste Quartal in 2023 nähert sich seinem Ende. Zeit, ein wenig über das
bisherige zu reflektieren.</p>
<h2>Januar</h2>
<p>Ich bin in das Jahr voller Energie gestartet. Im Dezember habe ich mich auf
einen Grant bei NLnet beworben, um dafür bezahlt werden zu können, Code für
die Allgemeinheit zu schreiben. Ich bin immer noch überzeugt davon, dass dies
eine gute Idee ist. Aber dazu später mehr.</p>
<p>Mein Fokus in diesem Monat bestand darin, den Papierkram möglichst schnell
hinter mir zu bekommen. Ich habe auch Profile auf diverse
Freelancer-Plattformen angelegt und ausgefüllt. Des Weiteren habe ich Kontakte
aufgefrischt, die sich teilweise vor Jahren ergeben hatten, aber damals nicht
zeitlich passend waren.</p>
<h2>Februar</h2>
<p>Der Monat begann mit FOSDEM. Ich habe effektiv immer noch kein Video von der
Konferenz angeschaut, aber Beziehungen geknüpft und aufgefrischt. Mir ist es
seitdem wichtig geworden, weiterhin auf Hygienemaßnahmen zu achten.</p>
<p>Nachdem ich dort auch das erste Mal vor Publikum gesprochen habe, werde ich
mich künftig wohl weiter auf virtuelle Vorträge konzentrieren. Ich führe
mich einfach wohler, wenn ich die Möglichkeit habe, gegebenenfalls einen Take
erneut aufnehmen zu können. Ich möchte meinem Qualitätsanspruch gerecht
werden.</p>
<h2>März</h2>
<p>Der März lief leider sehr enttäuschend. Nicht nur habe ich eine Absage für
den NLnet Grant erhalten (was mir aber erlaubt, jetzt auch längerfristige
Angebote zu evaluieren), sondern es war auch ein Monat, der sehr durch
Krankheit geprägt war. Ich habe den halben Monat nach Familienangehörigen
schauen müssen, was sich in meinen eigenen Bestrebungen widerspiegelt.</p>
<p>Als Vorbereitung auf Aufträge nahm ich aber den Wechsel des Betriebssystems in
Angriff. Ich arbeite jetzt mit Kaisen Linux, was auf Debian Testing
(„Bookworm“) aufbaut. Damit habe ich Nix OS hinter mir gelassen.
Ich schätze Reproduktive Builds und eine deklarative Konfiguration, aber wenn
5/6 meiner Festplatte durch den Nix Store beansprucht werden, bin ich gezwungen
auch Projektabhängigkeiten regelmäßig zu löschen und erneut herunter zu laden,
um Aktualisierungen einspielen zu können. Dies ist auf Dauer nicht haltbar.</p>
<p>Mit Debian Testing setze ich weiterhin auf eine Rolling Release Distribution.
Ich kann auch recht aktuelle Software verwenden, wenngleich ich einige Projekte
pausieren muss, weil etwa die Runtime noch nicht zur Verfügung steht
(konkret geht es hier um Golang. Mein Projekt benötigt v1.20, aber ich habe
nur v1.19 in den Paketquellen).</p>
<h2>Ausblick</h2>
<p>Für die kommenden Monate werde ich erst einmal liegen gebliebene Projekte wie
Desktop-App-Entwicklung und Low Code Spiele-Engine in Angriff nehmen, aber auch
einen genaueren Blick auf WordPress legen. Dort vollzieht sich ein Wandel zu
React. Meiner Erfahrung nach gibt es dort also auch Wissenslücken, die sich
für mich in Geschäftsmöglichkeiten widerspiegeln können. Ich werde dafür
aber auch beim Finanzamt eventuell E-Commerce-Angaben machen müssen. Auf jeden
Fall muss ich mich darum bemühen, zeitnah Geld einzunehmen.</p>
<p>Im Zuge dessen arbeite ich auch mit einer Plattform, die ich im Januar wieder
ansprach, daran, Online-Kurse anzubieten. Die Teilnahme dort ist
kostenpflichtig. Lehrer werden anteilig an geschauten Minuten bzw. bei
Anmeldungen über einen Affiliate-Link bezahlt. Mehr dazu in einem anderen
Blog-Post.</p>
</description>
      <pubDate>Thu, 30 Mar 2023 08:30:00 +0000</pubDate>
      <guid>https://jaenis.ch/blog/2023/recap-2023-q1/</guid>
    </item>
  </channel>
</rss>
