AksDev - posts
https://akselmo.dev/posts/
Akseli's various rambles and posts about gaming, gamedev, FOSS, programming and other things.ZolaenWed, 11 Mar 2026 17:44:04 +0000My PostgreSQL database got nuked lolWed, 11 Mar 2026 17:44:04 +0000Akselipostgresqlsecurityufwlinuxdocker
https://akselmo.dev/posts/they-broke-my-server/
https://akselmo.dev/posts/they-broke-my-server/<p>So I was running my <a href="https://linkhut.org/">linkhut</a> fork instance <a href="https://scalie.computer/">scalie.computer</a>,
and everything was fine at first. Then it was suddenly gone. This happened to me twice!</p>
<span id="continue-reading"></span><div id="emote" class="sad">
<img id="emote-face" src="/assets/images/emotes/sad.png" alt="My lizard fursona making an sad face."/>
<p id="emote-text">Note that I am not a sysadmin/webdev type of person. This whole world is scary and full of horrors to me.
I am most comfortable writing native applications in my cave.</p>
</div>
<p>I wrote <a href="https://akselmo.dev/notes/scaliecomputer-broke/">this note</a> about it when I was investigating,
but found nothing. So I thought the app was faulty or something in my server was faulty.
It's mostly useless note now.</p>
<p>Well, I learned what happened!</p>
<h2 id="my-database-was-just-out-in-the-open-lol"><a class="zola-anchor" href="#my-database-was-just-out-in-the-open-lol" aria-label="Anchor link for: my-database-was-just-out-in-the-open-lol">My database was just out in the open lol</a></h2>
<p>I ran my database in a docker container. Overnight, about the same time both times ~23:00,
the site just broke when I tried to visit it.</p>
<div id="emote" class="grumpy">
<img id="emote-face" src="/assets/images/emotes/grumpy.png" alt="My lizard fursona making an grumpy face."/>
<p id="emote-text">Okay, what, why?!</p>
</div>
<p>First I thought it was linkhut doing some migration stuff, since that's what the logs said.
But it was not that, it was something else, linkhut was just doing the migrations in confusion.</p>
<p>What actually happened was that the port to my database docker container was just out there
to the public. Sure, it was behind a password but in my laziness the admin and password were just
<code>postgres:postgres</code> because that's what the original file came with.</p>
<p>So someone deleted them!</p>
<p>I found that out by eventually getting curious about what was happening and wondering if I could
see any data in the database. Instead I find "readme" table, with one entry that goes
<em>"pls give me ur bitcoin or i will sell your data!!"</em> type shit. Clearly by a bot, since it happened
always around the same time of night.</p>
<div id="emote" class="laugh">
<img id="emote-face" src="/assets/images/emotes/laugh.png" alt="My lizard fursona making an laugh face."/>
<p id="emote-text">Ah. Right. My 5kb of bookmarks.</p>
</div>
<p>I then learned through this nice article that docker does dumb shit by default if you don't specify
the address: <a href="https://geoff.tuxpup.com/posts/psa_docker_edits_firewall_rules/">PSA: Docker Will Edit Host-Based Firewall Rules For You</a>.</p>
<p>Jeez. I don't know anything about servers (obviously). But that feels like some bad design to me.
Maybe there's some reason. Dunno.</p>
<p>So I made sure my docker-compose files have the ports like this:</p>
<pre data-lang="yaml" style="background-color:#181818;color:#ffffff;" class="language-yaml "><code class="language-yaml" data-lang="yaml"><span style="font-weight:bold;color:#838fff;">ports</span><span>:
</span><span> - </span><span style="color:#5fff33;">"127.0.0.1:5432:5432"
</span></code></pre>
<p>Apparently this should work, according to the blogpost I linked.</p>
<h2 id="oh-and-another-thing"><a class="zola-anchor" href="#oh-and-another-thing" aria-label="Anchor link for: oh-and-another-thing">Oh and another thing...</a></h2>
<p>Seems that my VPS had no UFW preinstalled! UFW being the firewall.</p>
<p>So there was no firewall.</p>
<p>All ports were open to be poked at.</p>
<div id="emote" class="wheeze">
<img id="emote-face" src="/assets/images/emotes/wheeze.png" alt="My lizard fursona making an wheeze face."/>
<p id="emote-text">Oops.</p>
</div>
<p>Well that has been fixed now. And learned the hard way: Install ufw, block the postgres port, open only
80 and 443 ports, make sure ufw is running and then run bunch of port sniffing tools to see what's up.</p>
<h2 id="to-sum-it-all-up"><a class="zola-anchor" href="#to-sum-it-all-up" aria-label="Anchor link for: to-sum-it-all-up">To sum it all up</a></h2>
<p><strong>Learn from my mistakes and check the following:</strong></p>
<ul>
<li>Check your docker compose files for the port and be explicit about it being localhost only if needed</li>
<li>Make sure ufw is installed, running and blocking all the ports you don't need.</li>
</ul>
<p>That's all folks. <a href="https://scalie.computer">scalie.computer</a> has now been running for a while without an incident.</p>
<div id="emote" class="scream">
<img id="emote-face" src="/assets/images/emotes/scream.png" alt="My lizard fursona making an scream face."/>
<p id="emote-text">Unless someone now sees this post and finds out something else!! (Please don't, I'll cry)</p>
</div>
<p>glhf.</p>
<p><a href="https://brid.gy/publish/mastodon"></a></p>
What even are Breeze, QtQuick, QtWidget, Union..?Sun, 01 Mar 2026 17:19:01 +0000Akselikdeunionthemesqt
https://akselmo.dev/posts/what-are-breeze-widgets-quick-union/
https://akselmo.dev/posts/what-are-breeze-widgets-quick-union/<p>I was asked a good question: What are these things? What are the
differences? I will try to explain what they are in this post, in bit less technical manner.</p>
<span id="continue-reading"></span>
<p>I will keep some of the parts bit short here, since I am not 100% knowledgeable
about everything, and I rather people read documentation about it instead of
relying my blogpost. :) But here's the basics of it.</p>
<div id="emote" class="smug">
<img id="emote-face" src="/assets/images/emotes/smug.png" alt="My lizard fursona making an smug face."/>
<p id="emote-text">It's infodump time.</p>
</div><h2 id="qtwidgets"><a class="zola-anchor" href="#qtwidgets" aria-label="Anchor link for: qtwidgets">QtWidgets</a></h2>
<p>QtWidgets is the "older" way of writing Qt applications.
It's mostly C++ and sometimes quite difficult to work with.
It's not very flexible.</p>
<p>More information in here:</p>
<ul>
<li><a href="https://doc.qt.io/qt-6/qtwidgets-index.html">https://doc.qt.io/qt-6/qtwidgets-index.html</a></li>
</ul>
<h3 id="qstyle"><a class="zola-anchor" href="#qstyle" aria-label="Anchor link for: qstyle">QStyle</a></h3>
<p>QStyle is the class for making UI elements that follow the style given
for the application. Instead of hardcoding all the styles, we use
QStyle methods for writing things. This is what I was talking about
in my <a href="https://akselmo.dev/posts/breeze-and-union-preparing/">previous post</a>.</p>
<p>More information in here:</p>
<ul>
<li><a href="https://doc.qt.io/qt-6/qstyle.html">https://doc.qt.io/qt-6/qstyle.html</a></li>
</ul>
<h3 id="breeze"><a class="zola-anchor" href="#breeze" aria-label="Anchor link for: breeze">Breeze</a></h3>
<p>Breeze is our current style/theme. It's what defines how things should look like.
Sometimes when we say "Breeze" in QtWidgets context, it means the QStyle of it,
since we do not have other name for it.</p>
<p>Repository: <a href="https://invent.kde.org/plasma/breeze/">https://invent.kde.org/plasma/breeze/</a></p>
<h2 id="qtquick"><a class="zola-anchor" href="#qtquick" aria-label="Anchor link for: qtquick">QtQuick</a></h2>
<p>QtQuick is the modern way of writing Qt applications.
In QtQuick, we use QML which is a declarative language for writing the
UI components and such. Then we usually have C++ code running the backend
for the application, such as handling data.</p>
<p>More information in here:</p>
<ul>
<li><a href="https://doc.qt.io/qt-6/qtquick-index.html">https://doc.qt.io/qt-6/qtquick-index.html</a></li>
<li><a href="https://doc.qt.io/qt-6/qtqml-index.html">https://doc.qt.io/qt-6/qtqml-index.html</a></li>
</ul>
<h3 id="qqc2-desktop-style"><a class="zola-anchor" href="#qqc2-desktop-style" aria-label="Anchor link for: qqc2-desktop-style">qqc2-desktop-style</a></h3>
<p>qqc2-desktop-style is the Breeze style for QtQuick applications.
It tells QtQuick applications what certain elements should look like.</p>
<p>Repository: <a href="https://invent.kde.org/frameworks/qqc2-desktop-style/">https://invent.kde.org/frameworks/qqc2-desktop-style/</a></p>
<h3 id="kirigami"><a class="zola-anchor" href="#kirigami" aria-label="Anchor link for: kirigami">Kirigami</a></h3>
<p>Kirigami is a set of shared components and items we can utilize in our QtQuick applications.
Instead of rewriting similar items every time for new apps, we use Kirigami
for many things. We call them Kirigami applications since we rely on it quite a lot.</p>
<h3 id="kirigami-and-qqc2-desktop-style"><a class="zola-anchor" href="#kirigami-and-qqc2-desktop-style" aria-label="Anchor link for: kirigami-and-qqc2-desktop-style">Kirigami and qqc2-desktop-style</a></h3>
<p>These two are a bit intermixed. For example, Kirigami provides convenient size units
we have agreed on together, such as <code>Kirigami.Units.smallSpacing</code>.</p>
<p>We then use these units in the qqc2-desktop-style, but in other applications as well:
Both for basic components that QtQuick provides us which are then styled by qqc2-desktop-style,
but also for any custom components one may need to write for an application, if Kirigami
does not provide such.</p>
<div id="emote" class="sad">
<img id="emote-face" src="/assets/images/emotes/sad.png" alt="My lizard fursona making an sad face."/>
<p id="emote-text">I wish the two weren't so tightly coupled but there's probably a reason for that, that has
been decided before my time. (Or it just happened as things tend to go.)</p>
</div><h2 id="diagram-of-the-current-stack"><a class="zola-anchor" href="#diagram-of-the-current-stack" aria-label="Anchor link for: diagram-of-the-current-stack">Diagram of the current stack</a></h2>
<p>This is how the current stack looks like.</p>
<p><a href="/assets/images/breeze/current-situation.svg"><img src="/assets/images/breeze/current-situation.svg" alt="Diagram of current situation" /></a></p>
<h3 id="problem-keeping-styles-in-sync"><a class="zola-anchor" href="#problem-keeping-styles-in-sync" aria-label="Anchor link for: problem-keeping-styles-in-sync">Problem: Keeping styles in sync</a></h3>
<p>As you can see from the diagram, the styles must be kept in sync
by hand. We have to go over each change and somehow sync them.</p>
<div id="emote" class="scream">
<img id="emote-face" src="/assets/images/emotes/scream.png" alt="My lizard fursona making an scream face."/>
<p id="emote-text">Not all things have to be kept in sync. This whole thing is rather.. Primitive.
Some parts come from QStyle, some parts are handcrafted, some metrics and spacings can get
out of sync when changed.. But for purposes of "regular person reading this" they need to be
carefully modified by developers to make sure everything looks consistent.</p>
</div>
<p>Even bigger problem is that these two (QtWidgets and QtQuick) can behave
very differently, causing a lot of inconsistent look and behavior!</p>
<p>But this is why Union was made.</p>
<h2 id="union"><a class="zola-anchor" href="#union" aria-label="Anchor link for: union">Union</a></h2>
<p>Union is our own "style engine" on top of these two. Instead of having
to keep two completely different stacks in sync, we feed Union
one single source of truth in form of CSS files, and it then chews the
data out to both QtQuick and QtWidgets apps, making sure the both look
as close to each other as possible!</p>
<p><a href="/assets/images/breeze/union.svg"><img src="/assets/images/breeze/union.svg" alt="Diagram of what it looks like with Union" /></a></p>
<p>I think it's entirely possible to create other outputs for it too, such as GTK style.
Our ideal goal with Union is to have it feed style information even across toolkits eventually,
but first we just aim for these two! :)</p>
<div id="emote" class="smile">
<img id="emote-face" src="/assets/images/emotes/smile.png" alt="My lizard fursona making an smile face."/>
<p id="emote-text">And yes the CSS style files are completely customizable by users!
But note that the CSS is not 1-to-1 something one would use to write for web platforms!</p>
</div>
<p>Repository: <a href="https://invent.kde.org/plasma/union/">https://invent.kde.org/plasma/union/</a></p>
<h3 id="note-about-plasma-styles"><a class="zola-anchor" href="#note-about-plasma-styles" aria-label="Anchor link for: note-about-plasma-styles">Note about Plasma styles</a></h3>
<p>Plasma styles are their own thing, which are made entirely out of SVG files.</p>
<p>I do not know if Union will have an output for that as well, or do we just use the qqc2-desktop-style
directly in our Plasma stack (panels, widgets) so we can deprecate the SVG stack. Nothing has been
decided in this front yet as far as I know.</p>
<hr />
<p>Yeah that's a lot of stuff. Over +20 years of KDE we have accumulated so many different
ways of doing things, so of course things will get out of sync.</p>
<p>Union will be a big step in resolving the inconsistencies and allowing users easily to
customize their desktop with CSS files, instead of having to edit two or three different styles
for different engines and then having to compile them all and load them over the defaults.</p>
<p>I hope this post helps open up this a bit. Please see the previous post as well, if you're
interested in this work: <a href="https://akselmo.dev/posts/breeze-and-union-preparing/">https://akselmo.dev/posts/breeze-and-union-preparing/</a></p>
<p><a href="https://brid.gy/publish/mastodon"></a></p>
Breeze QtWidgets style changes to help us prepare for UnionSat, 28 Feb 2026 15:40:05 +0000Akselikdebreezeuniontheming
https://akselmo.dev/posts/breeze-and-union-preparing/
https://akselmo.dev/posts/breeze-and-union-preparing/<p>We have worked on some spring cleaning for Breeze, which helps us to prepare for
<a href="https://quantumproductions.info/articles/2025-02/moving-kdes-styling-future">Union</a> and the changes it brings. This post is a bit more technical.</p>
<p>Help us test things!</p>
<span id="continue-reading"></span>
<p>Edit: I made another post that should help explain some of the terminology and such: <a href="https://akselmo.dev/posts/what-are-breeze-widgets-quick-union/">https://akselmo.dev/posts/what-are-breeze-widgets-quick-union/</a></p>
<p>If you are running Plasma git master branch, you may have noticed that Breeze has
gotten various (small) changes to it.</p>
<p><strong>Note that these changes are NOT in 6.6 branch</strong>, just in master branch. Current
target is <strong>Plasma 6.7</strong> but <strong>that may change (6.8)</strong> if we still have some issues with it!
And to clarify, I do not know when Union releases to wider public yet. These changes will be
most likely before Union.</p>
<p>This all is happening for two reasons:</p>
<ol>
<li>Bring <a href="https://invent.kde.org/plasma/breeze/">Breeze</a> on-par with the current <a href="https://invent.kde.org/frameworks/qqc2-desktop-style">QtQuick styling</a>, which is our <em>current vision</em> for Breeze</li>
<li>Find out any discrepancies and fix them, to make moving to <a href="https://invent.kde.org/plasma/union/">Union</a> theming more seamless</li>
</ol>
<p>In more technical terms, this means we have made <code>QStyle::PE_PanelItemViewItem</code> (<a href="https://doc.qt.io/qt-6/qstyle.html#PrimitiveElement-enum">docs</a>) more round. This primitive is used in a lot of places.</p>
<p>For example, see the background of the places panel element here:</p>
<p><a href="/assets/images/places-round.png"><img src="/assets/images/places-round.png" alt="Places panel item background being more rounded" /></a></p>
<p>It looks much more like the items in our System Settings for example, since they're rounded too.</p>
<p>However this has not been easy: Due to how QStyle works, we have to add margins to the primitive itself,
otherwise it will be touching the edges of the view, making it look bad.</p>
<p>These changes have made us notice bunch of visual oddities since we have +20 years of cruft across our stack,
working on top of Breeze style without taking QStyle into account. People use completely custom
solutions instead of relying on QStyle, though the QStyle API is not easy to work with so I do understand
why it can be annoying.</p>
<h2 id="why-does-using-qstyle-api-matters-in-regards-to-union"><a class="zola-anchor" href="#why-does-using-qstyle-api-matters-in-regards-to-union" aria-label="Anchor link for: why-does-using-qstyle-api-matters-in-regards-to-union">Why does using QStyle API matters in regards to Union?</a></h2>
<p>This is all fine and good if we just decide to use Breeze always and forever. But we're not!
With Union style engine, people are going to do all kinds of cool things. First of course we just
are trying to make 1-to-1 Breeze "copy" with Union, since it's a good target to compare that
everything works.</p>
<p>But when people are going to make their cool new themes with Union, our QtWidgets stack will
not always follow that, due to all the custom things they're doing! So we need to minimize custom
styling within QtWidgets apps and frameworks, and make sure they use QStyle APIs, so that Union
can tell them properly what to do.</p>
<p>A more practical example:</p>
<ol>
<li>KoolApp directly paints a rectangle with <code>QPainter</code> as a selection background.
<ul>
<li>It's a regular rectangle, 90 degree angles.</li>
</ul>
</li>
<li>Union style engine is released to the public and everyone starts making their own themes</li>
<li>Someone makes a theme that makes all selection backgrounds a rounded rectangle</li>
<li>They then open KoolApp and notice nothing changes! Since KoolApp draws its on its own.</li>
<li>Everyone is unhappy. :(</li>
</ol>
<p>However, when KoolApp is updated to use <code>drawPrimitive</code> like this:</p>
<pre data-lang="cpp" style="background-color:#181818;color:#ffffff;" class="language-cpp "><code class="language-cpp" data-lang="cpp"><span style="color:#808080;">// Remove the old background
</span><span style="color:#808080;">//painter->setRenderHint(QPainter::Antialiasing);
</span><span style="color:#808080;">//painter->setPen(Qt::NoPen);
</span><span style="color:#808080;">//painter->setBrush(color);
</span><span style="color:#808080;">//painter->drawRect(rect);
</span><span>
</span><span style="color:#808080;">// Use style API instead
</span><span style="font-weight:bold;color:#33ffa0;">...
</span><span>style()->drawPrimitive(QStyle::PE_PanelItemViewItem, </span><span style="font-weight:bold;color:#33ffa0;">&</span><span>option, </span><span style="font-weight:bold;color:#33ffa0;">&</span><span>painter, this);
</span><span style="font-weight:bold;color:#33ffa0;">...
</span><span>
</span><span style="color:#808080;">// Then for text, add some spacing at start and end so it does not hug the edges of the primitive
</span><span style="color:#33ffff;">const int</span><span> margin </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing);
</span><span>
</span><span style="color:#808080;">// NOTE: you can use QStyle::SE_ItemViewItemText to get the subelement of the text
</span><span style="color:#808080;">// NOTE: If you use HTML to draw rich text, you will have to do adjustments manually!
</span><span style="color:#808080;">// Because nothing can be ever easy. :(
</span><span style="font-weight:bold;color:#33ffa0;">...
</span></code></pre>
<p>Now the background uses what the QStyle gives it,
which in turn is whatever Union has declared for it.</p>
<p>I understand there are cases where someone might want to draw their custom thing,
but if at all possible, please use QStyle API instead! It will make theming
much easier on the long run.</p>
<h2 id="why-change-now-why-not-wait-for-union"><a class="zola-anchor" href="#why-change-now-why-not-wait-for-union" aria-label="Anchor link for: why-change-now-why-not-wait-for-union">Why change now? Why not wait for Union?</a></h2>
<p>It's better to start catching this all now. It can be more tough to find
the bugs with Union styling later on, because it changes much more than
just one style: It changes the whole styling engine.</p>
<p>When we tinker with Breeze theme to find out these discrepancies, it's easier
to spot if the problem is in Breeze theme itself or the application/framework
drawing the items. With Union, we can also have a bug in Union too, so
it adds one more layer to the bughunt.</p>
<p>So when Breeze looks fine with apps, we can be sure that any changes Union brings,
it can be either a bug in Union or the style Union is using, instead of having to
<em>also</em> hunt down the bug from application/framework.</p>
<p>Think of it as a gradual rollout of changes. :)</p>
<h2 id="a-call-for-testing"><a class="zola-anchor" href="#a-call-for-testing" aria-label="Anchor link for: a-call-for-testing">A call for testing</a></h2>
<p>The current Breeze style changes we have now in git master branch are already out there
if you're using <a href="https://kde.org/linux/">KDE Linux</a> for example.</p>
<p>What we need is YOU to test out our stack. Test out other peoples Qt apps too.</p>
<p>So please check this VDG issue and join there: <a href="https://invent.kde.org/teams/vdg/issues/-/issues/118">https://invent.kde.org/teams/vdg/issues/-/issues/118</a></p>
<p>Read the tasks section, look over what others have shared, share information, etc.
<strong>Report everything in that issue!</strong></p>
<p>Any help is appreciated, from spotting small errors to fixing them.</p>
<p><strong>I doubt our QtWidgets and QtQuick styles can be 1-to-1 without Union</strong>, so
do not worry too much about that. At the moment goal is just to make sure
the <strong>Breeze QStyle is properly utilized.</strong> Perfect is the enemy of good and all that.</p>
<p>I hope this does not cause too much annoyance for our git master branch users, but
if you're using master branch, we hope you're helping us test too. :)</p>
<p>Let's make the movement from separate QtWidgets/QtQuick style engines to one unified Union style
engine as seamless as possible. And this will help other QtWidgets styles too, such as Fusion, Kvantum, Klassy,
etc..!</p>
<p>Happy testing!</p>
<p><a href="https://brid.gy/publish/mastodon"></a></p>
My blog has now webmention support!Tue, 20 Jan 2026 19:07:41 +0000Akseliwebmentionsindiewebweb
https://akselmo.dev/posts/webmention-support/
https://akselmo.dev/posts/webmention-support/<p>Hey there, I have been reading about <a href="https://indieweb.org/">IndieWeb</a> and found out
about something called <a href="https://indieweb.org/Webmention">Webmentions</a>.<span id="continue-reading"></span></p>
<p>I am using <a href="https://indieweb.org/webmention.io">Webmention.io</a> for mine for now, I may
in future host my own Webmention system, though I am rather lazy so IDK.</p>
<p>I am still quite new at this, but I am interested in how it works.</p>
<p>Feel free to webmention this post! I think you can use something like <a href="https://telegraph.p3k.io/">telegraph</a>
for sending them.</p>
<p>Also if I set my <a href="https://brid.gy/">brid.gy</a>, any replies to the post that mentions this
blogpost should show up below. If there's no mentions, nothing is shown. (You need JS enabled to see them).</p>
<p>Uh, that's all. Let's see how this goes. :)</p>
Happy Holidays 2025!Sun, 21 Dec 2025 19:03:20 +0000Akselicosplayholidayskde
https://akselmo.dev/posts/happy-holidays/
https://akselmo.dev/posts/happy-holidays/<p>Happy holidays everyone. <span id="continue-reading"></span>Consider this as your holiday card from me.
I will be taking short break from KDE stuff for now, though I will be around.</p>
<p><a href="/assets/images/holidays2025/holiday_1.png"><img src="/assets/images/holidays2025/holiday_1.png" alt="Me wearing my lizard cosplay and chilling in christmas dinosaur shirt" /></a></p>
<p><a href="/assets/images/holidays2025/holiday_2.png"><img src="/assets/images/holidays2025/holiday_2.png" alt="Me wearing my lizard cosplay and doing devil horn hand gesture in christmas dinosaur shirt" /></a></p>
<p><em>(I tagged KDE so that readers of planet have to see these, mwahaha.)</em></p>
<p>And happy new year 2026, let's hope it gets better from here.</p>
Adding Customizable Frame Contrast to KDE PlasmaWed, 29 Oct 2025 20:40:46 +0000Akselikdeaccessibilityoutlinesframescontrastcolors
https://akselmo.dev/posts/frame-contrast-settings/
https://akselmo.dev/posts/frame-contrast-settings/<p>For a while now, probably two years, I wanted to have support for high-contrast colorschemes in KDE Plasma.</p>
<p>Technically, this was already doable<span id="continue-reading"></span>, by just modifying your colorscheme to such colors.
However one thing was lacking: Outlines were calculated automagically with hardcoded value.</p>
<p>Well, no more! Now you can set your own frame contrast value!
And you may ask "Why not change the color completely?" which is a good question and
I will answer that later.</p>
<p>This feature will be in Plasma 6.6. Hopefully. Or if you use <a href="https://kde.org/linux/">KDE Linux</a> you can
already try it out. :)</p>
<h2 id="the-settings"><a class="zola-anchor" href="#the-settings" aria-label="Anchor link for: the-settings">The settings</a></h2>
<p>This is how the settings will look like.</p>
<div>
<a href="https://akselmo.dev/assets/images/kde/frame0.png" target="_blank">
<img src="https://akselmo.dev/processed_images/frame0.91b6a936bf6e7ad3.png" />
</a>
<a href="https://akselmo.dev/assets/images/kde/frame13.png" target="_blank">
<img src="https://akselmo.dev/processed_images/frame13.adb1802f10d09496.png" />
</a>
<a href="https://akselmo.dev/assets/images/kde/frame20.png" target="_blank">
<img src="https://akselmo.dev/processed_images/frame20.128c0c15fa1256e1.png" />
</a>
<a href="https://akselmo.dev/assets/images/kde/frame100.png" target="_blank">
<img src="https://akselmo.dev/processed_images/frame100.5f833399148e9064.png" />
</a>
</div>
<p>This setting used to be a slider.. And guess what, it did <em>nothing</em> in Breeze style.
It was leftover from Oxygen times. Do not worry though if you use Oxygen style, the
slider value is just percentage now and it will be converted to the value Oxygen uses.</p>
<h2 id="desktop-examples"><a class="zola-anchor" href="#desktop-examples" aria-label="Anchor link for: desktop-examples">Desktop examples</a></h2>
<p>Some examples how it might look like in desktop setting.</p>
<div>
<a href="https://akselmo.dev/assets/images/kde/frame0_desktop.png" target="_blank">
<img src="https://akselmo.dev/processed_images/frame0_desktop.23c74a9c3631dea1.png" />
</a>
<a href="https://akselmo.dev/assets/images/kde/frame13_desktop.png" target="_blank">
<img src="https://akselmo.dev/processed_images/frame13_desktop.7152bac045be41ff.png" />
</a>
<a href="https://akselmo.dev/assets/images/kde/frame100_desktop.png" target="_blank">
<img src="https://akselmo.dev/processed_images/frame100_desktop.afdeb5e8597bdba9.png" />
</a>
<a href="https://akselmo.dev/assets/images/kde/frame100_light_desktop.png" target="_blank">
<img src="https://akselmo.dev/processed_images/frame100_light_desktop.0c4af81bd7e45d47.png" />
</a>
</div>
<p>All items are updated to follow this:</p>
<ul>
<li>QtQuick windows (qqc2-desktop-style)</li>
<li>QtWidgets style and decorations (Breeze)</li>
<li>Plasma SVG files (Anything using <code>class: ColorScheme-Frame</code> )</li>
</ul>
<p>There's still some bugs with panels not always updating immediately,
though we're working on fixing them.</p>
<h2 id="why-not-change-the-whole-color"><a class="zola-anchor" href="#why-not-change-the-whole-color" aria-label="Anchor link for: why-not-change-the-whole-color">Why not change the whole color?</a></h2>
<p>Currently across all of our apps and styles, we do the following:</p>
<ul>
<li>Take background color and foreground color</li>
<li>Mix them with previously hardcoded frameContrast value, which was 0.2</li>
<li>Use that as the color for all the frames</li>
</ul>
<p>If we wanted this to be recolorable completely, we would have to go through <strong>every single occurence</strong>
of this color mixing. Most apps luckily rely on the styling, but some may have custom things,
for example custom QtQuick Controls that are doing this manually, using the <code>Kirigami.Theme.frameContrast</code>
value.</p>
<p>I think we most likely would have gotten away with it for most apps, but then rest of them would
look wrong, and some of them may not even be KDE apps but are using Kirigami.. So we would need
to tell everyone to do this update, or risk things look broken.</p>
<p>This was the compromise solution: Allow users to change the <code>Kirigami.Theme.frameContrast</code> value to
whatever they wish, even turn it off. :)</p>
<h2 id="a-lot-of-work"><a class="zola-anchor" href="#a-lot-of-work" aria-label="Anchor link for: a-lot-of-work">A lot of work</a></h2>
<p>This was a lot of work. In total, it was <a href="https://invent.kde.org/teams/vdg/issues/-/issues/108">8 merge requests</a>
that had to work together and be merged in correct order, etc..</p>
<p>And this is why modifying Breeze in our current stack is so difficult. You have to do many many changes
across the platform.. And make sure that nothing breaks in the process!</p>
<h3 id="my-first-draft-use-kdeglobals"><a class="zola-anchor" href="#my-first-draft-use-kdeglobals" aria-label="Anchor link for: my-first-draft-use-kdeglobals">My first draft: Use kdeglobals</a></h3>
<p>First step for me was trying to make this a global configuration value only in <code>~/.config/kdeglobals</code>,
which every platform would watch for modifications for this particular value.</p>
<p>It worked fine, but it was quite messy, and I had to make sure all the default values across the
stack would be synced. That is annoying for anyone who wants to maybe modify the default value later.
On top of that, I felt like different platforms constantly watching the config file for changes just was
not a good idea..</p>
<h3 id="second-draft-use-kcolorscheme"><a class="zola-anchor" href="#second-draft-use-kcolorscheme" aria-label="Anchor link for: second-draft-use-kcolorscheme">Second draft: Use KColorScheme</a></h3>
<p>After chatting with people, we decided it would be best to just add this as a new value into
our KColorScheme library. Instead of all the platforms looking for this configuration change,
only the KColorScheme library did it.</p>
<p>This allowed me to simplify the implementation significantly.</p>
<h3 id="summary-of-changes"><a class="zola-anchor" href="#summary-of-changes" aria-label="Anchor link for: summary-of-changes">Summary of changes</a></h3>
<p>All in all, I had to do the following:</p>
<ul>
<li>Update KColorScheme to load this value from kdeglobals/current colorscheme | <a href="https://invent.kde.org/frameworks/kcolorscheme/-/merge_requests/56">Link</a></li>
<li>Update the settings for plasma-workspace to allow users to change this value | <a href="https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/5917">Link</a></li>
<li>Update Breeze window decorations and QtWidgets style to use this value | <a href="https://invent.kde.org/plasma/breeze/-/merge_requests/558">Link</a></li>
<li>Update Kirigami platformtheme to notify any platforms that use it about the changes | <a href="https://invent.kde.org/frameworks/kirigami/-/merge_requests/1940">Link</a></li>
<li>Update the libplasma library to actually listen for changes to this contrast value and change accordingly | <a href="https://invent.kde.org/plasma/libplasma/-/merge_requests/1369">Link</a></li>
<li>Update qqc2-desktop-style (QtQuick style) to listen for changes to this value and change accordingly | <a href="https://invent.kde.org/frameworks/qqc2-desktop-style/-/merge_requests/484">Link</a></li>
<li>Update KSvg library so that the Plasma styles can now use <code>ColorScheme-Frame</code> class to load correct color | <a href="https://invent.kde.org/frameworks/ksvg/-/merge_requests/80">Link</a></li>
<li>Update kde-gtk-config to make sure the Breeze GTK theme also updates correctly when value is changed | <a href="https://invent.kde.org/plasma/kde-gtk-config/-/merge_requests/136">Link</a></li>
</ul>
<p>Yeah. It's a lot. This took me about a week to work on.</p>
<p>A week to make one number user modifiable.</p>
<p>Now imagine how long it would have taken if I had made the whole color modifiable!</p>
<p>And remember, there's tons of legacy code here which rely on each other,
so I could not take shortcuts at places without possibly breaking everything.</p>
<h2 id="and-that-s-why-union-was-born"><a class="zola-anchor" href="#and-that-s-why-union-was-born" aria-label="Anchor link for: and-that-s-why-union-was-born">And that's why Union was born</a></h2>
<p>This is why <a href="https://quantumproductions.info/articles/2025-02/moving-kdes-styling-future">Union</a> is such an important project when it comes to styling,
and which is why we are most likely NOT going
to modify Breeze much further, aside maintenance: A lot of work for even small changes.</p>
<p>Union lets us have a "single source of truth." We can change things only in <strong>one place</strong> and (hopefully)
see the visuals update everywhere, be it QtQuick, QtWidgets or Plasma style or whatever we decide to support!
Which means easier to work on styling and iterate on it, designers have easier time collaborating because changes
do not take days.. Etc.</p>
<p>So I am putting more effort in Union from now on.</p>
<h2 id="summary-and-future"><a class="zola-anchor" href="#summary-and-future" aria-label="Anchor link for: summary-and-future">Summary and future</a></h2>
<p>I felt this was important change due to accessibility reasons, so I did it. And I am happy that I did, even
if it was tons of work. (And there's more left with bugfixing lol.)
This will also help alleviate issues where people feel like our apps are too "framey." You can now
turn them off (well, you can make their color same as the background color) by setting the contrast to 0%.
I must warn you that setting the value to <strong>0% will probably look broken at some places</strong>, so we will probably
have to add a warning to the color editor that "hey this is not optimal but you can do it lol."</p>
<p>In short-term future, I want this to be tied to the desktop portal interface for high-contrast accessibility preference:
When user has this enabled, be they on Plasma desktop or not, the applications will maximize
this frame contrast value automatically.</p>
<p>And then, there's bug hunting and finding out any weird inconsistencies. If you spot any, please
report them to <a href="https://bugs.kde.org">https://bugs.kde.org</a>!</p>
<p>In long-term, this whole color thing will be rewritten to something much more robust, shinier, fancier and
it will work with Union and everything is nice and beautiful. At least, that's what I hope.</p>
<p>I hope people will like this feature, especially those who need high-contrast colors.</p>
<p>Thanks for reading.</p>
The move from Blue Systems to TechPaladinTue, 16 Sep 2025 15:06:34 +0000Akselikdeworkramble
https://akselmo.dev/posts/bluesystems-to-techpaladin/
https://akselmo.dev/posts/bluesystems-to-techpaladin/<p>People have been a bit weirded by what happened during this period. <span id="continue-reading"></span>
People have been interested in this after the post by <a href="https://jriddell.org/2025/09/14/adios-chicos-25-years-of-kde/">Jonathan Riddell</a>
was written.</p>
<p>Here's what I remember from the situation.</p>
<h2 id="order-of-events"><a class="zola-anchor" href="#order-of-events" aria-label="Anchor link for: order-of-events">Order of events</a></h2>
<ol>
<li>I get <a href="https://akselmo.dev/posts/i-got-laid-off/">laid off from previous job</a> in 2023-10-10.</li>
<li><a href="https://pointieststick.com/">Nate Graham</a> learns of this and invites me to join Blue Systems.
<ul>
<li>I would be joining the team that works with Valve contracts. Cool!</li>
<li>He had no power to really "invite" me but told me that there's a good spot I could fill.</li>
<li>I apply and cross my fingers</li>
<li>I get into interview and get hired!</li>
</ul>
</li>
<li>I work for Blue Systems until ~31.10.2024, renewing the contract yearly.</li>
<li>Blue Systems holds a get-together in late 2024.</li>
<li>I am really bad with traveling due to anxiety and I was still recovering from the Akademy 2024, I skip this get-together.</li>
<li>I get a video call from the get-together, where I'm told news: <strong>the team that has the Valve contract is being laid off.</strong></li>
<li>However! We also have this chance to start working with our single contract, Valve, in separate company.
<ul>
<li>Essentially, we, the team that works with Valve, are moving to new company and continue this contract under it's name.</li>
</ul>
</li>
<li>A lot of chatter in work Telegram about how the new company should be governed.</li>
<li>A lot of differences in opinions. Long debates. Talks.
<ul>
<li>Everyone had their own opinions and plans.</li>
</ul>
</li>
<li>My wife gets really sick and has to spend chunk of December in hospital.
<ul>
<li>I have zero energy for any of the work governance things.</li>
<li>I just wanted to make sure I have job and get my salary.</li>
<li>Thus, I did not really care what the plan was going to be.</li>
</ul>
</li>
<li>Eventually, we decide Nate's plan for this is the easiest.
<ul>
<li>More info here <a href="https://pointieststick.com/2025/03/10/personal-and-professional-updates-announcing-techpaladin-software/#comment-40233">Personal and professional updates — announcing Techpaladin Software</a></li>
<li>I would have been fine with whatever plan, as long as I get to keep my job and continue my work and getting paid.</li>
<li>I do not remember any kind of voting or anything like that. We just went with it. Everyone was very tired of this weird situation.</li>
<li><strong>We all just wanted to get back to work.</strong></li>
</ul>
</li>
<li>Time goes by and TechPaladin is ready for continuing the work around March.</li>
<li>I have some small interview about the situation with Nate, and he asks me <strong>if I'm still interested to join.</strong>
<ul>
<li>No contract was made yet with anyone. TechPaladin was barely established at this point.</li>
<li>I assume everyone in Valve team went through this discussion. I do not know anything else.</li>
<li>We had no money to pay for non-Valve related work.</li>
</ul>
</li>
<li>I end my contract with Blue Systems around March 2025.</li>
<li>I start my contract with TechPaladin around same week.</li>
<li>I still work there!</li>
</ol>
<h2 id="messy"><a class="zola-anchor" href="#messy" aria-label="Anchor link for: messy">Messy.</a></h2>
<p>Yeah, it's really messy. And I wish it had gone differently. But that's how things go.</p>
<p>I have been laid off before, twice.</p>
<p>First time when I was a very fresh programmer, I was suddenly told in middle of day that my contract will end
right before my probation period will end.</p>
<p>Then second time, I went for a leave due to burnout, come back to work, and on same day I'm told I'm getting laid off.</p>
<p>It sucked.</p>
<p>So Jonathan, I can sympathize with your feelings about the situation.
I hope you get help for your issues and warmth to your life. Sincerely. I do not have anything bad against you.</p>
<h2 id="my-experiences-at-techpaladin"><a class="zola-anchor" href="#my-experiences-at-techpaladin" aria-label="Anchor link for: my-experiences-at-techpaladin">My experiences at TechPaladin</a></h2>
<ul>
<li>TechPaladin has always paid my salary in time.</li>
<li>My contract is completely legal where I live.
<ul>
<li>I'm sure I could negotiate it into something more shiny with help of lawyers, money and time.</li>
<li>But I trust TechPaladin to not screw me over.</li>
<li>And if they would do so, I would leave immediately and cut my losses.</li>
</ul>
</li>
<li>I've never been "abused" in any way.
<ul>
<li>People care about me there.</li>
<li>They notice if I'm burning out (looking at you Dolphin) and help me switch projects.</li>
</ul>
</li>
</ul>
<p>Sure, I might be naive for trusting a company like this.
But I'm just like this. If I like the people who I work with, I trust them.
This is not the first company I trust like this. It won't be the last either, probably.</p>
<p>And I just want to fix bugs in KDE software without having to think about the corporate stuff,
but still have money for food and rent. TechPaladin lets me do that.</p>
<p>In the end, the contract is my choice and this is the choice I've made.
So far so good.</p>
<p>And my friends and family know me. If TechPaladin would go against my values or rights,
all of them would know.</p>
<h2 id="conclusions"><a class="zola-anchor" href="#conclusions" aria-label="Anchor link for: conclusions">Conclusions</a></h2>
<p>Draw your own conclusions.</p>
<p>Or better yet, join KDE to help keep the project running: <a href="https://community.kde.org/Get_Involved">https://community.kde.org/Get_Involved</a></p>
<p>Maybe this post helps shine light on things, anyway. Not that I really need to do this, since it's all private matters,
but since it's been blown open, meh. Might as well. I'm tired of the <a href="https://xkcd.com/386/">misinformation</a> I've seen around.</p>
<p>glhf.</p>
<p>ps. if some youtuber reads this, hi</p>
Akademy 2025 - My first talk!Sat, 13 Sep 2025 01:32:08 +0000Akselikdeakademyconferencelinux
https://akselmo.dev/posts/akademy-2025/
https://akselmo.dev/posts/akademy-2025/<p>Once again, all <a href="https://kde.org/">KDE</a> nerds had their yearly gathering around somewhere in the world.<span id="continue-reading"></span>
We call this gathering <a href="https://akademy.kde.org/2025/">Akademy</a> and this year it was in Berlin.</p>
<p>I don't really have anything in-depth to share, except for my first talk I had.
I spent a lot of time listening to talks and chilling at BoFs. Since I was with my <a href="https://tecsielity.wordpress.com/">wife</a>,
we also went around Berlin looking for fun things, such as the Aquarium at the zoo.</p>
<p>TL;DR: I don't remember much, but I had a lot of fun and <a href="https://youtu.be/clARvO_AthM">I had my first talk!</a></p>
<h2 id="day-1"><a class="zola-anchor" href="#day-1" aria-label="Anchor link for: day-1">Day 1</a></h2>
<p>We arrived around ~13.00 at Berlin airport and spent some time getting to
our hotel. After a good nap, we went to the welcome event, where I
had a nice hotdog and chatted with various folks.</p>
<p>It was a bit of a blur, I was so sleepy. But I do remember having fun.</p>
<p>Also I was super happy that our planes were finally on time this year, unlike last time...</p>
<h2 id="day-2"><a class="zola-anchor" href="#day-2" aria-label="Anchor link for: day-2">Day 2</a></h2>
<p>I arrived to Akademy venue around 9:30 and spent the whole day going to talks
and taking notes of said talks. I will share those notes later in the post.</p>
<p>I also had a lot of discussions with other KDE devs about Union and the like.</p>
<h2 id="day-3"><a class="zola-anchor" href="#day-3" aria-label="Anchor link for: day-3">Day 3</a></h2>
<p>I spent so much time just being anxious about my talk, so that I don't remember much else.</p>
<p>I have embedded the talk in here.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/clARvO_AthM?si=LIzmwmMk-iaYMmaz" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<p>Here's also a link to the talk: <a href="https://www.youtube.com/watch?v=clARvO_AthM">Youtube link</a>.</p>
<p>I rushed the talk a bit due to worrying it would take too long, I tend to go "hummmm" a lot..
So I forgot to mention two bits:</p>
<ul>
<li>The cosplay in the intro slide is what I wish I wore for the talk.. :D</li>
<li>We should warn newcomers about any of the possible negativity their contributions may gather.</li>
</ul>
<p>Other than that, it went fine I think.</p>
<p>Later in the evening we visited <a href="https://en.wikipedia.org/wiki/C-base">c-base</a> and it was really
cool looking hackerspace. Though I was already out of any energy at that point, we left a bit early.</p>
<h3 id="my-akademy-notes-file"><a class="zola-anchor" href="#my-akademy-notes-file" aria-label="Anchor link for: my-akademy-notes-file">My Akademy Notes file</a></h3>
<p>Here's a link to the notes, excuse my bad handwriting: <a href="/assets/misc/Akademy2025Notes.pdf">Akademy 2025 notes.pdf</a></p>
<h2 id="day-4"><a class="zola-anchor" href="#day-4" aria-label="Anchor link for: day-4">Day 4</a></h2>
<p>First we went to the aquarium, which was fun. We saw very cool sharks and other huge fish there.
I did not even know Koi fish could grow that big.
We also saw a lot of different lizards, toads and insects. I tried my best to
befriend the iguana in there... But I don't think they spoke Finnish.</p>
<p><a href="/assets/images/2025/iguana.png"><img src="/assets/images/akademy2025/iguana.png" alt="Me chatting to an iguana" /></a></p>
<p>We then also had a korean sandwich, I bought myself a pair of new cool pants and we visited
a Lego store.</p>
<p>Later in the evening, I went to a dinner with my coworkers, which was really fun.</p>
<h2 id="day-5"><a class="zola-anchor" href="#day-5" aria-label="Anchor link for: day-5">Day 5</a></h2>
<p>Went to more Akademy BoFs. One of the more interesting ones was the BoF around <a href="https://kde.org/linux/">KDE Linux</a>
so we chatted about it and any related issues with it.</p>
<p>I also went to a BoF around KIO + Sandboxing, to see what we can do to make tools that depend on
KIO work better in sandboxed environment, such as Flatpaks.</p>
<p>Sadly I don't have much notes from either, since they were rather speedy and I missed parts of
them all because I was busy tinkering on my KomoDo app.</p>
<h2 id="day-6"><a class="zola-anchor" href="#day-6" aria-label="Anchor link for: day-6">Day 6</a></h2>
<p>On the last day, we had a scavenger hunt in the morning and then went to a game museum.
I was so exhausted that I couldn't even think of walking around Berlin anymore, so I
just joined the game museum part. It was rather cool and I spent some time playing various
arcade games they had set up.</p>
<p>There was also some "PainGame" that was basically pong but with pickups that would cause
actual pain to the other player. The players had to hold their hand on some panel that would
heat up, cause electric shocks and whip the hand with some plastic bit.</p>
<p>Well I tried it and pulled my hand off the moment I felt it heating up. I already had enough
anxiety at the moment, didn't need to contribute more to it.</p>
<p>After a pizza at a nice little pizza place, we went back to hotel and slept.</p>
<p>The next morning we went to a plane at 5 am and were soon back home.</p>
<h2 id="ramblings-and-thoughts"><a class="zola-anchor" href="#ramblings-and-thoughts" aria-label="Anchor link for: ramblings-and-thoughts">Ramblings and thoughts</a></h2>
<p>Berlin is not a good place for me to go to. It's very loud, uh.. fragrant and there's a lot
of things moving constantly.</p>
<p>My nerves were constantly shot. I kept constantly looking around for bad shit to happen,
I could not relax at all. I managed to <a href="https://en.wikipedia.org/wiki/Masking_(behavior)">mask</a>
it to the best of my abilities, but that just drained me further.</p>
<p>So, uh, sorry anyone who thought I was rather hard to approach. I was just constantly anxious.
<strong>Akademy itself was really nice</strong> and people there were really friendly and fun, but Berlin
just was too much for me.</p>
<p>I also really enjoyed every single talk and BoF I went to!</p>
<p>I just can't deal with big cities well, I suppose.
Next year I will have to limit the time I'm traveling, preferably ~4 days or so.
Anything more is out of my limits.</p>
<p>Still, looking forward to where it will be next year. :)</p>
<p>Thanks for reading, I know there wasn't much actual knowledge in this blogpost, but maybe
you liked my talk and/or my notes.</p>
NetSurf on reMarkable 2Sun, 31 Aug 2025 00:03:12 +0000Akseliremarkableeinknetsurf
https://akselmo.dev/posts/netsurf-on-remarkable-2/
https://akselmo.dev/posts/netsurf-on-remarkable-2/<p>One thing I always have wished that my reMarkable 2 had was web browser.<span id="continue-reading"></span>
It wouldn't need to be very efficient nor the best browser out there.
Just something simple I can use to read definitions for words or
other small knowledge when I'm reading articles I've sent to the device.</p>
<p>Well, seems with some elbow grease it's possible.
And a lot of help from <a href="https://discord.gg/ATqQGfu">reMarkable discord</a>.</p>
<p><a href="/assets/images/photos/netsurf-rm2.jpg"><img src="/assets/images/photos/netsurf-rm2.jpg" alt="reMarkable 2 running Netsurf" /></a></p>
<p>In this post I'm documenting the steps for setting it up.</p>
<p><strong>I am not responsible if anything goes wrong with your reMarkable device when following this guide.</strong></p>
<h2 id="ssh-connection-and-passcode"><a class="zola-anchor" href="#ssh-connection-and-passcode" aria-label="Anchor link for: ssh-connection-and-passcode">SSH connection and passcode</a></h2>
<p>You will have to have SSH connection to your device. Also turning off the passcode during
the process will make things easier.</p>
<p>You can find out what address you need to connect to use SSH from Settings -> Help -> Copyrights and licenses.
There's a little blurb in the end of it with the password and username, and the address.</p>
<h2 id="install-xovi-extensions-and-apploader"><a class="zola-anchor" href="#install-xovi-extensions-and-apploader" aria-label="Anchor link for: install-xovi-extensions-and-apploader">Install XOVI + extensions and apploader</a></h2>
<p><a href="https://github.com/asivery/xovi">XOVI</a> is the tool that makes all this at all possible on
reMarkable devices with version 3.20 or higher.</p>
<p>Note that reMarkable 2 is the <code>arm32</code> version.</p>
<p>You will also need extensions that allow apploader to work, which is
what we use to load netsurf.</p>
<p>Follow this guide on how-to install XOVI: <a href="https://github.com/asivery/rm-xovi-extensions/blob/master/INSTALL.MD">https://github.com/asivery/rm-xovi-extensions/blob/master/INSTALL.MD</a></p>
<p>And when I say follow it, <strong>follow it to-the-letter!</strong></p>
<p>Then, install the <code>qt-resource-rebuilder</code> extension by following the above guide as well.</p>
<p>When that is done, install <a href="https://github.com/asivery/rm-appload">appload</a>, by downloading it's newest
version. Place <code>appload.so</code> into <code>/home/root/xovi/extensions.d/</code> and the <code>shim</code> files into <code>/home/root/shims/</code>.</p>
<p>If folders do not already exist, create them.</p>
<p>Make sure that everything runs correctly by running <code>xovi/start</code> when you're inside <code>/home/root</code> folder,
and then open sidebar. You should see a new button called "AppLoad."</p>
<h2 id="install-netsurf"><a class="zola-anchor" href="#install-netsurf" aria-label="Anchor link for: install-netsurf">Install Netsurf</a></h2>
<p>Netsurf is a smol browser that doesn't do much, and has very limited Javascript support.
But it's brilliant for very lightweight web-browsing, especially when using <a href="http://frogfind.com/">FrogFind</a>.</p>
<p>Now this is a bit fiddly part, since there's no premade package for it that just works on XOVI.</p>
<p>First, download the newest release from here: <a href="https://github.com/alex0809/netsurf-reMarkable/releases/">https://github.com/alex0809/netsurf-reMarkable/releases/</a></p>
<p>Get the <code>nsfb.tar.gz</code> file. It has a folder called <code>resources</code> which we will need later.</p>
<p>Then, copy the insides of this file: <a href="https://github.com/alex0809/netsurf-reMarkable/blob/main/example/Choices">https://github.com/alex0809/netsurf-reMarkable/blob/main/example/Choices</a>.
In reMarkable tablet, place paste the contents inside <code>/home/root/.netsurf/Choices</code> file. You can use Vim on
reMarkable 2 by the way!</p>
<p>Open the <code>/home/root/xovi/exthome/appload/</code> folder, and create new folder called <code>netsurf</code> there. If any paths
do not exist yet, create them.</p>
<p>In that folder, you want to place this json snippet, and save it as <code>external.manifest.json</code>.</p>
<pre data-lang="json" style="background-color:#181818;color:#ffffff;" class="language-json "><code class="language-json" data-lang="json"><span>{
</span><span> </span><span style="color:#5fff33;">"name"</span><span>: </span><span style="color:#5fff33;">"Netsurf"</span><span>,
</span><span> </span><span style="color:#5fff33;">"application"</span><span>: </span><span style="color:#5fff33;">"nsfb"</span><span>,
</span><span> </span><span style="color:#5fff33;">"args"</span><span>: [</span><span style="color:#5fff33;">"-v"</span><span>],
</span><span> </span><span style="color:#5fff33;">"environment"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"QTFB_SHIM_MODEL"</span><span>:</span><span style="color:#5fff33;">"0"</span><span>,
</span><span> </span><span style="color:#5fff33;">"QTFB_SHIM_INPUT_MODE"</span><span>:</span><span style="color:#5fff33;">"NATIVE"</span><span>,
</span><span> </span><span style="color:#5fff33;">"LD_LIBRARY_PATH"</span><span>: </span><span style="color:#5fff33;">"."</span><span>,
</span><span> </span><span style="color:#5fff33;">"LD_PRELOAD"</span><span>: </span><span style="color:#5fff33;">"/home/root/shims/qtfb-shim.so"
</span><span> },
</span><span> </span><span style="color:#5fff33;">"qtfb"</span><span>: </span><span style="color:#ff9233;">true
</span><span>}
</span></code></pre>
<p>You will also need an icon. Any png file will do, I just searched for "netsurf logo" and found some small icon.
Save this in the same folder as <code>icon.png</code>.</p>
<p>Then place the <code>nsfb</code> file from that tarball you downloaded in the same folder.</p>
<p>After that, we also need a <code>libevdev.so.2</code> file. You can get that by manually compiling it with the
rM2 toolchain: <a href="https://developer.remarkable.com/documentation/sdk">https://developer.remarkable.com/documentation/sdk</a></p>
<p>You can also download the file I got from the reMarkable Discord from here: <a href="/assets/misc/libevdev.so.2">libevdev.so.2</a>
It has worked fine for me at least. Downloading random libraries over the internets is always a security problem,
so be careful, of course.</p>
<p>Place it next to the <code>nsfb</code> file. This is what your <code>/home/root/xovi/exthome/appload/netsurf/</code> folder
should look like:</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>external.manifest.json
</span><span>icon.png
</span><span>libevdev.so.2
</span><span>nsfb
</span></code></pre>
<p><strong>Important:</strong> Make sure to run <code>chmod a+x nsfb</code> in that folder.
I also ran <code>chmod a+x libevdev.so.2</code> but I'm not sure if that is necessary.</p>
<p>We now have the app there and if you refresh AppLoad or run <code>cd && xovi/start</code>, you should see netsurf there!
Hooray! Alas, it wont work yet and will crash at boot: We still lack the resource files and the fonts!</p>
<h3 id="resources-and-fonts"><a class="zola-anchor" href="#resources-and-fonts" aria-label="Anchor link for: resources-and-fonts">Resources and fonts</a></h3>
<p>Last step is to place the <strong>contents</strong> of the <code>resources</code> folder you downloaded inside
this path: <code>/opt/usr/share/netsurf/</code>. If the path doesn't exist, create them.</p>
<p>Then, download <a href="https://dejavu-fonts.github.io/">DejaVu fonts</a> and place all the TTF files in <code>/opt/share/fonts/ttf-dejavu/</code>. Again, create paths if they do not exist.</p>
<p>Note: the <code>/opt/share/fonts/ttf-dejavu/</code> folder may get deleted
when the device updates. You could also move the TTF files into
<code>/home/root/ttf-dejavu</code> to avoid that from happening, but
you will have to modify the <code>/home/root/.netsurf/Choices</code> files accordingly.</p>
<h2 id="and-that-s-it"><a class="zola-anchor" href="#and-that-s-it" aria-label="Anchor link for: and-that-s-it">And that's it!</a></h2>
<p>That's it, should be good to go. I still ran <code>cd && xovi/start</code> one more time, let the device
reboot and then I could launch netsurf from the appload menu!</p>
<h2 id="usage-tips"><a class="zola-anchor" href="#usage-tips" aria-label="Anchor link for: usage-tips">Usage tips</a></h2>
<ul>
<li>Swipe from the top of the screen around the address bar ~1cm down to open a window menu bar,
<ul>
<li>This lets you close or even turn the app into small window you can drag around!</li>
</ul>
</li>
<li>To open the onscreen keyboard, press the tiny <code>a</code> in the bottom-right of the screen.</li>
<li>If you want to add bookmarks, you will have to edit the <code>/opt/usr/share/netsurf/welcome.html</code> and write them in HTML.</li>
<li>In <code>/home/root/.netsurf/Choices</code> file..
<ul>
<li>You can change the homepage with modifying the <code>homepage_url:about:welcome</code> key.</li>
<li>You can enable very simple support for javascript with <code>enable_javascript:1</code>.
<ul>
<li>It's not perfect though.</li>
</ul>
</li>
</ul>
</li>
<li>Logins do not seem to save. I could login to lobste.rs but if I restarted the browser, the cookies are gone.</li>
<li>If you have text rendering issues, set the value <code>scale:100</code> in the <code>Choices</code> file.
<ul>
<li>This can cause very small font size, so set the <code>font_size:180</code> and <code>font_min_size:180</code> values too.</li>
</ul>
</li>
</ul>
<p>Last thing is that you can make <code>xovi/start</code> autorun at boot with a systemd-unit file, since
otherwise whenever you reboot your device, the appload menu disappears since it's not loaded.</p>
<p>However, I decided against that because if XOVI starts acting up after an update, I don't want it
to make my device act up every boot. So whenever I reboot the device, I manually run it over SSH.</p>
<hr />
<p>And that's it!</p>
<p>Thank you so much to <a href="https://ko-fi.com/asivery">asivery</a> in the reMarkable Discord, who helped me to figure out how to get this running.
They are also the person behind XOVI and I'm super intrigued what else they can make reMarkable do over time!
Thank you also to the people who have made Netsurf running on remarkable. :)</p>
<p>I hope this helps others to run Netsurf on their remarkable 2 tablet as well. I do not know if the
guide works with rM1 or reMarkable paper pro, though. You may have to adapt some bits, like use 64 libraries
for remarkable paper pro; I am not sure.</p>
<p>Anyways, thanks for reading, and happy hacky browsing!</p>
Various desktop Linux tips for newbiesSat, 16 Aug 2025 17:15:24 +0000Akselilinuxkdeinfodumpfedorakubuntubazzitegaming
https://akselmo.dev/posts/how-to-linux-2025/
https://akselmo.dev/posts/how-to-linux-2025/<p>There has been quite a surge in interest towards desktop Linux lately.<span id="continue-reading"></span>
The userbase, at least according to <a href="https://www.gamingonlinux.com/steam-tracker/">some metrics</a>, seems to be climbing.</p>
<p>I realised today that it's been 4 years for me since I did the switch.
I have gathered some know-how that maybe a complete newbie could find useful.
I also try to untangle some jargon I've learned: It may not be exactly technically correct, but
this is meant for a more regular user anyway.</p>
<p>Note: <em><strong>Do not trust "AI" tools when looking for information.</strong></em> They can lie. They don't really "know" anything, they just copy what they see on the internet, and spit it out. Sometimes in wrong orders and contexts.
I will list some resources I trust at the end of the post.</p>
<p>I have also written about this before here: <a href="https://akselmo.dev/posts/setting-up-kubuntu-for-gaming/">Setting up Kubuntu for gaming</a></p>
<p>That post is quite out of date though, so consider this a supplemental material and sort of upgrade.</p>
<h2 id="investigate-the-software-you-need"><a class="zola-anchor" href="#investigate-the-software-you-need" aria-label="Anchor link for: investigate-the-software-you-need">Investigate the software you need</a></h2>
<p>There is often times where you can only use specific software on Windows only.
Or specific games with anticheats do not work on Linux; Not all of them though! Just some, especially with kernel level anticheats!.</p>
<p>But for example Photoshop or similar tools do not work on Linux natively. There can be tricks to get them
working.</p>
<p>You would not expect Mac software to work on Windows, right? This is similar kind of situation.</p>
<p>Now Linux can run <strong>some</strong> Windows applications through <a href="https://usebottles.com/">Bottles</a>, which uses <a href="https://www.winehq.org/">Wine</a>. But not all.</p>
<p>So, make a list of the Must Have applications you have. Then search for Linux compatibility.</p>
<p>In some cases, you may find alternatives for the application, that work on both Windows and Linux!
When that happens, you can already test it out in Windows and see if it works for your workflow,
and start using that instead. Note that this can take time to learn, but I think it would be worth it.</p>
<h3 id="and-hardware-too"><a class="zola-anchor" href="#and-hardware-too" aria-label="Anchor link for: and-hardware-too">And hardware too</a></h3>
<p>I haven't had a problem with incompatible hardware with Linux for long long time, but it's still good idea
to check it. For example, if you have Nvidia GPU, you may want to check if the GPU is supported by which drivers,
or if you need to install drivers at all. For AMD/Intel GPU users, you're in luck, because the drivers are in the Kernel:
This means that you don't need to install anything.</p>
<p>If I have had trouble with hardware, it's often been audio devices, like headsets that have two separate dials
for sound (mono and stereo), weird bluetooth speakers, etc..</p>
<p>There is a site called <a href="https://linux-hardware.org/">Linux Hardware</a> you can use to search for compatible parts.</p>
<h2 id="backup-all-your-stuff"><a class="zola-anchor" href="#backup-all-your-stuff" aria-label="Anchor link for: backup-all-your-stuff">Backup all your stuff</a></h2>
<p>Before doing anything to your PC: Backup your data. Backup the photos, the videos, the game save files,
documents, anything you may need. Back them up to a cloud service or external drive.</p>
<p>Make sure those backups work, too.</p>
<h2 id="distribution-choice-paralysis"><a class="zola-anchor" href="#distribution-choice-paralysis" aria-label="Anchor link for: distribution-choice-paralysis">Distribution choice paralysis</a></h2>
<p>Linux distributions are all their own operating systems, they just share the most
central part, that is the <a href="https://www.kernel.org/">Linux kernel</a>.</p>
<p>Distributions take that kernel, add their own things to it and make it
what they want it to be for their users.</p>
<p>There's a lot of distributions. Like, A LOT. So of course it'll feel daunting
to choose one.</p>
<p>But there's no "wrong" choice. It will probably take time to figure out
which one you like, but honestly, most people will be fine with one that
does it's job, stays out of the way and updates without effort.</p>
<p>Everyone has tons of opinions about this. Then there's the weird
curmudgeons that tell others their opinion is "wrong." Those people
are something you can ignore. If it works for you, that's all that matters.</p>
<p>After choosing a distribution, you install it to an USB stick (that has nothing important in it,
so NOT the one with your backups!!) with tool like <a href="https://rufus.ie/en/">Rufus</a>,
boot from it at PC startup (varies between motherboards) and get installing.</p>
<h3 id="my-recommended-newbie-distributions"><a class="zola-anchor" href="#my-recommended-newbie-distributions" aria-label="Anchor link for: my-recommended-newbie-distributions">My recommended newbie distributions</a></h3>
<p>To help one get started with choosing, here's my recommendations from all the
distributions I've tried on my ~4 year journey.</p>
<p>Do note that gaming is big factor in my computer use, so if the distribution
can't game well, it's not on this list.</p>
<h4 id="bazzite"><a class="zola-anchor" href="#bazzite" aria-label="Anchor link for: bazzite">Bazzite</a></h4>
<p>Homepage: <a href="https://bazzite.gg/">https://bazzite.gg/</a></p>
<p>Bazzite is perfect distribution for anyone starting with Linux.</p>
<p>It's made so that user can't really break it, due to it's nature:
You can't really open system files and start modifying them and deleting them.
Then, updates are done in a way that if something goes wrong, you can go to previous version
of the distribution.</p>
<p>On top of that, it makes setting it up very easy with its <a href="https://docs.bazzite.gg/General/Installation_Guide/">guides</a>.
And in download section, you select what hardware you have, and what desktop environment you have, so you
know from the get-go that it's very likely going to work with your system.</p>
<p><strong>If you don't really know what to choose, go with Bazzite.</strong></p>
<h4 id="fedora-kde"><a class="zola-anchor" href="#fedora-kde" aria-label="Anchor link for: fedora-kde">Fedora KDE</a></h4>
<p>Homepage: <a href="https://fedoraproject.org/kde/">https://fedoraproject.org/kde/</a></p>
<p>Fedora KDE is solid. It works, it updates regularly, it plays games I play
really well, and works with development. And then it stays out of the way.
Fedora is also what Bazzite is built on top of.</p>
<p>Fedora however allows you to tinker with the system files and such, as long
as you have access to it. You should not do that if you don't know what you're doing!
But it's possible.</p>
<p>Installation on systems with AMD/Intel GPU is really easy and you don't need to
install any separate drivers.</p>
<p>With Nvidia GPU, you will likely have to use RPM Fusion repositories, and follow
their guide: <a href="https://rpmfusion.org/Howto/NVIDIA">https://rpmfusion.org/Howto/NVIDIA</a>.</p>
<p>So yes, for Nvidia users it can be bit more tinkery.</p>
<p><strong>Fedora KDE is my daily driver</strong> because it works really well with any
development work I do due to it's up-to-date system libraries.
And since it's regularly updated, if there is a bug, it often gets fixed just
as fast.</p>
<h4 id="kubuntu"><a class="zola-anchor" href="#kubuntu" aria-label="Anchor link for: kubuntu">Kubuntu</a></h4>
<p>Homepage: <a href="https://kubuntu.org/">https://kubuntu.org/</a></p>
<p>Last but not the least, Kubuntu is a solid distribution as well.
It does not update as frequently as Fedora KDE does, but not everyone
needs such frequent updates, especially for basic daily use.</p>
<p>Kubuntu utilizes same tools and systems as <a href="https://ubuntu.com/">Ubuntu</a>, which you may
have heard of. So it has a solid community behind it.</p>
<p>When I used Kubuntu, it worked with games really well and I had zero issues with it.
I moved to Fedora due to development stuff, so that's why I don't use it anymore.</p>
<p>When downloading Kubuntu, make sure to choose "Latest."</p>
<h3 id="opinions-and-notes-about-lts-distros"><a class="zola-anchor" href="#opinions-and-notes-about-lts-distros" aria-label="Anchor link for: opinions-and-notes-about-lts-distros">Opinions and notes about LTS distros</a></h3>
<p>LTS stands for "Long Term Support" or "Long Term Stable."</p>
<p>This wording has caused a lot of confusion: People tend to think "stable" means it doesn't crash.
What it actually means is that <strong>it won't change</strong> and that means <strong>the bugs are stable too.</strong>
The only updates it gets are security updates. Bug fixes, especially for software, are really rare.</p>
<p>LTS/Stable distributions are perfect for <strong>enterprise environments</strong> or your grandmas PC which you know
she won't remember to update.</p>
<p>For regular use, especially gaming use, I would recommend against them: They use LTS kernel that
has support only for specific devices, so if you buy a new shiny GPU and plop it in to system running
on LTS kernel, it very likely does not have support for that new shiny GPU.</p>
<p>Also, when you encounter an annoying bug, be prepared for that bug to stay around until the next LTS release:
Which can mean years!</p>
<p>So unless you really know you <em>need/want</em> LTS distribution, choose anything that is "Latest" or frequently updated.
You will have less headaches that way: I learned this the hard way.</p>
<p>Note: Bunch of people have told me that I should have more nuance here. I understand it too,
for some people LTS distribution can be quite perfect. I'm not saying that one should completely avoid them, either.
But newcomer should, in my honest opinion, try more up-to-date distribution. I think they provide
better experiences, especially for regular desktop use. Bazzite has been really good for this usecase.</p>
<h2 id="desktop-environments"><a class="zola-anchor" href="#desktop-environments" aria-label="Anchor link for: desktop-environments">Desktop environments</a></h2>
<p>You may notice that I seem to recommend distros running on <a href="https://kde.org/">KDE software</a>.</p>
<p>This is because, well, I work on that software and I like it! But people also find it
very easy to learn when they're coming from Windows.</p>
<p>When I started Linuxing, I tried <a href="https://www.gnome.org/">GNOME</a>. It's a great desktop environment,
but it's far from what Windows is. This was very overwhelming for me, because I was already
learning completely new operating system paradigm, so having also the desktop use change from underneath
was really jarring. I then tried <a href="https://xfce.org/">XFCE</a>, which is very lightweight and nice to use,
but it lacked some things I wanted, like <a href="https://en.wikipedia.org/wiki/Wayland_(protocol)">Wayland</a> support.</p>
<p>I then stumbled upon on <a href="https://kde.org/plasma-desktop/">KDE Plasma</a> and fell in love with it:
I did not have to learn completely new way of using my desktop, but could <em>gradually</em> modify the desktop
to suit my needs. My Plasma setup is <em>far</em> from the defaults nowadays, and Plasma allowed
me to discover what I like on my own pace.</p>
<p>Note that I don't think any desktop environment is "bad." They're just different, catering for different
needs.</p>
<p>But for most Windows users, I do recommend KDE Plasma for the above reasons: Less cognitive load
to learn everything.</p>
<h2 id="unlearning-windows"><a class="zola-anchor" href="#unlearning-windows" aria-label="Anchor link for: unlearning-windows">Unlearning Windows</a></h2>
<p>When moving to desktop Linux, most people are confused by some things, like "Where's my C-drive."</p>
<p>Windows has taught many of us specific patterns, and when those patterns do not exist, we tend
to blame the system we're using.</p>
<p>What you need to remember is that you're not trying to switch to "better Windows." You're
switching to completely different operating system, and you need to try your best at <em>unlearning Windows</em>.</p>
<h3 id="so-where-is-the-c-and-d-drive"><a class="zola-anchor" href="#so-where-is-the-c-and-d-drive" aria-label="Anchor link for: so-where-is-the-c-and-d-drive">So where is the C and D drive</a></h3>
<p>Instead of having drives like C and D, you mount the drives you have.</p>
<p>You can open terminal and type <code>ls /mnt/</code> and it shows what drives you have mounted.</p>
<p>Mounting in this case means that it's plugged in and browsable.</p>
<p>Here's a shoddy comparison:</p>
<ul>
<li>C drive on Windows -> <code>/</code></li>
<li>D drive on Windows -> <code>/mnt/drive-name</code></li>
</ul>
<p>The <code>/</code> is called "root directory" and that's where everything in the PC resides.</p>
<p>It can get more complicated, and my suggestion is to just leave <code>/</code> alone.</p>
<p>If you want to have games on your other drive, check your <code>/mnt/</code> folder for that
drive. Usually during installation the drive is made for you.</p>
<p>If not, you may have to ask help for the distribution you're using.</p>
<p>In Linux, all drives and such are folders, that start from <code>/</code>. Instead of
multiple "trees" that start from "C" or "D", there's one big tree that starts from <code>/</code>.</p>
<h3 id="what-s-home-or"><a class="zola-anchor" href="#what-s-home-or" aria-label="Anchor link for: what-s-home-or">What's /home/ or ~</a></h3>
<p>When you open file manager such as <a href="https://apps.kde.org/dolphin/">Dolphin</a>, usually
the first folder you see open is <code>/home/your-username/</code>.</p>
<p>This is your home folder. Think of it like "my documents" folder in Windows computers.</p>
<p>Keep all your documents, videos, images etc. in here.</p>
<p>When people say <code>~/Documents</code>, the <code>~</code> is shorthand for <code>/home/your-username/</code>.
This also works inside terminal, so you can type <code>ls ~</code> to see what's inside your home folder,
without having to type the <code>/home/user</code>.</p>
<h3 id="can-i-just-keep-my-game-drive-from-windows"><a class="zola-anchor" href="#can-i-just-keep-my-game-drive-from-windows" aria-label="Anchor link for: can-i-just-keep-my-game-drive-from-windows">Can I just keep my game drive from Windows?</a></h3>
<p>When installing Linux, many people tend to ask that if they can just keep the drive
full of games, like <code>D:</code> drive, without formatting it and just use the same
game files.</p>
<p>Well, you sort of can, but Linux is not very fast with it. When Windows formats drives,
it uses something called <code>NTFS</code> for them. Linux has many different ones, but usually it's <code>ext4</code> or <code>btrfs</code>.</p>
<p><code>NTFS</code> drives can be opened and such on Linux, but it can be rather slow.</p>
<p>So my tip is just to back up the game data to something like USB drive and then move them,
or just download the games again. You will be much happier with the performance that way.</p>
<h2 id="do-not-be-afraid-of-terminal"><a class="zola-anchor" href="#do-not-be-afraid-of-terminal" aria-label="Anchor link for: do-not-be-afraid-of-terminal">Do not be afraid of terminal</a></h2>
<p>Terminal is that box full of text you can type in. It looks like something from
the 80s/90s.. And it can be intimidating.</p>
<p>Don't be afraid of it! Terminals are great way to operate on some things because <em>they're desktop agnostic!</em>.</p>
<p>This means that if your friend uses GNOME and you use KDE Plasma, and you both have some problem you
have to solve. GNOME and Plasma have different user interfaces, so you can't really advice your friend
how to solve that issue on their end.</p>
<p>However, what you <em>can</em> do is solve that issue inside terminal with a command, then share that command with
your friend who can then use it too.</p>
<p>Of course, there's a ton more nuance here.. But the above is why it's still being used.</p>
<p>Couple important notes:</p>
<ul>
<li><strong>If you don't understand the command, study it first before running it.</strong></li>
<li><strong>If the command requires <code>sudo</code> to be run, study it three times before even thinking of running it.</strong></li>
</ul>
<p>Commands that need <code>sudo</code> to be run mean that they have access to everything on your computer, as they
need a <code>root</code> access. If you don't know what you're doing, things may break.</p>
<p>Again, this is not something you need to be afraid of, but you should be cautious,
especially when copying commands from the internet!</p>
<h2 id="report-bugs"><a class="zola-anchor" href="#report-bugs" aria-label="Anchor link for: report-bugs">Report bugs!</a></h2>
<p>In Linux world, most things don't cost anything. However, if you encounter bugs,
you should report those to the app/system you encountered it with.</p>
<p>This helps the bug to get fixed. Sometimes it can take long time, sometimes it can be fixed next day.</p>
<p>But without the bug report, nobody will know.</p>
<p>Here's a post about reporting bugs I wrote: <a href="https://akselmo.dev/posts/how-i-report-bugs/">How I report bugs</a></p>
<p>Note: <strong>If you're using LTS distribution, report all the bugs to the distribution itself, not the app/system!</strong></p>
<h2 id="avoid-installing-apps-from-internet"><a class="zola-anchor" href="#avoid-installing-apps-from-internet" aria-label="Anchor link for: avoid-installing-apps-from-internet">Avoid installing apps from internet</a></h2>
<p>On Windows, it's common to go to a website and download an exe file there to install something.</p>
<p>On Linux, we prefer using app "stores" where one just types what they want to download and then
download it.</p>
<p>For example in KDE Plasma, we use tool called <a href="https://apps.kde.org/discover/">Discover</a>.</p>
<p>Instead of going to internet, open Discover and type the name of the app. If it exists, it'll pop-up,
and then you can download it there.</p>
<p>This is safer for the user as the files come from the distribution (or Flathub, more on that later),
so they have been (likely) tested that they work. They also are installed more
cleanly to the system, so you get all the launcher icons and other things.</p>
<p>You <em>can</em> download apps from web pages, and sometimes that's the only way to get some apps.
But always first check your distribution app downloader.</p>
<h3 id="flathub"><a class="zola-anchor" href="#flathub" aria-label="Anchor link for: flathub">Flathub</a></h3>
<p><a href="https://flathub.org/">Flathub</a> is the new cool thing that uses <a href="https://flatpak.org/">Flatpaks</a>.</p>
<p>As a regular user you don't need to worry as much what Flatpaks are, but I will explain anyway:
When distributing application between distros, some distros use different package management systems.</p>
<p>This then can get out of hand when you want to share your app with 10 distributions that all use their own
thing. Or they use the same thing but have different library versions.. And this causes headaches.</p>
<p>What Flatpak tries to do is just Make Things Work by adding all that's needed to the package, then user
just installs it. Flathub is a central place where people upload their flatpaks.</p>
<p>Flatpaks also have security measures, that can be helpful with some apps. For example Flatpak apps can
be told to not be able to read any other folder than <code>~/Downloads</code> etc. Kind of like what Android has with their
permission system.</p>
<p>So, if your system does not have Flathub set up, select your distribution from <a href="https://flathub.org/setup">here</a>,
and add it to your system.</p>
<p>However I advice to not install Steam through it: Steam works better when it has more access to
your system. So follow your distributions guide for installing Steam in those cases.</p>
<h2 id="dualbooting"><a class="zola-anchor" href="#dualbooting" aria-label="Anchor link for: dualbooting">Dualbooting</a></h2>
<p>If you want or need to use Windows for something, it is possible to
set up your PC so that when you power on your PC, it asks you if you want to
use Windows or Linux.</p>
<p>Distributions have their own manuals for that. Be prepared that Windows updates have
been known to meddle with your boot-loader (the thing that shows you the "Windows or Linux?" at startup),
which may cause your PC suddenly boot only to Windows one day.</p>
<p>So, it's possible, but you need to do some research about it for the distro you have chosen.</p>
<h2 id="learning-resources"><a class="zola-anchor" href="#learning-resources" aria-label="Anchor link for: learning-resources">Learning resources</a></h2>
<p>Again, <strong>do not rely on AI tools.</strong> They can lie.</p>
<p>Instead, search information from various forums and wikis, such as:</p>
<ul>
<li><a href="https://wiki.archlinux.org/title/Main_page">ArchWiki</a>
<ul>
<li>Despite the name, it can be useful for whatever distribution you use!</li>
</ul>
</li>
<li><a href="https://www.protondb.com/">ProtonDB</a>
<ul>
<li>Game compatibility with Linux</li>
</ul>
</li>
<li><a href="https://www.gamingonlinux.com/">GamingOnLinux</a>
<ul>
<li>A lot of gaming related news, and they have section for tracking <a href="https://www.gamingonlinux.com/anticheat/">anti-cheat compatibility</a></li>
</ul>
</li>
<li><a href="https://atl.wiki/">All Things Linux wiki</a>
<ul>
<li>Up and coming new wiki for Linux things</li>
</ul>
</li>
<li><a href="https://old.reddit.com/r/linuxhardware/">r/linuxhardware</a>
<ul>
<li>People ask here often if specific hardware works on Linux</li>
</ul>
</li>
</ul>
<p>Then, every project and desktop has often their own forums and wiki pages.
When in doubt, read those. Don't be afraid to ask in the forums either, or
in chats like IRC or Matrix.</p>
<h2 id="anything-else"><a class="zola-anchor" href="#anything-else" aria-label="Anchor link for: anything-else">Anything else?</a></h2>
<p>Uh, that's a lot of stuff. I don't remember if I had anything else in mind. I will update this post if
I do remember suddenly something.</p>
<p>I hope this has been useful, however! I can't give in-depth guides to everything, because things
can vary between distributions, hardware, desktop environments.. But I hope this can at least
help you get started and helps resolve some questions you have.</p>
<p>If you have any questions, feel free to mail me at <code>[email protected]</code>.
If it's something that should deserve it's place here, I will update the post.</p>
<p>Anyways, thanks for reading!</p>
<h1 id="edits"><a class="zola-anchor" href="#edits" aria-label="Anchor link for: edits">Edits</a></h1>
<ul>
<li>2025-08-23: Clarified that my notes about LTS are opinions, added Dualbooting section</li>
</ul>
Kate and Python Language Server: BasedpyrightThu, 14 Aug 2025 00:06:09 +0000Akselipythonkatelsplanguage-serverkde
https://akselmo.dev/posts/kate-and-basedpyright/
https://akselmo.dev/posts/kate-and-basedpyright/<p>This post is somewhat an update for my older post: <a href="https://akselmo.dev/posts/kate-python-lsp/">Kate and Python language server</a><span id="continue-reading"></span></p>
<p>There seems to be a lot of different Python language servers.. And I just want
one that does all and stays out of the way.</p>
<p>So after moaning about that I was pointed towards <a href="https://docs.basedpyright.com/latest/">basedpyright</a> on Fedi.</p>
<p>Despite the silly name, it works really well, so I set it up for <a href="https://kate-editor.org/">Kate</a>
editor as I do. Here's how.</p>
<h2 id="install-basedpyright"><a class="zola-anchor" href="#install-basedpyright" aria-label="Anchor link for: install-basedpyright">Install basedpyright</a></h2>
<p>You may want to use something like <a href="https://pipx.pypa.io/latest/">pipx</a> for this, that's at least what I did.</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>pipx install basedpyright
</span></code></pre>
<h2 id="pylsp-in-env-sh"><a class="zola-anchor" href="#pylsp-in-env-sh" aria-label="Anchor link for: pylsp-in-env-sh">pylsp_in_env.sh</a></h2>
<p>Then add <code>pylsp_in_env.sh</code> to PATH (such as <code>~/.local/bin/</code>) Kate can see:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span style="color:#808080;">#!/usr/bin/env bash
</span><span>
</span><span>path</span><span style="font-weight:bold;color:#33ffa0;">=</span><span style="color:#5fff33;">"$</span><span>1</span><span style="color:#5fff33;">"
</span><span style="color:#838fff;">cd </span><span>$path
</span><span style="font-weight:bold;color:#33ffa0;">if </span><span style="color:#838fff;">[ </span><span style="color:#ff9233;">-d</span><span> ./.venv </span><span style="color:#838fff;">]</span><span style="font-weight:bold;color:#33ffa0;">; then
</span><span> </span><span style="color:#838fff;">source</span><span> ./.venv/bin/activate
</span><span style="font-weight:bold;color:#33ffa0;">elif </span><span style="color:#838fff;">[ </span><span style="color:#ff9233;">-d</span><span> ./venv </span><span style="color:#838fff;">]</span><span style="font-weight:bold;color:#33ffa0;">; then
</span><span> </span><span style="color:#838fff;">source</span><span> ./venv/bin/activate
</span><span style="font-weight:bold;color:#33ffa0;">elif </span><span style="color:#838fff;">[ </span><span style="color:#ff9233;">-f</span><span> ./Pipfile </span><span style="color:#838fff;">]</span><span style="font-weight:bold;color:#33ffa0;">; then
</span><span> </span><span style="color:#838fff;">exec</span><span> pipenv run basedpyright-langserver --stdio
</span><span> </span><span style="color:#838fff;">exit</span><span> 0
</span><span style="font-weight:bold;color:#33ffa0;">fi
</span><span>
</span><span style="color:#838fff;">exec</span><span> basedpyright-langserver --stdio
</span></code></pre>
<p>As mentioned in the previous post, this is needed to get the proper virtual environment.
I also updated the script to work with Pipfiles.</p>
<h2 id="kate-lsp-settings"><a class="zola-anchor" href="#kate-lsp-settings" aria-label="Anchor link for: kate-lsp-settings">Kate lsp settings</a></h2>
<p>Then add this to Kate LSP settings.</p>
<p>I have also kept the <code>pylsp</code> settings there. It doesn't harm anything to have them there,
in case you want to change the language server back to <code>python-lsp-server</code>.</p>
<pre data-lang="json" style="background-color:#181818;color:#ffffff;" class="language-json "><code class="language-json" data-lang="json"><span>{
</span><span> </span><span style="color:#5fff33;">"python"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"command"</span><span>: [
</span><span> </span><span style="color:#5fff33;">"pylsp_in_env"</span><span>,
</span><span> </span><span style="color:#5fff33;">"%{Project:NativePath}"
</span><span> ],
</span><span> </span><span style="color:#5fff33;">"root"</span><span>: </span><span style="color:#5fff33;">"."</span><span>,
</span><span> </span><span style="color:#5fff33;">"url"</span><span>: </span><span style="color:#5fff33;">"https://docs.basedpyright.com/latest/"</span><span>,
</span><span> </span><span style="color:#5fff33;">"highlightingModeRegex"</span><span>: </span><span style="color:#5fff33;">"^Python$"</span><span>,
</span><span> </span><span style="color:#5fff33;">"settings"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"basedpyright"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"analysis"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"typeCheckingMode"</span><span>: </span><span style="color:#5fff33;">"off"
</span><span> }
</span><span> },
</span><span> </span><span style="color:#5fff33;">"pylsp"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"plugins"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"pycodestyle"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"enabled"</span><span>: </span><span style="color:#ff9233;">false
</span><span> },
</span><span> </span><span style="color:#5fff33;">"ruff"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"enabled"</span><span>: </span><span style="color:#ff9233;">true
</span><span> }
</span><span> }
</span><span> }
</span><span> }
</span><span> }
</span><span>}
</span></code></pre>
<p>You can change the <code>typeCheckingMode</code> to different values like <code>basic</code> and <code>recommended</code>
if project demands it. I set it <code>off</code> because with <code>recommended</code> there's <em>A LOT</em> of
diagnostics that I usually don't need, unless again, the project expects proper type checking.</p>
<h2 id="done"><a class="zola-anchor" href="#done" aria-label="Anchor link for: done">Done!</a></h2>
<p>And that's it. Restart Kate or the Language server inside Kate and as long as Kate can find
the file, it should just start up <code>basedpyright-langserver</code> and work.</p>
<p>I like this language server a lot, but if there's other challengers in future, expect me to
make a post about them too.</p>
<p>Until next time!</p>
KomoDo, my first KDE appThu, 07 Aug 2025 18:38:49 +0000Akselikdeappskomodotodo.txt
https://akselmo.dev/posts/komodo-my-first-kde-app/
https://akselmo.dev/posts/komodo-my-first-kde-app/<p>During all my time with KDE projects, I've never made an app from scratch.. Except now.<span id="continue-reading"></span></p>
<p>Today my first KDE app ever, <a href="https://invent.kde.org/utilities/komodo">KomoDo</a>, was released on <a href="https://flathub.org/apps/org.kde.komodo">Flathub</a>!</p>
<p><a href="/assets/images/kde/komodo.png"><img src="/assets/images/kde/komodo.png" alt="Screenshot of the KomoDo todo.txt application" /></a></p>
<p>It's a simple todo application for <a href="http://todotxt.org/">todo.txt format</a> and parses todo.txt
files into a list of cards. One task is one card.</p>
<p>The application has help sections for any of the rules todo.txt format follows, but you can
use as many or as little of them as you want.</p>
<p>I wanted to go through in this blogpost about the process, or what I remember of it anyway.
I've always just fixed bugs in Plasma or Frameworks or even in apps like Dolphin, but never made anything from scratch.
So I thought that writing this down might be helpful for someone in similar position.</p>
<p>As with any KDE project, it's open source and the repository can be explored right here: <a href="https://invent.kde.org/utilities/komodo">utilities/komodo</a>.</p>
<h2 id="starting-up"><a class="zola-anchor" href="#starting-up" aria-label="Anchor link for: starting-up">Starting up</a></h2>
<p>Starting a Qt project using KDE libraries, especially QtQuick, is not that difficult in the end.
KDE has really good documentation for starting up.
I mostly followed this guide to get started: <a href="https://develop.kde.org/docs/getting-started/kirigami/setup-cpp/">https://develop.kde.org/docs/getting-started/kirigami/setup-cpp/</a></p>
<p>There is also guides for <a href="https://develop.kde.org/docs/getting-started/kirigami/setup-python/">Python</a> and <a href="https://develop.kde.org/docs/getting-started/kirigami/setup-rust/">Rust</a> if you wish to use those instead of C++.</p>
<p>I also highly recommend using <a href="https://develop.kde.org/docs/getting-started/kirigami/setup-cpp/#kde-builder">kde-builder</a> for building
and running the applications. It makes things so much easier.</p>
<p>Other than that, there's not much to tell about the setup.</p>
<h2 id="the-project-itself"><a class="zola-anchor" href="#the-project-itself" aria-label="Anchor link for: the-project-itself">The project itself</a></h2>
<p>Working on the application was not that bad either. I've worked on various C++ and QML files
during my work on KDE software, so I had easy time getting into the flow.</p>
<p>I think the most difficult part for me was the CMake files: I couldn't really understand them or
what they do, I mostly followed what other projects did and replicated them.</p>
<p>This of course caused me to do unnecessary things, like installing libraries I made for the app:
TodoModel which the QML code uses to parse the todo.txt file and generate the view was accidentally installed
among the system libraries, which was not ideal, since I'm not building a framework.</p>
<p>Luckily with tons of help and reviews from my friends in the KDE fam, we got CMake to build things nicely.
Then with kde-builder the feedback loop of code->build->test was fast enough, especially in small app like this,
that I could iterate on the application in a good pace.</p>
<p>I also had a lot of help from a friend with the CI and sysadmin stuff. That side of development is
very confusing to me so I'm glad with the help. I dunno if you want to be named so I didn't, but you know
who you are: Big thanks. :)</p>
<h3 id="todomodel"><a class="zola-anchor" href="#todomodel" aria-label="Anchor link for: todomodel">TodoModel</a></h3>
<p>Since Qt is reliant on the model-view system, I had to make a "model" that parses
the todo.txt file and spits out Todo objects, which can then be parsed
by the QML code, which is the frontend code.</p>
<p>If you have never worked on model-view systems, it can take some time to understand.
To me, the model-view as words was always a bit confusing: I would have understood it better
if it was worded something like data-ui. But tech jargon has always been my weakest point.</p>
<p>The parsing is done by a RegExp nightmare I concocted with help of stack-overflow and tears.</p>
<p>Here it is, in its nightmarish glory, enjoy the nightmare fuel:</p>
<pre data-lang="cpp" style="background-color:#181818;color:#ffffff;" class="language-cpp "><code class="language-cpp" data-lang="cpp"><span>QStringLiteral(</span><span style="color:#5fff33;">"(?:^[ "
</span><span> </span><span style="color:#5fff33;">"</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">t]*(?P<Completion>x))|(?P<Priority></span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">([A-Z]</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">))|(?:(?P<FirstDate>"
</span><span> </span><span style="color:#5fff33;">"</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">d{4}-</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">d</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">d-</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">d</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">d)[ "
</span><span> </span><span style="color:#5fff33;">"</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">t]*(?P<SecondDate></span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">d{4}-</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">d</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">d-</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">d</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">d)?)|(?P<Projects></span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">B</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">+[</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">w</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">d</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">S]+)|(?P<"
</span><span> </span><span style="color:#5fff33;">"Contexts>(?<=</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">s)@[^</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">s]+)|(?P<KeyValuePairs>[a-zA-Z]+:[</span><span style="color:#33ffff;">\\</span><span style="color:#5fff33;">S]*)"</span><span>);
</span></code></pre>
<p>Yyyeah. It's.. Something.</p>
<h3 id="testing"><a class="zola-anchor" href="#testing" aria-label="Anchor link for: testing">Testing</a></h3>
<p>Due to the nightmare fuel that RegExp can be, I decided that unit testing would be great addition.
So I fought with CMake a bit and then made myself a proper parser testing file.</p>
<p>Thankfully Qt has nice QTest library that can be used to create tests.
They can be hard to parse at first, but when you understand how they work, they're really
quick and easy to work with.</p>
<p>Testing saved my rear a few times during this project, especially when modifying anything parser related.</p>
<h2 id="look-and-feel"><a class="zola-anchor" href="#look-and-feel" aria-label="Anchor link for: look-and-feel">Look and feel</a></h2>
<p>When the model worked fine, I started concentrating more on the look and feel of the app.</p>
<p>The application went through various phases: At first, everything was done through a dialog, except
viewing the cards. It was kind of distracting that every time you wanted to modify or make new task,
the application would pop things up.</p>
<p>Over time though, I think I got it into a good spot: Most actions can be done in the task list, but when
user wants to delete a task, the app asks the user first if they are sure about it.</p>
<p>Then there is help menu and quick info for syntax related things.</p>
<p>Otherwise there's really no settings: I did not want to add any settings if I could avoid it.
The only setting the app saves to config file is the file you opened last time.</p>
<p>I also consulted the <a href="https://develop.kde.org/hig/">KDE Human Interface Guidelines</a> (HIG) few times, but
it was never "in the way." It just helped me to make decisions sometimes when I wasn't sure what to do with
the design.</p>
<p>Also my lovely wife <a href="https://scalie.zone/@tecsiederp/">@tecsiederp</a> made the application the most adorable icon ever.</p>
<p><a href="/assets/images/kde/komodo-big-icon.png"><img src="/assets/images/kde/komodo-big-icon.png" alt="Cute green lizard holding a todo sign" /></a></p>
<p>Look at it. Just a lil guy.</p>
<p>Also, if you don't get your tasks done, he will get sad. So you better do those tasks!</p>
<p>It just makes me so happy and motivated to work on my tasks when I see this lil guy in my taskbar. :D</p>
<p>The icons however have to follow our guidelines, also mentioned in the <a href="https://develop.kde.org/hig/icons/colorful/">HIG</a>.
Luckily my wife is good with SVG files, and if she wasn't I already had two people wanting to help me with it, which
I very much appreciated. If I had to make an icon myself, it would.. Not be good. :P</p>
<p>Something I mostly struggled with though was getting a nice syntax highlighting for the task text.
I wanted to use our KSyntaxHighlighting library, but it would not match all colorschemes: Users
may use their own or third party colorscheme for the app, but the syntax highlighter does not have a colorscheme
that matches it.. So it would look bit odd.</p>
<p>So I made my own simple one that appends some color tags to the string, and the QML engine does the rest.
The text can have HTML tags like <code><span></code> in it which QML can parse automagically.</p>
<p>I think the app turned out to look pretty good. It also supports keyboard navigation
for getting around the app. (Though there might be some bugs with it still.)</p>
<h2 id="releasing-the-app"><a class="zola-anchor" href="#releasing-the-app" aria-label="Anchor link for: releasing-the-app">Releasing the app</a></h2>
<p>KDE has documentation for the release process, so I just followed it to the letter.
During the release process, I have to wait for at least 2 weeks for people to give me reviews,
and so they did. And then I fixed things. And some more.</p>
<p>Eventually the app was good to go (though it was never directly told me, it was just implicitly agreed),
and I followed the last bits of relese process, setting up signing keys and such.</p>
<p>And now it exists as a tarball here, so any interested distros can go grab it: <a href="https://download.kde.org/stable/komodo/1.0.0/">https://download.kde.org/stable/komodo/1.0.0/</a></p>
<p>I also recommend this patch to go with it, to make sure it doesn't install the static libraries in the system:
<a href="https://invent.kde.org/utilities/komodo/-/commit/57c6fa82719155bd32cb35b4c64cddae956c53e0">https://invent.kde.org/utilities/komodo/-/commit/57c6fa82719155bd32cb35b4c64cddae956c53e0</a></p>
<p>With Flathub, the submission process was rather painless in my opinion. I followed their
<a href="https://docs.flathub.org/docs/for-app-authors/submission">requirements and submission documentation</a> and it all just
clicked together. Eventually someone was reviewing my PR and then.. The app is in Flathub.
I had to make a patch for Flathub specifically, but it was also really painless so I didn't mind.</p>
<p>What it all mostly took from me is time. Otherwise it was just nice and easy.</p>
<h2 id="more-apps"><a class="zola-anchor" href="#more-apps" aria-label="Anchor link for: more-apps">More apps?</a></h2>
<p>So at least in my experience, the whole process was rather easy. I didn't want to go into
nitty gritty details too much.. Because I don't remember everything + you can see the source code + the process itself
happens in the open.</p>
<p>I'm definitely interested in making more KDE apps, but also I have my game project(s).</p>
<p><em>And I really want to get back into gamedev. Like spend much more time into it.</em></p>
<p>At least now I have a todo app which fits my needs to keep track of the gamedev projects. :)</p>
<p>Thanks for reading! And if you're looking for new todo application, give KomoDo a try! :)</p>
Shedding (Cosplay Photos)Sat, 21 Jun 2025 22:49:20 +0000Akselicosplayphotos
https://akselmo.dev/posts/shedding-cosplay-photos/
https://akselmo.dev/posts/shedding-cosplay-photos/<p>I wanted to do some fun little photoshoot with my new tattoo and my lizard
cosplay. <span id="continue-reading"></span>They are rather connected after all!</p>
<div>
<div>
<a href="https://akselmo.dev/assets/images/shedding2025/shedding1.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/shedding1.b8c6c872ac773ccc.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/shedding2025/shedding2.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/shedding2.e661963d4c51079f.jpg" />
</a>
</div>
</div>
<ul>
<li>The photos were taken by <a href="https://www.instagram.com/mediakettu/">mediakettu</a>.</li>
<li>Editing was done by my wife <a href="https://scalie.zone/@tecsiederp">tecsiederp</a>.</li>
<li>The lizard suit (head, feet, hands and tail) were made by <a href="https://www.lisanotuspaja.com/en/">Lisan Otuspaja</a></li>
</ul>
todo.txt tasks in my TRMNLSat, 14 Jun 2025 15:58:00 +0000Akselitrmnltodotxttasksproductivity
https://akselmo.dev/posts/todotxt-in-my-trmnl/
https://akselmo.dev/posts/todotxt-in-my-trmnl/<p><strong>Edit: Please avoid buying TRMNL</strong></p>
<p>It turns out some people behind TRMNL are not something I want to support. <span id="continue-reading"></span></p>
<p>See: <a href="https://social.lol/@adam/114959554043586459">https://social.lol/@adam/114959554043586459</a></p>
<p>Archive link: <a href="https://archive.is/3Nu1c">https://archive.is/3Nu1c</a></p>
<p>I do not want to support a company that allows and endorses this sort of behavior.</p>
<p>You are allowed to do what you wish, but I can't with good consciences support something like this.</p>
<p>What also annoys me a ton is that I made a plugin for TRMNL, for free, and I'm part of these minorities
they seem to dislike.</p>
<p>I'm currently looking into ways to self-host my TRMNL infrastructure so that it's completely
detached from TRMNL itself. Will write a post about that when I get something done.
The device itself is fine and I do not want it to go to e-waste.</p>
<p>Original text below.</p>
<hr />
<p>I'm never really satisfied with my task and note taking systems. Always looking for new stuff.</p>
<p>I had my <a href="https://akselmo.dev/posts/kate-and-orgmode/">Kate-Orgmode</a> system for a long while,
but I ended up disliking the Org mode syntax on the longer run, so I use Markdown.
And now especially when I do all my journaling by hand to my <a href="https://remarkable.com/products/remarkable-2">reMarkable2</a> e-ink
tablet, markdown suits me fine.</p>
<p>But tasks..! I used a simple markdown todo-list for my tasks, but it got unwieldy really quickly.</p>
<h2 id="todo-txt"><a class="zola-anchor" href="#todo-txt" aria-label="Anchor link for: todo-txt">Todo.txt</a></h2>
<p>So I decided to try something else. I wanted something super simple, something with
zero effort to understand and work with. So I went with <a href="http://todotxt.org/">todo.txt</a>.</p>
<p>So far I've been very happy with it. I made a <a href="https://codeberg.org/akselmo/dotfiles/src/branch/main/kate/Todotxt%20Snippets.xml">snippet collection</a>
for it for the <a href="https://kate-editor.org/">Kate</a> text editor, so creating new tasks is super fast. Kate even
has syntax highlighting for the todo.txt files, so it all worked out for me.
On Android i use <a href="https://github.com/tmaegel/ntodotxt">ntodotxt</a>.</p>
<h2 id="then-i-got-a-trmnl"><a class="zola-anchor" href="#then-i-got-a-trmnl" aria-label="Anchor link for: then-i-got-a-trmnl">Then I got a TRMNL</a></h2>
<p>I saw a post about this nifty thing on fedi: <a href="https://usetrmnl.com/">TRMNL</a>.
I couldn't say no: I have noticed I really like e-ink stuff. Maybe a bit too much.
Anyway, I bought one and it arrived in +7 days.</p>
<p>It's really cool little screen to show you various information. They have a website
where you can tinker with what the device shows to you, during what time of day etc.</p>
<p>I mostly use it to show me my calendar, some weather information etc.
Anykind of productivity stuff.</p>
<p>But I wanted to see my tasks there too..</p>
<h2 id="first-try-parse-the-todo-txt-file"><a class="zola-anchor" href="#first-try-parse-the-todo-txt-file" aria-label="Anchor link for: first-try-parse-the-todo-txt-file">First try: Parse the todo.txt file</a></h2>
<p>Since todo.txt files are rather simple to parse, I just made a
plugin on TRMNL site that reads the todo.txt file from my Nextcloud,
and prints it all pretty and nice.</p>
<p>But this was not really what I wanted: I wanted to have all the <code>+projects</code> and <code>@contexts</code>
and dates on their own separate line.</p>
<p>I could have spent year trying to come up with some awful regex and javascript combination
to parse things, but instead I went with something else.</p>
<h2 id="second-try-todo-json"><a class="zola-anchor" href="#second-try-todo-json" aria-label="Anchor link for: second-try-todo-json">Second try: todo.json</a></h2>
<p>Since TRMNL plugins really like working with json, I was looking around
for any kind of tool that could take a todo.txt file and spit out a json
out of it with all the information categorized nicely.</p>
<p>Well, I didn't find a premade tool, but I found <a href="https://vonshednob.cc/pytodotxt/">pytodotxt</a>.
This Python module allowed me easily to parse things.</p>
<p>I then wrote my own Python script <a href="https://codeberg.org/akselmo/todojson">todojson</a> for it.
It takes the todo.txt file, takes the info, and writes a todo.json out of it.</p>
<p>Next up is.. How do I share this json nicely? I don't want it to be in public
for everyone to poll my todos, but I need somekind of endpoint.</p>
<p>I went with something very simple: Website that asks a password to log in.
Then this file is on that website.</p>
<p>I followed some tutorials <a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-apache-on-ubuntu-20-04">how to set up password auth with Apache2</a>
and placed the json file behind that.</p>
<p>Then on TRMNL side I just poll that URL with proper authentication header.
This works really nicely! I now have an endpoint for all my todo.txt data.</p>
<h2 id="trmnl-plugin"><a class="zola-anchor" href="#trmnl-plugin" aria-label="Anchor link for: trmnl-plugin">TRMNL plugin</a></h2>
<p>The actual TRMNL plugin <a href="https://usetrmnl.com/framework">markup</a> for this is rather simple as well.
They use some template language called <a href="https://shopify.github.io/liquid/">Liquid</a> which
made the creation of the plugin markup rather nice.</p>
<p>It looks like this on the screen:</p>
<p><a href="/assets/images/trmnl/trmnl_todo_txt.jpg"><img src="/assets/images/trmnl/trmnl_todo_txt.jpg" alt="TRMNL with Todo items" /></a></p>
<p>The block on the left indicates the priority of the item with A, B, C...
And then there is the actual task description, and then any relevant metadata, such as start date, <code>+projects</code> and <code>@contexts</code>.
The date with black background is a <code>due:YYYY-MM-DD</code> item, which shows when the item is due.</p>
<p>It turned out to look really nice! I am very happy with it. Now I have easy way to check my todo list without having
to juggle with many apps. I also have copy of this plugin that only shows tasks with the <code>@Personal</code> context, so I wont
be looking at work tasks during off hours. :)</p>
<p>Since I do not have these yet uploaded anywhere, nor have this shared as an
actual plugin on TRMNL plugin gallery (yet, I may do that at some point), here's the markup code for the full view:</p>
<pre data-lang="html" style="background-color:#181818;color:#ffffff;" class="language-html "><code class="language-html" data-lang="html"><span>{% assign todo_data = {{todos}} %}
</span><span>{% assign todo_sorted = todo_data | sort: "priority" %}
</span><span>
</span><span><</span><span style="font-weight:bold;color:#838fff;">div class</span><span>=</span><span style="color:#5fff33;">"layout"</span><span>>
</span><span> <</span><span style="font-weight:bold;color:#838fff;">div class</span><span>=</span><span style="color:#5fff33;">"list" </span><span style="font-weight:bold;color:#838fff;">data-content-limiter</span><span>=</span><span style="color:#5fff33;">"true" </span><span style="font-weight:bold;color:#838fff;">data-list-limit</span><span>=</span><span style="color:#5fff33;">"true" </span><span style="font-weight:bold;color:#838fff;">data-list-max-height</span><span>=</span><span style="color:#5fff33;">"420" </span><span style="font-weight:bold;color:#838fff;">data-list-hidden-count</span><span>=</span><span style="color:#5fff33;">"false"</span><span>>
</span><span> {% for todo in todo_sorted %}
</span><span> {% unless todo.data.completed %}
</span><span> <</span><span style="font-weight:bold;color:#838fff;">div class</span><span>=</span><span style="color:#5fff33;">"item"</span><span>>
</span><span> <</span><span style="font-weight:bold;color:#838fff;">div class</span><span>=</span><span style="color:#5fff33;">"meta"</span><span>>
</span><span> <</span><span style="font-weight:bold;color:#838fff;">span class</span><span>=</span><span style="color:#5fff33;">"index"</span><span>>{{todo.data.priority}}</</span><span style="font-weight:bold;color:#838fff;">span</span><span>>
</span><span> </</span><span style="font-weight:bold;color:#838fff;">div</span><span>>
</span><span> <</span><span style="font-weight:bold;color:#838fff;">div class</span><span>=</span><span style="color:#5fff33;">"content"</span><span>>
</span><span> <</span><span style="font-weight:bold;color:#838fff;">span class</span><span>=</span><span style="color:#5fff33;">"description"</span><span>>{{todo.data.bare_description}}</</span><span style="font-weight:bold;color:#838fff;">span</span><span>>
</span><span> <</span><span style="font-weight:bold;color:#838fff;">div class</span><span>=</span><span style="color:#5fff33;">"flex gap--small"</span><span>>
</span><span> {% if todo.data.attributes contains "due" %}
</span><span> <</span><span style="font-weight:bold;color:#838fff;">span class</span><span>=</span><span style="color:#5fff33;">"label label--small label--inverted" </span><span style="font-weight:bold;color:#838fff;">data-value-fit</span><span>=</span><span style="color:#5fff33;">"true"</span><span>>{{todo.data.attributes['due']}}</</span><span style="font-weight:bold;color:#838fff;">span</span><span>>
</span><span> {%endif%}
</span><span> <</span><span style="font-weight:bold;color:#838fff;">span class</span><span>=</span><span style="color:#5fff33;">"label label--small label--outline"</span><span>>{{todo.data.creation_date | join}}</</span><span style="font-weight:bold;color:#838fff;">span</span><span>>
</span><span> {% for project in todo.data.projects %}
</span><span> <</span><span style="font-weight:bold;color:#838fff;">span class</span><span>=</span><span style="color:#5fff33;">"label label--small label--outline"</span><span>>+{{project}}</</span><span style="font-weight:bold;color:#838fff;">span</span><span>>
</span><span> {% endfor %}
</span><span> {% for context in todo.data.contexts %}
</span><span> <</span><span style="font-weight:bold;color:#838fff;">span class</span><span>=</span><span style="color:#5fff33;">"label label--small label--outline"</span><span>>@{{context}}</</span><span style="font-weight:bold;color:#838fff;">span</span><span>>
</span><span> {% endfor %}
</span><span> </</span><span style="font-weight:bold;color:#838fff;">div</span><span>>
</span><span> </</span><span style="font-weight:bold;color:#838fff;">div</span><span>>
</span><span> </</span><span style="font-weight:bold;color:#838fff;">div</span><span>>
</span><span> {% endunless %}
</span><span> {% endfor %}
</span><span> </</span><span style="font-weight:bold;color:#838fff;">div</span><span>>
</span><span></</span><span style="font-weight:bold;color:#838fff;">div</span><span>>
</span><span>
</span><span><</span><span style="font-weight:bold;color:#838fff;">div class</span><span>=</span><span style="color:#5fff33;">"title_bar"</span><span>>
</span><span> <</span><span style="font-weight:bold;color:#838fff;">img class</span><span>=</span><span style="color:#5fff33;">"image" </span><span style="font-weight:bold;color:#838fff;">style</span><span>=</span><span style="color:#5fff33;">"</span><span style="color:#d970ff;">background-color</span><span>:</span><span style="color:#d970ff;">black</span><span>; </span><span style="color:#d970ff;">border-radius</span><span>:</span><span style="color:#ff9233;">5</span><span style="font-weight:bold;color:#33ffa0;">px</span><span style="color:#5fff33;">" </span><span style="font-weight:bold;color:#838fff;">src</span><span>=</span><span style="color:#5fff33;">"https://usetrmnl.com/images/plugins/todo_list.svg"</span><span>>
</span><span> <</span><span style="font-weight:bold;color:#838fff;">span class</span><span>=</span><span style="color:#5fff33;">"title"</span><span>>{{ trmnl.plugin_settings.instance_name }}</</span><span style="font-weight:bold;color:#838fff;">span</span><span>>
</span><span></</span><span style="font-weight:bold;color:#838fff;">div</span><span>>
</span></code></pre>
<p>I like how simple these are to make. I could see myself easily to make more changes and such to this, but for now
I'm satisfied.</p>
<h2 id="but-why"><a class="zola-anchor" href="#but-why" aria-label="Anchor link for: but-why">But why</a></h2>
<p>Why make all these things and get the TRMNL display?</p>
<p>Well I just think it's cool and I had some extra pocket cash.</p>
<p>Also I really like how simple todo.txt system is, since it's very effortless to make new tasks.
And having this little display to show my tasks as it loops through the many different plugins I've added
helps me avoid closing and opening all kinds of apps all the time. I can just.. Look at it, and it's there.</p>
<p>Obviously this is nothing essential. It's just a little cool gadget for myself, as a treat.
In short: I got it and did this just for the fun of it.</p>
<p>Does it actually help me day-to-day? I think so,
it's rather easy now for me to check if I have any calendar appointments or tasks incoming while gaming
for example. Looking at another screen is more effortless than juggling between apps.</p>
<p>I hope you liked this thing I did and maybe other todo.txt users can find the <a href="https://codeberg.org/akselmo/todojson">todojson</a>
script I made useful for their own needs. Maybe someone wants to use this markup for their own TRMNL
but for different purpose.</p>
<p>Either way, thanks for reading!</p>
Game Ramblings: Quitters, Splitgate 2, DaggerfallSun, 08 Jun 2025 12:47:01 +0000Akseligamingramble
https://akselmo.dev/posts/game-ramblings/
https://akselmo.dev/posts/game-ramblings/<p>I love FPS games, especially fast paced PVP FPS games.<span id="continue-reading"></span>
Now that Splitgate 2 was released, I played it a bunch.</p>
<p>I was big fan of Splitgate 1, I played it a ton. One of those
rare fast paced FPS games, nowadays most FPS games are slow and
sluggish. Well, at least to me, a Quake player.</p>
<p>I was excited to play Splitgate 2 but the game has some issues
with mouse sensitivity: It keeps over/undershooting and just being weird.</p>
<p>Then people leave the matches immediately if things don't go their way.
I don't get this.</p>
<h2 id="quitters"><a class="zola-anchor" href="#quitters" aria-label="Anchor link for: quitters">Quitters</a></h2>
<p>I used to play Wolfenstein Enemy Territory as a kiddo and had
awful stats on the leaderboards, but I still played: The game was fun, the
stats did not matter.</p>
<p>Seems these days people just give up immediately. They don't even try to learn the game
against more challenging opponents.</p>
<p>I really don't get it.</p>
<p>When I played Quake Live in 2009 and 2010, I got my ass handed to me
daily. But the game was so much fun, I didn't care.</p>
<p>I started then learning strafejumping and rocketjumping. It took
me some time but it made the game even more fun.</p>
<p>Still got my ass handed to me. Still get absolutely wrecked in Quake Live, although
I used to be a lot better when I was younger.</p>
<p>But I don't quit mid match. Why is this so common now? Maybe it has always
been common, though in community servers you never really noticed it: Someone
would always jump in to refill their place.</p>
<p>The whole ELO and Rankings and matchmaking and whatever seems to have made
players ego hurt more when they get wrecked.</p>
<p>But counterpoint: Who the fuck cares? It's a game. If you like the game,
keep at it and you'll learn it. I'm not a saint, I used to get really
angry about losing in games. But I never quit in mid match, unless the enemy
team had an obvious cheater or something.</p>
<p>Idk man, just weird. You're allowed to lose in games, and if anyone thinks
any less of you for that, they're weak person.</p>
<h2 id="splitgate-2"><a class="zola-anchor" href="#splitgate-2" aria-label="Anchor link for: splitgate-2">Splitgate 2</a></h2>
<p>Anyway, sadly one of Splitgate 2 devs ended up being a fool, and this
fully solidified that I don't really want to have anything to do with the
game or it's playerbase: <a href="https://aftermath.site/splitgate-2-hat-maga-ceo-ian-proulx-elon-musk">Article by Aftermath</a></p>
<p>I will likely try the game again in ~1 year, if it survives that long: Despite
the foolish business in the above link, the game is still lacking sense of direction.
The first game knew where it was going, but this..? It adds everything from
every other game (loadouts, battle royale..), then slaps portals to it, and calls it innovation.</p>
<p>The first Splitgate game was solid enough. Could have just made that again. Without the embarrassing tweets and hats.</p>
<p>Oh well, I'll probably go back to <a href="https://xonotic.org/">Xonotic</a>, <a href="https://store.steampowered.com/app/611500/Quake_Champions/">Quake Champions</a> and <a href="https://store.steampowered.com/app/2073850/THE_FINALS/">The Finals</a> again for my FPS needs.</p>
<h2 id="daggerfall"><a class="zola-anchor" href="#daggerfall" aria-label="Anchor link for: daggerfall">Daggerfall</a></h2>
<p>I've been also playing Daggerfall with <a href="https://www.dfworkshop.net/">Daggerfall Unity</a>.</p>
<p>I've always wanted to play it more but when compared to modern games, playing it through DOSBox is a bit jank.</p>
<p>Daggerfall Unity made the game more playable and fun for me. The mod support
also adds a lot of niceties to it.</p>
<p>I honestly really like it. Despite it's age, the game holds up very well with Daggerfall Unity and the mods enhance it even more.</p>
<p>There's all kinds of fun quests to do and bunch of random generated dungeons to delve.
One of the quests I encountered was someone asking for help. I then went to look for the
person, who in turn turned out to be "evil mage" and teleported me to some random dungeon!
I then went through the dungeon, looted stuff, and looked for the mage who teleported me
to the dungeon and kicked their ass.</p>
<p>It was so unexpected and fun little encounter.</p>
<p>I'm still working through the main quest, curious to see how it'll go!</p>
<h2 id="game-ramblings"><a class="zola-anchor" href="#game-ramblings" aria-label="Anchor link for: game-ramblings">Game ramblings</a></h2>
<p>I want to make more gaming ramblings like this. Instead of posting it all to fedi,
I just like talking about games I play in longer form. So I think I'll keep doing this.
If you look my very old "Bitksel" posts, I used to make posts like this about certain games, but more in depth. They were fun but quite exhausting to write.
So maybe short-form ramblings like this are way to go.</p>
<p>Anyhow thanks for reading. :) And don't quit the matches early unless you absolutely have to.</p>
I got my first tattooThu, 05 Jun 2025 19:58:56 +0000Akselipersonalramblephotostattoo
https://akselmo.dev/posts/i-got-my-first-tattoo/
https://akselmo.dev/posts/i-got-my-first-tattoo/<p>I promised to share this here too, so here you go, I finally got a proper tattoo!<span id="continue-reading"></span></p>
<div>
<div>
<a href="https://akselmo.dev/assets/images/photos/scale_tattoo.png" target="_blank">
<img src="https://akselmo.dev/processed_images/scale_tattoo.b3a8bd98988a7d96.png" />
</a>
</div>
</div>
<p>It's a tattoo of my skin being torn off and there's scales dark gray underneath.</p>
<p>It was made by <a href="https://www.instagram.com/ravilassi/?hl=en">Ravi-Lassi (@ravilassi)</a>.</p>
<p>I've wanted this kind of tattoo since I was 15 so I finally went for it. I'm glad I did! I'm really happy about it.</p>
<p>The experience was a bit painful (apparently this is a painful area).
At first it was quite tolerable and okay, but when the last highlights
were being added, it hurt <em>a lot!</em></p>
<p>I'm already thinking of next ones. Maybe Quake logo and Morrowind cover-art somewhere,
maybe Half-Life logo.. And I really want more of these scales, probably on my back next time.</p>
Ramble: Tired and EmotionalWed, 28 May 2025 21:59:16 +0000Akselipersonalramble
https://akselmo.dev/posts/tired-emotional/
https://akselmo.dev/posts/tired-emotional/<p><em>Note: This is not a techy post or anything. It's personal post. Ramble. Feel free to ignore it.</em><span id="continue-reading"></span></p>
<p>Burnout is ass. Well, the <a href="https://en.wikipedia.org/wiki/Burnout_(series)">games</a> are actually pretty good.
But the mental burnout, it's just ass.</p>
<p>I've gone through this road multiple times. I'll probably go through it many more
times in future.</p>
<p>But at least I'm on a vacation now, trying to rest. So might as well
write a post about my general feelings too. Sort of public journal page.</p>
<h2 id="i-think-i-dislike-most-modern-tech"><a class="zola-anchor" href="#i-think-i-dislike-most-modern-tech" aria-label="Anchor link for: i-think-i-dislike-most-modern-tech">I think I dislike most modern tech</a></h2>
<p>Nowadays when I look at most new things in technology, my first instinct
is <strong>not</strong> "Oh that looks cool."</p>
<p>My first instinct is instead: "Oh great, another tool to fuck us over."</p>
<p>New GPUs? Great, more resource hungry bricks that add features games don't really need
just because someone has a boner for ultra-realistic-graphics or "AI."</p>
<p>And yes then there's the blanket term "AI" that has so much trash in it. I'm
so fucking tired of it.</p>
<p>Then there's some new websites or web "apps" or whatever that are like "yo join our thing"
and they will fuck over their userbase when they run out of money.</p>
<p>It's not all that bad though: When I see new FOSS projects, I get excited, interested..!
Because if they fuck me over, I can just fork it if I rely on it, or alternatively stop using it.
But they rarely do, because many FOSS projects are made by actually nice people. It's refreshing.
(Not all of them though, if you know, you know.)</p>
<p><strong>I preferred when tech was tool to create end goals, not the end goal itself.</strong></p>
<h2 id="i-have-to-accept-i-am-emotional-bean"><a class="zola-anchor" href="#i-have-to-accept-i-am-emotional-bean" aria-label="Anchor link for: i-have-to-accept-i-am-emotional-bean">I have to accept I am emotional bean</a></h2>
<p>I used to think I was sort of "stoic." This was a case when I was younger:
I was actually so depressed I killed most of my emotions.. Well, except anger.</p>
<p>Now that I am finally getting better, I've noticed that I am VERY EMOTIONAL.
And I don't mean I'm crying over things, I haven't been able to cry properly since I
was 13 and that has not changed.</p>
<p>It's more that I am very passionate, easily frustrated and it's all very overwhelming.
I am not used to my emotions being like this.</p>
<p>If you're a friend of mine and see me in this state, please do not dismiss it: Allow
me to come out of it with my own terms, but you can help me by guiding me to the correct
route.</p>
<p>Usually that means allowing me to rant until I'm too tired. I don't know
any other ways to snap out of it yet.</p>
<h2 id="i-am-still-addicted-to-social-media-things"><a class="zola-anchor" href="#i-am-still-addicted-to-social-media-things" aria-label="Anchor link for: i-am-still-addicted-to-social-media-things">I am still addicted to social media things</a></h2>
<p>Social media addiction, be it fediverse or lobste.rs or whatever, can get
really out of hand with me. Or at least I feel like that way.</p>
<p>How many of you do the dumb cycle of:</p>
<ol>
<li>Open site</li>
<li>Read site 10 seconds</li>
<li>Close site</li>
<li>Wait for a minute</li>
<li>"I should open the site"</li>
<li>Repeat...</li>
</ol>
<p>When I spot myself doing this, I get so angry with myself. I detest this behavior in me.
Addiction to things is like taking control out of my hands and it just makes me so
fucking angry.</p>
<p>So I need to set myself walls, mostly mental walls:</p>
<ul>
<li>Open The Site only ~5 times a day. Less is better. Zero is bets.</li>
<li>If I break the rule, don't blame yourself. Just close it when realising and keep it in mind.</li>
</ul>
<p>It's important to not tell yourself you're a failure because that goes to the
"well might do it anyway since I failed" thinking and then you're back to square one.</p>
<p>Self-control is something that is very difficult when I'm being emotional. But I think I can do it.</p>
<h3 id="i-should-use-my-blog-for-personal-things-too"><a class="zola-anchor" href="#i-should-use-my-blog-for-personal-things-too" aria-label="Anchor link for: i-should-use-my-blog-for-personal-things-too">I should use my blog for personal things too</a></h3>
<p>Since social media is addicting, but I like to write my thoughts.. Well,
I should do it here instead!</p>
<p>I think writing things down like this and sharing the blog post is much more
better for my health than making ranty fedi threads or whatever.</p>
<p>Also I just find writing blog posts fun. I've actually avoided
writing more personal posts here because "people are not going to like it."</p>
<p>Well fuck the people, this is my blog and I'll write what I want.
Pee pee poo poo.</p>
<p>If you want to comment on the thing, too bad. I don't have comments here.
You can email me if you want I guess. Or comment on the fedi post I link this
to. But otherwise, nah.</p>
<h2 id="internet-comments-are-waste-of-time-for-me"><a class="zola-anchor" href="#internet-comments-are-waste-of-time-for-me" aria-label="Anchor link for: internet-comments-are-waste-of-time-for-me">Internet comments are waste of time for me</a></h2>
<p>I don't know when I learn this lesson. I keep commenting on things because I disagree
with someone. Then I find myself in the addiction of the frustrated/passionate feedback loop.</p>
<p>It's all just fucking useless. If I want to have conversation, it's way better for
me to do it in a chat application. Unless, it's about something like a tutorial or
project or similar. But for the run of the mill topics like "did you play this game" it's
just much more sensible to do it in a chat app.</p>
<h2 id="tiredness-does-not-help"><a class="zola-anchor" href="#tiredness-does-not-help" aria-label="Anchor link for: tiredness-does-not-help">Tiredness does not help</a></h2>
<p>Due to the burnout I am also tired. I can fall asleep easily in middle of a day,
and I actually really dislike that. I would rather do something like smack goblins with a sword in
Cyrodiil or something. Anything else.</p>
<p>But I am tired because my mind is tired and I just need to allow it the time it needs.
That's fine. I hope you, reader, also allow your brain to rest too.</p>
<p>Burnout is not really <em>evil</em>, it's just a state where your brain ran out of any reserves
because <em>life happened</em> and you just need to allow it to recover.</p>
<p>But man being tired is annoying.</p>
<h2 id="writing-notes-and-journals-by-hand"><a class="zola-anchor" href="#writing-notes-and-journals-by-hand" aria-label="Anchor link for: writing-notes-and-journals-by-hand">Writing notes and journals by hand</a></h2>
<p>Since I got my <a href="https://remarkable.com/products/remarkable-2">reMarkable 2</a> notebook second-hand,
I've been using it almost daily to write journals.</p>
<p>I have two journals, work and personal.</p>
<ul>
<li>For personal, it's mostly ramblings like this but in bullet point form.
<ul>
<li>Any specific things that happened</li>
<li>What I like, what I dislike, with emotions next to them</li>
</ul>
</li>
<li>For work, it's "what I did, how I did, did I finish task" etc.
<ul>
<li>Actual tasks I have in a markdown to-do file.</li>
<li>I gave up on timing tasks, using caldav tasks and orgmode etc.</li>
<li>I just need simple lists with least amount overhead as possible!</li>
</ul>
</li>
</ul>
<p>Both journals do not have any rigid form. If I try to follow some "ruleset"
for notetaking, I end up making sure the rules are correct and everything is neatly
placed, instead of actually taking notes..</p>
<p>Anyway, it's been fantastic. I could do this with regular journal too, but
I have a thing for e-ink which motivates me to use it more. Idk how to explain it,
my autism just loves interacting wit e-ink.</p>
<p>When I write journals down by hand, I actually remember all the important bits, at least
for the day. And with reMarkable I can turn handwriting into text if I need it to
be searchable. It works surprisingly well.</p>
<p>I'm sure there's tons of privacy issues with using the reMarkable cloud and whatnot,
but I will allow myself to have some convenience, as a treat.</p>
<h2 id="i-got-a-tattoo"><a class="zola-anchor" href="#i-got-a-tattoo" aria-label="Anchor link for: i-got-a-tattoo">I got a tattoo</a></h2>
<p>I got a cool tattoo. I am waiting for it to heal proper, and will
then share photos of it here.</p>
<p>If you cannot wait, I already have posted a photo of it to fedi: <a href="https://scalie.zone/@aks/114579821093455212">Akseli :quake_verified: :kde:: "Tattoo get" - Scalie Zone</a></p>
<p>But I want to take a better photo of it for here. Maybe mixed with my cosplay, something fun!</p>
<p>The tattooing process was rather okay at first, very painful in the end, and now recovering
from taking it has been adding to being tired. But I am very happy with the tattoo.
Anyway, I'll write more about it when I make the image post.</p>
<h2 id="there-is-no-conclusion-to-these-posts"><a class="zola-anchor" href="#there-is-no-conclusion-to-these-posts" aria-label="Anchor link for: there-is-no-conclusion-to-these-posts">There is no conclusion to these posts</a></h2>
<p>There's no specific notes to end on. I just wanted to write something.
I will preface these posts with <code>Ramble</code> and tag them as such,
so it's easy to ignore them.</p>
<p>I will be doing this more often, I hope. It's my blog.
And I genuinely enjoy writing rambly things.
I think it's just better to do it in here than on fedi and get then stuck
on browsing fedi.</p>
<p>glhf kkthxbai</p>
My changes to saving Konsole tab layoutsSun, 18 May 2025 14:47:10 +0000Akselikonsolekdeterminal
https://akselmo.dev/posts/konsole-layout-changes/
https://akselmo.dev/posts/konsole-layout-changes/<p>I recently made a patch to <a href="https://konsole.kde.org/">Konsole</a> terminal emulator, that<span id="continue-reading"></span>
adds to the current tab layout saving system couple more things:</p>
<ul>
<li>Working directory</li>
<li>Size of splits</li>
<li>Optional command to run</li>
</ul>
<p>You can find the patch here: <a href="https://invent.kde.org/utilities/konsole/-/merge_requests/1095">ViewManager: Save columns, lines and working directory to tabLayout (!1095)</a></p>
<p>It's a feature I've seen in other terminal editors, so I wanted to add it to Konsole as well.</p>
<p><strong>Note that this is not in current version of Konsole, but it will be in the next one: 25.07</strong>.
Unless it gets backported, of course.</p>
<h2 id="current-tab-layouts"><a class="zola-anchor" href="#current-tab-layouts" aria-label="Anchor link for: current-tab-layouts">Current tab layouts</a></h2>
<p>In Konsole, you can even in current version save your tab layout:</p>
<ol>
<li>Open Konsole</li>
<li>Split the current view into multiple ones</li>
<li>Go to Menu -> View -> Save tab layout...</li>
</ol>
<p>This produces a JSON file like this:</p>
<pre data-lang="json" style="background-color:#181818;color:#ffffff;" class="language-json "><code class="language-json" data-lang="json"><span>{
</span><span> </span><span style="color:#5fff33;">"Orientation"</span><span>: </span><span style="color:#5fff33;">"Vertical"</span><span>,
</span><span> </span><span style="color:#5fff33;">"Widgets"</span><span>: [
</span><span> {
</span><span> </span><span style="color:#5fff33;">"SessionRestoreId"</span><span>: </span><span style="color:#ff9233;">0
</span><span> },
</span><span> {
</span><span> </span><span style="color:#5fff33;">"SessionRestoreId"</span><span>: </span><span style="color:#ff9233;">0
</span><span> }
</span><span> ]
</span><span>}
</span></code></pre>
<p>Now, as it is currently, it's not that useful. The split sizes won't be saved,
for example.</p>
<h2 id="my-changes"><a class="zola-anchor" href="#my-changes" aria-label="Anchor link for: my-changes">My changes</a></h2>
<p>My changes now allow you to save the size of the splits and the working directories, like this:</p>
<pre data-lang="json" style="background-color:#181818;color:#ffffff;" class="language-json "><code class="language-json" data-lang="json"><span>{
</span><span> </span><span style="color:#5fff33;">"Orientation"</span><span>: </span><span style="color:#5fff33;">"Horizontal"</span><span>,
</span><span> </span><span style="color:#5fff33;">"Widgets"</span><span>: [
</span><span> {
</span><span> </span><span style="color:#5fff33;">"Columns"</span><span>: </span><span style="color:#ff9233;">88</span><span>,
</span><span> </span><span style="color:#5fff33;">"Command"</span><span>: </span><span style="color:#5fff33;">""</span><span>,
</span><span> </span><span style="color:#5fff33;">"Lines"</span><span>: </span><span style="color:#ff9233;">33</span><span>,
</span><span> </span><span style="color:#5fff33;">"SessionRestoreId"</span><span>: </span><span style="color:#ff9233;">0</span><span>,
</span><span> </span><span style="color:#5fff33;">"WorkingDirectory"</span><span>: </span><span style="color:#5fff33;">"/home/akseli/Repositories"
</span><span> },
</span><span> {
</span><span> </span><span style="color:#5fff33;">"Orientation"</span><span>: </span><span style="color:#5fff33;">"Vertical"</span><span>,
</span><span> </span><span style="color:#5fff33;">"Widgets"</span><span>: [
</span><span> {
</span><span> </span><span style="color:#5fff33;">"Columns"</span><span>: </span><span style="color:#ff9233;">33</span><span>,
</span><span> </span><span style="color:#5fff33;">"Command"</span><span>: </span><span style="color:#5fff33;">""</span><span>,
</span><span> </span><span style="color:#5fff33;">"Lines"</span><span>: </span><span style="color:#ff9233;">21</span><span>,
</span><span> </span><span style="color:#5fff33;">"SessionRestoreId"</span><span>: </span><span style="color:#ff9233;">0</span><span>,
</span><span> </span><span style="color:#5fff33;">"WorkingDirectory"</span><span>: </span><span style="color:#5fff33;">"/home/akseli/Documents"
</span><span> },
</span><span> {
</span><span> </span><span style="color:#5fff33;">"Columns"</span><span>: </span><span style="color:#ff9233;">33</span><span>,
</span><span> </span><span style="color:#5fff33;">"Command"</span><span>: </span><span style="color:#5fff33;">""</span><span>,
</span><span> </span><span style="color:#5fff33;">"Lines"</span><span>: </span><span style="color:#ff9233;">10</span><span>,
</span><span> </span><span style="color:#5fff33;">"SessionRestoreId"</span><span>: </span><span style="color:#ff9233;">0</span><span>,
</span><span> </span><span style="color:#5fff33;">"WorkingDirectory"</span><span>: </span><span style="color:#5fff33;">"/home/akseli"
</span><span> }
</span><span> ]
</span><span> }
</span><span> ]
</span><span>}
</span></code></pre>
<p>As you can see, it saves the Columns, Lines, WorkingDirectory. It also adds empty Command
item, which you can write any command in, like <code>ls -la</code>, or keep it empty.</p>
<p>You can try to use the columns and lines sections to modify the size manually,
but I've noticed it's easier just to do it inside Konsole.</p>
<p>Now the old layout file will work too, if the field doesn't exist
Konsole won't do anything about it.</p>
<p>Note about the command: Konsole basically pretends to type that command in when it loads, so
the commands don't need a separate Parameter field or anything like that. You could make the command
something like <code>foo && bar -t example && baz --parameter</code>. Konsole then just types
that in and presses enter for you. :)</p>
<h3 id="more-concrete-example"><a class="zola-anchor" href="#more-concrete-example" aria-label="Anchor link for: more-concrete-example">More concrete example</a></h3>
<p>I made this change because I wanted to run Konsole in following layout:</p>
<pre data-lang="json" style="background-color:#181818;color:#ffffff;" class="language-json "><code class="language-json" data-lang="json"><span>{
</span><span> </span><span style="color:#5fff33;">"Orientation"</span><span>: </span><span style="color:#5fff33;">"Horizontal"</span><span>,
</span><span> </span><span style="color:#5fff33;">"Widgets"</span><span>: [
</span><span> {
</span><span> </span><span style="color:#5fff33;">"Orientation"</span><span>: </span><span style="color:#5fff33;">"Vertical"</span><span>,
</span><span> </span><span style="color:#5fff33;">"Widgets"</span><span>: [
</span><span> {
</span><span> </span><span style="color:#5fff33;">"Columns"</span><span>: </span><span style="color:#ff9233;">139</span><span>,
</span><span> </span><span style="color:#5fff33;">"Command"</span><span>: </span><span style="color:#5fff33;">"hx ."</span><span>,
</span><span> </span><span style="color:#5fff33;">"Lines"</span><span>: </span><span style="color:#ff9233;">50</span><span>,
</span><span> </span><span style="color:#5fff33;">"SessionRestoreId"</span><span>: </span><span style="color:#ff9233;">0
</span><span> },
</span><span> {
</span><span> </span><span style="color:#5fff33;">"Columns"</span><span>: </span><span style="color:#ff9233;">139</span><span>,
</span><span> </span><span style="color:#5fff33;">"Command"</span><span>: </span><span style="color:#5fff33;">""</span><span>,
</span><span> </span><span style="color:#5fff33;">"Lines"</span><span>: </span><span style="color:#ff9233;">14</span><span>,
</span><span> </span><span style="color:#5fff33;">"SessionRestoreId"</span><span>: </span><span style="color:#ff9233;">0
</span><span> }
</span><span> ]
</span><span> },
</span><span> {
</span><span> </span><span style="color:#5fff33;">"Columns"</span><span>: </span><span style="color:#ff9233;">60</span><span>,
</span><span> </span><span style="color:#5fff33;">"Command"</span><span>: </span><span style="color:#5fff33;">"lazygit"</span><span>,
</span><span> </span><span style="color:#5fff33;">"Lines"</span><span>: </span><span style="color:#ff9233;">66</span><span>,
</span><span> </span><span style="color:#5fff33;">"SessionRestoreId"</span><span>: </span><span style="color:#ff9233;">0
</span><span> }
</span><span> ]
</span><span>}
</span></code></pre>
<p>With these items I can get the layout splits as I want, with any commands I want.</p>
<p>Then I have a bash script to run this layout in the directory the script is run at:</p>
<pre data-lang="bash" style="background-color:#181818;color:#ffffff;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#808080;">#!/usr/bin/env bash
</span><span>konsole</span><span style="color:#ff9233;"> --separate --hold --workdir </span><span style="color:#5fff33;">"$</span><span>1</span><span style="color:#5fff33;">"</span><span style="color:#ff9233;"> --layout </span><span style="color:#5fff33;">"$</span><span>HOME</span><span style="color:#5fff33;">/Documents/helix-editor.json" </span><span style="font-weight:bold;color:#33ffa0;">&
</span></code></pre>
<p>Now when I go to any project folder and run this script, it will open the <a href="https://helix-editor.com/">Helix</a> text editor,
<a href="https://github.com/jesseduffield/lazygit">lazygit</a> and empty split the way I want it, without
having to make these splits manually every time.</p>
<p><a href="/assets/images/konsole/splits.png"><img src="/assets/images/konsole/splits.png" alt="Preview of Konsole and splits of editor and git" /></a></p>
<p>Sure I could use something like <a href="https://zellij.dev/">Zellij</a> for this but they have so much things
I don't need, I just wanted to split the view and save/load that arrangement.</p>
<h2 id="in-future"><a class="zola-anchor" href="#in-future" aria-label="Anchor link for: in-future">In future</a></h2>
<p>I would like to add a small GUI tool inside Konsole that allows you to customize
these layout easily during save process, such as changing the WorkingDirectory and
Command parameters.</p>
<p>But for now, you'll have to do it inside the JSON file, but chances are
when you want to do layouts like this, you're comfortable editing these kind
of files anyway.</p>
<p>I hope some others will find this useful as well, for things
like system monitoring etc.</p>
<p>Hope you like it!</p>
Kummacon 2025 cosplay photosSat, 17 May 2025 19:01:42 +0000Akselicosplaykummacongalleryphotos
https://akselmo.dev/posts/kummacon-2025-cosplay/
https://akselmo.dev/posts/kummacon-2025-cosplay/<p>I visited Kummacon today and it was fun! Saw a lot of cool art and trinkets<span id="continue-reading"></span>
on display, bought myself a tiny skeleton dinosaur necklace.</p>
<p>I spent the whole time there in my cosplay, it wasn't luckily too
hot but inside the con area I was sweating a ton in this suit.</p>
<p>The photos were taken by <a href="https://www.instagram.com/mediakettu/">mediakettu</a>.</p>
<p>The lizard suit (head, feet, hands and tail) were made by <a href="https://www.lisanotuspaja.com/en/">Lisan Otuspaja</a></p>
<p>Hope to visit other cons this year too if at all possible!</p>
<h1 id="kummacon-2025"><a class="zola-anchor" href="#kummacon-2025" aria-label="Anchor link for: kummacon-2025">Kummacon 2025</a></h1>
<div>
<div>
<a href="https://akselmo.dev/assets/images/cosplay2025/kummacon/huntra_and_waifu1.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/huntra_and_waifu1.f03f6542dce6371d.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2025/kummacon/huntra_and_waifu2.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/huntra_and_waifu2.e2dfbf5d48f4311f.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2025/kummacon/huntra_and_waifu3.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/huntra_and_waifu3.502ac340e653594b.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2025/kummacon/huntra_boo.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/huntra_boo.c51e411a05096813.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2025/kummacon/huntra_lean1.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/huntra_lean1.830468d18df03281.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2025/kummacon/huntra_lean2.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/huntra_lean2.516f9744d9f91955.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2025/kummacon/huntra_hat.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/huntra_hat.d119dcbe151270ab.jpg" />
</a>
</div>
</div>
<p>The first three photos I am with my wife. :)</p>
<p><em>(Don't mind the blurry green hat photo, I tried to blur the background myself, I am not good with image editing lol)</em></p>
Forgejo webhook to auto-update my blog and my frustrationsSun, 11 May 2025 00:00:00 +0000Akseliserversforgejowebhookrant
https://akselmo.dev/posts/forgejo-webhook-to-update-my-blog/
https://akselmo.dev/posts/forgejo-webhook-to-update-my-blog/<p>Preface: <strong>I am really bad with servers.</strong> I actually dislike working with them, most of the time.<span id="continue-reading"></span>
Setting up ports and proxies and other stuff just really frustrates me.
It's like washing dishes by hand: I just want to get it over with.</p>
<p>I wanted my blog to automagically update whenever I make a git push.</p>
<p>My first iteration was "have a script poll the git repo every minute and then update."
Works, but is bad for everyone involved.</p>
<p>So I looked into setting up <a href="https://forgejo.org/docs/v1.19/user/webhooks/">Forgejo webhooks</a> to work with this on my own server.
I know Codeberg has their own site thing, but I have my own setup for everything on my own
server, since I don't want my blog repository and building and whatnot to be tied to
singular git forge.</p>
<h2 id="blog-setup"><a class="zola-anchor" href="#blog-setup" aria-label="Anchor link for: blog-setup">Blog setup</a></h2>
<p>My blog runs in a random Debian 12 VPS somewhere in Germany.
It uses <a href="https://github.com/getzola/zola">Zola</a> for generating the site.</p>
<p>At some point I just may write my own generator because why not.</p>
<p>Anyhow, before this webhook automation, what I used to do is:</p>
<ul>
<li>Write article</li>
<li>SSH to the server</li>
<li>Run <a href="https://codeberg.org/akselmo/aksdev_zola_blog/src/branch/main/deploy.sh">./deploy.sh</a></li>
<li>Logout</li>
</ul>
<p>It's not really much work to do, but when I just want to write something, it was bit annoying
to do that, so I often ended up not even writing.</p>
<p>I wanted to automate it so I can allow myself to write shorter posts, and encourage myself to write more often.</p>
<h2 id="setting-up-my-server"><a class="zola-anchor" href="#setting-up-my-server" aria-label="Anchor link for: setting-up-my-server">Setting up my server</a></h2>
<p>First I wanted to find out a thing that would allow me to listen for webhook and then run a command.</p>
<h2 id="webhook"><a class="zola-anchor" href="#webhook" aria-label="Anchor link for: webhook">Webhook</a></h2>
<p>I found this thing that is in Debian repos as well: <a href="https://github.com/adnanh/webhook/">webhook</a></p>
<p>It was pretty straightforward to set up. I ended up with a JSON file the webhook binary uses, which looks like this:</p>
<pre data-lang="json" style="background-color:#181818;color:#ffffff;" class="language-json "><code class="language-json" data-lang="json"><span>[
</span><span> {
</span><span> </span><span style="color:#5fff33;">"id"</span><span>: </span><span style="color:#5fff33;">"deploy-blog"</span><span>,
</span><span> </span><span style="color:#5fff33;">"execute-command"</span><span>: </span><span style="color:#5fff33;">"./deploy_blog.sh"</span><span>,
</span><span> </span><span style="color:#5fff33;">"command-working-directory"</span><span>: </span><span style="color:#5fff33;">"/root"</span><span>,
</span><span> </span><span style="color:#5fff33;">"trigger-rule"</span><span>:
</span><span> {
</span><span> </span><span style="color:#5fff33;">"match"</span><span>:
</span><span> {
</span><span> </span><span style="color:#5fff33;">"type"</span><span>: </span><span style="color:#5fff33;">"value"</span><span>,
</span><span> </span><span style="color:#5fff33;">"value"</span><span>: </span><span style="color:#5fff33;">"Alright then, keep your secrets"</span><span>,
</span><span> </span><span style="color:#5fff33;">"parameter"</span><span>:
</span><span> {
</span><span> </span><span style="color:#5fff33;">"source"</span><span>: </span><span style="color:#5fff33;">"url"</span><span>,
</span><span> </span><span style="color:#5fff33;">"name"</span><span>:</span><span style="color:#5fff33;">"secret"
</span><span> }
</span><span> }
</span><span> }
</span><span> }
</span><span>]
</span></code></pre>
<p>The <code>deploy_blog.sh</code> goes to the blog folder and runs the <code>./deploy.sh</code> I linked earlier.</p>
<p>Then, I run the webhook thing with <code>webhook -hooks hooks.json -verbose</code>.
Of course, like a proper sysadmin I am, I am running this thing in <code>screen</code> because I'm super
lazy and I haven't written systemd unit files yet for this.</p>
<p>After that, of course, I need to open the port the <code>webhook</code> tool uses: <code>sudo ufw allow 9000</code>.</p>
<h2 id="apache2"><a class="zola-anchor" href="#apache2" aria-label="Anchor link for: apache2">Apache2</a></h2>
<p>My server setup is ancient and uses Apache2 to set things up. I could move to Nginx, I don't really
care what it's using, I equally dislike using either.</p>
<p>You have to understand that I <em>really really rather be doing anything else than this</em>. I don't care
about what is the best tool. I care about what works with the least amount of pain and misery.
I am not going to change shit around because of internet comments. So you can hold those in.</p>
<p>To make sure Apache2 can see the messages sent to this webhook program, this is what I did to it
in my website config.</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span><VirtualHost *:9000>
</span><span> ServerName akselmo.dev
</span><span> ServerAlias www.akselmo.dev
</span><span>
</span><span> ProxyPreserveHost On
</span><span>
</span><span> ProxyPass "/" "http://0.0.0.0:9000/"
</span><span> ProxyPassReverse "/" "http://0.0.0.0:9000/"
</span><span></VirtualHost>
</span></code></pre>
<p>I had no idea if it works or not, but with trial and error I got it to working with the above.
Yay!</p>
<h2 id="codeberg-hook"><a class="zola-anchor" href="#codeberg-hook" aria-label="Anchor link for: codeberg-hook">Codeberg hook</a></h2>
<p>In Codeberg, I added the new webhook to my repo settings:</p>
<ul>
<li>Target URL: <code>http://akselmo.dev:9000/hooks/deploy-blog?secret=Alright then, keep your secrets</code></li>
<li>HTTP method: <code>POST</code></li>
<li>POST content type: <code>application/json</code></li>
</ul>
<p>Rest I kept empty or in defaults. Everything than target URL is default, really.</p>
<p>The test delivery button in the webhook page made the webhook binary on my
server print text. All is good.</p>
<p>I wanted to use the <code>Secret</code> field for the secret key but I couldn't figure out how.</p>
<h2 id="ending-rant"><a class="zola-anchor" href="#ending-rant" aria-label="Anchor link for: ending-rant">Ending rant</a></h2>
<p>And that's it. I am annoyed but I got it to work. This kind of stuff is really
not for me, I rather pay someone else to do server stuff for me.</p>
<p><strong>Sysadmins are the unsung heroes of our industry.</strong> I have no idea how you lot do this without
wanting to punch a wall every five seconds. Even the most basic shit I just did here
was really frustrating to me. You have all my respect, and more.</p>
<p>Maybe it's just me. I'm way happier writing native programs and not interacting with the web
that much with them.</p>
<p>Setting this up took way longer than I wanted, but at least it's done now.
Maybe this post will help equally frustrated person.</p>
<p>Thanks for reading this bad post. lol</p>
Anubis protects this blog nowThu, 08 May 2025 00:00:00 +0000Akselianubisserverswebshort
https://akselmo.dev/posts/anubis-enabled/
https://akselmo.dev/posts/anubis-enabled/<p><strong>Edit:</strong> I disabled Anubis for now.<span id="continue-reading"></span></p>
<p>The thing is, my blog is really not that affected by the bots,
and I have to admit, I prefer to have my blog as Javascript free as
possible. (I still have goatcounter javascript but it can be blocked, Anubis can't.)</p>
<p>However, I have now tested out the Anubis stuff and can enable it
pretty quickly if needed!</p>
<p>Nothing against Anubis, I think it's a great tool and it was
quite easy to get set up. But for now, I don't think my blog
really <em>needs</em> it.</p>
<p>Old post below.</p>
<hr />
<p>Hey all, just wanted to let you know that I added the <a href="https://github.com/TecharoHQ/anubis/">Anubis</a>
"AI" scraping blocker tool thing to my blog now.</p>
<p>Now you will see a fun mascot and a loading bar before opening the site.
Then it just lets you in.</p>
<p>I kinda did not want to add it but seems that thanks to "AI" bullshit,
we kind of have to do this to protect our websites, at least for now.</p>
<p>Anyway, if you have any problems with the RSS feed after this, let me know!</p>
Kate and Python language serverSat, 03 May 2025 00:00:00 +0000Akselikdekatepythonlsplanguage-server
https://akselmo.dev/posts/kate-python-lsp/
https://akselmo.dev/posts/kate-python-lsp/<p>As much as I love Kate editor, as I mentioned in my <a href="https://akselmo.dev/posts/how-i-use-kate-editor/">previous post</a>, setting up Python language server<span id="continue-reading"></span>
has always been a bit fiddly if you want it to work with
virtual environments.</p>
<p>However thanks to Kate documentation and some Big Think:tm:, I managed to
figure it out, and now I wish to share it.</p>
<p>I could just show the code and that's it, but I wanted to write
this so that someone new-ish has easier time to understanding
what to do.</p>
<h2 id="language-server-python-lsp-server"><a class="zola-anchor" href="#language-server-python-lsp-server" aria-label="Anchor link for: language-server-python-lsp-server">Language server: python-lsp-server</a></h2>
<p>The language server I am talking about in this instance is the <a href="https://github.com/python-lsp/python-lsp-server/#configuration">python-lsp-server</a>.
VSCode uses something called <a href="https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance">Pylance</a>, but that's proprietary and probably can't
ever be made to work with any other editors.
One thing I do miss from Pylance is the easy way to make it work with virtual environments.</p>
<p><em>Also silly side tangent, I kinda find it weird people call them "LSP" and not "LS" or "language server."</em>
<em>LSP means Language Server Protocol, which is how the language server talks to your editor..</em>
<em>I mean I know it doesn't matter but it's a silly pet-peeve.</em></p>
<h3 id="python-language-server-plugins"><a class="zola-anchor" href="#python-language-server-plugins" aria-label="Anchor link for: python-language-server-plugins">Python language server plugins</a></h3>
<p>I also want to utilize <a href="https://docs.astral.sh/ruff/">ruff</a> which is a nice linter
and formatter for Python. To use it with the language server,
you need to use <a href="https://github.com/python-lsp/python-lsp-ruff">python-lsp-ruff</a>.
This makes the language server use ruff instead of it's own built-in things.</p>
<h2 id="configurations-for-virtual-environments"><a class="zola-anchor" href="#configurations-for-virtual-environments" aria-label="Anchor link for: configurations-for-virtual-environments">Configurations for virtual environments</a></h2>
<p>Kate docs actually mention this part. Search the <a href="https://docs.kde.org/stable5/en/kate/kate/kate-application-plugin-lspclient.html">documentation</a> for <code>pylsp_in_env</code>.
It's a bash script which we will be making, but with a tiny twist.</p>
<h3 id="bash-script"><a class="zola-anchor" href="#bash-script" aria-label="Anchor link for: bash-script">Bash script</a></h3>
<p>We need to create a bash script called <code>pylsp_in_env</code> (or whatever you desire) which Kate will use to figure out the virtual environment before
running the language server.</p>
<p>It's rather simple script:</p>
<pre data-lang="bash" style="background-color:#181818;color:#ffffff;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#808080;">#!/usr/bin/env bash
</span><span>
</span><span>path</span><span style="font-weight:bold;color:#33ffa0;">=</span><span style="color:#5fff33;">$</span><span>1
</span><span style="color:#838fff;">cd </span><span>$path
</span><span style="font-weight:bold;color:#33ffa0;">if </span><span style="color:#838fff;">[ </span><span style="color:#ff9233;">-d </span><span style="color:#5fff33;">"${</span><span>path</span><span style="color:#5fff33;">}/.venv" </span><span style="color:#838fff;">]</span><span style="font-weight:bold;color:#33ffa0;">; then
</span><span> </span><span style="color:#838fff;">source </span><span>$1/.venv/bin/activate
</span><span style="font-weight:bold;color:#33ffa0;">fi
</span><span>
</span><span style="font-weight:bold;color:#33ffa0;">if </span><span style="color:#838fff;">[ </span><span style="color:#ff9233;">-d </span><span style="color:#5fff33;">"${</span><span>path</span><span style="color:#5fff33;">}/venv" </span><span style="color:#838fff;">]</span><span style="font-weight:bold;color:#33ffa0;">; then
</span><span> </span><span style="color:#838fff;">source </span><span>$1/venv/bin/activate
</span><span style="font-weight:bold;color:#33ffa0;">fi
</span><span>
</span><span style="color:#838fff;">exec</span><span> pylsp --check-parent-process
</span><span>
</span></code></pre>
<p>What we do here, instead of the documented example, is to check
where the <code>activate</code> script actually is.
Some people prefer having it <code>.venv</code> and some <code>venv</code> and there's other names too I'm sure.</p>
<p>So we get the path from the command, then source the virtual environment
in right folder, and then execute the <code>pylsp --check-parent-process</code>
as Kate would do by default.</p>
<p>Save this this to your <code>$PATH</code> somewhere so that Kate can see it, or alternatively
add the path to your Kate settings. This PATH setting is in <code>Kate 25.04.0</code> at least.
Don't forget to <code>chmod +x ./pylsp_in_env</code> so that it has the execution permissions</p>
<h3 id="kate-lsp-config"><a class="zola-anchor" href="#kate-lsp-config" aria-label="Anchor link for: kate-lsp-config">Kate LSP config</a></h3>
<p>Finally, just add this to your Kate LSP config file:</p>
<pre data-lang="json" style="background-color:#181818;color:#ffffff;" class="language-json "><code class="language-json" data-lang="json"><span>{
</span><span> </span><span style="color:#5fff33;">"servers"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"python"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"command"</span><span>: [
</span><span> </span><span style="color:#5fff33;">"pylsp_in_env"</span><span>, </span><span style="color:#5fff33;">"%{Project:NativePath}"
</span><span> ],
</span><span> </span><span style="color:#5fff33;">"root"</span><span>: </span><span style="color:#5fff33;">"."</span><span>,
</span><span> </span><span style="color:#5fff33;">"url"</span><span>: </span><span style="color:#5fff33;">"https://github.com/python-lsp/python-lsp-server"</span><span>,
</span><span> </span><span style="color:#5fff33;">"highlightingModeRegex"</span><span>: </span><span style="color:#5fff33;">"^Python$"</span><span>,
</span><span> </span><span style="color:#5fff33;">"settings"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"pylsp"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"plugins"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"ruff"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"enabled"</span><span>: </span><span style="color:#ff9233;">true
</span><span> }
</span><span> }
</span><span> }
</span><span> }
</span><span> }
</span><span> }
</span><span>}
</span></code></pre>
<p>Of course, if you have more language servers in your config, make sure
to add the above part next to them.</p>
<p>If you don't want to use ruff, you can remove the whole <code>settings</code> bit.</p>
<p>What I wanted to note here is that Kate now gives the full path to the python project
using the <code>%{Project:NativePath}</code> argument. There's more of these <code>%{}</code> items in Kate, which can be found by scouring the documentation.</p>
<h2 id="done"><a class="zola-anchor" href="#done" aria-label="Anchor link for: done">Done!</a></h2>
<p>That's pretty much it. Now restart the language servers from Kate menus, or restart Kate, and Kate is now aware of any of the virtual environments running inside your Python project.</p>
<p>Do note that I have no idea how <code>poetry</code> etc. do this. I think they may need some kind of different script. If I ever need to figure that out, I will extend this post or make new one.</p>
<p>If you read the Kate docs, you may have already understood what to do and done so. I however wanted to share my solution for this, which differs very slightly from the one in the documentation.</p>
<p>Thanks for reading, I hope this helps!</p>
How I use Kate EditorSun, 20 Apr 2025 00:00:00 +0000Akselikdekateeditorsprogramming
https://akselmo.dev/posts/how-i-use-kate-editor/
https://akselmo.dev/posts/how-i-use-kate-editor/<p>I love the <a href="https://kate-editor.org/">Kate Text editor</a>. I use it for pretty much all the programming projects I do.<span id="continue-reading"></span> Kate has been around for long time now, about 20 years! At least earliest blog post for it I could find was <a href="https://kate-editor.org/2004/01/06/writing-a-kate-plugin/">written in 2004.</a></p>
<p>I wanted to go over my workflow with it, why I like it so much and hopefully get more people to try it out.</p>
<p><a href="/assets/images/kate/kate-view.png"><img src="/assets/images/kate/kate-view.png" alt="My Kate setup" /></a></p>
<h2 id="how-i-set-up-my-editor"><a class="zola-anchor" href="#how-i-set-up-my-editor" aria-label="Anchor link for: how-i-set-up-my-editor">How I set up my editor</a></h2>
<p>Here's some settings I find important for my workflow. There's tons more
settings to fiddle with, but most of the defaults suffice for me very well.</p>
<h3 id="plugins-i-use"><a class="zola-anchor" href="#plugins-i-use" aria-label="Anchor link for: plugins-i-use">Plugins I use</a></h3>
<p>Here's a list of the plugins I have enabled. Some of them are self-explanatory, some I will go more in detail later.</p>
<ul>
<li>Build & Run</li>
<li>Color Picker</li>
<li>Colored Brackets</li>
<li>Document Preview</li>
<li>Docment Switcher</li>
<li>External Tools</li>
<li>Formatting</li>
<li>Git Blame</li>
<li>Kate Debugger</li>
<li>LSP Client</li>
<li>Open Link</li>
<li>Project Plugin</li>
<li>Search & Replace</li>
<li>Snippets</li>
<li>Terminal</li>
</ul>
<h3 id="move-and-split-views"><a class="zola-anchor" href="#move-and-split-views" aria-label="Anchor link for: move-and-split-views">Move and split views</a></h3>
<p>In Kate, most views are in their own little tabs. You can right click these tabs and select "Own section" which splits them into their own areas. In the screenshot I provided at start, you can see my Projects and Git view being split like this, so they can both be open at the same time.</p>
<p><img src="/assets/images/kate/split-context-menu.png" alt="Context menu for splitting panels" /></p>
<p>Do note that these are saved per session, so sessions can have different splits.</p>
<h3 id="language-server"><a class="zola-anchor" href="#language-server" aria-label="Anchor link for: language-server">Language server</a></h3>
<p>In LSP Client settings, you can toggle multiple things I won't go into detail in here.
What I do want to mention is the User Server Settings file, which can be edited from this menu.
To override some defaults, you can just copy the default setting from the default tab, put it in your own settings tab and then just change the values.</p>
<p>Here's my LSP settings: <a href="https://codeberg.org/akselmo/dotfiles/src/branch/main/kate/lspclient/settings.json">dotfiles/kate/lspclient/settings.json</a></p>
<h3 id="debug-adapters"><a class="zola-anchor" href="#debug-adapters" aria-label="Anchor link for: debug-adapters">Debug adapters</a></h3>
<p>Debugger settings work similarly to LSP setting, however you may have to restart Kate to recognize any new changes.</p>
<p>Here's my DAP settings: <a href="https://codeberg.org/akselmo/dotfiles/src/branch/main/kate/debugger/dap.json">dotfiles/kate/debugger/dap.json</a></p>
<h3 id="formatters"><a class="zola-anchor" href="#formatters" aria-label="Anchor link for: formatters">Formatters</a></h3>
<p>For code formatting, there's also it's own setting menu, however as of writing this <em>only the languages mentioned in default settings</em> are supported.</p>
<p>If you want to tell formatter to stop autoformatting, you can set it like this, using clang-formatter as example:</p>
<pre data-lang="json" style="background-color:#181818;color:#ffffff;" class="language-json "><code class="language-json" data-lang="json"><span>{
</span><span> </span><span style="color:#5fff33;">"clang-format"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"command"</span><span>: [
</span><span> </span><span style="color:#5fff33;">"clang-format"
</span><span> ],
</span><span> </span><span style="color:#5fff33;">"formatModifiedLinesOnly"</span><span>: </span><span style="color:#ff9233;">true</span><span>,
</span><span> </span><span style="color:#5fff33;">"formatOnSave"</span><span>: </span><span style="color:#ff9233;">false
</span><span> }
</span><span>}
</span></code></pre>
<p>Here's my formatting settings: <a href="https://codeberg.org/akselmo/dotfiles/src/branch/main/kate/formatting/settings.json">dotfiles/kate/formatting/settings.json</a></p>
<h3 id="shortcuts"><a class="zola-anchor" href="#shortcuts" aria-label="Anchor link for: shortcuts">Shortcuts</a></h3>
<p>Shortcuts are very personal thing and I encourage learning the defaults if at all possible. I have changed mine around a bit, for example <code>Ctrl+Shift+Space</code> for Quick Open and <code>Ctrl+Space</code> for Find action. More of these two later!</p>
<h3 id="path-setting"><a class="zola-anchor" href="#path-setting" aria-label="Anchor link for: path-setting">Path setting</a></h3>
<p>Kate can't always find language servers for example, if it can't resolve your path.
Use this path setting to load binaries from paths like <code>~/.local/bin</code>. You can find this under Behavior settings at least on Kate 25.04.</p>
<h2 id="sessions"><a class="zola-anchor" href="#sessions" aria-label="Anchor link for: sessions">Sessions</a></h2>
<p>Sessions are basically group of projects. Do not treat sessions as projects themselves, that will only cause sadness.</p>
<p>I have separated my Work and Personal projects in their own sessions. This means that during work day, I can right click the Kate icon, select Work session, and then Kate will always open for me in that session until I choose Personal session.</p>
<p>In session settings I have set Kate to always open the last used session because of this.</p>
<p>I highly recommend this way of working. You could also have sessions for differently themed projects: Gamedev, web, etc..</p>
<p>Just make sure to create at least one session when starting out, then you can use that as a template for the other sessions in Kate session manager.</p>
<p>When I used to write more notes with Kate, I had it's own Notes session with both my Notes folder as a project folder and my blog.</p>
<h2 id="colorschemes"><a class="zola-anchor" href="#colorschemes" aria-label="Anchor link for: colorschemes">Colorschemes</a></h2>
<p>Kate uses <a href="https://invent.kde.org/frameworks/kcolorscheme">KColorScheme</a> library for it's colorscheme needs. You can very easily to copy a ready colorscheme and then start modifying your own changes on top of it.</p>
<p>You can also create a completely new colorscheme if you wish, like I have done here: <a href="https://codeberg.org/akselmo/Revontuli/src/branch/main/Kate">Revontuli/Kate</a></p>
<p>The colorscheme files in the library are their own XML format which is not ideal IMO but it gets the job done.
It would be awesome if Kate supported <a href="https://tree-sitter.github.io/tree-sitter/">tree-sitter</a> but so far I haven't heard anyone trying to implement that.</p>
<h2 id="file-quick-switching"><a class="zola-anchor" href="#file-quick-switching" aria-label="Anchor link for: file-quick-switching">File quick switching</a></h2>
<p>I mentioned this earlier in shortcuts section. If you're like me and have multiple projects open, you can use the Quick switcher and start typing the filename you need to open.</p>
<p><img src="/assets/images/kate/quickswitch.png" alt="Quickswitcher being used" /></p>
<p>If you just want to open a specific project, you can type <code>project bla</code> and it will find that project for you from your project list.</p>
<p>This is why I have it bound to <code>Ctrl+Shift+Space</code>, so I can just press it and quickly find the file I need.</p>
<h2 id="action-search"><a class="zola-anchor" href="#action-search" aria-label="Anchor link for: action-search">Action search</a></h2>
<p>This is more interesting: Instead of searching for files, you can search for any action Kate has.</p>
<p>For example, if you want to look for terminal related actions, you can type "Terminal" and it lists everything plus any potential shortcuts.</p>
<p><img src="/assets/images/kate/actionsearch.png" alt="Action search being used" /></p>
<p><strong>Fun fact, you can use this in other KDE apps too, like Dolphin or Konsole!</strong> The default key combination for it is <code>ctrl+alt+i</code> but I use it so frequently I set it to <code>ctrl+space</code>.</p>
<h2 id="build-and-run"><a class="zola-anchor" href="#build-and-run" aria-label="Anchor link for: build-and-run">Build and Run</a></h2>
<p>The name of this plugin is a bit misleading IMO because it can do so much more than just build.</p>
<p><img src="/assets/images/kate/build-and-run.png" alt="Build and run view" /></p>
<p>In essence, it's a command runner. You can give the command a name, then build command and run command.</p>
<p>For example in the above image, my game project has only one command called <code>build</code> which has build command <code>odin build ./src -collection:src=src -debug -out:./build/ArtificialRage</code> and run command <code>odin run ./src -collection:src=src -debug -out:./build/ArtificialRage</code>.</p>
<p>I can then just use the action search to build and run my game project.</p>
<p>For your projects, you can then add file called <code>.kateproject.build</code> in your project root folder, so Kate will pick that up. They're just JSON files that look like this:</p>
<pre data-lang="json" style="background-color:#181818;color:#ffffff;" class="language-json "><code class="language-json" data-lang="json"><span>{
</span><span> </span><span style="color:#5fff33;">"target_sets"</span><span>: [
</span><span> {
</span><span> </span><span style="color:#5fff33;">"cmake_config"</span><span>: </span><span style="color:#5fff33;">""</span><span>,
</span><span> </span><span style="color:#5fff33;">"directory"</span><span>: </span><span style="color:#5fff33;">"/home/akseli/Repositories/artificial-rage/"</span><span>,
</span><span> </span><span style="color:#5fff33;">"loaded_via_cmake"</span><span>: </span><span style="color:#ff9233;">false</span><span>,
</span><span> </span><span style="color:#5fff33;">"name"</span><span>: </span><span style="color:#5fff33;">"artificial-rage"</span><span>,
</span><span> </span><span style="color:#5fff33;">"targets"</span><span>: [
</span><span> {
</span><span> </span><span style="color:#5fff33;">"build_cmd"</span><span>: </span><span style="color:#5fff33;">"odin build ./src -collection:src=src -debug -out:./build/ArtificialRage"</span><span>,
</span><span> </span><span style="color:#5fff33;">"name"</span><span>: </span><span style="color:#5fff33;">"build"</span><span>,
</span><span> </span><span style="color:#5fff33;">"run_cmd"</span><span>: </span><span style="color:#5fff33;">"odin run ./src -collection:src=src -debug -out:./build/ArtificialRage"
</span><span> }
</span><span> ]
</span><span> }
</span><span> ]
</span><span>}
</span><span>
</span></code></pre>
<p>The <code>.kateproject</code> files can store much more information about the project, but they are not very user facing yet sadly. Something on my eternal to-do list.</p>
<p>Also when running the commands, there's "Output" tab that shows the results. It's basically view to your terminal, but if you encounter an error or warning, and the output panel can parse the file and location from it,
you can click that item and it will open code at that position where the error/warning appeared.</p>
<h2 id="language-server-1"><a class="zola-anchor" href="#language-server-1" aria-label="Anchor link for: language-server-1">Language server</a></h2>
<p>As I mentioned above in the settings, Kate does have support for <a href="https://microsoft.github.io/language-server-protocol/">Language Server Protocol</a>, as long as they're found from the path Kate looks for them and are configured properly. It's very much the same support one would expect in any modern editor.</p>
<p>One thing I do use a bunch thanks to it is looking for references to specific symbol, searching symbols across all my open projects and symbol overview.</p>
<h2 id="debugger"><a class="zola-anchor" href="#debugger" aria-label="Anchor link for: debugger">Debugger</a></h2>
<p>Kate has support for <a href="https://microsoft.github.io/debug-adapter-protocol/">Debug Adapter Protocol</a>, which is the lesser known cousin of Language Server Protocol.</p>
<p>This allows you to debug applications visually with breakpoints, check the stacktrace by using <code>Locals and stack</code> panel, and so on.</p>
<p>As long as the configuration is correct, debug adapter is found in path, and the executable, working directory, etc are given to Kate correctly, it can debug things rather well. The debugger plugin has undergone bunch of polish lately so it's rather good for my use, especially with my game projects.</p>
<p><a href="/assets/images/kate/debug.png"><img src="/assets/images/kate/debug.png" alt="Debugging my game" /></a></p>
<p>For bigger things like debugging whole Plasma desktop, I still use gdb in terminal.</p>
<h2 id="terminal"><a class="zola-anchor" href="#terminal" aria-label="Anchor link for: terminal">Terminal</a></h2>
<p>Speaking of terminal, the terminal is just Konsole running inside it's own view. The terminal can be made to follow the folder of the file you're editing, and it will share the settings with Konsole.
You can also split the terminal from Kate if you need more views. Terminal tabs also work.</p>
<p>So it's essentially just Konsole embedded in Kate.</p>
<h2 id="git-integration"><a class="zola-anchor" href="#git-integration" aria-label="Anchor link for: git-integration">Git integration</a></h2>
<p>The git integration in Kate is simple-but-works. You can diff, stage and discard lines/hunks directly from the editor (I use this a lot).</p>
<p><img src="/assets/images/kate/git-diff.png" alt="Git diffing" /></p>
<p>Then of course, you can stage and unstage, commit, push, pull etc. directly from Kate.
As of writing this, you can't rebase yet, but for more complex tasks I tend to often use something like <a href="https://github.com/jesseduffield/lazygit">lazygit</a>, which I highly recommend.</p>
<p><img src="/assets/images/kate/git-staging.png" alt="Git staging" /></p>
<p>All of this has inline git blame, so you can see per line who did what and where. This is very handy in projects with multiple devs.</p>
<h2 id="snippets"><a class="zola-anchor" href="#snippets" aria-label="Anchor link for: snippets">Snippets</a></h2>
<p>Kate has a snippet plugin that allows one to create simple or super complex snippets, for example for boilerplate.</p>
<p><img src="/assets/images/kate/snippet.png" alt="Snippets tool" /></p>
<p>Here's example for my blog header snippet (don't mind the bad JS I wrote it very tired)</p>
<p>The snippet text, that will be pasted into a markdown file:</p>
<pre data-lang="yaml" style="background-color:#181818;color:#ffffff;" class="language-yaml "><code class="language-yaml" data-lang="yaml"><span style="color:#5fff33;">+++
</span><span style="color:#5fff33;">title = "${title}"
</span><span style="color:#5fff33;">date = ${justDate()}
</span><span style="color:#5fff33;">aliases = ["/${dateUrl()}/${lowerFilename()}.html"]
</span><span>[</span><span style="color:#5fff33;">taxonomies</span><span>]
</span><span style="color:#5fff33;">tags = ["${tag}",]
</span><span style="color:#5fff33;">+++
</span></code></pre>
<p>My ugly javascript mess for creating dynamic items:</p>
<pre data-lang="javascript" style="background-color:#181818;color:#ffffff;" class="language-javascript "><code class="language-javascript" data-lang="javascript"><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">fileName</span><span>() { </span><span style="font-weight:bold;color:#33ffa0;">return </span><span style="color:#d970ff;">document</span><span>.</span><span style="font-weight:bold;color:#838fff;">fileName</span><span>(); }
</span><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">fileUrl</span><span>() { </span><span style="font-weight:bold;color:#33ffa0;">return </span><span style="color:#d970ff;">document</span><span>.</span><span style="font-weight:bold;color:#838fff;">url</span><span>(); }
</span><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">encoding</span><span>() { </span><span style="font-weight:bold;color:#33ffa0;">return </span><span style="color:#d970ff;">document</span><span>.</span><span style="font-weight:bold;color:#838fff;">encoding</span><span>(); }
</span><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">selection</span><span>() { </span><span style="font-weight:bold;color:#33ffa0;">return </span><span>view.</span><span style="font-weight:bold;color:#838fff;">selectedText</span><span>(); }
</span><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">year</span><span>() { </span><span style="font-weight:bold;color:#33ffa0;">return new </span><span style="font-weight:bold;color:#838fff;">Date</span><span>().</span><span style="color:#838fff;">getFullYear</span><span>(); }
</span><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">upper</span><span>(</span><span style="color:#ff9233;">x</span><span>) { </span><span style="font-weight:bold;color:#33ffa0;">return </span><span>x.</span><span style="color:#838fff;">toUpperCase</span><span>(); }
</span><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">lower</span><span>(</span><span style="color:#ff9233;">x</span><span>) { </span><span style="font-weight:bold;color:#33ffa0;">return </span><span>x.</span><span style="color:#838fff;">toLowerCase</span><span>(); }
</span><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">today</span><span>() {
</span><span> </span><span style="color:#33ffff;">var </span><span>date </span><span style="font-weight:bold;color:#33ffa0;">= new </span><span style="font-weight:bold;color:#838fff;">Date</span><span>();
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return </span><span style="font-weight:bold;color:#838fff;">formatDate</span><span>(date);
</span><span>}
</span><span>
</span><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">padTo2Digits</span><span>(</span><span style="color:#ff9233;">num</span><span>) {
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return </span><span>num.</span><span style="color:#838fff;">toString</span><span>().</span><span style="font-weight:bold;color:#838fff;">padStart</span><span>(</span><span style="color:#ff9233;">2</span><span>, </span><span style="color:#5fff33;">'0'</span><span>);
</span><span>}
</span><span>
</span><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">getDateName</span><span>(</span><span style="color:#ff9233;">date</span><span>){
</span><span> </span><span style="color:#33ffff;">var </span><span>names </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>[</span><span style="color:#5fff33;">'Sun'</span><span>, </span><span style="color:#5fff33;">'Mon'</span><span>, </span><span style="color:#5fff33;">'Tue'</span><span>, </span><span style="color:#5fff33;">'Wed'</span><span>, </span><span style="color:#5fff33;">'Thu'</span><span>, </span><span style="color:#5fff33;">'Fri'</span><span>, </span><span style="color:#5fff33;">'Sat'</span><span>];
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return </span><span>names[date.</span><span style="color:#838fff;">getDay</span><span>()];
</span><span>}
</span><span>
</span><span style="color:#808080;">// 2024-06-13 Thu 10:00
</span><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">formatDate</span><span>(</span><span style="color:#ff9233;">date</span><span>) {
</span><span> </span><span style="color:#33ffff;">var </span><span>dateString </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>[
</span><span> date.</span><span style="color:#838fff;">getFullYear</span><span>(),
</span><span> </span><span style="font-weight:bold;color:#838fff;">padTo2Digits</span><span>(date.</span><span style="color:#838fff;">getMonth</span><span>() </span><span style="font-weight:bold;color:#33ffa0;">+ </span><span style="color:#ff9233;">1</span><span>),
</span><span> </span><span style="font-weight:bold;color:#838fff;">padTo2Digits</span><span>(date.</span><span style="color:#838fff;">getDate</span><span>()),
</span><span> ].</span><span style="color:#838fff;">join</span><span>(</span><span style="color:#5fff33;">'-'</span><span>);
</span><span>
</span><span> </span><span style="color:#33ffff;">var </span><span>dayName </span><span style="font-weight:bold;color:#33ffa0;">= </span><span style="font-weight:bold;color:#838fff;">getDateName</span><span>(date);
</span><span>
</span><span> </span><span style="color:#33ffff;">var </span><span>time </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>[
</span><span> </span><span style="font-weight:bold;color:#838fff;">padTo2Digits</span><span>(date.</span><span style="color:#838fff;">getHours</span><span>()),
</span><span> </span><span style="font-weight:bold;color:#838fff;">padTo2Digits</span><span>(date.</span><span style="color:#838fff;">getMinutes</span><span>())
</span><span> ].</span><span style="color:#838fff;">join</span><span>(</span><span style="color:#5fff33;">':'</span><span>);
</span><span>
</span><span> </span><span style="color:#33ffff;">var </span><span>timeString </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>dateString </span><span style="font-weight:bold;color:#33ffa0;">+ </span><span style="color:#5fff33;">" " </span><span style="font-weight:bold;color:#33ffa0;">+ </span><span>dayName </span><span style="font-weight:bold;color:#33ffa0;">+ </span><span style="color:#5fff33;">" " </span><span style="font-weight:bold;color:#33ffa0;">+ </span><span>time;
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return </span><span>timeString;
</span><span>}
</span><span>
</span><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">justDate</span><span>() {
</span><span> </span><span style="color:#33ffff;">var </span><span>date </span><span style="font-weight:bold;color:#33ffa0;">= new </span><span style="font-weight:bold;color:#838fff;">Date</span><span>();
</span><span> </span><span style="color:#33ffff;">var </span><span>dateString </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>[
</span><span> date.</span><span style="color:#838fff;">getFullYear</span><span>(),
</span><span> </span><span style="font-weight:bold;color:#838fff;">padTo2Digits</span><span>(date.</span><span style="color:#838fff;">getMonth</span><span>() </span><span style="font-weight:bold;color:#33ffa0;">+ </span><span style="color:#ff9233;">1</span><span>),
</span><span> </span><span style="font-weight:bold;color:#838fff;">padTo2Digits</span><span>(date.</span><span style="color:#838fff;">getDate</span><span>()),
</span><span> ].</span><span style="color:#838fff;">join</span><span>(</span><span style="color:#5fff33;">'-'</span><span>);
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return </span><span>dateString;
</span><span>}
</span><span>
</span><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">dateUrl</span><span>() {
</span><span> </span><span style="color:#33ffff;">var </span><span>date </span><span style="font-weight:bold;color:#33ffa0;">= new </span><span style="font-weight:bold;color:#838fff;">Date</span><span>();
</span><span> </span><span style="color:#33ffff;">var </span><span>dateString </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>[
</span><span> date.</span><span style="color:#838fff;">getFullYear</span><span>(),
</span><span> </span><span style="font-weight:bold;color:#838fff;">padTo2Digits</span><span>(date.</span><span style="color:#838fff;">getMonth</span><span>() </span><span style="font-weight:bold;color:#33ffa0;">+ </span><span style="color:#ff9233;">1</span><span>),
</span><span> </span><span style="font-weight:bold;color:#838fff;">padTo2Digits</span><span>(date.</span><span style="color:#838fff;">getDate</span><span>()),
</span><span> ].</span><span style="color:#838fff;">join</span><span>(</span><span style="color:#5fff33;">'/'</span><span>);
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return </span><span>dateString;
</span><span>}
</span><span>
</span><span style="color:#33ffff;">function </span><span style="font-weight:bold;color:#838fff;">lowerFilename</span><span>() {
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return </span><span style="font-weight:bold;color:#838fff;">lower</span><span>(</span><span style="font-weight:bold;color:#838fff;">fileName</span><span>());
</span><span>}
</span></code></pre>
<p>So yes, you can write Javascript to generate snippets for you, like here I've done with date and time, filename, etc.. It's super useful.</p>
<p>You can then use code-completion shortcut and type <code>snippet-namespace:snippet-name</code> and press enter, and it will run the snippet for you. You can make the snippets only appear for files in specific language.</p>
<p>It's a very very powerful tool for generating simple boilerplate code. Requires some upfront work but after that's done, it works wonders.</p>
<p>Here's also some of my markdown snippets: <a href="https://codeberg.org/akselmo/dotfiles/src/branch/main/kate/Markdown%20Snippets.xml">dotfiles/kate/Markdown Snippets.xml</a></p>
<h2 id="but-why-do-i-love-it-so"><a class="zola-anchor" href="#but-why-do-i-love-it-so" aria-label="Anchor link for: but-why-do-i-love-it-so">But why do I love it so</a></h2>
<p>Kate has basically all the features I need, out of the box, without having to download random extensions or plugins.
Sometimes I just have to enable plugins, maybe write and change some configurations.. But when that's done, it's all just there and I can start using it.</p>
<p>I tend to back up my configs to my dotfiles git, so I can just in subsequent installs use them immediately.</p>
<blockquote>
<p>Hang on, VSCode has all of this and more!</p>
</blockquote>
<p>You're right, VSCode has a lot of these things too. However with VSCode I've noticed that you have to sometimes download whole language as an extension.
Then, the extensions may clash with each other, especially if you have two extensions that do different things for the same thing: I remember having two CMake extensions where both had something I needed, but they both also overlap in some basic features, so it got very confusing.</p>
<p>That's probably all skill-issue of course. But I like that I don't have to download any extensions or plugins or whatever.. I can just import my settings and start working.</p>
<p>VSCode being electron and Microsoft doesn't really help my feelings either, especially since some of their extensions like C# and Python are proprietary, and they're working on more extensions to be like that:</p>
<ul>
<li><a href="https://mstdn.social/@msw/114281012370795980">Matt "msw" Wilson: "The latest proprietary #VSCode extension that no…" - Mastodon 🐘</a>
<ul>
<li><a href="https://web.archive.org/web/20250420193838/https://mstdn.social/@msw/114281012370795980">Archive.org link</a></li>
</ul>
</li>
</ul>
<p>So yeah, I rather use something like Kate that I know will be around for long time and won't turn into proprietary mush, nor try to tell me to use their newest "AI" slop tools.</p>
<p>Kate is very much the embodiment of KDE tagline: Simple by Default, Powerful when Needed. It does all I need and allows me to modify it as I need.</p>
<p>I've contributed to Kate bunch of times, and every time it has been nice. The maintainers of Kate are very lovely patient people who deal with my nonsense. :)</p>
<p>And that's why I love it so much: The people around it, the out of the box experience, the simplicity yet powerfulness..! ❤️</p>
<p><a href="https://kate-editor.org/get-it/">Give Kate a try today!</a> :)</p>
<p>If you have any issues with it, report them on <a href="https://bugs.kde.org/">bugs.kde.org</a>. You can also send wishlist items there. There is also wishlist of things on <a href="https://discuss.kde.org/t/kate-hopes-and-dreams-wishlist/582">KDE Discuss</a>, feel free to chat there about it or ask for help in general.</p>
<p>PS. For the modal text editor lovers, Kate does have Vi mode. I use it from time to time, but I prefer Kate as it is to be honest. For my terminal/modal editing needs I use <a href="https://helix-editor.com/">Helix</a> editor, but most of the time I'm using Kate.</p>
KURLNavBar and meSat, 22 Mar 2025 00:00:00 +0000Akselikdefossrefactorvisualsoftwaredesktopdesignuikioux
https://akselmo.dev/posts/visual-woes/
https://akselmo.dev/posts/visual-woes/<p>I made a change to the <a href="https://invent.kde.org/frameworks/kio/-/merge_requests/1793">KURLNavBar according to old mockup</a>,
since we hoped it would be easier to use.<span id="continue-reading"></span></p>
<p>This was a bad idea and made many people angry, at least on <a href="https://old.reddit.com/r/kde/comments/1jdpafa/new_dolphin_location_bar_is_really_bad/">Reddit</a>.</p>
<p>Seems to be a <a href="https://akselmo.dev/posts/you-dont-need-to-yell/">recurring theme</a> with my visual changes,
though this time wasn't nearly as bad as that was.</p>
<p>Anyway, I wanted to go over the process around it. Maybe someone else
than me can learn something from this.</p>
<h1 id="so-what-happened"><a class="zola-anchor" href="#so-what-happened" aria-label="Anchor link for: so-what-happened">So, what happened</a></h1>
<p>When implementing this <a href="https://phabricator.kde.org/T12308">mockup</a>,
I was expecting this was something people had been waiting for. It looked
good to me, and since we've been wanting to freshen up Dolphin a bit,
it felt like a good way to start. (This change wasn't to Dolphin, but our
framework, so any apps that would use this navbar would get the changes.)</p>
<p>Another reasoning for changes was that there has been many many instances
where people didn't even know this field could be clicked!
They didn't know these items are buttons, for example on touch devices.
That's where the background idea came from.
And then make the folders look like clickable items, so people
know that, well, they're not there just to look pretty.</p>
<p>The work started well enough, though I spent tons of time refactoring and
trying to understand the old codebase. On top of that, we wanted to make
sure it was as close to perfect as possible.</p>
<p>So I added a background first, which was relatively easy, then started modifying the buttons.</p>
<p>I wanted to use chevron <code>></code> style separators between the folders, but
there was no easy way to create a button with this shape. Sure, we could
do it well for Breeze but any other Qt theme might render it weird and wrong,
and that will just cause people report more bugs. So I settled with regular separators.
It was a compromise, but I admit it was a rather bad one in the end.</p>
<p>I worked so much on this part, trying to figure out a good way to make the new buttons
work, following the mockup as close as possible, and I couldn't see the usability issues.
This was because I was so entrenched in the work I couldn't practically "see the forest for the trees."</p>
<p>I had tons of good feedback, from visual designers and the like. I wanted to follow
everyones advice, but had to make compromises at some places.</p>
<p>Eventually I got somewhere where we all just liked it enough to push it out to the world.</p>
<p>And yeah, the whole process took ~1 month. You would think this is a simple change, but <em>it never is that simple.</em></p>
<h1 id="the-feedback"><a class="zola-anchor" href="#the-feedback" aria-label="Anchor link for: the-feedback">The feedback</a></h1>
<p>I was expecting some pushback, as it always happens with visual changes, but I didn't
expect it to be this.. energetic?</p>
<p>Sadly, most of the feedback was "it ugly" which <em>gives me nothing actionable to work on!</em></p>
<p>Saying "it looks bad" doesn't help me work on it. It doesn't help me fix anything.
I think that frustrated me the most: I wanted to help to fix the situation, but this kind of feedback
just makes me wonder endlessly how to fix it.</p>
<p>Then I saw some actually actionable feedback:</p>
<ul>
<li>The arrows showed the hierarchy better than the separators
<ul>
<li>I actually agreed with this afterwards, but I couldn't get the chevron thing working as mentioned above</li>
<li>I opted for separators because I wanted to keep the button look.</li>
</ul>
</li>
<li>Some thought they were tabs and kept misclicking them instead of tabs
<ul>
<li>This was very good feedback and made me rethink the situation</li>
</ul>
</li>
</ul>
<p>I am glad I saw those two things in the sea of "it ugly." It helped me to restructure
the whole thing in my mind and start fixing.</p>
<p>So yeah I do read your feedback. :P</p>
<h1 id="out-with-the-new-in-with-the-new-but-old"><a class="zola-anchor" href="#out-with-the-new-in-with-the-new-but-old" aria-label="Anchor link for: out-with-the-new-in-with-the-new-but-old">Out with the new, in with the new but old</a></h1>
<p>Here's the new iteration: <a href="https://invent.kde.org/frameworks/kio/-/merge_requests/1842">KUrlNavigatorButton: Use arrow as separators </a></p>
<p>I saw the value in the old navbar with the arrows, so I brought them back. I wanted
to keep the icons, because I liked the visual flair they added, but they also
added clutter. If I could have had the chevron style buttons as shown in the mockups,
I would have likely kept the icons.</p>
<p>Instead of reworking the old code, I decided to refactor it to best of my abilities:
There was some things we didn't need anymore, and some things were a bit buggy due to
miscalculations, so I changed things around and got them into good place.</p>
<p>I wanted to remove some items I thought people wouldn't use, but in fact I was told
quickly that these are very good things to have, so I kept them around. And this is also
the kind of feedback I like to see!</p>
<p>We're creating custom button components here, so we couldn't utilize more "standard" buttons.
That's why there was a lot of math and tinkering with padding involved. I did try to utilize the
QStyle methods here though so that it would look okay on any theme, not just Breeze.
There will likely be cases where it won't look perfect in custom themes,
but utilizing QStyle allows us to at least try.</p>
<p>After the refactoring, it got easier to work on this and I started to wrap it up with rapid pace.
Instead of a month, it took me around a week.</p>
<p>It's not merged yet, but hopefully will be soon. I've been daily driving this
iteration on my system and haven't had issues so far.</p>
<h1 id="so-what-s-the-big-deal"><a class="zola-anchor" href="#so-what-s-the-big-deal" aria-label="Anchor link for: so-what-s-the-big-deal">So what's the big deal?</a></h1>
<p>Yeah, so, why the big deal? Why write a blogpost about this?</p>
<p>I didn't expect this change affect so much to my psyche, so I wanted to
talk about this. Maybe some other FOSS devs can relate. I think it's
something we should discuss more often, than just the raw results.</p>
<p>I like to think I am good at taking feedback. But after working on something
for a month, then having to throw it all away even I was told it was ok..
It hurt! It was a lot of time spent on a thing that I hoped would make people happy.</p>
<p>I care about the stuff I do. A lot. So yeah, I'm gonna feel hurt when my work is disliked. And that's okay.
Anyone who tells me otherwise can pound sand. Rejecting emotions like these just gets you in worse state over time.
I speak from experience here.</p>
<p>It's easy to say "just ignore the negative feedback" but I literally can't.
I am so into working on these things, I love
working on KDE applications.. So it does hurt when something that has become such an extension of my
own creativity and passion gets disliked... <em>Even when I haven't directly worked on it!</em></p>
<p>Sure, this all is my
problem to work on and I don't expect anyone to treat me with silk gloves and pat my head. Just wanted
to explain it, that's all. Maybe someone can relate to this and doesn't feel so alone with the problem.
I had the same thing when my games got insulted, where I was even more emotionally
attached to the things, because I had made them myself completely.</p>
<p>Sadly, I kept dwelling on it a bit longer than I wished.. But working on the new version was a great outlet.
I noticed old problems, fixed them and the new version is better in many ways.</p>
<p>I've noticed that I am not annoyed/upset about negative feedback itself, but how it's conveyed.
Negative feedback will always be demotivating and bothersome, but when the negative feedback is written
politely and has actually actionable items, it can be rather motivating as well. The "it ugly" feedback has
stronger demotivating feedback, because it's not actionable.</p>
<p>I think the key takeaway from all of this is that <strong>mockups can get stale!</strong>
If people like some older mockup, then you change to it suddenly, people may
get very frustrated about it: They either forgot the old mockup, had never seen it,
or they ended up disliking it in actual use.</p>
<p>So it's good idea to freshen the mockup before iterating on it: Ask the visual designers
about it one more time, maybe share it with the users and ask their opinion on it.
Sure you can't gauge everyone's opinion on it, but at least it shouldn't be that sudden
to everyone.</p>
<p>This whole ordeal has been very tiring, but that's my own fault for not really allowing
myself to take a break from it. I get hyperfixated easily, but again, that's my own problem.</p>
<p>So yeah, slight burnout by all of this.
I'm sure I'll be fine, especially after this is merged so it can stop living rent free in my head.</p>
<p>I'm not blaming anyone for anything. Not even myself. Things happened and we all need to chill.</p>
<h1 id="hopes-for-future"><a class="zola-anchor" href="#hopes-for-future" aria-label="Anchor link for: hopes-for-future">Hopes for future</a></h1>
<p>There will be many many other times where I or someone else will get it wrong the first time.</p>
<p>So, share your feedback, but don't immediatelly go for the nuclear option of removing it all.
With FOSS stuff, we don't have these huge QA teams that go yay/nay for something..
But everyone is welcome to join help in that regard!</p>
<p>Help us help you with actionable, polite feedback.</p>
<p>And thank you so much for everyone who has done so!</p>
<p>Now I'm going to try to just let go of this all. It's weekend anyway
and I got bunch of games waiting to be played.</p>
<p>Thanks for reading as always!</p>
Desktop icons are surprisingly hard!Fri, 08 Nov 2024 00:00:00 +0000Akselikdeplasmadesktopiconsrefactorprogramming
https://akselmo.dev/posts/plasma-desktop-icons-positioning-refactor/
https://akselmo.dev/posts/plasma-desktop-icons-positioning-refactor/<p>I spent past three weeks working on refactoring and fixing legacy code <span id="continue-reading"></span> (the oldest of which was from 2013)
that handled positioning Plasma desktop icons, and how this data was saved and loaded.</p>
<p>Here's the merge request if you're curious: <a href="https://invent.kde.org/plasma/plasma-desktop/-/merge_requests/2607">plasma-desktop: Refactor icon positioner saving and loading</a></p>
<p>The existing code worked sometimes, but there were some oddities like race conditions (icon positioning happens in weird order)
and backend code mixed in with frontend code.</p>
<p>Now I am not blaming anyone for this. Code has tendency to get a bit weird, especially over long periods of time,
and <em>especially</em> in open source projects where anyone can tinker with it.</p>
<p>You know how wired earbuds always, <em>always</em> get tangled when you place them in a drawer or your pocket
or something for few seconds? Codebases do the exact same thing, when there are multiple
people writing on things, fixing each others' bugs. Everyone has a different way of thinking,
so it's only natural that things over time get a bit tangled up.</p>
<p>So sometimes you need someone to look at the tangled codebase and try to clear it up a bit.</p>
<h1 id="reading-code-is-the-hardest-part"><a class="zola-anchor" href="#reading-code-is-the-hardest-part" aria-label="Anchor link for: reading-code-is-the-hardest-part">Reading code is the hardest part</a></h1>
<p>When going through old code, especially some that has barely any comments, it can take a
very long time to understand what is actually going on. I honestly spent most of my time
trying to understand how the thing even works, what is called when, where the icons positions are updated,
and so on.</p>
<p>When I finally had some understanding of what was happening, I could start cleaning things up.
I renamed a lot of the old methods to be hopefully more descriptive, and moved backend code — like saving
icon positions — from the frontend back to backend.</p>
<h1 id="screens-and-icons"><a class="zola-anchor" href="#screens-and-icons" aria-label="Anchor link for: screens-and-icons">Screens and icons</a></h1>
<p>Every screen (PC monitor, TV…) tends to have it's own quirks.
Some, when connected with display-port adapter, tell your PC it's disconnected if your PC goes to
screen saving mode. Some stay connected, but show a blank screen.</p>
<p>One big issue with the icon positions was that when screen got turned off,
it thought there was no screen anymore and started removing items from the desktop.</p>
<p>That's fair. Why show desktop icons on a screen that is non-existent? But
when you have a monitor that tells your PC, "Okay I'm disconnecting now!" when the PC
says it's time to sleep, wrong things would happen.</p>
<p>This condition is now handled by having a check that if the screen is in use or not.
Now when screen is not in use, we just do nothing with the icons. No need to touch them
at all.</p>
<h1 id="stripes-and-screen-resolution"><a class="zola-anchor" href="#stripes-and-screen-resolution" aria-label="Anchor link for: stripes-and-screen-resolution">Stripes and screen resolution</a></h1>
<p>Our icon positioning algorithm uses something called "stripes."</p>
<p>Every resolution has it's amount of stripes. Stripes contain an array of icons,
or blank spots.</p>
<p>So if your screen resolution is, let's say, <code>1920x1080</code>, we calculate
how many stripes and how many items per stripe will fit on that screen.</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>Stripe1: 1 2 3 4 5 6 7
</span><span>Stripe2: 1 2 3 4 5 6 7
</span><span>Stripe3: 1 2 3 4 5 6 7
</span><span>
</span><span>And so on..
</span></code></pre>
<p>But when you change your screen resolution or scale factor, how many icon stripes you have and how
many icons fit on each stripe will change.</p>
<p>So if you have one of those screens that looks to the system like it's been unplugged when it goes into
sleep mode, previously the stripe amount would change to 1 row, 1 column. And the icon positioner would
panics and shove all icons in that <code>1,1</code> slot.</p>
<p>Then when you'd turn the screen back on, the icon positioner would wonder what just happened and restore
the proper stripe number and size. But by that point it would have lost all our positioning coordinate
data during the shoving of icons in that one miniscule place, so instead it would reset the icon positions…
and this leaves users wondering why their desktop icon arrangement is now gone.</p>
<p>Here we have to also check for the screen being in use or not. But there were other problems.</p>
<h1 id="saving-icon-positions"><a class="zola-anchor" href="#saving-icon-positions" aria-label="Anchor link for: saving-icon-positions">Saving icon positions</a></h1>
<p>The prior code saved the icon positions every time the positions changed.
Makes sense.</p>
<p>But it didn't account for the screen being off… so the icon positions would
get saved while the desktop was in a faulty state. This also causes frustration because someone arranges the icons
how they wish, but then screen does something weird and they're now saved in wrong places again.</p>
<p>Our icon positions were updated after almost every draw call, if the positions changed.
So this would mean the saving would happen rather often and no matter what moved them.</p>
<p>We had to separate the user action from computer action. If computer moves the icons,
we ideally do not save their positions, unless something drastic has happened like
resolution change.</p>
<p>The icon positions are saved per resolution, so if you move
icons around while they're displayed on a <code>3440x1440</code> screen and then change the resolution to <code>1920x1080</code>,
both will have their own arrangements.
This part of the codebase did not previously work, and it would always override the old configuration,
which caused headache.</p>
<p>So now we only save icon positions when:</p>
<ul>
<li>The user adds or removes a desktop icon</li>
<li>The user moves a desktop icon</li>
<li>The user changes the desktop resolution</li>
</ul>
<p>This makes the icon position saving much less random, since it's done only after explicit user actions.</p>
<h1 id="margin-errors"><a class="zola-anchor" href="#margin-errors" aria-label="Anchor link for: margin-errors">Margin errors</a></h1>
<p>The last thing that caused headaches with the icon positioning was that the area available on the desktop
for icons was determined before panels were loaded. When the panels loaded, they would reduce the amount of
space for desktop icons, and that area would constantly resize until everything is ready.</p>
<p>In previous code, this would cause icons to move, which updates positions, which then saves their positions.</p>
<p>So let's say you arrange your icons nicely, but the next time you boot into plasma, your panels start shoving
the poor icon area around and the icons have to move out of the way… and now they're all in the wrong places.</p>
<p>This was already partially fixed by not saving when the computer moves the icons around: we just load the icon
positions when the screen is in use and we are done with listing the icons on the desktop. Part of the margin changes
happen when screen is off.</p>
<p>We still need to fix the loading part; ideally we load the icon area last, so that it gets the margins
it expects and doesn't shuffle around while panels are still appearing. But it was out of scope for this merge request.</p>
<h1 id="conclusions"><a class="zola-anchor" href="#conclusions" aria-label="Anchor link for: conclusions">Conclusions</a></h1>
<p>It may not sound like much, but this was a lot of work. I spent days just thinking about this
problem, trying to understand what is happening now and how to improve it.</p>
<p>Luckily with a lot of help from reviewers and testers I got things to work
much better than it used to. I am quite "all-over-the-place" when I solve problems
so I appreciate the patience they had with me and my questions. :D</p>
<p>What I mostly wished for when working on this were more inline code comments. You don't need to
comment the obvious things, but everything else could use something. It's hard to gauge
what is obvious and what is not, but that kind of answers the question: If you don't know
if it's obvious or not, it's likely not, so add some comment about it.</p>
<p>I do hope that the desktop icons act more reliably after all these changes. If you spot bugs, do
report them at <a href="https://bugs.kde.org/enter_bug.cgi?product=plasmashell">https://bugs.kde.org</a>.</p>
<p>Thanks for reading! :)</p>
<p><em>PS. The funniest thing to me about all of this is that I do not like having any icons on my desktop. :'D</em></p>
Moving my game project from C to Odin languageSat, 02 Nov 2024 00:00:00 +0000Akseliprogramminggamedevodinc
https://akselmo.dev/posts/moving-from-c-to-odin/
https://akselmo.dev/posts/moving-from-c-to-odin/<p>Some months ago, I got really fed up with C.<span id="continue-reading"></span></p>
<p>Like, I don't <em>hate</em> C. Hating programming languages is silly.
But it was way too much effort to do simple things like lists/hashmaps and
other simple data structures and such.</p>
<p>I decided to try this language called <a href="https://odin-lang.org/">Odin</a>, which
is one of these "Better C" languages. And I ended up liking it <em>so much</em> that
I moved my game <a href="https://codeberg.org/akselmo/artificial-rage">Artificial Rage</a> from C to Odin.
Since Odin has support for Raylib too (like everything really), it was very easy to move things around.</p>
<p>Here's how it all went.. Well, what I remember the very least.</p>
<h1 id="learning-odin"><a class="zola-anchor" href="#learning-odin" aria-label="Anchor link for: learning-odin">Learning Odin</a></h1>
<p>Firstly I want to go through the things I learned while tinkering on Odin with separate project,
since I didn't want to just go blindly in and decide I dislike the language.</p>
<p>Luckily, learning Odin was rather easy.</p>
<p>I am no programmer language enthusiast like
many others may be, and I will make weird comparison and anecdotes.
But this is my blog so deal with it.</p>
<p>I am not going through everything. Just the things that stuck to my mind the best.</p>
<h2 id="backwards-syntax"><a class="zola-anchor" href="#backwards-syntax" aria-label="Anchor link for: backwards-syntax">Backwards syntax</a></h2>
<p>You see, Odin is like taking C and then.. Writing it backwards.
And remove the unnecessary cruft.</p>
<p>For example, in C you type <code>int variableName = 10</code>.</p>
<p>In Odin, you type <code>variableName: int = 10</code> or <code>variableName := 10</code>.</p>
<p>This was probably the most difficult part for me: Remembering that the name comes first
then the type (if you dont let it be inferred automatically).</p>
<p>Functions are also called procedures or "procs." This sometimes still throws me off, but
it's just semantic, they're essentially the same name, just less math-y name.</p>
<p>I still prefer the C way, but the only reasoning I have for it is that "it's what I learned."</p>
<h3 id="pointy-pointers"><a class="zola-anchor" href="#pointy-pointers" aria-label="Anchor link for: pointy-pointers">Pointy pointers</a></h3>
<p>This one I kinda like. In Odin, pointers are <code>^pointer</code> instead of <code>*pointer</code>.</p>
<p>Then when you want to deference the pointer, its <code>pointer^</code>. In some cases, like with Raylib,
you have to feed the memory address with <code>&pointer</code>.</p>
<p>To have better understanding, look at the docs, I am bound to have something wrong in this blogpost anyway:
<a href="https://odin-lang.org/docs/overview/#pointers">https://odin-lang.org/docs/overview/#pointers</a></p>
<h2 id="lack-of-header-files"><a class="zola-anchor" href="#lack-of-header-files" aria-label="Anchor link for: lack-of-header-files">Lack of header files</a></h2>
<p>When it comes to removing unnecessary cruft, one of the biggest things that
made me happy was lack of header files.</p>
<p>I have ADHD. It's my excuse for having bad memory. When working with C, I often forgot to edit either the header file
or the source file and then I was wondering why something fails to compile or otherwise acts weird...
Juggling two files for one "programmatic unit" is stupid. I hate it.</p>
<p>In Odin it's all in the one file, so I don't forget it.</p>
<p>I know this is not a major revelation and people are like "wtf this is basic" but for me it was
big deal!</p>
<h2 id="building-is-not-pain"><a class="zola-anchor" href="#building-is-not-pain" aria-label="Anchor link for: building-is-not-pain">Building is not pain</a></h2>
<p>In C, building requires either a shell script with some magic notation or CMake or Meson or XMake or Make or Autotools or..</p>
<p>You get the point. There's so many ways to do same thing because the original way is just not fun.</p>
<p>I've never enjoyed writing CMake files. I appreciate CMake, but I don't want to write the build systems.
I just don't like setting up build systems in general, when I want to hack on a game on my limited time.</p>
<p>In Odin? <code>odin build .</code> or <code>odin run .</code>. That's it. It just does the thing.</p>
<p>Now if you are like me and love organizing your code into blocks and modules and whatever, you
have to do things like <code>odin build ./src -collection:src=src -debug -out:./build/binary</code>.</p>
<p>This takes your collection of packages and spits out a debug build of your thing,
then you can use LLDB to debug it.</p>
<p>Simple little commands you can stick into a <code>build.sh</code> and then just run that. Super simple, works well.</p>
<p>It's rather quick to build too!</p>
<h2 id="no-package-management-is-good-actually"><a class="zola-anchor" href="#no-package-management-is-good-actually" aria-label="Anchor link for: no-package-management-is-good-actually">No package management is good, actually</a></h2>
<p>Odin doesn't have built-in package manager. It doesn't need one.</p>
<p>Packages are folders of files. You can just plop it in your repo, then use
some collection commands and It Just Works.</p>
<p>However you rarely even need to download third party packages from the internets!</p>
<p>Odin has a lot of nice core features for basically everything one needs, and then
for more extra things, like Raylib, theres <a href="https://pkg.odin-lang.org/vendor/">vendored packages</a>.</p>
<p>So if you need something from Raylib, you just do <code>import rl "vendor:raylib"</code>.
Then you have all the fun Raylib things under <code>rl.</code>.</p>
<p>For third party packages you can just use git submodules for example, so the packages are
managed that way per project.</p>
<p>I honestly love this way of working. Batteries included like with Python, but if you need more stuff,
you just take care of it yourself and make sure you only have what you need, instead of 1000 random packages.</p>
<h1 id="moving-my-game-from-c-to-odin"><a class="zola-anchor" href="#moving-my-game-from-c-to-odin" aria-label="Anchor link for: moving-my-game-from-c-to-odin">Moving my game from C to Odin</a></h1>
<p>In the end, moving the game project was quite simple. C and Odin are like very long distance relatives. They do
similar things, but maybe in different ways. C likes to build things every time ground up, while Odin just provides
you the niceties.</p>
<h2 id="swapping-syntaxes"><a class="zola-anchor" href="#swapping-syntaxes" aria-label="Anchor link for: swapping-syntaxes">Swapping syntaxes</a></h2>
<p>Surprisingly often, moving the code from C to Odin was just "transpiling" the C syntax to Odin.</p>
<p>I mostly had to change the name and type other way around, turn <code>void bla()</code> to <code>bla :: proc()</code> and so on.</p>
<p>This was the easy part, though I sometimes forgot I was writing Odin when I was looking at the old C code and had
things wrong way around.</p>
<h2 id="cyclic-dependencies"><a class="zola-anchor" href="#cyclic-dependencies" aria-label="Anchor link for: cyclic-dependencies">Cyclic dependencies</a></h2>
<p>However, one caveat is that Odin really doesn't like cyclic dependencies. In C you could get away with having
two files that import each other.</p>
<p>In Odin, if you have <code>src:game</code> package, and <code>src:scene</code> package, only one can rely on the other one.
This means that if your <code>src:game</code> needs something from <code>src:scene</code>, then <code>src:scene</code> can't get stuff
from <code>src:game</code>.</p>
<p>If you are organizing maniac like me, this can be difficult to deal with first. I wanted to create a package
for everything in the game, but it turned out that this is not what Odin wants to do.</p>
<p>I am sure Odin devs have many opinions on this, but I'm still exploring. Many Odin devs seem to just have one package for their
whole project, avoiding the cyclic dependencies completely.. Kinda like you do in C. I think that's also fine approach, as long
as you remember having a consistent naming scheme like <code>EnemyEntity</code> and <code>WeaponEntity</code> etc etc.</p>
<p>What I did was I turned the packages into more a hierarchial style, so that a child package doesnt rely on it's parent.</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>Odin dependency diagram
</span><span>
</span><span>+-------------->---------+ +-----------+
</span><span>| Settings | | Game | | Utilities |
</span><span>|----------+ +----|----+ +-----------|
</span><span>| | |
</span><span>--------------->----v----<---------------
</span><span>| | Scene | |
</span><span>| +----|----+ |
</span><span>| | |
</span><span>| +------------v--------------+ |
</span><span>| | Entities | |
</span><span>+------> <----+
</span><span> | Player, Weapon, Enemies.. |
</span><span> +---------------------------+
</span></code></pre>
<p>I know it's a bit messy, I tried my best with the diagram. But basically, nothing relies <em>back</em> to it's predecessor.
Anything that <em>needs</em> to know about each other (enemy and player for example) is in same package.</p>
<ul>
<li>Game is our main loop, it just runs the show. It will likely be the one that toggles between game state and menu state.</li>
<li>Settings is a config loader that just makes sure our things are accessible from anywhere.</li>
<li>Utilities are procs that are commonly used, like creating bounding boxes.</li>
<li>Scene generates data for all entities, like where they should be placed. It also updates entities when iterating over the scene.</li>
<li>Entities have their shared update, where we use tagged unions (more of those later) to update whatever happens
<ul>
<li>Player, players weapons, projectiles, enemies, level walls and objects, pickup items..</li>
<li>These items need to know about each other so they're in same blob.</li>
</ul>
</li>
</ul>
<p>I am sure this creates a lot of opinions and different takes, someone will tell me this is horrible mess and I likely will agree.</p>
<p>But hey, it works. And I am quite happy with it.</p>
<p>With the C code, we had this instead:</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>
</span><span>C dependency diagram (mess)
</span><span>
</span><span>
</span><span> +----------------------------------+
</span><span>+--------------|------------+ |
</span><span>| | | +-------+ |
</span><span>| | | | | |
</span><span>| <--------+------------v----------+------>| |
</span><span>| | Settings | | Game | | Utilities || |
</span><span>| |----------^ +----|----+ ^-----------|| |
</span><span>| +-------+ | | | || |
</span><span>| | |-----|----|--->----v----<--|------------| |
</span><span>| | | | | | Scene | | || |
</span><span>| | | | | ^----^----<-------------->| |
</span><span>| | | | | | | | || |
</span><span>| | | |+---v---v----v-------v------+ || |
</span><span>| | | || Entity | || |
</span><span>| | v----<+> <----+| |
</span><span>| | | Player, Weapon, Enemies.. | | |
</span><span>| | +---------------------------+ | |
</span><span>| | | |
</span><span>| | | |
</span><span>| +------------------------------------------+ |
</span><span>+-------------------------------------------------+
</span><span>
</span></code></pre>
<p>Honestly everything relied on each other. Remove one block, something breaks.
In C it was way too easy to have these weird dependencies, and I am glad Odin basically
told me to have some discipline and do things properly.</p>
<p>Now if I break something, it's way more predictable where the issue occurs and why.</p>
<p>In C breaking something in place A would break something in place XYZ.</p>
<p>This is not really C's fault, it's fault of my bad planning. But the fact that C doesn't
really enforce me to have good planning is why it got that way.</p>
<h2 id="tagged-unions-my-beloved"><a class="zola-anchor" href="#tagged-unions-my-beloved" aria-label="Anchor link for: tagged-unions-my-beloved">Tagged unions my beloved</a></h2>
<p>In C, I wanted to use unions because they made sense for my faux-entity-component system.</p>
<p>There was a <code>struct</code> that holds <code>EntityType enum</code> and <code>Entity union</code> which holds all the different
<code>structs</code> like <code>Player</code>, <code>Enemy</code>, <code>Item</code> etc..</p>
<p>This got bit messy over time and I had to rely a lot on this <code>EntityType enum</code> to make sure
I am doing the right thing in right place. I had a lot of the following in C in various entity functions:</p>
<pre data-lang="c" style="background-color:#181818;color:#ffffff;" class="language-c "><code class="language-c" data-lang="c"><span>
</span><span style="font-weight:bold;color:#33ffa0;">if </span><span>(entity->type </span><span style="font-weight:bold;color:#33ffa0;">!=</span><span> EntityType.item)
</span><span>{
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return</span><span>;
</span><span>}
</span><span>
</span></code></pre>
<p>Sure it works but eventually you forget to make that check and then it bites your ass.</p>
<p>In Odin, thanks to tagged unions, I could do following for example:</p>
<pre data-lang="odin" style="background-color:#181818;color:#ffffff;" class="language-odin "><code class="language-odin" data-lang="odin"><span style="font-weight:bold;color:#838fff;">HandlePlayerPickup</span><span> :: </span><span style="color:#33ffff;">proc</span><span>(entity: ^Entity) {
</span><span> destroyed := </span><span style="color:#ff9233;">false
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">#partial switch</span><span> ent </span><span style="font-weight:bold;color:#33ffa0;">in</span><span> entity.type {
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">case</span><span> ItemHealth:
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">if</span><span> (Player.health < PLAYER_MAX_HEALTH) {
</span><span> </span><span style="color:#838fff;">PlayerSetHealth</span><span>(ent.healAmount)
</span><span> destroyed = </span><span style="color:#ff9233;">true
</span><span> }
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">case</span><span> ItemAmmo:
</span><span> destroyed = </span><span style="color:#838fff;">WeaponAddAmmo</span><span>(ent.ammoAmount, ent.ammoMorph)
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">case</span><span> ItemWeapon:
</span><span> pickedUp := </span><span style="color:#838fff;">WeaponPickup</span><span>(ent.weaponType)
</span><span> ammoAdded := </span><span style="color:#838fff;">WeaponAddAmmo</span><span>(ent.ammoAmount, ent.weaponType)
</span><span> destroyed = pickedUp || ammoAdded
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">case</span><span> ItemKey:
</span><span> destroyed = </span><span style="color:#ff9233;">true
</span><span> Player.hasTeleportKey = </span><span style="color:#ff9233;">true
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">case</span><span>:
</span><span> fmt.</span><span style="color:#838fff;">printfln</span><span>(</span><span style="color:#5fff33;">"Unimplemented: %[0]v"</span><span>, entity.type)
</span><span> }
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">if</span><span> (destroyed) {
</span><span> entity.transform.isPickup = </span><span style="color:#ff9233;">false
</span><span> entity.active = </span><span style="color:#ff9233;">false
</span><span> </span><span style="color:#838fff;">Destroy</span><span>(entity)
</span><span> }
</span><span>}
</span></code></pre>
<p>This is such a nice way of handling unions. Every type has it's own proc related to the current action,
so just go through a fun and quick switch ladder and do the action if we find that specific entity.
We can also have default too, like that <code>case:</code> which prints that the thing is unimplemented. This actually
helped me to catch a bug with the item pickup thing very quickly and I loved the experience.</p>
<h2 id="strings-actually-exist"><a class="zola-anchor" href="#strings-actually-exist" aria-label="Anchor link for: strings-actually-exist">Strings actually exist</a></h2>
<p>Due to having a HUD and config files, I have to do string handling.</p>
<p>In C this is misery. Anyone who has done string handling in C knows this.
It's absolutely insane how a language in the year <code>[CURRENTYEAR]</code> has no proper
string handling.</p>
<p>Anyway, instead of having do stuff like in C:</p>
<pre data-lang="c" style="background-color:#181818;color:#ffffff;" class="language-c "><code class="language-c" data-lang="c"><span style="font-weight:bold;color:#33ffa0;">if </span><span>(</span><span style="color:#838fff;">strcmp</span><span>(key, </span><span style="color:#5fff33;">"ceilingtexture"</span><span>) </span><span style="font-weight:bold;color:#33ffa0;">== </span><span style="color:#ff9233;">0</span><span>)
</span><span>{
</span><span> scene->ceilingPlaneTexture </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>LoadTexture(fullTexturePath);
</span><span> </span><span style="color:#838fff;">free</span><span>(fullTexturePath);
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return </span><span style="color:#ff9233;">true</span><span>;
</span><span>}
</span></code></pre>
<p>In Odin I could do just this:</p>
<pre data-lang="odin" style="background-color:#181818;color:#ffffff;" class="language-odin "><code class="language-odin" data-lang="odin"><span> </span><span style="font-weight:bold;color:#33ffa0;">switch</span><span> key
</span><span> {
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">case </span><span style="color:#5fff33;">"ceilingtexture"</span><span>:
</span><span> ceilingPlaneTexture = rl.</span><span style="color:#838fff;">LoadTexture</span><span>(texturesPath)
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return </span><span style="color:#ff9233;">true
</span><span>...
</span></code></pre>
<p>Again our old friend lil switchy there, and its just simple and easy to read.</p>
<p>Even opening files is less pain.</p>
<p>C:</p>
<pre data-lang="c" style="background-color:#181818;color:#ffffff;" class="language-c "><code class="language-c" data-lang="c"><span style="color:#808080;">// Parse scene plane textures from level.cfg
</span><span style="color:#33ffff;">void </span><span style="font-weight:bold;color:#838fff;">Scene_LoadSceneConfig</span><span>(</span><span style="color:#33ffff;">void</span><span>)
</span><span>{
</span><span> </span><span style="color:#33ffff;">const char </span><span style="font-weight:bold;color:#33ffa0;">*</span><span>fileName </span><span style="font-weight:bold;color:#33ffa0;">= </span><span style="color:#5fff33;">"./assets/levels/level1.cfg"</span><span>;
</span><span> </span><span style="color:#33ffff;">const int</span><span> bufferSize </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>Utilities_GetFileCharacterCount(fileName);
</span><span>
</span><span> FILE </span><span style="font-weight:bold;color:#33ffa0;">*</span><span>filePointer </span><span style="font-weight:bold;color:#33ffa0;">= </span><span style="color:#838fff;">fopen</span><span>(fileName, </span><span style="color:#5fff33;">"r"</span><span>);
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">if </span><span>(nullptr </span><span style="font-weight:bold;color:#33ffa0;">==</span><span> filePointer)
</span><span> {
</span><span> </span><span style="color:#838fff;">printf</span><span>(</span><span style="color:#5fff33;">"Failed to open level config file </span><span style="color:#33ffff;">%s \n</span><span style="color:#5fff33;">"</span><span>, fileName);
</span><span> </span><span style="color:#838fff;">fclose</span><span>(filePointer);
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return</span><span>;
</span><span> }
</span><span>
</span><span> </span><span style="color:#33ffff;">char</span><span> buffer[bufferSize];
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">while </span><span>(</span><span style="color:#838fff;">fgets</span><span>(buffer, bufferSize, filePointer))
</span><span> {
</span><span> </span><span style="color:#33ffff;">char</span><span> key[bufferSize];
</span><span> </span><span style="color:#33ffff;">char</span><span> value[bufferSize];
</span><span> Utilities_ParseKeyValuePair(buffer, key, </span><span style="color:#5fff33;">"="</span><span>, value);
</span><span>
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">if </span><span>(</span><span style="font-weight:bold;color:#33ffa0;">!</span><span>Scene_ParseConfig(key, value))
</span><span> {
</span><span> </span><span style="color:#838fff;">printf</span><span>(</span><span style="color:#5fff33;">"Failed to parse level.cfg key-value: </span><span style="color:#33ffff;">%s</span><span style="color:#5fff33;"> - </span><span style="color:#33ffff;">%s \n</span><span style="color:#5fff33;">"</span><span>, key, value);
</span><span> }
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">else
</span><span> {
</span><span> </span><span style="color:#838fff;">printf</span><span>(</span><span style="color:#5fff33;">"Parsed level.cfg key-value: </span><span style="color:#33ffff;">%s</span><span style="color:#5fff33;"> - </span><span style="color:#33ffff;">%s \n</span><span style="color:#5fff33;">"</span><span>, key, value);
</span><span> }
</span><span> }
</span><span> </span><span style="color:#838fff;">fclose</span><span>(filePointer);
</span><span>}
</span></code></pre>
<p>Odin:</p>
<pre data-lang="odin" style="background-color:#181818;color:#ffffff;" class="language-odin "><code class="language-odin" data-lang="odin"><span style="font-weight:bold;color:#838fff;">LoadSceneConfig</span><span> :: </span><span style="color:#33ffff;">proc</span><span>() {
</span><span> fileName := </span><span style="color:#5fff33;">"./assets/levels/level1.cfg"
</span><span> data, success := os.</span><span style="color:#838fff;">read_entire_file</span><span>(fileName)
</span><span>
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">if</span><span> (!success) {
</span><span> fmt.</span><span style="color:#838fff;">printfln</span><span>(</span><span style="color:#5fff33;">"Failed to open level config file %[0]v"</span><span>, fileName)
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return
</span><span> }
</span><span>
</span><span> sceneConfigText := </span><span style="color:#33ffff;">string</span><span>(data)
</span><span> sceneArr := strings.</span><span style="color:#838fff;">split_lines</span><span>(sceneConfigText)
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">for</span><span> item </span><span style="font-weight:bold;color:#33ffa0;">in</span><span> sceneArr {
</span><span> keyValuePair := strings.</span><span style="color:#838fff;">split</span><span>(item, </span><span style="color:#5fff33;">"="</span><span>)
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">if</span><span> (</span><span style="color:#838fff;">len</span><span>(keyValuePair) < </span><span style="color:#ff9233;">2</span><span>) {
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">continue
</span><span> }
</span><span>
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">if</span><span> (</span><span style="color:#838fff;">ParseConfig</span><span>(keyValuePair[</span><span style="color:#ff9233;">0</span><span>], keyValuePair[</span><span style="color:#ff9233;">1</span><span>])) {
</span><span> fmt.</span><span style="color:#838fff;">printfln</span><span>(</span><span style="color:#5fff33;">"Parsed level.cfg key-value: %[0]v - %[1]v"</span><span>, keyValuePair[</span><span style="color:#ff9233;">0</span><span>], keyValuePair[</span><span style="color:#ff9233;">1</span><span>])
</span><span> }
</span><span> }
</span><span>}
</span></code></pre>
<p>It's just much easier to understand the Odin code, and I likely could implement that better still,
since it's mostly recreation of the C code. But here you can see well how the two differ.</p>
<h2 id="deferring-defers"><a class="zola-anchor" href="#deferring-defers" aria-label="Anchor link for: deferring-defers">Deferring defers</a></h2>
<p>Defer is also a beautiful thing. Like I said, due to my ADHD I have trouble remembering things.
So I often <code>malloc</code>, but rarely <code>free</code>. And this makes computers sad.</p>
<p>In Odin I can just do following:</p>
<pre data-lang="odin" style="background-color:#181818;color:#ffffff;" class="language-odin "><code class="language-odin" data-lang="odin"><span>txt := strings.</span><span style="color:#838fff;">clone_to_cstring</span><span>(fmt.</span><span style="color:#838fff;">aprintf</span><span>(</span><span style="color:#5fff33;">"%[0]v"</span><span>, entity.Player.health))
</span><span style="font-weight:bold;color:#33ffa0;">defer </span><span style="color:#838fff;">delete</span><span>(txt)
</span></code></pre>
<p>And in the end of the block the delete is called. I don't have to remember to separately add it to end of the block.</p>
<p>However I think C23 is going to have a defer too? Some doc I found: <a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2589.pdf">https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2589.pdf</a></p>
<p>But yeah, it's really nice!</p>
<h2 id="matrices-are-stored-differently-in-c-and-odin"><a class="zola-anchor" href="#matrices-are-stored-differently-in-c-and-odin" aria-label="Anchor link for: matrices-are-stored-differently-in-c-and-odin">Matrices are stored differently in C and Odin</a></h2>
<p>One thing that REALLY stumped me was that matrices are handled differently in Raylib-Odin and Raylib-C:</p>
<ul>
<li>Odin, right handed, stored row major</li>
<li>C, right handed, stored column major</li>
</ul>
<p>This caused some problems with my custom camera code, but when I figured it out
it got easier from there.</p>
<p>Here's couple tables to help you remember how they differ between C and Odin.</p>
<h3 id="column-major"><a class="zola-anchor" href="#column-major" aria-label="Anchor link for: column-major">Column major</a></h3>
<p><em>Used by Raylib C</em></p>
<table><thead><tr><th></th><th>0</th><th>1</th><th>2</th><th>3</th></tr></thead><tbody>
<tr><td>0</td><td>m0</td><td>m4</td><td>m8</td><td>m12</td></tr>
<tr><td>1</td><td>m1</td><td>m5</td><td>m9</td><td>m13</td></tr>
<tr><td>2</td><td>m2</td><td>m6</td><td>m10</td><td>m14</td></tr>
<tr><td>3</td><td>m3</td><td>m7</td><td>m11</td><td>m15</td></tr>
</tbody></table>
<h3 id="row-major"><a class="zola-anchor" href="#row-major" aria-label="Anchor link for: row-major">Row major</a></h3>
<p><em>Used by Raylib Odin</em></p>
<table><thead><tr><th></th><th>0</th><th>1</th><th>2</th><th>3</th></tr></thead><tbody>
<tr><td>0</td><td>m0</td><td>m1</td><td>m2</td><td>m3</td></tr>
<tr><td>1</td><td>m4</td><td>m5</td><td>m6</td><td>m7</td></tr>
<tr><td>2</td><td>m8</td><td>m9</td><td>m10</td><td>m11</td></tr>
<tr><td>3</td><td>m12</td><td>m13</td><td>m14</td><td>m15</td></tr>
</tbody></table>
<h1 id="conclusions"><a class="zola-anchor" href="#conclusions" aria-label="Anchor link for: conclusions">Conclusions</a></h1>
<p>Sadly I don't remember much else. I had a blast with moving the codebase, and when I was visiting <a href="https://akselmo.dev/posts/akademy-2024/">Akademy</a>,
I did some game programming in a plane while I was super sleep deprived and still managed to get things work.</p>
<p>In general, moving from C to Odin was quite a pleasant and rather easy experience. The languages
are rather similar but Odin takes the painful bits away, letting you to focus on the problem
instead of wondering why something is going weirdly wrong again.</p>
<p>What's the most essential part of this movement, and why I did it, was that
when I write C, I have to use much more effort to write it. I have to remember
so many things, like updating headers and sources, updating CMake files,
remembering to free in the end of block instead of deferring, having to create my own
systems for everything instead of using common datatypes...</p>
<p>There's so much mental overhead in C. Odin takes that mental overhead away mostly and just lets you
concentrate on the problem. And it's so much more effortless to write too!</p>
<p>I could feel my motivation come back and I am always excited to write more Odin code. With C code,
I only enjoy it with very small projects, like couple files.. But with larger projects it gets
overwhelming really fast.</p>
<p>On top of that, staring at C++ for my dayjob (I know it's different, but syntax is similar), working with
C made me feel like I was at work at times. It wasn't different enough, in a way.</p>
<p>But now, instead of dreading opening my C game project, I am excited to open my Odin game project!</p>
<p>I really recommend giving Odin a try, especially if you're tired with C.
It's really fun language that helps you a lot when it comes to
writing systems, and thanks to all the vendored packages it's really good for gamedev.</p>
<p>Also if you use language servers, make sure to set up and use <a href="https://github.com/DanielGavin/ols">ols</a>, it's brilliant.
Debugging can be done easily with LLDB debug adapters (or from commandline).</p>
<p>I hope you got something out of this yet-another-rambly-tired blogpost. If nothing else, moving from C to Odin is something
if I can do it, you can do it too!</p>
<p><em><strong>Happy hacking, and thanks for reading!</strong></em></p>
Cosplay images 2024Sat, 12 Oct 2024 00:00:00 +0000Akselicosplaygalleryphotos
https://akselmo.dev/posts/cosplay-images-2024/
https://akselmo.dev/posts/cosplay-images-2024/<p>Some cosplay images from various events. I mostly dress up as my own character,
Huntra, who I have to make a game of someday:tm:.<span id="continue-reading"></span></p>
<p>If I happen to do more this year I will update the galleries.</p>
<p>Photos were taken and edited by my wife Jenny! She is great with camera. <3</p>
<p>The lizard suit (head, feet, hands and tail) were made by <a href="https://www.lisanotuspaja.com/en/">Lisan Otuspaja</a></p>
<h1 id="comiccon-2024"><a class="zola-anchor" href="#comiccon-2024" aria-label="Anchor link for: comiccon-2024">ComicCon 2024</a></h1>
<div>
<div>
<a href="https://akselmo.dev/assets/images/cosplay2024/comiccon/huntracomiccon_1.png" target="_blank">
<img src="https://akselmo.dev/processed_images/huntracomiccon_1.8de12337fa73a787.png" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/comiccon/huntracomiccon_2.png" target="_blank">
<img src="https://akselmo.dev/processed_images/huntracomiccon_2.c2ef52266042f3e8.png" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/comiccon/huntracomiccon_3.png" target="_blank">
<img src="https://akselmo.dev/processed_images/huntracomiccon_3.596e8ce0395b9919.png" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/comiccon/huntracomiccon_4.png" target="_blank">
<img src="https://akselmo.dev/processed_images/huntracomiccon_4.bc3730bc4a064226.png" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/comiccon/huntracomiccon_5.png" target="_blank">
<img src="https://akselmo.dev/processed_images/huntracomiccon_5.1a489cecce12d985.png" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/comiccon/huntracomiccon_6.png" target="_blank">
<img src="https://akselmo.dev/processed_images/huntracomiccon_6.aebdb7fe62d60e7e.png" />
</a>
</div>
</div>
<h1 id="kummacon-2024"><a class="zola-anchor" href="#kummacon-2024" aria-label="Anchor link for: kummacon-2024">Kummacon 2024</a></h1>
<div>
<div>
<a href="https://akselmo.dev/assets/images/cosplay2024/kummacon/kummacon_1.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/kummacon_1.b8ce765c8a296e72.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/kummacon/kummacon_2.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/kummacon_2.d40fde1d498a989e.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/kummacon/kummacon_3.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/kummacon_3.430cf6463b885785.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/kummacon/kummacon_4.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/kummacon_4.858e085cb9247dbd.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/kummacon/kummacon_5.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/kummacon_5.cd448ad53c72ac03.jpg" />
</a>
</div>
</div>
<h1 id="matsucon-2024"><a class="zola-anchor" href="#matsucon-2024" aria-label="Anchor link for: matsucon-2024">Matsucon 2024</a></h1>
<div>
<div>
<a href="https://akselmo.dev/assets/images/cosplay2024/matsucon/matsucon_1.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/matsucon_1.688ffd42e1339263.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/matsucon/matsucon_2.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/matsucon_2.3db203d264b2ff68.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/matsucon/matsucon_3.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/matsucon_3.e69f2fd989370224.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/matsucon/matsucon_4.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/matsucon_4.270da192cee12857.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/matsucon/matsucon_5.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/matsucon_5.0f1bfca535f86bfb.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/matsucon/matsucon_6.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/matsucon_6.680de02c850b593f.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/matsucon/matsucon_7.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/matsucon_7.8bf0cced3d9aa332.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/matsucon/matsucon_8.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/matsucon_8.6709e7755d3aace3.jpg" />
</a>
<a href="https://akselmo.dev/assets/images/cosplay2024/matsucon/matsucon_9.jpg" target="_blank">
<img src="https://akselmo.dev/processed_images/matsucon_9.15f7e2b3b144d504.jpg" />
</a>
</div>
</div>
My Akademy 2024 tripSat, 14 Sep 2024 00:00:00 +0000Akselikdeakademylinuxconference
https://akselmo.dev/posts/akademy-2024/
https://akselmo.dev/posts/akademy-2024/<p><a href="https://akademy.kde.org/">Akademy</a> is this yearly thing where bunch of KDE people go to talk about and work on KDE software.<span id="continue-reading"></span>
I had never been in one before, but this year I managed to make it there! This year Akademy was held at the city of Würzburg.
This was also my first time in Germany, which is the furthest I've ever been from home.</p>
<p>I also had my wife Jenny with me, since if I had gone alone I would have gotten lost in some random mountain somewhere,
or started a new life at the dark corners of Frankfurt airport, completely confused.</p>
<h1 id="friday-the-day-of-flying-or-so-i-thought"><a class="zola-anchor" href="#friday-the-day-of-flying-or-so-i-thought" aria-label="Anchor link for: friday-the-day-of-flying-or-so-i-thought">Friday, the day of flying (or so I thought)</a></h1>
<p>On Friday the 6th, we left from Oulu to Helsinki first. Hop on plane at 14.30 and- Oh, a small delay.</p>
<p>Eh, it's fine, we hopped on the plane at 16.00 and-...</p>
<p>The flight was canceled.</p>
<p>So, we wait til like 19.30 or something to get to Helsinki. But of course, our flight from Helsinki to Germany had already left!
No worries though, the next flight to Germany would leave soon.</p>
<p>Wait, what do you mean it leaves at 7.00?</p>
<p><em>Aaaaaaaaaahhhhggggggggggg....</em></p>
<p>Well, we got paid airport hotel room with paid dinner and breakfast. So we slept at Helsinki the first night. We were supposed to be at
Würzburg at 23.55 or something, but of course not. Oh well, with some effort I might be able to make to the event, although I would miss
the first few talks.</p>
<p>I had the most saddest (but still good) slab of lasagne at very sad and empty airport hotel restaurant.
Very frustrated by everything. Sure it'll get better, right?</p>
<h1 id="saturday-the-day-of-sleep-deprivation"><a class="zola-anchor" href="#saturday-the-day-of-sleep-deprivation" aria-label="Anchor link for: saturday-the-day-of-sleep-deprivation">Saturday, the day of sleep deprivation</a></h1>
<p>This time the airplane actually started to fly, instead of getting canceled for scandalous airplane activities, and we
were on route to Frankfurt pretty soon. I spent some time in the airplane just working on my <a href="https://codeberg.org/akselmo/artificial-rage/src/branch/move-to-odin">never-ending game project</a>.</p>
<p>At Frankfurt, we got our luggage and went to the funny ICE train, which was a bit late. Apparently being late is some German train thing,
I don't really understand it, but we have similar thing at Finland so it wasn't that shocking.</p>
<p>At the train, we were exhausted with our 4h of sleep due to stress not allowing us to sleep, so we just find some seats and sit down. Five
minutes later some chap tells us to go away, so we stay up standing for the next 1h 30min next to the exit doors in some midcabin thing.</p>
<p>I wanted to watch some of the Akademy streams at this point, but I was mostly focusing on staying up.</p>
<p>Eventually, we finally reach the Burg of Würz. First impressions were that it looks really nice and.. What the hell is that? A.. mountain?
Wow, they can be THAT tall??? (Authors note: Finland is very, VERY flat).</p>
<p>Also it was hellishly hot. The most I saw was 32 celsius. It was painful, I was sweating all the time and it was not fun.</p>
<p>We walk to our hotel room at Mercure hotel, which was really nice by the way. At this time, Akademy was having an incredible luncheon together,
so me and Jenny decided to find something to eat. We found this place that was all about avocados, and I had something called powerbowl, which was brilliant.</p>
<p>After that, we began to study the incredibly complex thing that is the German bus system and started our trip towards the Akademy venue.</p>
<h2 id="aktually-at-akademy"><a class="zola-anchor" href="#aktually-at-akademy" aria-label="Anchor link for: aktually-at-akademy">Aktually at Akademy</a></h2>
<p>Me and my blurry sleep deprived brain walk to the venue and first off I meet familiar people. A lot of familiar people.
Many hugs and "Oh you finally made it!"-s were shared. Jenny was with me there as well and it was fun to introduce her to my friends.</p>
<p>I honestly don't remember much about the day. It was quite a blur. But it was cool and I talked <em>a lot.</em></p>
<p>I stole a lot of stickers and listened some talks, which I can barely remember... But I do remember which ones:</p>
<ul>
<li>Arjen's talk about Union KDE styling theme thing, that is super cool.</li>
<li>Harald talked about of our own new possible shiny OS called KDE OS. Or 🍌 OS. I found this really exciting.</li>
<li>A lot of lighting talks, where Nicole's talk about teaching lil kiddos how to install Linux with KDE software on old PC's to bring them back alive.
<ul>
<li>I think this talk was my favorite. It was very wholesome, motivating and I'd like to have similar kind of teaching event at home. No promises, but.. Maybe!</li>
</ul>
</li>
</ul>
<p>During this day I also began to give out <a href="https://en.wikipedia.org/wiki/Salty_liquorice">salmiakki</a> to people, since I had been well prepared.
It was kinda fun to see peoples reactions, especially if they had never heard of it before.</p>
<p>Then it was back to sleep at the hotel.</p>
<h1 id="sunday-i-managed-to-do-things"><a class="zola-anchor" href="#sunday-i-managed-to-do-things" aria-label="Anchor link for: sunday-i-managed-to-do-things">Sunday, I managed to do things</a></h1>
<p>On sunday I was at Akademy pretty much the whole day. Again, I listened bunch of talks, met more people and we had many good chats
about LTS distros, KDE PIM, Kwin, Flatpak... And many other things I can't remember.</p>
<p>I listened Carl's KDE Apps Initiative talk which was very motivating for me, since I've wanted to make a KDE app for a while. A gaming related
lil thing.</p>
<p>After the fun group photo and delicious lunch, I chatted more and wandered about the venue.</p>
<p>There was a talk about daily driving Plasma Mobile and I found it very cool, and we had a chat about the Plasma Mobile afterwards. Apparently my
Fairphone 5 could run PostmarketOS with Plasma Mobile pretty well already, but I am not yet ready to commit to such a change with my mobile device.</p>
<p>Last I listened Xaver's talk about what color is in computers. I learned that sRGB is a lie and gasped audibly, then heard a lot of words
related to color systems I didn't really always understand.. But I found the talk still quite interesting and informative.</p>
<p>The evening was then again a bit of a blur, with sponsors lightning talks and Akademy Awards (congrats to winners btw).</p>
<p>Very interesting day, but I've always been bad when it comes to learning from listening. I learn by doing.</p>
<p>Of course the day wasn't complete without me going to wait bus with my t-shirt and shorts (since it was hot again),
and it started pouring like heck. I was soaked when I got to the bus, then at the last stop I had to walk 1km to the hotel
in the rain. Ah well, it was warm so I didn't mind too much.</p>
<h1 id="monday-i-skipped-the-class"><a class="zola-anchor" href="#monday-i-skipped-the-class" aria-label="Anchor link for: monday-i-skipped-the-class">Monday, I skipped the class</a></h1>
<p>On monday I was so exhausted by Everything:tm: I decided to just chill with my wife and we went around Würzburg, buying food and chocolate.</p>
<p>I spent that day just recharging my social batteries. And I ate some Flammenkuchen, which was <em>delicious!</em></p>
<p>At some point when Jenny is done editing and uploading her video, I will make separate post for it.
Then you can see what Würzburg is like, and hear what she did during the trip.</p>
<p>Edit: Am lazy but heres the link to the video: https://www.youtube.com/watch?v=05qexeiHNeY</p>
<h1 id="tuesday-i-flocked-together-with-the-birds"><a class="zola-anchor" href="#tuesday-i-flocked-together-with-the-birds" aria-label="Anchor link for: tuesday-i-flocked-together-with-the-birds">Tuesday, I flocked together with the birds</a></h1>
<p>Like on monday, on tuesday as well Akademy had these events called "BoFs" which is abbreviation of Birds of a Feather. Because "Birds of a Feather Flock Together".
I don't know why it's called that, but anyhow, I participated a few of them:</p>
<ul>
<li>New design system bof
<ul>
<li>Very interesting discussions and ideas even I know nothing about design</li>
<li>I was mostly hoping to help people there with my programmer side of knowhow, as someone who has touched the Breeze styles codebases</li>
</ul>
</li>
<li>Tiling in kwin bof
<ul>
<li>We mulled over what we could do to make tiling in kwin even better</li>
<li>I have this mini task for myself where I try to make tiles split automatically when a window is dragged on top of the other</li>
</ul>
</li>
<li>Fedora KDE bof
<ul>
<li>I was just mostly curious whats up with Fedora KDE at the moment</li>
<li>I also wanted to give my praise for Fedora KDE, it's been my daily driver for many months now and it's been really good</li>
<li>Couple of my friends use it too due to my recommendation and they're having good time gaming on it! :)</li>
</ul>
</li>
</ul>
<p>To wrap up the evening, I had a fancy dinner with my friends. What was quite a culture shock to me was that after 22.00 the streets
were practically completely empty. It was <em>eerily quiet</em>. At home we would have had few drunks about making noise, but at Germany there was just..
Silence.</p>
<h1 id="wednesday-to-home-again"><a class="zola-anchor" href="#wednesday-to-home-again" aria-label="Anchor link for: wednesday-to-home-again">Wednesday, to home again</a></h1>
<p>Due to having two lizards and them needing a petsitter, and said petsitter not being able to be there the whole week,
we left a bit early so we missed the daytrip and the last bof day.</p>
<p>Bit early being our flight from Frankfurt was leaving around 7.00. So we woke up at 5.00.</p>
<p>And when I wake up I saw a message in my phone saying: "Hi your flight is canceled"</p>
<p>Ah. Fun. If all had gone to plan, we would've been at home around 17.00. But instead, we were home at ~2.00.</p>
<p>We had to live at Frankfurt airport for ~7 hours, saw a lot of police with weapons (it was really scary to me, I've never seen weaponry like.. that openly),
there was some suspicious luggage that got a whole McDonalds covered in "dont go here" tape and more police.</p>
<p>Urghgfhklfg. Scary.</p>
<p>Eventually we luckily made it to Helsinki and then back to Oulu and I didn't need to type out this blogpost from some corner of the airport.</p>
<h1 id="conclusions"><a class="zola-anchor" href="#conclusions" aria-label="Anchor link for: conclusions">Conclusions</a></h1>
<p>Akademy was really fun event. I can hardly describe how fun it was. It's been quite a blur due to traveling issues
and thus me being completely stressed and exhausted, but I still had many fun chats with everyone.</p>
<p>It was really nice to finally see who the people behind the internet names are and have talks with them, be it just random topics
or KDE topics. I met people who I had never met before and shared many chats, laughs and information with them.</p>
<p>I learned quite a lot about what's going on in our KDE ecosystem and even outside of it, how we all interact. But
I think the biggest thing I learned was that events like Akademy are crucial for the motivation and wellbeing of the KDE community.
It helps us stay together, keep our bonds strong, be it KDE folk itself or people working with us, and keep us being awesome at what we do:
Making computers do cool things, for free, for productivity and for fun.</p>
<p>Sorry about no photos, I have basically nothing: I am very bad at taking photos because I simply don't remember.</p>
<p>I love KDE and if you love KDE too, and if it's at all possible, visiting Akademy is well worth it!</p>
<p>See you at the next one, and apologies for the all-over-the-place-rambly-travel-post. Hope you find it a good read anyway.</p>
<p>Thanks for reading!</p>
KIO Thumbnailer SupportThu, 08 Aug 2024 00:00:00 +0000Akselikdesoftwaredevelopmentlinuxkio
https://akselmo.dev/posts/kio-thumbnailer-support/
https://akselmo.dev/posts/kio-thumbnailer-support/<p>The <a href="https://invent.kde.org/frameworks/kio/">KIO Framework</a> has gained support for de-facto standard, cross-desktop thumbnail generators.<span id="continue-reading"></span>
This means that we have a support for thumbnails from 3rd party applications!
On Linux systems, many applications that produce some kind of output, such as a 3D file or text document,
ship a thumbnailer file that tells file managers how to create thumbnails of their files.
One specific example I've used here in the images are STL files, for which we don't have our own KDE-specific thumbnailer plugin.</p>
<p><img src="/assets/images/thumbnailbinary/stlfiles.png" alt="Screenshot of various STL file thumbnails" /></p>
<p><img src="/assets/images/thumbnailbinary/xeno.png" alt="Screenshot of a Xenomorph STL files" /></p>
<p>These thumbnailer files are currently used by Nautilus and Thunar,
so we felt like we were missing out and wanted to join the party! :)</p>
<h1 id="thumbnailer-files"><a class="zola-anchor" href="#thumbnailer-files" aria-label="Anchor link for: thumbnailer-files">Thumbnailer files</a></h1>
<p>Thumbnailer files are simple text files that tell the system what program we should run to generate
a thumbnail. You can check what thumbnailers you have installed by running <code>ls /usr/share/thumbnailers</code></p>
<p>For example, the STL thumbnailer file looks like this:</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>[Thumbnailer Entry]
</span><span>TryExec=stl-thumb
</span><span>Exec=xvfb-run --auto-servernum -w 0 stl-thumb -f png -s %s %i %o
</span><span>MimeType=model/stl;model/x.stl-ascii;model/x.stl-binary;application/sla;
</span></code></pre>
<p>It tells the software running the thumbnailer what commands to use to generate the thumbnail,
and what mimetypes it supports.</p>
<h1 id="kde-thumbnailer-plugins"><a class="zola-anchor" href="#kde-thumbnailer-plugins" aria-label="Anchor link for: kde-thumbnailer-plugins">KDE Thumbnailer Plugins</a></h1>
<p>On KDE side, we have used plugins for KIO, that reside in the <code>kio-extras</code> repository.
They work just fine for our usecase in KDE apps, but nobody should need to write a KIO specific plugin
for their application.</p>
<h1 id="the-changes-to-kio"><a class="zola-anchor" href="#the-changes-to-kio" aria-label="Anchor link for: the-changes-to-kio">The changes to KIO</a></h1>
<p>You can check the <a href="https://invent.kde.org/frameworks/kio/-/merge_requests/1651">merge request</a> for more
in-depth details, but here's a summary of how I made it work side-by-side with our plugin system:</p>
<p>We utilize the KIO plugins always first if possible, since we know for sure they work. This is to avoid
any possible regressions and oddities, and to keep the change as unintrusive as possible. When we encounter
a mimetype that is not supported by our plugins, like STL files, we utilize a thumbnailer file instead.</p>
<p>This also means that it's transparent to users. <strong>Users do not have to worry which one they have installed.</strong></p>
<h1 id="why-make-support-for-thumbnailer-files-then"><a class="zola-anchor" href="#why-make-support-for-thumbnailer-files-then" aria-label="Anchor link for: why-make-support-for-thumbnailer-files-then">Why make support for thumbnailer files then?</a></h1>
<p>As mentioned earlier, no application should need to create a plugin for KIO just to make their thumbnails
show up in our applications.</p>
<p>Thumbnailer files offer other benefits too, such as easing future transitions, (like from KF6 to KF7); working nicely with sandboxing, and being distributable in Flatpak bundles.</p>
<p>I am also working on moving our own plugins into thumbnailers,
so we get the benefits from that too.</p>
<h1 id="how-can-i-test-it-out"><a class="zola-anchor" href="#how-can-i-test-it-out" aria-label="Anchor link for: how-can-i-test-it-out">How can I test it out?</a></h1>
<p>Currently it's only in the master branch of KIO, so if you really want to try it out,
you will have to set up KDE Plasma development environment: <a href="https://develop.kde.org/docs/getting-started/building/kdesrc-build-setup/">https://develop.kde.org/docs/getting-started/building/kdesrc-build-setup/</a></p>
<p>When inside in the development environment, open Dolphin and enable the thumbnailers from preview settings.</p>
<p>Any help testing it would be very welcome! :)
Let me know of any possible improvements and bugs!</p>
Kate and OrgModeSun, 07 Jul 2024 00:00:00 +0000Akselikdekateorgmodenotesproductivitypersonal
https://akselmo.dev/posts/kate-and-orgmode/
https://akselmo.dev/posts/kate-and-orgmode/<p>I have a very.. unusual notetaking and task setup with <a href="https://kate-editor.org/">Kate</a>, using <a href="https://orgmode.org/">Orgmode</a> files.<span id="continue-reading"></span>
I wanted to showcase it and explain how it works, maybe someone else has similar needs.</p>
<p>Here's a small screenshot of my journal notes, I blurred out some things I didn't want to share.</p>
<p><img src="/assets/images/kateorg.png" alt="Screenshot of my Journal 2024 org mode notes where many items are blurred out" /></p>
<h1 id="why-orgmode"><a class="zola-anchor" href="#why-orgmode" aria-label="Anchor link for: why-orgmode">Why OrgMode?</a></h1>
<p>I actually prefer markdown much more. I enjoy writing markdown files and it just works in most editors.
However, there is zero markdown note taking apps on android, that allow me to <strong>sync from my nextcloud</strong>
<em>and</em> have <strong>notifications</strong>.</p>
<p>I write very journal style notes. I have one big journal file (used to be a file per day before),
where I write down all the interesting things that happened, plus most importantly, my work tasks.</p>
<p>I tried to use calendar with tasks before.. But theres way too much context switching between
notetaking apps, calendars, tasks (and on android you have to have two apps for tasks and calendar!!!).
I was drowning in various apps and windows, constantly hopping around..</p>
<p>All I wanted to do was write down a task in my journal, then have that task notify me on my phone
and on my desktop whenever it was scheduled.</p>
<p>So eventually I found an app called <a href="https://github.com/orgzly-revived/orgzly-android-revived/">Orgzly Revived</a>.
It lets me take the outline style notes where everything is a bulletpoint, with tasks and such, timers, repeats..
And it has the dang phone notifications no other note taking app has. So it's perfect. Works awesome for my needs.</p>
<p>Only thing is that it requires Orgmode files. Okay, I can do that. I first used <a href="https://logseq.com/">Logseq</a> with both
markdown and orgmode files, but it's quite slow app, even on my nice PC. And no notifications on mobile of course.</p>
<p>I then realised that I am trying to overcomplicate things. I live a lot of my work life in Kate editor, so I
decided to start using that. I had to update the Orgmode Kate syntax file a bit to make it work better for me
(it's been upstreamed now yay), but other than that it works really nicely.</p>
<p><em>And why not Emacs? I need an editor, not an OS.</em> Well, jokes aside,
I am just not really into learning yet another
tool for something like note taking. Last time I tried to set up Neovim config that works for me, I just ended up doing everything in Kate.. I wager same would happen with emacs.
I am very happy with Kate, that's all. And I contribute to it now and then, so it just makes sense to use it. :)</p>
<p>Now I just sync all my note files through my Nextcloud to my phone and my computers. I have couple scripts
that make figuring out my agenda and have notifications on my PC as well.</p>
<h1 id="my-kate-setup"><a class="zola-anchor" href="#my-kate-setup" aria-label="Anchor link for: my-kate-setup">My Kate setup</a></h1>
<p>My setup took some time to get together and with couple scripts and snippets it works pretty well.</p>
<ul>
<li>First, you need to <code>git clone https://codeberg.org/akselmo/kate-orgmode.git</code>
<ul>
<li>In there I have couple python and shell scripts, and snippets for Kate</li>
<li>You need to create a <code>.venv</code> for it with <code>python -m venv .venv</code> and then <code>pip install -r requirements.txt</code></li>
<li>Check the Readme file for how to use the snippets</li>
</ul>
</li>
<li>Create session called Notes.
<ul>
<li>In Plasma, you can just search "Notes" in KRunner and open the Notes session, that just opens the files.</li>
</ul>
</li>
<li>Symlink the org mode snippets to <code>~/.local/share/ktexteditor_snippets/data/</code> and make sure they work in Kate
<ul>
<li>Snippets are incredibly powerful in Kate, i recommend using them for many things!</li>
<li>These snippets automate stuff like "worktask" entries.</li>
<li>Unfortunately any timestamps need to be modified by hand, i have not yet had time to make an external tool
that spawns a calendar view and spits out a timestamp.</li>
<li>For example, "worktask" adds a following item.</li>
</ul>
</li>
</ul>
<pre data-lang="org" style="background-color:#181818;color:#ffffff;" class="language-org "><code class="language-org" data-lang="org"><span style="font-weight:bold;color:#838fff;">* </span><span style="font-weight:bold;color:#ff9233;">TODO</span><span style="font-weight:bold;color:#5fff33;"> [#ABC] </span><span style="font-weight:bold;color:#838fff;">task_name :work:
</span><span style="font-weight:bold;color:#33ffa0;">SCHEDULED: </span><span><2024-07-07 Sun 21:12> </span><span style="font-weight:bold;color:#33ffa0;">DEADLINE: </span><span><2024-07-07 Sun 21:12>
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :PROPERTIES:
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :CREATED:</span><span> [2024-07-07 Sun 21:12]
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :product:</span><span> product
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :kdebug: </span><span style="text-decoration:underline;color:#33aaff;">[[</span><span style="text-decoration:underline;color:#808080;">https://bugs.kde.org/show_bug.cgi?id=bugid</span><span style="text-decoration:underline;color:#33aaff;">][bugid]]
</span><span> :merge-request: UPDATE_ME
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :END:
</span></code></pre>
<ul>
<li>Add an "external tool" entry for the <code>run-orgagenda.sh</code> item in the files.
<ul>
<li>Set the "Output" setting to "Display in a panel"</li>
<li>For the scripts, make sure they're reading right folder (where your notes are)</li>
<li>Now you can press <code>ctrl+alt+i</code> and type <code>Org Agenda</code> and it shows you a fun lil overview in a panel of all your items in agenda</li>
</ul>
</li>
<li>In your DE's autostart, add the <code>run-orgnotifier.sh</code> script.
<ul>
<li>This will send notification for anything you have set as scheduled or deadline before 30 min, and before/after 5 min of the timestamp.</li>
</ul>
</li>
</ul>
<p>That should be it for the setup, <strong>the code for these scripts is absolutely horrid</strong>
but you should check that all filepaths match yours etc. I need to clean up the code when I feel like it
but honestly it Just Works:tm: for now.. lol.</p>
<h1 id="journaling"><a class="zola-anchor" href="#journaling" aria-label="Anchor link for: journaling">Journaling?</a></h1>
<p>I have one single file that is called <code>Journal-2024</code> and I create new journal every year.
In this journal file, I <strong>prepend</strong> new items on top of the file, like this.</p>
<pre data-lang="org" style="background-color:#181818;color:#ffffff;" class="language-org "><code class="language-org" data-lang="org"><span>
</span><span style="font-weight:bold;color:#838fff;">* Daily notes 2024-07-07
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :PROPERTIES:
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :CREATED:</span><span> [2024-07-07 Sun 21:20]
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :END:
</span><span>Some notes for this day
</span><span style="font-weight:bold;color:#808080;">*</span><span style="font-weight:bold;color:#838fff;">* Some specific subnote for this daily note
</span><span>blabla
</span><span>
</span><span style="font-weight:bold;color:#838fff;">* </span><span style="font-weight:bold;color:#ff9233;">TODO</span><span style="font-weight:bold;color:#5fff33;"> [#A] </span><span style="font-weight:bold;color:#838fff;">do this task ples :personal:
</span><span style="font-weight:bold;color:#33ffa0;">SCHEDULED: </span><span><2024-07-06 Sat 21:22> </span><span style="font-weight:bold;color:#33ffa0;">DEADLINE: </span><span><2024-07-07 Sun 21:23>
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :PROPERTIES:
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :CREATED:</span><span> [2024-07-05 Fri 21:22]
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :END:
</span><span>blalbla
</span><span>
</span><span style="font-weight:bold;color:#838fff;">* </span><span style="font-weight:bold;color:#ff9233;">DONE</span><span style="font-weight:bold;color:#5fff33;"> [#B] </span><span style="font-weight:bold;color:#838fff;">ancient task :work:
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :PROPERTIES:
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :CREATED:</span><span> [2000-01-01 someDayIdk 21:23]
</span><span> </span><span style="font-weight:bold;color:#838fff;"> :END:
</span><span>its been 24 years
</span><span>#+BEGIN_SRC code
</span><span>ancient code
</span><span>#+END_SRC
</span><span>
</span></code></pre>
<p>This means that you can just quickly see all the new items. Also in Kate, there's a handy
feature for folding all toplevel nodes when you press <code>ctrl+alt+i</code> so you get just list of
all headers. I use it all the time. Folding the nodes only works with the newest ksyntaxhighlighting since
i recently updated the orgmode syntax file to support that lol.</p>
<h1 id="anything-else"><a class="zola-anchor" href="#anything-else" aria-label="Anchor link for: anything-else">Anything else</a></h1>
<p>Any other items go to their respective note files.</p>
<p>For example anything related to programming goes to "Programming notes" file. Then I use
tags for those items to categorize them based on language, framework, etc..</p>
<p>Instead of having many small files, I have multiple big files, where I categorize items with tags.
I can then easily search for items by typing <code>:tag:</code> in the search field in Kate, and it shows me all items
related to that tag. Just, well, remember to tag your items! :D</p>
<h1 id="wrap-up"><a class="zola-anchor" href="#wrap-up" aria-label="Anchor link for: wrap-up">Wrap up</a></h1>
<p>To wrap it up, this system has made things much easier to remember for me, and I can handle more
complicated tasks like repeating workout tasks with my phone. (I can do it in Kate too but it requires manual number changing).</p>
<p>I wouldn't mind changing back to markdown if there was a <strong>markdown app for phone that has actual notifications</strong>.</p>
<p>Sorry this post is a bit all over the place, but there's really not much more interesting things to share about this.
It's just couple scripts reminding me or showing all the items in my agenda, and the rest is snippets in Kate
and writing orgmode files.</p>
<p>And I am quite happy with my system. Maybe it'll help you to get some ideas too!</p>
<p>Also please tell me about any markdown note taking apps that have notifications on mobile and desktop, if you know
any. You can ping me on fedi, which you can find on my about section.</p>
<p>Thanks for reading!</p>
Family of free and friendly open source softwareThu, 02 May 2024 00:00:00 +0000Akselikdesoftwaredevelopmentlinuxfoss
https://akselmo.dev/posts/fofafoss/
https://akselmo.dev/posts/fofafoss/<p>Or FOFAFOSS. Rolls right off your tongue.<span id="continue-reading"></span></p>
<p>Like in many families, there's always a bit of.. turmoil and drama in FOSS.
Something breaks (either on purpose or by accident), people get frustrated.. The usual.
It is kind of to be expected when it comes to very social projects, like let's say, Linux desktop environments.</p>
<p>People have their own visions and ways to see things. They often clash. That's normal. It's quite human.
I do like to think that Linux desktop environments especially are like siblings that have rivalries.</p>
<p>But we got to remember that it's not "us vs them" here. We don't have the resources to fight each other.
We <em>need</em> to work together even with our incompatible visions sometimes. Otherwise things will keep fracturing
and get even worse.. And nobody gains from that. Well, except the proprietary platforms. :P</p>
<p>In the end we all want to make good software for everyone to use and enjoy.
Let's help each other to do that as well as we can.</p>
<p>Nothing wrong with "Oh you made that? Well watch this!" type of friendly rivalry however,
it keeps us doing what we do best. :)</p>
<p>I just wanted to write this down as somekind of reminder that we got to remember to
work together if we want to succeed. Even when frustrated.</p>
<p>And no I am not any high and mighty person to really say this, I have had my own share of frustrations and quips.
This post serves also as a reminder for myself.</p>
<p>So let's try to work together as well as we can.</p>
Plasma 6 and meSun, 31 Mar 2024 00:00:00 +0000Akselikdesoftwaredevelopmentlinuxplasma
https://akselmo.dev/posts/plasma-6-and-me/
https://akselmo.dev/posts/plasma-6-and-me/<p>I'm bit late to the train of Plasma 6 related posts... But anyway.
I will go through some things I did.<span id="continue-reading"></span></p>
<p>For me working on Plasma 6 was pretty fun, I learned a lot of new things and
fixed bunch of bugs and crashes.</p>
<p>The most resourceful ones can find my merge requests, but I am too lazy to link
them all.</p>
<h2 id="things-i-did"><a class="zola-anchor" href="#things-i-did" aria-label="Anchor link for: things-i-did">Things I did</a></h2>
<p>Most of the things I did were a lot more in the background. I hunted down a lot of bugs and crashes,
and tried to fix them myself or helped others fix them, in various projects, such as:</p>
<ul>
<li>Dolphin</li>
<li>Plasmashell</li>
<li>Kwin</li>
<li>KNS</li>
<li>And probably a lot of more I have already forgot... :D</li>
</ul>
<p>But there was A LOT stuff: Around 100 merge requests in total!
Pretty much all of them got in, thanks to all the reviews and education other KDE developers provided to me! :)</p>
<p>Again, <strong>thanks to everyone who has helped me to work on KDE projects!</strong>
Thanks for your patience with me and all the knowledge you have parted to me. ❤️
I'll keep doing my best helping KDE projects, be it bug hunting or feature creation.</p>
<p>I have to say my software testing background has been very useful when it comes down
to hunting down bugs, and I've learned a lot of things about Qt, C++ and QML. Still got much
more to learn though, but that's what makes me so excited about programming!</p>
<p>I think one of the most useful things I've learned is how to use GDB. I can't provide
anyone a crash course (at least in this blog post) but it is essential when hunting down
weird bugs in plasmashell for example. I love debuggers integrated to editors like using LLDB-DAP in Kate,
but sometimes GDB in terminal is all you can use, so it's good idea to learn to use it!</p>
<p>One big thing I worked on with others was fractional scaling related stuff: I didn't do any of the Kwin stuff around it,
but I hunted down some weird bugs with window decorations having some weird gaps in them when windows are specific size.
Hunting down all these bugs and weirdness took long time, and we're still looking into it, since it seems to be different in every system..
Floating point numbers and computers are very weird combo.</p>
<p>Another more visible thing I did was unifying separator colors and other items, you can find an issue about it here: <a href="https://invent.kde.org/teams/vdg/issues/-/issues/38">Frame and outline color consistency and high-contrast setting changes</a>.
I have been bothered by the random differences between some elements, which can be especially noticeable in darker colorschemes,
so I finally sat down and combed through related codebases. There's likely more to fix though, but there is now easy way for us to add
high-contrast support for outlining elements! It just needs doing, and I haven't had the time.. Yet. :)</p>
<h2 id="things-i-learned"><a class="zola-anchor" href="#things-i-learned" aria-label="Anchor link for: things-i-learned">Things I learned</a></h2>
<ul>
<li>GDB is a life saver</li>
<li>Write down notes. All the time.
<ul>
<li>Journaling is a good idea!</li>
</ul>
</li>
<li>Working in open source is a lot about the social aspects!
<ul>
<li>Be nice to people! Duh!</li>
<li>But also don't let people walk over you!</li>
<li>Listen to others, and don't be afraid to share your opinion.</li>
<li>Ask many questions and write down the answers.</li>
</ul>
</li>
<li>Be patient</li>
<li>Bug triaging is tough, but very important!</li>
<li>Remember to rest (I'm bad at this)</li>
</ul>
<h2 id="things-i-will-do-in-future"><a class="zola-anchor" href="#things-i-will-do-in-future" aria-label="Anchor link for: things-i-will-do-in-future">Things I will do in future</a></h2>
<p>I will continue hunting down various bugs and crashes and fixing them whenever I spot some, or
something is raised to me as "hey this looks like something you could do."</p>
<p>I have also started working on couple things related to remote desktop:</p>
<ul>
<li><a href="https://invent.kde.org/network/krdc/-/merge_requests/93">rdp: Proxy and Gateway settings</a></li>
<li><a href="https://invent.kde.org/plasma/krdp/-/merge_requests/16">Simple KCM for KRDP</a></li>
</ul>
<p>Last but not least, I have looked into facelifting our dear Breeze theme, just a lil bit. Nothing drastic,
some tell me they don't see any change and some do. But hopefully it would make Breeze look
just a lil bit "softer" and "friendlier." :) You can see them here: <a href="https://invent.kde.org/plasma/breeze/-/merge_requests/449">Slightly rounder elements, slightly lighter outlines</a></p>
<hr />
<p>All in all I am very happy with my current job working on KDE projects, fixing bugs and creating new cool things.
I also kind of enjoy being a jack-of-all-trades (master of none),
since I get to do a lot of different kinds of stuff, from something more "background"
like KWin and plasmashell to something more visible like Breeze and Dolphin.
Maybe eventually I will specialize around something, but for now I am bit all over the place which is fine by me lol.</p>
<p>I hope that some of my work has helped you as well. :)</p>
<p>I'll keep doing my best and learning more. (And hopefully write more blogposts.. lol.)</p>
<p>Thanks for reading!</p>
Debug symbols for all!Sun, 21 Jan 2024 00:00:00 +0000Akselikdesoftwaredevelopmentdebugginglinux
https://akselmo.dev/posts/debug-symbols-for-all/
https://akselmo.dev/posts/debug-symbols-for-all/<p>When running Linux software and encountering a crash, and you make a bug<span id="continue-reading"></span>
report about it (thank you!), you may be asked for backtraces and debug symbols.</p>
<p>And if you're not developer you may wonder what in the heck are those?</p>
<p>I wanted to open up this topic a bit, but if you want more technical
in-depth look into these things, internet is full of info. :)</p>
<p>This is more a <strong>guide for any common user</strong> who encounters
this situation and what they can do to get these mystical backtraces and symbols and
magic to the devs.</p>
<h1 id="backtrace"><a class="zola-anchor" href="#backtrace" aria-label="Anchor link for: backtrace">Backtrace</a></h1>
<p>When developers ask for a backtrace, they're basically asking "what are the steps that caused this crash to happen?"
Debugger software can show this really nicely, line by line. However without correct debug symbols,
the backtrace can be meaningless.</p>
<p>But first, how do you get a backtrace of something?</p>
<p>On systems with systemd installed, you often have a terminal tool called <code>coredumpctl</code>.
This tool can list many crashes you have had with software. When you see something say
"segmentation fault, core dumped", this is the tool that can show you those core dumps.</p>
<p>So, here's a few ways to use it!</p>
<h2 id="how-to-see-all-my-crashes-coredumps"><a class="zola-anchor" href="#how-to-see-all-my-crashes-coredumps" aria-label="Anchor link for: how-to-see-all-my-crashes-coredumps">How to see all my crashes (coredumps)</a></h2>
<p>Just type <code>coredumpctl</code> in terminal and a list opens. It shows you a lot of information and
last the app name.</p>
<h2 id="how-to-open-a-specific-coredump-in-a-debugger"><a class="zola-anchor" href="#how-to-open-a-specific-coredump-in-a-debugger" aria-label="Anchor link for: how-to-open-a-specific-coredump-in-a-debugger">How to open a specific coredump in a debugger</a></h2>
<p>First, check from the plain <code>coredumpctl</code> list the coredump you want to check out.
Easiest way to deduce it is to check the date and time. After that, there's something called <code>PID</code> number, for example <code>12345</code>.
You can close the list by pressing <code>q</code> and then type <code>coredumpctl debug 12345</code>.</p>
<p>This will often open GDB, where you can type <code>bt</code> for it to start printing the backtrace.
You can then copy that backtrace. But there's IMO easier way.</p>
<h2 id="can-i-just-get-the-backtrace-automatically-in-a-file"><a class="zola-anchor" href="#can-i-just-get-the-backtrace-automatically-in-a-file" aria-label="Anchor link for: can-i-just-get-the-backtrace-automatically-in-a-file">Can I just get the backtrace automatically in a file..?</a></h2>
<p>If you only want the latest coredump of the app that crashed on you, then print the backtrace
in a text file that you can just send to devs, here's a oneliner to run in terminal:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>coredumpctl debug APP_NAME_HERE</span><span style="color:#ff9233;"> -A </span><span style="color:#5fff33;">"-ex bt -ex quit" </span><span style="font-weight:bold;color:#33ffa0;">|& </span><span>tee backtrace.txt
</span></code></pre>
<p>You can also use the <code>PID</code> shown earlier in place of the app name, if you want some
specific coredump.</p>
<p>The above command will open the coredump in a debugger, then run <code>bt</code> command, then quit,
and it will write it all down in a file called <code>backtrace.txt</code> that you can share with developers.</p>
<p>As always when using debugging and logging features, <strong>check the file for possible personal data!</strong>
It's very unlikely to have anything personal data, BUT it's still a good practice to check it!</p>
<p>Here's a small snippet from a backtrace I have for Kate text editor:</p>
<pre data-lang="bt" style="background-color:#181818;color:#ffffff;" class="language-bt "><code class="language-bt" data-lang="bt"><span>#0 __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0)
</span><span> at pthread_kill.c:44
</span><span>...
</span><span>#18 0x00007f5653fbcdb9 in parse_file
</span><span> (table=table@entry=0x19d5a60, file=file@entry=0x19c8590, file_name=file_name@entry=0x7f5618001590 "/usr/share/X11/locale/en_US.UTF-8/Compose") at ../src/compose/parser.c:749
</span><span>#19 0x00007f5653fc5ce0 in xkb_compose_table_new_from_locale
</span><span> (ctx=0x1b0cc80, locale=0x18773d0 "en_IE.UTF-8", flags=<optimized out>) at ../src/compose/table.c:217
</span><span>#20 0x00007f565138a506 in QtWaylandClient::QWaylandInputContext::ensureInitialized (this=0x36e63c0)
</span><span> at /usr/src/debug/qt6-qtwayland-6.6.0-1.fc39.x86_64/src/client/qwaylandinputcontext.cpp:228
</span><span>#21 QtWaylandClient::QWaylandInputContext::ensureInitialized (this=0x36e63c0)
</span><span> at /usr/src/debug/qt6-qtwayland-6.6.0-1.fc39.x86_64/src/client/qwaylandinputcontext.cpp:214
</span><span>#22 QtWaylandClient::QWaylandInputContext::filterEvent (this=0x36e63c0, event=0x7ffd27940c50)
</span><span> at /usr/src/debug/qt6-qtwayland-6.6.0-1.fc39.x86_64/src/client/qwaylandinputcontext.cpp:252
</span><span>...
</span></code></pre>
<p>The first number is the step where we are. Step <code>#0</code> is where the app crashes.
The last step is where the application starts running.
Keep in mind though that even the app crashes at <code>#0</code> that may be just the computer handling the crash,
instead of the actual culprit. The culprit for the crash can be anywhere in the backtrace. So you
have to do some detective work if you want to figure it out. Often crashes happen when some
code execution path goes in unexpected route, and the program is not prepared for that.</p>
<p><strong>Remember that you will, however, need proper debug symbols for this to be useful!</strong>
We'll check that out in the next chapter.</p>
<h1 id="debug-symbols"><a class="zola-anchor" href="#debug-symbols" aria-label="Anchor link for: debug-symbols">Debug symbols</a></h1>
<p>Debug symbols are something that tells
the developer using debugger software, like GDB, what is going on and where.
Without debugging symbols the debugger can only show the developer
more obfuscated data.</p>
<p>I find this easier to show with an example:</p>
<p><strong>Without debug symbols</strong>, this is what the developer sees when reading the backtrace:</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>0x00007f7e9e29d4e8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /lib64/libQt5Core.so.5
</span></code></pre>
<p>Or even worse case scenario, where the debugger can't read what's going on but only can see the
"mangled" names, it can look like this:</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>_ZN20QEventDispatcherGlib13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE
</span></code></pre>
<p>Now, those are not very helpful. At least the first example tells what file the error is happening in,
but it doesn't really tell where. And the second example is just very difficult to understand what's going on.
You don't even see what file it is.</p>
<p>With <strong>correct debug symbols</strong> installed however, this is what the developer sees:</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=0x7fe88c001620, event=0x7fe888002c20) at kernel/qcoreapplication.cpp:1064
</span></code></pre>
<p>As you can see, it shows the file <em>and</em> line. This is super helpful since developers can just
open the file in this location and start mulling it over. No need to guess what line it may have happened,
it's right there!</p>
<h2 id="so-where-to-get-the-debug-symbols"><a class="zola-anchor" href="#so-where-to-get-the-debug-symbols" aria-label="Anchor link for: so-where-to-get-the-debug-symbols">So, where to get the debug symbols?</a></h2>
<p>Every distro has it's own way, but KDE wiki has an excellent list of most common operating systems and how to get debug symbols for them:
<a href="https://community.kde.org/Guidelines_and_HOWTOs/Debugging/How_to_create_useful_crash_reports">https://community.kde.org/Guidelines_and_HOWTOs/Debugging/How_to_create_useful_crash_reports</a></p>
<p>As always, double check with <strong>your distros official documentation</strong> how to proceed. But the above link is a good
starting point!</p>
<p>But basically, your package manager should have them.
If not, you will have to build the app yourself with debug symbols enabled, which is definitely not ideal..
If the above list does not have your distro/OS, you may have to ask the maintainers of your distro/OS for help with getting the debug symbols installed.</p>
<h2 id="wait-which-ones-do-i-download"><a class="zola-anchor" href="#wait-which-ones-do-i-download" aria-label="Anchor link for: wait-which-ones-do-i-download">Wait, which ones do I download?!</a></h2>
<p>Usually the ones for the app that is crashing. Sometimes you may also need include the libraries the app is using.</p>
<p>There is no real direct answer this, but at the very least, get debug symbols for the app. If developers need
more, they will ask you to install the other ones too.</p>
<p>You can uninstall the debug symbols after you're done, but that's up to you.</p>
<h1 id="thanks-for-reading"><a class="zola-anchor" href="#thanks-for-reading" aria-label="Anchor link for: thanks-for-reading">Thanks for reading!</a></h1>
<p>I hope this has been useful! I especially hope the terminal "oneliner" command
mentioned above for printing backtraces quickly into a file is useful for you!</p>
<p>Happy backtracing! :)</p>
And who is going to clean up?Mon, 15 Jan 2024 00:00:00 +0000Akselipersonal
https://akselmo.dev/posts/and-who-is-gonna-clean-up/
https://akselmo.dev/posts/and-who-is-gonna-clean-up/<p>I was listening Late Night Linux podcast episode 264 and they were chatting about AI, as usual.<span id="continue-reading"></span>
This post was inspired by the discussion, but not really related to it.</p>
<p>In podcast it was mentioned that current AI is like T-Ford of our era. I do agree.
There are potential good in the tooling, but something else came up in my mind:</p>
<p>Guess who is going to end up cleaning up the mess that those "AI T-Fords" go crashing around,
destroying lives, causing damage and such? On top of the climate change issues and other fun stuff we're
currently suffering from?</p>
<h1 id="the-clean-up-generation"><a class="zola-anchor" href="#the-clean-up-generation" aria-label="Anchor link for: the-clean-up-generation">The clean-up generation</a></h1>
<p>First let's make it clear what I mean with this clean-up generation:</p>
<ul>
<li>Anyone who actually cares about their impact on the world
<ul>
<li>Going "convenience and productivity is the king" route every time can be harmful</li>
</ul>
</li>
<li>Anyone who isn't rich (if you got +100k in your savings, I'd say you're rich.)
<ul>
<li>This also includes rich parents and family and whatever</li>
</ul>
</li>
<li>Our children who will have it way worse</li>
</ul>
<p>All these new inventions that cause distress are often made by rich dads,
who take resources from the clean-up generation to create more and more,
often useless things. When things go wrong, they tell their children to clean up.</p>
<p>It's akin to those dads coming to your house, taking all your Legos and pouring them all
over your house, then when they create a new shiny thing, they take those Lego parts home and tell
you to clean up the rest.</p>
<h1 id="progression-comes-with-a-cost"><a class="zola-anchor" href="#progression-comes-with-a-cost" aria-label="Anchor link for: progression-comes-with-a-cost">Progression comes with a cost</a></h1>
<p>This is the go-to argument: There's no progression without some sort of cost.</p>
<p>Well, sure, but why is it always the clean-up generation that pays the cost?
You rich dads have way more than enough money to clean things up. But you don't care, since you know
you're not alive anymore when the problems really materialize.</p>
<p>And I'm tired of cleaning up your shit. But I'm expecting there's tons of clean-ups to be done
in future.</p>
<p>I hope I do not cause such mess to clean up for my kids, if I decide to have any.</p>
<p>Happy 2024. Make sure your cleaning tools are ready.</p>
<h1 id="side-tangent"><a class="zola-anchor" href="#side-tangent" aria-label="Anchor link for: side-tangent">Side tangent</a></h1>
<p>No, copy-paste-bot for your code editor is not useful, and if you find it useful,
I'm worried about your code quality.
I wouldn't trust anyone who copies code directly from internet without second thought,
why would I trust a bot that does same, especially since it does not give a thought at all?</p>
First week of fulltime KDESat, 11 Nov 2023 00:00:00 +0000Akselipersonalkdesoftware
https://akselmo.dev/posts/first-week-of-fulltime-kde/
https://akselmo.dev/posts/first-week-of-fulltime-kde/<p>Seems getting laid off was pretty good for me after all. Funny how things go sometimes.<span id="continue-reading"></span></p>
<p>A company that works on KDE stuff (and other Linuxy things),
interviewed me for a fun job: "Wanna help us work on KDE Plasma?"</p>
<p><strong>You bet I said YES!</strong></p>
<p>So now I work daily 8 hours a day, 5 days a week, to improve KDE Plasma!
It's contract work, but I hope people there like me a lot to keep me around. :)
At least I am planning to be around for the long haul!</p>
<p><em>Anyway, this was my first week doing this job!</em></p>
<p>Everyone I work with is really nice and most of them I have already met during my contribution
adventures.</p>
<p>The job itself for now has been about helping finding and fixing bugs in KDE Plasma. I've
mostly concentrated on bugs that can appear when moving from 5 to 6, like migrating configs, etc.</p>
<p>There's some other stuff I'm doing as well, but they're not that visible to end user, necessarily.
Like fixing warnings.</p>
<p>I am also focusing on learning the stack and hopefully eventually get to work more on Flatpak related
things and Kwin related things, since those interest me. I am also hoping to help with accessibility,
like high-contrast color schemes and such. And who knows what else I will work on in future!</p>
<p>Also due to my experience in test automation, I have taken on the sidequest to help with that part as well.
I have been quite interested how test automation of Linux desktop apps works, and there's quite cool
stuff going on there.</p>
<p>In my <strong>personal</strong> KDE plans, I want to add color customization options for separators, since those can be used
in high contrast themes. But since it would be any custom color the user wants, well, they can
set it to anything. Anyhow, I will first prioritize fixing bugs and learning more.</p>
<p>Thank you so much for the company who took me under their wing. And thanks to my colleagues
for helping me get into this and teaching me things, even when my questions can be a bit dumb at times.. :'D
You know who you are!</p>
<p>Expect more posts in future about what I learn during this job! :)</p>
<p>Thanks for reading!</p>
I got laid off from work...Tue, 10 Oct 2023 00:00:00 +0000Akselipersonal
https://akselmo.dev/posts/i-got-laid-off/
https://akselmo.dev/posts/i-got-laid-off/<p>Hello, today I got laid off from my current workplace. <span id="continue-reading"></span>
I used to be a test automation engineer but I also worked
on Windows application with C#.</p>
<p><strong>So, I am looking for new programming and development job!</strong></p>
<p>I am very interested and passionate about Linux, and I am
quite good in test automation. I have been test automating
embedded and mobile devices with Python, using custom solutions,
Robot Framework and Appium/Selenium.</p>
<p>I am also a <a href="https://invent.kde.org/akselmo">KDE application and Plasma developer</a> (as you may know, if you're reading this post on KDE Planet).
I've mostly contributed to Kate and Breeze. I'm still somewhat new in C++ and Qt, but I don't mind learning more.</p>
<p>I also create games as a hobby, currently working on a <a href="https://codeberg.org/akselmo/artificial-rage">game made with C and Raylib</a>.
Before I've used <a href="https://akselmo.itch.io/">Unity and C#</a> for games for roughly ten years.</p>
<p>All in all, I am quite good allrounder but shine especially when working with Linux,
be it programming software or creating test automation systems.</p>
<p>I live in Finland and I am fine with full remote work.
If you're interested, feel free to mail me at: [email protected]</p>
<h1 id="other-thoughts-about-the-thing"><a class="zola-anchor" href="#other-thoughts-about-the-thing" aria-label="Anchor link for: other-thoughts-about-the-thing">Other thoughts about the thing</a></h1>
<p>Kinda rough, you know. To be burnt out, then finally heal and go back to work...
Only find out that you are being laid off.</p>
<p>I miss my coworkers a lot and it makes me sad. They were great.</p>
<p>Now I will have to just.. Let myself go through all my emotions.
Try to relax a bit. Basically continue that sickleave I was in..</p>
<p>But anyway. I am not too worried. But I am frustrated and sad.</p>
<p>This was my first "change negotiation" ever... And it ended up
with me leaving. There was no specific reason, just.. Money.</p>
<p>This too shall pass. I'll keep at it.</p>
<p>Anyone else in similar situation, you have my sympathies.</p>
<p>Thanks for reading.</p>
I burned out, again.. And how I let myself heal.Sun, 08 Oct 2023 00:00:00 +0000Akselipersonal
https://akselmo.dev/posts/i-burned-out-again/
https://akselmo.dev/posts/i-burned-out-again/<p><em>Sorry KDE Planet readers, this is just rambly non-techy post.</em><span id="continue-reading"></span></p>
<p>Burning out is no joke. I have gone through 3 or 4 major burnouts in my life.
All of them related to programming, in a way or another.</p>
<p>Basically my burnout starts when I can't think anything else except some certain problem.
I forget to take care of myself. I have major moodswings. It affects me and the environment
around me.</p>
<p>But I've always bounced back. Will go through that in a bit.</p>
<h1 id="what-happened-this-time"><a class="zola-anchor" href="#what-happened-this-time" aria-label="Anchor link for: what-happened-this-time">What happened this time?</a></h1>
<p>Often my burnout happens due to bad work environment (one of my internships)
or since I am a chronical people-pleaser, I try to do something perfectly right
for everyone and try to make everyone happy, then I explode.</p>
<p>This time, I was doing quite boring, repetitive work over summer. It was interesting at first,
creating my own test automation stuff for something. But since everyone was on vacation except me,
it was pretty lonely and eventually the work turned into boring mush.</p>
<p>Now I don't mind working on test automation, but when it's the only thing I am doing for
past 4 years.. Ech.
It was like chewing on chewing gum where all the flavor had already went away ages ago.</p>
<p>Anyway, I pushed myself too hard so I could get done with the task ASAP.
I didn't really take many breaks since there wasn't coworkers telling me to stop, lol.</p>
<p>Basically, I got so bored I lost my mind. I wanted to get over it quickly
so I can do something else (which was other not-so-interesting work.. :P )</p>
<p>This then caused random mood swings and other fun things.</p>
<p>Anyway, my wife finally pushed me to see a doctor about it and I've been on a sick leave
for past two weeks. Just getting my head back in shape. I felt first really guilty
about going to sick leave, since I did it last year too.. But fuck it. If I need it,
I need it. Health comes first.</p>
<p>I recognize I am far more "fragile" than most when it comes to mental health: I got
a whole list of things behind me, in my past. Of course since I am very stubborn,
or like the doctor said nicely, "resilient", I tend to push myself way too hard.</p>
<p>Sometimes the pushing is for pleasing others. This time it was just that I wanted
to get over with the boring stuff.</p>
<h1 id="healing-myself"><a class="zola-anchor" href="#healing-myself" aria-label="Anchor link for: healing-myself">Healing myself</a></h1>
<p>On this sick leave, I've done anything my mind wants to do, instead of planning things
beforehand and sticking to some weird plan. I usually try to stick to some weird plan,
and then get super upset because I didn't stick to it 100%.</p>
<p>This time I told myself that I got no plans. Do what you want.</p>
<p>What I ended up doing is playing a whole lot of videogames.</p>
<p>Like.. <em>A lot.</em></p>
<p>And honestly that helped. Just forgot the real world around me completely.
Instead, I visited space in Starfield and X4 Foundations, cleaned up Night City with a shotgun,
strafejumped in Xonotic.. Even set up Morrowind myself with few mods and started a Telvanni mage playthrough.</p>
<p>In the midst of that, I every now and then wanted to make some tiny code things. I didn't work on my game unfortunately,
but I worked on my KDE Breeze style fork <a href="https://codeberg.org/akselmo/Zephyr">Zephyr</a> and other tiny things.</p>
<p>And of course, I played with <a href="https://www.instagram.com/p/Cx1KDaCMt3B/">Tiamat</a> and <a href="https://www.instagram.com/p/CvLQhLmswzg/">Nebs</a>, our reptile pets. :)</p>
<h2 id="to-sum-it-up"><a class="zola-anchor" href="#to-sum-it-up" aria-label="Anchor link for: to-sum-it-up">To sum it up:</a></h2>
<ul>
<li>I let my mind wander</li>
<li>I let my mind do what it wants</li>
<li>I did not plan anything I was going to do</li>
<li>I escaped the real world to video games completely for a while</li>
</ul>
<p>And that all helped me, at least.</p>
<p>Perhaps, if you find yourself in similar situation, this blog post can help a little.</p>
<p>Don't be afraid to ask for help. Get a sickleave if you need it.
Your health is important.</p>
<p>Thanks for reading!</p>
Zephyr - My Breeze forkMon, 25 Sep 2023 00:00:00 +0000Akselipersonalkdesoftware
https://akselmo.dev/posts/zephyr-breeze-fork/
https://akselmo.dev/posts/zephyr-breeze-fork/<p>I had the hankering for tinkering the KDE application style. The default style by KDE, <a href="https://invent.kde.org/plasma/breeze">Breeze</a>,
is pretty nice as is, but there are small things I'd like to modify.<span id="continue-reading"></span></p>
<p>There's <a href="https://github.com/paulmcauley/klassy">Klassy</a> which is quite customizable and fun,
but I don't really need all of the settings it has.</p>
<p>Then there's <a href="https://github.com/tsujan/Kvantum/tree/master/Kvantum">Kvantum</a> which uses SVG files to
create a theme, but they don't follow KDE colorschemes. And I dislike working with SVG files.</p>
<p>Both are brilliant for their usecases, but I wanted just Breeze with few changes.</p>
<h1 id="fork-time"><a class="zola-anchor" href="#fork-time" aria-label="Anchor link for: fork-time">Fork time!</a></h1>
<p><img src="/assets/images/zephyr/screenshot.png" alt="Screenshot Zephyr style in action" /></p>
<p>So, I did what one has to do, forked Breeze and renamed <em>everything</em> Breeze related to Zephyr.
I chose Zephyr because it was synonym for Breeze in Thesaurus lol. Also, it makes sure it's last
in the list of the application styles, so people don't accidentally confuse it to Breeze.</p>
<p>Here's link to the repository: <a href="https://codeberg.org/akselmo/Zephyr">https://codeberg.org/akselmo/Zephyr</a></p>
<p>Installation help is also there, but feel free to make issue and/or merge requests for adding stuff like
what packages one has to install for their distro.</p>
<p>Unfortunately due to the massive size of the Breeze Gitlab repo,
I didn't want to flood Codeberg with the whole history.
So, some of the history got lost. I have mentioned it in the readme file though.</p>
<p>After renaming all the things, the whole thing built and installed surprisingly easily.</p>
<p>I then implemented following:</p>
<ul>
<li>Black outline setting, so the default outline has a black one around it.
<ul>
<li>Why? Idk looks cool. Not really other reason.</li>
<li>Yes, it can be disabled.</li>
</ul>
</li>
<li>Traffic color icons in window deco
<ul>
<li>I am allergic to Apple but the traffic light concept just makes sense to me.</li>
<li>Also can be enabled or disabled</li>
</ul>
</li>
<li>Customizable style frame and window deco outline colors
<ul>
<li>You can completely change the frame colors.</li>
<li>You can also make them invisible! No outlines, no frames! Fun!</li>
</ul>
</li>
<li>Slightly rounder windows and buttons
<ul>
<li>At some point I will make a setting for these too, but now they're applied when the thing is built</li>
</ul>
</li>
<li>Fitting Plasma style if you use the defaults Zephyr offers (mostly black outlines)
<ul>
<li>The plasma theme buttons do not match the application style in roundness, yet.</li>
<li>I am lazy and avoid working with SVG files as long as I can</li>
</ul>
</li>
</ul>
<h1 id="why"><a class="zola-anchor" href="#why" aria-label="Anchor link for: why">Why</a></h1>
<p>For fun! For learning! And I wanted to make something that is super close to Breeze (hell, it <em>is</em> Breeze, just few mods),
but still has it's own charm and how I like seeing my desktop.</p>
<p>It also can work as a great test bench for others who want to see if they can modify application style.</p>
<p>Just rename anything Zephyr to YourForkNameHere and have fun. But it's probably better to fork the original Breeze project :)</p>
<p>Also, when making my own things for Breeze, it's nice to just implement them in something similar but different name so I can test
the changes for longer period of time. And if I like the changes I can maybe show them to upstream.</p>
<p>In future, I will make it work with Plasma 6 (unless i feel lazy). Probably will have to fork Breeze then again
and apply my changes. Hopefully it's not too big of a change.</p>
<p>Also, I will be working on the actual Breeze in future too! I hope to implement separator colors
for the Plasma colorscheme, so basically you can change the color of all frames and outlines
and whatnot. This kinda helped me to figure how that works as well!</p>
<p>All in all, good project, I keep tinkering with it and it helps me understand the Breeze styling
and Qt in general more.</p>
<h1 id="revontuli-and-zephyr"><a class="zola-anchor" href="#revontuli-and-zephyr" aria-label="Anchor link for: revontuli-and-zephyr">Revontuli and Zephyr</a></h1>
<p>My colorscheme <a href="https://codeberg.org/akselmo/Revontuli">Revontuli</a> works really well together with Zephyr.
So, feel free to give them a go!</p>
<p>Thanks for reading as usual!</p>
Video: We visited Stockholm!Sun, 24 Sep 2023 00:00:00 +0000Akselipersonal
https://akselmo.dev/posts/stockholm-trip/
https://akselmo.dev/posts/stockholm-trip/<p><a href="https://fedi.akselmo.dev/users/tecsiederp">My wife</a> made a video of us visiting Stockholm,<span id="continue-reading"></span>
go check it here!</p>
<p><a href="https://www.youtube.com/watch?v=SRlruD9RrYU">We saw Trash Taste in Stockholm! | Honeymoon vlog</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/SRlruD9RrYU?si=lqtwGp9X3W8bFIoQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
Trust in software is important for meSun, 09 Jul 2023 00:00:00 +0000Akselipersonalsoftware
https://akselmo.dev/posts/trust-in-software-is-important/
https://akselmo.dev/posts/trust-in-software-is-important/<p>Preface: What is trust to me? <span id="continue-reading"></span></p>
<p>To make it clear what trust means to me:</p>
<ul>
<li>Can I trust my privacy, no matter how miniscule part of information you want, in your hands?
<ul>
<li>(my PTSD plays heavily in this lol)</li>
</ul>
</li>
<li>Can I trust your software or whatever be around long enough for me?
<ul>
<li>Basically, is it worth my time to learn this?</li>
</ul>
</li>
<li>Can I trust you to listen to me when I have something to say?
<ul>
<li>I don't know many things I could trust in this matter. Moneymen tend to ignore often.</li>
</ul>
</li>
<li>Can I trust you to <strong>not</strong> lure me in with nice promises and then pull the rug under me?
<ul>
<li>Honestly, this happens way more than I'd like.</li>
</ul>
</li>
</ul>
<p>Now since that's clear..</p>
<h1 id="trust-musings"><a class="zola-anchor" href="#trust-musings" aria-label="Anchor link for: trust-musings">Trust musings</a></h1>
<p>There has been, once again, turmoil and drama in FOSS spheres.</p>
<p>First, <a href="https://www.redhat.com/en/blog/furthering-evolution-centos-stream">Red Hat did a trick</a> with their open source code, so that if anyone
who uses their GPL rights to share the Red Hat code, loses their subscription.
(Well, that's how I understood it. Please give it a read yourself to make sure.)</p>
<p>It's a complicated matter, where complicated opinions bubble on top, at least for me.
I do not comment on it since I just do not know enough. I've never used RHEL for anything, anyway.</p>
<p>But it has certainly affected the user trust.</p>
<p>Now, <a href="https://discussion.fedoraproject.org/t/f40-change-request-privacy-preserving-telemetry-for-fedora-workstation-system-wide/85320">Fedora got recently a proposal to add opt-out telemetry</a>.</p>
<p>Considering Fedora and Red Hat are tied to each other on some level, it again has affected the user
trust. Mainly negatively.</p>
<p>Gaining trust is hard, losing it is easy.
And it does seem this has been quite a blow to Red Hat and Fedora,
but maybe it shows positively in other ways. Who knows.</p>
<p>I shared my opinions on their forum, but yes, I'm cynical enough to think my voice doesn't
really matter. I could've been less "sharp-tongued" about it in those posts, but <em>dude im just so tired.</em></p>
<p>My personal feelings on the matter is that I hope all goes well, but I will try other
distro offerings in the meanwhile and see how it goes. I am tired of worrying over
such things anyway, so it's easier for me to move.</p>
<p><em>Now, I use Arch. And no, I'm not gonna.. Ok, fine: Btw.</em></p>
<h1 id="telemetry-musings"><a class="zola-anchor" href="#telemetry-musings" aria-label="Anchor link for: telemetry-musings">Telemetry musings</a></h1>
<p>I do have some commentary on telemetry however, and how I feel like it should
be implemented. It is fine to disagree with me, for if I disagree the way you
implement telemetry, I just do not use the software, unless there is no other alternative
nor choice.</p>
<p>First off, the telemetry data in that proposal is fine by me. System info, whatever.
Steam asks me for system information as well. And I always say "yes, show the world im a linux gamerrr"</p>
<p>What the proposal wants to do, is to use the opt-out method of acquiring telemetry.</p>
<p>To briefly first mention what this means:</p>
<ul>
<li>Opt-in: Setting is toggled off by default, user has to explicitly say yes.</li>
<li>Opt-out: Setting is toggled on by default, user has to explicitly say no.</li>
</ul>
<p>I understand the rationale behind opt-out: Most people won't enable it, due to people being
used to the "just click next next next" pattern that Windows has hoisted on many us.
And I think that's a dark pattern, since it's easy to trick user to agree on something they do
not want. Remember the malware bundled with installing Windows apps, if you didn't remember
to remove the default checkbox.</p>
<p>This is essentially that, but for sending your data away. Yes, it's your data, despite it
being "meaningless" to you maybe, it is <em>still your data.</em></p>
<p>Utilizing this "dark pattern" feels wrong to me. Maybe it's my morals, or maybe I'm a silly person.
I think users should know exactly what they're getting into.</p>
<p><strong>So, please, ask for consent.</strong> Do not go "You consent to this, right?" and when the user goes
"Huh what? Yeayeayea." you have already moved on, decided this.</p>
<p>What I want to see is following pattern:</p>
<ul>
<li>Software: "Alright user, we have some data we'd like to collect, here is what data: blableblelba."</li>
<li>User: "next next next-"</li>
<li>Software: "You must <em>explicitly</em> choose, yes or no? Please read."</li>
<li>User: "Oh, data! Hmm, ok, seems good to me!"</li>
</ul>
<p>Of course, this can annoy the user. They just want to click next next next.</p>
<p>But that tiny bit of annoyance is good price to pay instead of possible regret in future.</p>
<p>And I think it's a good goal to teach the common users to read the popups again. This causes
many issues in the current software world, such as people falling for scams since they do not
properly read things, accepting all kinds of bad deals..</p>
<p><strong>"Just click next next next" is an anti-pattern that must be stopped.</strong></p>
<p>And FOSS has the chance to help stop that pattern, since I think not many of us
are in this for the quick buck, but instead for creating fun, free software for all.
Just <strong>stop the user and ask the question</strong>. Then you never need to ask it again.</p>
<p>Of course, alternatively you can do what KDE is doing. They show you a telemetry slider
in the welcome app, and you can set it to how much data you want to send.</p>
<p>Since they <em>ask me first</em> I always max it out. :)</p>
<h1 id="bottom-line-in-opt-in-opt-out"><a class="zola-anchor" href="#bottom-line-in-opt-in-opt-out" aria-label="Anchor link for: bottom-line-in-opt-in-opt-out">Bottom line in opt-in opt-out</a></h1>
<p>This is how I personally have <em>always dealt with</em> opt-in/opt-out checks.
No matter what OS I have used, but especially on Windows, you could not trust anything
so you had to read and stop. Way before of my Linux days, as well.</p>
<ul>
<li>Opt-in: I read what it does, then opt-in. Thanks for asking nicely, I reward you with my data.</li>
<li>Opt-out: Even if I don't mind the data being sent, I feel it's bit rude to assume what I want, thus I opt-out immediately.</li>
<li>Exclusively ask me: I stop, I read, and usually opt-in to sending the data.</li>
</ul>
<p>Again, I've <strong>always</strong> done this, even before my Linux days.</p>
<p>I guess it's because my parents told me to always ask first. :)</p>
<p>Thanks for reading this yet-another-ramble from me.
I know my writing style is all over the place but I hope it helps understand
why these trust matters are important to me.</p>
<p>If nothing else, just remember this: <em>Gaining trust is hard, losing trust is super easy.</em></p>
Why I don't like adsSat, 01 Jul 2023 00:00:00 +0000Akselipersonal
https://akselmo.dev/posts/why-i-dont-like-ads/
https://akselmo.dev/posts/why-i-dont-like-ads/<p>It's common to dislike ads. They're annoying for many. <span id="continue-reading"></span></p>
<p><strong>I recommend anyone to use an <a href="https://ublockorigin.com/">adblocker</a> whenever they can.</strong>
Despite ads being annoying, they're also bad for your privacy. Blocking them
helps avoiding annoyance and keeping your privacy a bit more in better shape.</p>
<p>Addictive and predatory nature of advertisement is harmful. Especially
so when it's not a product being advertised, but some
dangerous ideological movement.</p>
<p>Anyhow, I am not trying to be all "but it's worse for me!" here,
but ads <em>really</em> hinder me.</p>
<p><strong>Ads are not accessible.</strong></p>
<p>By accessibility I do not mean "I can't click/read them." But they
give me discomfort, more than many other things.</p>
<p>I have very likely some sort of misophonia <em>and</em> misokinesia.</p>
<p>Misophonia is basically finding some sounds really frustrating and
annoying. Some people have it worse than others. Mine is not that bad,
luckily. But some sounds like specific voices do tick me off. But I can live with that.</p>
<p>Misokinesia is finding certain movements frustrating and annoying.
This is what is my problem here with ads.</p>
<p>Ads have a lot of things going on to grab your attention. They're there
to get addicted and interested in the Thing they're selling.
You know, the usual.</p>
<p>For me, the movements are always very frustrating. Slap annoying music
and talk over there, and I'm seething like after bad match of Quake.</p>
<p>It's not regular "ugh." frustration. It's really passionate frustration.
Instead of "ugh" its "urrrrrghhhhhhhhhhh go awayyyyyyy" frustration.</p>
<p>Basically I get a sensory overload easily from them, I don't know what to do with that and act all dumb.</p>
<p>Sure, for advertisers this may be fine, any publicity is good publicity or whatever.</p>
<p>But for me it's bad. So I block them all.</p>
<p>Bonus is avoiding all the privacy issues and nasty tracking that comes with them.</p>
<p>But there's the accessibility side as well. I never really realised it
before but I've been noticing it more and more lately. I've been told
how it's funky how angry I get about ads.
Like more than a normal person.</p>
<p>So I guess that's what I just wanted to put out there.</p>
<p>The ads that bounce around and move and make silly sounds and whatever.
I am not going to buy your product. I am actively going to avoid it.</p>
<p>Ads that are just still images are the best ones.
I may even click them if I find them interesting.
However due to ads being so prevalent and mostly inaccessible, I just
block them all so I don't see these either.</p>
<p>Basically, I do not block ads to "deprive" anyone their money.
I block them to avoid being legitimately angry all the time.</p>
<p>It's also why I'm thankful for being able to disable automatic gif playing etc. in chat applications and such. Those also frustrate me.</p>
<p>Why am I talking about this? I dunno, felt like sharing that there's
this kind of side to whole adblocking thing too.
Like not doing it out of "haha fuk ur money revenue" but legitimately
wanting to just avoid being angry.</p>
<p>Thanks for reading. I do not expect understanding, but I doubt I'm alone with this.</p>
I got married!Sun, 25 Jun 2023 00:00:00 +0000Akselipersonal
https://akselmo.dev/posts/i-got-married/
https://akselmo.dev/posts/i-got-married/<p>After ten years of dating, me and <a href="https://mindly.social/@tecsiederp">tecsiederp</a> got finally married. <span id="continue-reading"></span></p>
<p>Our wedding ceremony was very nice and reflected us well.
No priests or churches, just us and our family and friends.</p>
<p>Fun were had, went to sauna, saw cute ducklings, listened to wide variety of music together... And I even danced.</p>
<p>I am happy and I hope people who were there
had a good time.</p>
<p>Thanks for everyone who helped and joined the party. You're awesome.</p>
Why I will likely never use AI programming toolsFri, 16 Jun 2023 00:00:00 +0000Akselipersonaldevelopmentai
https://akselmo.dev/posts/why-i-will-likely-never-use-ai-programming-tools/
https://akselmo.dev/posts/why-i-will-likely-never-use-ai-programming-tools/<p><em>I actually like writing code.</em> <span id="continue-reading"></span></p>
<p>That's really it.</p>
<p>If I didn't, I still wouldn't use it due to the ethical/copyright issues,
but I don't even have to think that far: I just like writing code.</p>
<p>Why would I give something I like to a robot?</p>
<p>I don't even mind writing boilerplate! I guess I am somekind of monster.</p>
<p>But the act of thinking and figuring out a problem, solving it, writing some code, fixing bugs...</p>
<p>Especially creating complex systems that interact with each other, with a lot of moving parts! (Hi, gamedev)</p>
<p><strong>It's fun to me.</strong></p>
<p>So, nah. Keep your "AI" tools. I'm fine like this.
If this makes me boring/slow/outdated/uncool, so be it.</p>
<p>I'll still be here, writing code.</p>
<p>And I do it with a smilSegmentation fault (core dumped)</p>
My thoughts on Flatpak (that nobody asked for)Fri, 09 Jun 2023 00:00:00 +0000Akselipersonaldevelopmentlinuxflatpak
https://akselmo.dev/posts/my-thoughts-on-flatpak-that-nobody-asked-for/
https://akselmo.dev/posts/my-thoughts-on-flatpak-that-nobody-asked-for/<p>Hindsight preface: This was written in very tired state.<span id="continue-reading"></span></p>
<p>I have been chatting about this with people who know more than I ever will about Flatpak.</p>
<p>Soo I have added few edits here and there.</p>
<p>If I seem frustrated, most of my frustration is aimed at the unnecessary shit
slinging over packaging formats.</p>
<p><em>We all want the good stuff, why the hell are we fighting?!</em></p>
<hr />
<p>Might as well, since everyone else is doing this.</p>
<p>First off, I am just a dev, and mostly a <em>user</em>, not packager and...</p>
<p><strong>I don't really care about the packaging format, as long as it works.</strong></p>
<p>Anyhow, these are my current thoughts on them, both positive and negative.</p>
<h1 id="i-get-the-thing-i-want"><a class="zola-anchor" href="#i-get-the-thing-i-want" aria-label="Anchor link for: i-get-the-thing-i-want">I get the thing I want</a></h1>
<p>I like Flatpaks when I am using an ancient system like Debian Stable, and still
if it has Flatpak support, I can download actually usable versions of many applications. Even nightly versions!</p>
<p>This is good. I like this.</p>
<h1 id="flatpak-run-blabla-org-bla-bla-bla-com-eu-biz-exe-yes"><a class="zola-anchor" href="#flatpak-run-blabla-org-bla-bla-bla-com-eu-biz-exe-yes" aria-label="Anchor link for: flatpak-run-blabla-org-bla-bla-bla-com-eu-biz-exe-yes">flatpak run blabla.org.bla.bla.bla.com.eu.biz.exe.yes</a></h1>
<p>Flatpaks are clearly made GUI applications in mind, but still, typing
that whole prose of commands <em>and</em> having to remember the
<code>org.com.package.eu</code> lines hinders terminal UX.</p>
<p>Sometimes you just need to run things through terminal to debug things,
or maybe you want to make a new shortcut of the app,
or whatever. Maybe you want to even make a terminal application into a Flatpak app!</p>
<p>Typing that massive command really deters using flatpaks for terminal
applications too, because every time you install apps, you have
to make an alias or memorize the magic words.</p>
<p>Flatpak, when installing an application, should just create that for you.</p>
<p>Yes there's third party solutions. But the solution should be first party one.</p>
<p>But it is a minor nit in the end and I can live with it.. But I am gonna complain about it
from time to time due to my bad memory lol.</p>
<h1 id="flatpaks-can-take-sometimes-too-much-space"><a class="zola-anchor" href="#flatpaks-can-take-sometimes-too-much-space" aria-label="Anchor link for: flatpaks-can-take-sometimes-too-much-space">Flatpaks <em>can</em> take sometimes too much space</a></h1>
<p>The more packages you install through Flatpak, the more it "pays off."</p>
<p>This makes sense in systems that use mostly or always Flatpaks.</p>
<p>But when you mix and match, because, as a user <em>you really don't care, you just want the app to work</em>
you may be frustrated to suddenly see your laptop with 256gb SSD losing big portion
of it's space to the 5 apps you installed with dependencies, that do not match
and can't be reused.</p>
<p>If you're starved for space, you may be better off just uninstalling Flatpaks in general
and then using native packages, which (hopefully) your distro manages for you so
that the dependencies are shared.</p>
<p><strong>And no, saying "bro, just buy more space, bro" is not an excuse.</strong> Not everyone
has that luxury, especially if they live in poorer countries and such. It's time
to stop this silly notion of making things bigger because "well we have so much space now."</p>
<p>So if you need to ooze everything out of your system space, you may want to avoid
Flatpaks if you don't install <em>everything</em> from there.</p>
<p>But if you're using a distro that uses Flatpaks for everything, your file usage is going to be very similar like with native packages.
Unless every app has different dependencies even if they're based on same framework.</p>
<p>There really is no good or bad here. Just different use cases.</p>
<p>Edit: I have heard very different opinions on this. My thoughts on this
have not changed, but I do believe it works for some but not for all.
I think we need more benchmarking and actual evidence to make further claims.</p>
<p>So take my point about this with the "source: me and my pals" level.</p>
<h1 id="permission-management"><a class="zola-anchor" href="#permission-management" aria-label="Anchor link for: permission-management">Permission management</a></h1>
<p>This is where I tend lose my marbles with Flatpaks. (But it's not really Flatpaks fault)</p>
<p>There are times when the app is uploaded to Flathub
by some random and they never really checked
what permissions the Flatpak actually needs.</p>
<p>So the it can be either leaking like a sieve or not working at all.</p>
<p>Luckily, I see this less often, but only if the app is sent to Flathub
by the people who know what permissions are actually needed.</p>
<p>Still, there are times when I have to install Flatseal (Luckily KDE has it's own
permission manager now!) and fiddle with some switches until
the app does what it was actually designed to do. This is especially
noticeable by programming tools like text editors.</p>
<p>So I just usually end up giving all the permissions. <em>I just want the app to work.</em></p>
<p>And if even then it doesn't do the thing I need it to do, I just use a native package.</p>
<p><del>Having Android style pop-up asking for permission when the app needs it could be good solution for this.</del>
Edit: <a href="https://theevilskeleton.gitlab.io/2023/05/11/overview-of-flatpaks-permission-models.html">Apparently this <em>is</em> a thing with portals.</a> That is super neat. I just didn't know,
possibly because I'm on KDE Plasma. Plasma <em>can</em> use portals for this too, but KDE priority is now
to get Qt6 out and working.</p>
<p>On the flipside, when installing random apps, I do feel a bit more safer.
But I do not know if it's a placebo, due to the fact that I am reaaally not a security expert. :P</p>
<h1 id="where-are-my-files"><a class="zola-anchor" href="#where-are-my-files" aria-label="Anchor link for: where-are-my-files">Where are my files???</a></h1>
<p>Sometimes when installing an application from Flatpak, one expects to get multiple
applications. My best example for this is Xonotic: Xonotic comes with the game binaries and dedicated server binaries.</p>
<p>I tried to find those with the Flatpak I was using for Xonotic but I could never find them.</p>
<p>Backing up configs can be a mystery too. Flatpak could have some integrated
configuration manager or something that helps users syncing their configs easily.</p>
<p>Edit: Seems to be out of scope, but personally I do believe Flatpak would just benefit from this.</p>
<h1 id="github"><a class="zola-anchor" href="#github" aria-label="Anchor link for: github">Github</a></h1>
<p>Why the hell is all Flathub related stuff on Github?
Is it to save on hosting costs or something?
If so, I hope Flathub can move on it's own system soon.</p>
<p>In general I am tired of everything being tied to Github, but that's a separate rant.</p>
<p>Learn from Twitter and Reddit: Do not build your thing around <strong>just one</strong> corporate owned service.
It <em>will</em> end up badly. I've seen in the future with my tinfoil hat, and I know.</p>
<p>Trust me, bro.</p>
<h1 id="to-sum-it-all-up"><a class="zola-anchor" href="#to-sum-it-all-up" aria-label="Anchor link for: to-sum-it-all-up">To sum it all up..</a></h1>
<p><strong>I really don't care about your packaging method. I care that the app works as
expected when I launch it.</strong></p>
<p>So far native packages have been better in my experience when it comes to this.</p>
<h2 id="but-i-am-not-a-flatpak-hater"><a class="zola-anchor" href="#but-i-am-not-a-flatpak-hater" aria-label="Anchor link for: but-i-am-not-a-flatpak-hater">But I am not a "Flatpak hater!"</a></h2>
<p><strong>I do want these to work!</strong></p>
<p>Because when it works it's awesome.
It makes distributing files much easier.</p>
<p>I think sandboxing is a cool feature (if it is not just a placebo, I am no security expert).
I can use newest coolest shiny things on distros that get updated once in a decade.</p>
<p>I just don't think the current solution is The Solution yet. It needs refinement
and the above negative points are the papercuts that put me off of using it.</p>
<p><strong>But I root for you, Flatpak. I think you're onto something really good in here.</strong></p>
<p>PS. And I am tired also of some people thinking that, like Rust, it's the Holy Solution To Everything Ever.
There's no such thing when it comes to computers. I want to be wrong though.</p>
<p>PPS. I hope I didn't type too "angry" here.
I blame my lacking english skills. And lacking social skills.
And just lack of skills in general. Skill issue(s).</p>
<p><strong>No dislike towards anyone who works on Flatpak, just absolute pure respect.</strong>
This stuff must be difficult to work on especially when some part of internet
seems to always be screaming when something is done to it.</p>
<p>This post was just me whining a bit, here in my tiny corner of the internets.</p>
<p>glhf.</p>
Updated my blog! Also news of Revontuli colorschemeSat, 03 Jun 2023 00:00:00 +0000Akselipersonalsoftwaredevelopment
https://akselmo.dev/posts/blog-update-and-revontuli/
https://akselmo.dev/posts/blog-update-and-revontuli/<p><em>Note: Old links to my site may not work anymore, due to change in the URL layout!! I tried to make a redirect for them however.</em><span id="continue-reading"></span></p>
<h1 id="blog-update"><a class="zola-anchor" href="#blog-update" aria-label="Anchor link for: blog-update">Blog update</a></h1>
<p>I have finally updated my blog look and feel.
In fact, I completely switched my static site generator
from <a href="https://jekyllrb.com/">Jekyll</a> to <a href="https://www.getzola.org/">Zola</a>!</p>
<p>I used Jekyll at first due to it being the one that Github Pages used. It was clunky but once set up
it just did the job.</p>
<p>But the reason why I changed to Zola was not Jekyll itself, it was the mess of setting up Ruby on
my home PC.</p>
<p>I tried Ruby Version Manager, using Ruby from DNF packages, changing paths, but there was always
some package that kept failing. All I wanted to do is test my site before I push it to server.
I couldn't test on my own PC. <strong>Yes, I had to test on production!</strong></p>
<p>And I didn't want to set a virtual machine or docker or whatever for a dang static site generator.
That is just silly!</p>
<p>So instead I went with Zola since my friend told me about it. Zola is just a single binary that you run and it does the magic for you,
which is all I wanted.</p>
<p>Moving from Jekyll to Zola was a bit messy, due to the differences in markdown files, but I could mostly just use <a href="https://kate-editor.org/">Kate</a> powerful search and replace regexp stuff to switch things over.</p>
<p>Then I set up myself a theme, but it wasn't completely explained how it works.. Basically I had to have
exact matching files from the theme in my own blog source folder, and Zola could then build it.
The files had to include <code>{% extends "theme/templates/page.html" %}</code> in them too, otherwise it failed to
show the theme.</p>
<p>After getting the theme up and running, I just modified it heavily (<a href="https://codeberg.org/akselmo/archie-zola-modified">Source here</a>)
with my own colorscheme.</p>
<h1 id="revontuli"><a class="zola-anchor" href="#revontuli" aria-label="Anchor link for: revontuli">Revontuli</a></h1>
<p>Speaking of the colorscheme: AksDark has now a proper name! <strong>Revontuli</strong>!</p>
<p><img src="/assets/images/revontuli/revontuli-konsole.png" alt="Screenshot of Revontuli in Konsole" /></p>
<p><img src="/assets/images/revontuli/revontuli-plasma.png" alt="Screenshot of Revontuli in KDE Plasma" /></p>
<p>Yes, the colors are the same as before really, but the name is now different. Some colorschemes for apps
Kate and Konsole have tiny differences though. These are the ones I'm going to update onwards.</p>
<p>Check out it's repository for the applications support: <a href="https://codeberg.org/akselmo/Revontuli">https://codeberg.org/akselmo/Revontuli</a></p>
<p>I didn't want to use "AksDark" as a name anymore, since I have seen people download it and I've gotten
few comments telling me they like it too. I wanted something that works for it,
and my wife (well, she is gonna be my wife in couple weeks.. :D ) came up with "Revontuli" for the name.</p>
<p>Revontuli is a Finnish word that means "northern light." She said it works because it's dark theme
but colorful, like northern lights are colorful against a dark sky.</p>
<p>The plan is to have collection of matching themes for various applications, be it code editors or other applications.
When it comes to code editors, I want the syntax highlighting be exactly the same, and if not exactly, then very closely
similar.</p>
<p>This helps a lot if one wants to switch editors, but they don't have to relearn the new syntax highlighting.</p>
<p>I first used <a href="https://themer.dev/?colors.dark.accent0=%23ff3344&colors.dark.accent1=%2333ffa0&colors.dark.accent2=%23ff9233&colors.dark.accent3=%235fff33&colors.dark.accent4=%2333ffff&colors.dark.accent5=%2333aaff&colors.dark.accent6=%23838fff&colors.dark.accent7=%23D970FF&colors.dark.shade0=%23202020&colors.dark.shade1=%23303030&colors.dark.shade2=%23404040&colors.dark.shade3=%23505050&colors.dark.shade4=%23606060&colors.dark.shade5=%23707070&colors.dark.shade6=%23E0DCE0&colors.dark.shade7=%23FFFFFF&colors.light.accent0=%23ff3344&colors.light.accent1=%2333ffa0&colors.light.accent2=%23ff9233&colors.light.accent3=%235fff33&colors.light.accent4=%2333ffff&colors.light.accent5=%2333aaff&colors.light.accent6=%23838fff&colors.light.accent7=%23D970FF&colors.light.shade0=%23f2f2f2&colors.light.shade1=%23E0DCE0&colors.light.shade2=%23C1BCC2&colors.light.shade3=%23A29DA3&colors.light.shade4=%23847E85&colors.light.shade5=%23656066&colors.light.shade6=%23474247&colors.light.shade7=%23000000&activeColorSet=dark&calculateIntermediaryShades.dark=true&calculateIntermediaryShades.light=true">Themer.dev (link has Revontuli applied)</a>
to generate themes for applications, but there was a problem: Many of the syntax highlighting definitions do not match each other.
I do hope Themer developers and contributors will look into this and unify the colorschemes.</p>
<p>However, I do love Themer, so if any devs of Themer are reading this, <strong>thank you</strong> for the great generator.
It helped Revontuli to start as a colorscheme, and I hope eventually people will contribute Revontuli colors for all kinds of apps! :)</p>
<p>I will be uploading the Revontuli themes soon:tm: (either today or tomorrow) after this post to KDE store, so you can search from there.
In the meanwhile you can get the colorschemes from the repository, where they're always up-to-date.</p>
<p>Again, thanks for liking AksDark! I hope Revontuli will serve you well from now on! It works great for me, at least. ;)</p>
<h1 id="i-kinda-want-to-write-more"><a class="zola-anchor" href="#i-kinda-want-to-write-more" aria-label="Anchor link for: i-kinda-want-to-write-more">I kinda want to write more</a></h1>
<p>I have bunch of weird blog ideas but I have not written them since they're not that "relevant" to maybe what people
want to read here. I am trying to get out of that mindset and start posting more, be it very short posts or long novels.
I will try to start tagging my posts too if I do that more often. It's my blog, I'm allowed to write whenever I want and how much I want!</p>
<h1 id="quick-bit-about-blog-comments"><a class="zola-anchor" href="#quick-bit-about-blog-comments" aria-label="Anchor link for: quick-bit-about-blog-comments">Quick bit about blog comments</a></h1>
<p>I am currently testing out how the blog comments would work if one would use email instead.
Check below for mailing list link and mail link.
The mailing list is hosted on <a href="https://akselmo.dev/posts/blog-update-and-revontuli/sourcehut">https://sr.ht</a>.</p>
<p><em>That's all for this time, thanks for reading!</em></p>
AksDark: My colorscheme for KDE PlasmaSat, 27 May 2023 00:00:00 +0000Akselipersonaldevelopment
https://akselmo.dev/posts/aksdar-colorscheme/
https://akselmo.dev/posts/aksdar-colorscheme/<p>Hey all, just a simple blog post this time, I just wanted to showcase the colorscheme
I have made for KDE Plasma and various text editors and such.<span id="continue-reading"></span></p>
<p><img src="/assets/images/aksdark/aksdark.png" alt="AksDark Colorscheme for KDE Plasma" /></p>
<p><a href="https://www.opendesktop.org/p/1971781">Download</a></p>
<p>I have been working on this colorscheme for many months now, slowly tweaking it and
figuring out what are the best colors for me.</p>
<p>I think I've finally found what works for me the best.</p>
<p>About the name: I am bad at naming things and I just first felt like "Okay only I use this colorscheme so I just name it AksDark lol" and
well seems some people like it a lot!</p>
<h1 id="why"><a class="zola-anchor" href="#why" aria-label="Anchor link for: why">Why</a></h1>
<p>Okay, yes, it's silly to write about history of why I made a colorscheme besides "it looks cool" but
hear me out, there's an actual reason!</p>
<p>I have tried a lot of dark colorschemes, but they often share this one thing that does not work for me:</p>
<p>Low contrast.</p>
<p>My eyes are in weird place where too high contrast hurts, but too low contrast just doesn't help readability
at all and I get easily distracted. I think my ADHD adds to it as well!</p>
<p>I couldn't for the life of me find a colorscheme that has vibrant colors but also not too dark background.
Even <a href="https://github.com/catppuccin/catppuccin">Catpuccin</a>, while good looking,
has just too much pastel for me, and the purple background just bothers me in general.</p>
<p><em>I would love to rename AksDark to something else and have similar project for it like Catpuccin is! Email me or talk to me on Fediverse if interested :D</em></p>
<p>With pastel colors, the colors arent distinct enough and when I read things, I keep jumping from place to place, since it doesn't "lock" my eyes. I do not know any science behind this.</p>
<p>I wanted something very neutral, but vibrant. These sound like they're odds with each other, but I think they can be made work.</p>
<h1 id="what"><a class="zola-anchor" href="#what" aria-label="Anchor link for: what">What</a></h1>
<p>AksDark comes with dark-gray background, but all the elements are vibrant and high color. I tried to keep the luminosity of the color values very similar, so in black and white mode one can still look at the text and see what's going on.</p>
<p><img src="/assets/images/aksdark/aksdarkbw.png" alt="AksDark Colorscheme in black and white" /></p>
<p>As you can see the colors are pretty distinct in b/w mode, however it seems link and visited colors could use some tweaking. Of course one has to remember that different monitors can display them differently and so on.</p>
<p>The contrast is purposefully high, but not too high. The gray background ensures that eyes do not hurt when looking at the bright text, but it still is bright enough to <em>lock</em> my view and help me concentrate.</p>
<h1 id="how"><a class="zola-anchor" href="#how" aria-label="Anchor link for: how">How</a></h1>
<p>I just trial-and-error'd it. I tried even darker background color but that ended up getting my eyes tired. I tried less bright text etc. colors but that just made me distracted easily, avoiding the "eye-lock."</p>
<p>What I got now is pretty much perfect for my needs.</p>
<p>The most helpful tool with this was definitely <a href="https://themer.dev/">Themer.dev</a>!
One can easily make their own colorschemes with it. However, the biggest problem with it is that, for example, syntax highlighting will always look different between applications. So it will require a lot of manual tweaking in the end, which is what I spent most of my time doing.</p>
<h1 id="other-apps"><a class="zola-anchor" href="#other-apps" aria-label="Anchor link for: other-apps">Other apps</a></h1>
<p>Since I really like this colorscheme, I made a Kate style for it too:</p>
<p><img src="/assets/images/aksdark/aksdarkkate.png" alt="AksDark Colorscheme for Kate text editor" /></p>
<p><a href="https://www.opendesktop.org/p/2041073">Download</a></p>
<p>And Konsole</p>
<p><img src="/assets/images/aksdark/aksdarkkonsole.png" alt="AksDark Colorscheme for Konsole terminal emulator" /></p>
<p><a href="https://www.opendesktop.org/p/2041061">Download</a></p>
<p>There's colors for other apps like <strong>VSCode</strong> and <strong>Jetbrains IDE's</strong> in my repository: <a href="https://codeberg.org/akselmo/aks_themes">https://codeberg.org/akselmo/aks_themes</a></p>
<p>However they may not be as up-to-date.</p>
<h1 id="outline-plasma-theme"><a class="zola-anchor" href="#outline-plasma-theme" aria-label="Anchor link for: outline-plasma-theme">Outline plasma theme!</a></h1>
<p>Last but not least, if you use the default Breeze window decoration with this colorscheme, this Plasma theme is also default Breeze, but with similar outlines. Having outlines on my Plasma theme helps me a lot (I dont get lost in sea of windows), so maybe someone else will find it useful too: <a href="https://www.opendesktop.org/p/1887659">AksDarkPlasma</a></p>
<p>Also remember that you can download all these themes and styles from the "Get more new stuff" menus in KDE Plasma!</p>
<p>That's all, I hope you like the colorscheme and find it useful as well, if your eyes and/or brain are just as weird as mine!</p>
How I report bugsSun, 16 Apr 2023 00:00:00 +0000Akselisoftwaredevelopmentguide
https://akselmo.dev/posts/how-i-report-bugs/
https://akselmo.dev/posts/how-i-report-bugs/<p>As someone who has been doing test automation for past ~3,5 years (and desperately wanting out towards doing just development),
I have done a lot of bug reports.<span id="continue-reading"></span></p>
<p>Then I switched to Linux based OS and that amount has doubled. :D</p>
<p>I have been asked what are good bug reports. Since I'm both dev and tester, I'd say I have an alright idea of how to do it.
So, here's what I've learned about making good bug reports.</p>
<h1 id="find-the-right-place-to-report"><a class="zola-anchor" href="#find-the-right-place-to-report" aria-label="Anchor link for: find-the-right-place-to-report">Find the right place to report</a></h1>
<p>Sometimes you may not know where to actually report the bug.</p>
<p>Usually, I follow this route:</p>
<ol>
<li>If it happens with specific software, report it to the specific software.</li>
<li>If it happens with hardware around multiple software, report it to the hardware driver repo</li>
<li>If still in doubt, ask around in Matrix/IRC channels related to the software/hardware.</li>
</ol>
<p>Someone will know, usually. So just don't be afraid to ask if you really can't figure out where the
report should be made.</p>
<h1 id="always-follow-the-template"><a class="zola-anchor" href="#always-follow-the-template" aria-label="Anchor link for: always-follow-the-template">Always follow the template</a></h1>
<p>None of the things I say here are good if you do not follow
the given bug reporting template. Often, projects have their own bug report template.</p>
<p>I can't emphasize this enough: <strong>Follow it as closely as you can</strong>.</p>
<p>Many bug reports are often not very useful because they just ignore the template.
The actually good information gets hidden inside something (usually a rant) and as a
developer you are often scouring through <em>a lot</em> of bug reports, especially in big projects.
There just is not time to read the lengthy rant <em>and</em> decipher what the problem actually is.</p>
<p>Give the specifics the template asks, put everything else in "additional information" section in the end of the report.</p>
<p>But if there's no template, these are the ones I'd like to see every bug report to have.</p>
<h1 id="summary-of-the-bug"><a class="zola-anchor" href="#summary-of-the-bug" aria-label="Anchor link for: summary-of-the-bug">Summary of the bug</a></h1>
<p>What the bug actually is? What happens wrong? What do you think is wrong?
Maybe it's a feature?</p>
<p>Write a short summary what is going on, but give it more detail than "screen no work."</p>
<p>Example:</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>
</span><span>Bug summary:
</span><span>
</span><span>Screen shuts down during gameplay of CoolGame69. I also can hear the GPU
</span><span>fans ramping up rapidly before the freeze.
</span><span>
</span><span>This happens also other CoolGames, that seem to use CoolEngine.
</span><span>
</span></code></pre>
<p><strong>Basically</strong>, give the situation where the bug happened but in very concise manner.
You can write more details in "Additional Information" section.</p>
<h1 id="steps-to-reproduce-the-bug"><a class="zola-anchor" href="#steps-to-reproduce-the-bug" aria-label="Anchor link for: steps-to-reproduce-the-bug">Steps to reproduce the bug</a></h1>
<p>To fix a bug, one must be able to reproduce (also known as "repro") the bug.
Developer needs to see what is going on, what goes wrong.
Then they can debug with tools or the good ol' <code>print("bug here")</code> debugging.</p>
<p>So, write down to the bug report what did you do to cause it. You don't have to
write down the whole day from when you got up from the bed, but try to aim around ~5
steps before the bug happened. Also, you should write down if you could make the bug happen again.</p>
<p>Example:</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>
</span><span>1. I updated my PC
</span><span>2. I restarted PC
</span><span>3. I launched the game
</span><span>4. When in level SpookyTown, I punch a skeleton
</span><span>5. The game shuts down the GPU
</span><span>
</span><span>I restarted PC and tried playing again, but it crashed again.
</span><span>But on third time, it did not crash my GPU.
</span><span>
</span></code></pre>
<p>This already gives the developer a lot of information. It can be assumed
that before the update, punching skeletons in SpookyTown did not shut down the GPU.
So the problem is in some update component. However, it does not happen every time,
so there's probably some weird timing issue. Or something else.. Creative juices start
flowing!</p>
<p><strong>Basically</strong>, give step-by-step directions how one could make the bug
happen <em>on your PC</em>. Also if you can, mention how often the bug happens.</p>
<h1 id="system-information"><a class="zola-anchor" href="#system-information" aria-label="Anchor link for: system-information">System Information</a></h1>
<p>This is VERY important, and here's couple commands for Linux systems I can give
you to get Good Info.</p>
<p>First, try not to use neofetch. It gives info, yes, but it's usually not enough.</p>
<p><code>inxi --full</code> gives you usually everything you need.</p>
<p><strong>Remember to check the full log for any personally identifiable info!</strong></p>
<p>You can get even more data by appending <code>sudo</code>. So <code>sudo inxi --full</code>. But this may show more personally identifiable info.</p>
<p><code>inxi</code> may not be installed in your system by default, so you may have to do that first.</p>
<p>If the problem is about USB device, you can use <code>lsusb -v</code>.</p>
<p>But with <code>inxi</code> you can get quite far. The developer/template will ask for specific commands to run if needed.
So again, check the template if there's some specific info it asks. Often they have the command to run as well.</p>
<p>Example:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>
</span><span>inxi</span><span style="color:#ff9233;"> --full
</span><span>
</span><span>System:
</span><span> Host: fedora Kernel: 6.2.10-200.fc37.x86_64 arch: x86_64 bits: 64
</span><span> Desktop: KDE Plasma v: 5.27.4 Distro: Fedora release 37 (Thirty Seven)
</span><span>Machine:
</span><span> Type: Desktop Mobo: ASUSTeK model: ROG STRIX B450-F GAMING II v: Rev 1.xx
</span><span> serial: </span><span style="font-weight:bold;color:#33ffa0;"><</span><span>superuser required</span><span style="font-weight:bold;color:#33ffa0;">></span><span> UEFI: American Megatrends v: 4007
</span><span> date = 12/08/2020
</span><span>CPU:
</span><span> Info: 6-core model: AMD Ryzen 5 3600 bits: 64 type: MT MCP cache: L2: 3 MiB
</span><span> Speed (MHz)</span><span style="color:#838fff;">:</span><span> avg: 2992 min/max: 2200/4208 cores: 1: 4199 2: 2199 3: 2196
</span><span> 4: 3927 5: 4199 6: 2022 7: 4200 8: 2095 9: 2150 10: 2646 11: 3874 12: 2200
</span><span>Graphics:
</span><span> Device-1: AMD Navi 23 </span><span style="font-weight:bold;color:#33ffa0;">[</span><span>Radeon RX 6600/6600 XT/6600M</span><span style="font-weight:bold;color:#33ffa0;">]</span><span> driver: amdgpu
</span><span> v: kernel
</span><span> Display: wayland server: X.org v: 1.20.14 with: Xwayland v: 22.1.9
</span><span> compositor: kwin_wayland driver: X: loaded: amdgpu
</span><span> unloaded: fbdev,modesetting,radeon,vesa dri: radeonsi gpu: amdgpu
</span><span> resolution: 1: 1920x1080 2: 1920x1080
</span><span> API: OpenGL v: 4.6 Mesa 22.3.7 renderer: AMD Radeon RX 6600 (navi23 LLVM
</span><span> 15.0.7 DRM 3.49 6.2.10-200.fc37.x86_64)
</span><span>Audio:
</span><span> Device-1: AMD Navi 21/23 HDMI/DP Audio driver: snd_hda_intel
</span><span> Device-2: AMD Starship/Matisse HD Audio driver: snd_hda_intel
</span><span> Device-3: DSEA A/S EPOS GSA 70 type: USB
</span><span> driver: hid-generic,snd-usb-audio,usbhid
</span><span> API: ALSA v: k6.2.10-200.fc37.x86_64 status: kernel-api
</span><span> Server-1: PipeWire v: 0.3.69 status: active
</span><span>Network:
</span><span> Device-1: Intel I211 Gigabit Network driver: igb
</span><span> IF: enp3s0 state: up speed: 1000 Mbps duplex: full mac: secret
</span><span>Drives:
</span><span> Local Storage: total: 2.73 TiB used: 1.52 TiB (55.5%)
</span><span> ID-1: /dev/nvme0n1 vendor: Kingston model: SA2000M81000G size: 931.51 GiB
</span><span> ID-2: /dev/sda vendor: Samsung model: SSD 860 EVO 2TB size: 1.82 TiB
</span><span>Partition:
</span><span> ID-1: / size: 929.93 GiB used: 360.1 GiB (38.7%) fs: btrfs
</span><span> dev: /dev/nvme0n1p3
</span><span> ID-2: /boot size: 973.4 MiB used: 545.6 MiB (56.1%) fs: ext4
</span><span> dev: /dev/nvme0n1p2
</span><span> ID-3: /boot/efi size: 598.8 MiB used: 17.4 MiB (2.9%) fs: vfat
</span><span> dev: /dev/nvme0n1p1
</span><span> ID-4: /home size: 929.93 GiB used: 360.1 GiB (38.7%) fs: btrfs
</span><span> dev: /dev/nvme0n1p3
</span><span>Swap:
</span><span> ID-1: swap-1 type: zram size: 8 GiB used: 34.2 MiB (0.4%) dev: /dev/zram0
</span><span>Sensors:
</span><span> System Temperatures: cpu: 57.0 C mobo: 42.0 C gpu: amdgpu temp: 58.0 C
</span><span> Fan Speeds (RPM)</span><span style="color:#838fff;">:</span><span> cpu: 2008 case-1: 849 case-2: 0 case-3: 0 gpu: amdgpu
</span><span> fan: 0
</span><span>Info:
</span><span> Processes: 466 Uptime: 1h 20m Memory: 15.51 GiB used: 5.33 GiB (34.4%)
</span><span> Shell: Zsh inxi: 3.3.26
</span></code></pre>
<p>Now the developer can look at the versions of your drivers.
There may already be a known issue with the game with specific driver.</p>
<p><strong>Basically</strong>: Make sure that your system information includes version numbers of everything, and
all the pertinent data. Follow the template for the commands and system info needed, if it's given.
But always add system information.</p>
<h1 id="additional-information"><a class="zola-anchor" href="#additional-information" aria-label="Anchor link for: additional-information">Additional information</a></h1>
<p>If there is any specific information to add, do that in the end of the file.</p>
<p>You can for example mention how knowledgeable about the topic you are, if the bug appeared before
with different system, anything that may be relevant.</p>
<p>Example:</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>I don't think I've had this bug before. The CoolGame69 did update recently though,
</span><span>I can't remember exactly when. My PC has been the same for years.
</span></code></pre>
<p><strong>Basically</strong>: Any info that could be related but does not fit the other sections.</p>
<h1 id="logs"><a class="zola-anchor" href="#logs" aria-label="Anchor link for: logs">Logs!</a></h1>
<p>Often it can also be useful to include logs with the bug, if possible. In this example
I've chosen to share amdgpu logs.</p>
<p>The templates often also have a log command/file to be attached. If there is none
and you want to check if your logfiles have anything useful, use this command:</p>
<p><code>journalctl --since="10 minutes ago" > bug.log</code></p>
<p>You can change the "10 minutes ago" to anything, like "2 hours ago" or similar. Set
it to a time before the crash, and scour the bug.log file for anything possibly interesting.</p>
<p>If you can't find anything interesting, you can omit the log and ask the developers
if there is any log files you should include.</p>
<p><strong>Basically</strong>: Check the template if logs are needed, and if not, check <code>journalctl</code> or similar command for any possible data related to the bug.</p>
<h1 id="and-the-usual-end-result"><a class="zola-anchor" href="#and-the-usual-end-result" aria-label="Anchor link for: and-the-usual-end-result">And the usual end result</a></h1>
<p>Now that you have filled your bug report well enough, following things can happen:</p>
<ol>
<li>Developer asks for more detailed info if they have something in mind.</li>
<li>Developer can't reproduce the bug and asks your help to fix it, often by using the git version of the thing the bug relates to.</li>
<li>The bug has already been fixed but you have to wait for update.</li>
<li>Some bug report systems can have a bug report duplicate checking. In that case, do not create a duplicate, but append to the existing bug with the above info.</li>
</ol>
<p>Example end for the above issue :)</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>Hey, dev here. CoolGame69 got new particle effect shaders and it
</span><span>kept crashing the GPU drivers because x y z a b c.
</span><span>
</span><span>We've pushed a hotfix to the GPU drivers, so inform your distro about this in
</span><span>their channels.
</span></code></pre>
<p>And yes, you likely have to poke someone handling the distro about this,
since all distributions handle the updates in different paces and such.
Basically look for contact information or a forum to talk about it.
I've found mailing lists and emails tend to be effective, but Matrix/IRC channels work as well.</p>
<h1 id="a-simple-template"><a class="zola-anchor" href="#a-simple-template" aria-label="Anchor link for: a-simple-template">A simple template</a></h1>
<p>Here's a simple template from the above information:</p>
<pre data-lang="md" style="background-color:#181818;color:#ffffff;" class="language-md "><code class="language-md" data-lang="md"><span>
</span><span style="color:#33ffff;"># </span><span style="font-weight:bold;color:#838fff;">Bug summary:
</span><span>
</span><span style="color:#33ffff;"># </span><span style="font-weight:bold;color:#838fff;">Reproduction steps:
</span><span>
</span><span>1.
</span><span>2.
</span><span>3.
</span><span>4.
</span><span>5.
</span><span>
</span><span>Bug appearance rate: Every time/Sometimes/Rarely/More detailed answer...
</span><span>
</span><span style="color:#33ffff;"># </span><span style="font-weight:bold;color:#838fff;">System info:
</span><span>
</span><span>Gathered with </span><span style="color:#d970ff;">`inxi --full`
</span><span>
</span><span style="color:#33ffff;"># </span><span style="font-weight:bold;color:#838fff;">Additional information:
</span><span>
</span><span>I've included bug.log as an attachment
</span><span>
</span></code></pre>
<p>I hope this will answer some of the questions about reporting bugs.</p>
<p>But anyhow, just be very to-the-point and give any info around the bug you can.
Follow any templates, append to other reports if it's already reported and be respectful. :)</p>
I blocked Hacker News and you can tooSat, 01 Apr 2023 00:00:00 +0000Akselipersonalsoftwarerant
https://akselmo.dev/posts/i-blocked-hacker-news-and-you-can-too/
https://akselmo.dev/posts/i-blocked-hacker-news-and-you-can-too/<p><em>No, not april fools.</em><span id="continue-reading"></span></p>
<p>Hacker News is one of those websites where the commenters
are often very angry people. Note, I said
<strong>commenters</strong> not lurkers/passive browsers/link clickers.
Anyone who uses Hacker News just as a website to find links on, I have no beef with.</p>
<p>But most people who comment on it.. I don't want anything to do with them.</p>
<p>So I used link referrer to "block" the site: If someone sees a link to my blog on there and clicks it, depending if your browser sends a referral header or not, it gets 403 forbidden warning and stops there.</p>
<p>Easy to circumvent of course, but average HN commenter likely doesn't care enough to copy paste links and open sites in privacy mode or w/e.
They're too busy making money, being intelligent and having stimulating discussions over the newest fad in tech.</p>
<h2 id="how-to"><a class="zola-anchor" href="#how-to" aria-label="Anchor link for: how-to">How-to</a></h2>
<p>Enough dumb ranting, here's how to do it if you run Apache 2.
Unfortunately I do not know how to do this with nginx.</p>
<ol>
<li>
<p>Open <code>/etc/apache2/apache2.conf</code></p>
</li>
<li>
<p>Scroll to bottom of the file</p>
</li>
<li>
<p>Add following</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span><if "%{http_referer} =~ /ycombinator.com/">
</span><span> deny from all
</span><span></if>
</span></code></pre>
</li>
<li>
<p>Save file</p>
</li>
<li>
<p>Restart apache2: <code>systemctl restart apache2</code></p>
</li>
<li>
<p>Done!</p>
</li>
</ol>
<p>You can test if the blocking works with curl:</p>
<p><code>curl -e ycombinator.com your_site_url_here</code></p>
<p>You can add other sites as well with same way! However,
if you have massive blocklists, there's likely a better
way to do this, like using <code>.htaccess</code> file or something like that.</p>
<p>Anyhow, hope this helps others, just wanted to share how it's done since I saw people asking about it.
Again, it's not foolproof, very easy to circumvent (literally copy-paste the link to another window), but it should at least deter some.</p>
<p>Have fun "blocking!"</p>
My game was illegally uploaded on SteamWed, 08 Mar 2023 00:00:00 +0000Akselipersonalgamedevrant
https://akselmo.dev/posts/my-game-was-illegally-shared-on-steam/
https://akselmo.dev/posts/my-game-was-illegally-shared-on-steam/<p>Quick post for this time.<span id="continue-reading"></span></p>
<p>Seems my game, <a href="https://akselmo.itch.io/penance">Penance</a> has been
uploaded on Steam by someone who I don't know, completely
without my permission. They're selling my <em>free</em> game and of course
I'm not gonna get any money from their sales.</p>
<p>If you stumble on this game outside of this page: <a href="https://akselmo.itch.io/penance">https://akselmo.itch.io/penance</a> <strong>then it's not uploaded by me!</strong> It's
also very likely those illegal copies are also bundled with malware.</p>
<p>I have done a DMCA claim for the game already.</p>
<p>I'm not going to link the fake link here just in case, but it's easy to find if you're curious.</p>
<p>Just know that <strong>all my games are on itch.io</strong> <a href="https://akselmo.itch.io">https://akselmo.itch.io</a>
and all the other possible "copies" are fake and not by me. If I make a Steam page for any of my games in future, you will be let know by my Fediverse account and/or this blog.</p>
<p><strong>This also serves as a PSA for fellow gamedevs</strong>: Check if your game has been uploaded into some places without your permission! <strong>Especially on Steam!</strong>
I didn't expect this to happen since uploading on Steam costs money, but someone uploaded it anyway without any permission.</p>
<p>Stay safe out there.</p>
FOSS communities: You don't need to yellFri, 17 Feb 2023 00:00:00 +0000Akselipersonalsoftwarerant
https://akselmo.dev/posts/you-dont-need-to-yell/
https://akselmo.dev/posts/you-dont-need-to-yell/<p>This is kind of open letter I suppose.<span id="continue-reading"></span> I've seen a lot of similar stuff happen in other projects too, like GNOME.
So I wanted to write down what happened to me and my inbox today. It's written in my perspective, but I'm
sure many can sympathize. And I sympathize with them.</p>
<h1 id="you-don-t-need-to-yell"><a class="zola-anchor" href="#you-don-t-need-to-yell" aria-label="Anchor link for: you-don-t-need-to-yell">You don't need to yell</a></h1>
<p>KDE Plasma 5.27 landed with my outline change that I made for accessibility reasons mostly.
You can read more about it in here: <a href="https://www.akselmo.dev/2022/10/31/I-made-outlines-for-KDE-Breeze.html">https://www.akselmo.dev/2022/10/31/I-made-outlines-for-KDE-Breeze.html</a></p>
<p>They certainly have been dividing opinions. I think that's fine.
I do enjoy good critique and discussion: It's how things get better!</p>
<p>However, what I don't enjoy is:</p>
<ul>
<li>Getting my blog comments spammed with "Revert the outlines, they're ugly"</li>
<li>Asking people to send developers angry messages</li>
<li>Acting like an complete ass, then hiding behind the whole "but it was critique!" facade.</li>
</ul>
<p>"Get thicker skin!" you scream. Believe me, my skin is thick enough. I've seen some shit.
But me having a thick skin doesn't mean that you should yell at me for something.</p>
<p>It's demotivating. Why would I want to fix something, if I keep getting screamed at?
What do you expect? It more likely makes us want to <em>avoid</em> working on something, since
it's known that fiddling with it will make people angry.</p>
<p>I can understand being angry at faceless corporation that does not listen. KDE is <strong>not</strong> a faceless corporation.
We're a group that does this because we enjoy what we do and want to make cool things usable for everyone.
And we listen.</p>
<p>Trust me, we're discussing this and gathering feedback on the outline feature. And every other feature as well.</p>
<p>All I ask in return is to behave and be patient. The iterations will come, if needed. Changes, fixes, and all the cool stuff.
I'm not here to be yelled at. Well written critique is allowed and appreciated, but be respectful:
No need to kiss my feet, but no need to scream at me either. Makes it easier for everyone involved.</p>
<p>When thinking of future, I am planning to make the separators colorable in color schemes. This means that the outlines and other separators
can use that color and user can dictate themselves the color completely. It would also help with separator coloring
in Plasma themes, not just Window Decorations.</p>
<p>Here's a merge request I'm working on addressing the outline intensity: <a href="https://invent.kde.org/plasma/breeze/-/merge_requests/292">https://invent.kde.org/plasma/breeze/-/merge_requests/292</a></p>
<p><del>However for now, I don't have time to work on KDE stuff. I'm working on my game, I'm joining a gamejam this weekend, I'm busy with life and work.</del></p>
<p>But if you take anything out of this post: <strong>My blog is not an issue tracker for KDE. LOL.</strong>
Use <a href="https://bugs.kde.org/">https://bugs.kde.org/</a> instead.</p>
<p>We can do better than this. We <em>must</em> do better than this.</p>
<hr />
<p>PS. If you want to modify the color of the outline, you can set the titlebar color to something different, and the outline color
will follow it.</p>
<p>PPS. I may remove the comments from my blog at some point and ask people use the public mailbox linked below instead. Maybe. Idk.</p>
My podcast tastesSat, 14 Jan 2023 00:00:00 +0000Akselipersonalpodcast
https://akselmo.dev/posts/my-podcast-tastes/
https://akselmo.dev/posts/my-podcast-tastes/<p>I just wanted to write this down since I've been talking a bit about podcasts
on fediverse.<span id="continue-reading"></span></p>
<p>I listen a lot of podcasts when gaming, it's kind of a way how I relax.
Nothing like good multiplayer FPS where I can turn off my brains, then I can
listen podcasts on the side. :)</p>
<h1 id="list-of-podcasts-i-listen"><a class="zola-anchor" href="#list-of-podcasts-i-listen" aria-label="Anchor link for: list-of-podcasts-i-listen">List of podcasts I listen</a></h1>
<p>Here's some of the podcasts I recommend trying! I'm too lazy to link them
but they're one search away. I've also found these all from <a href="https://podcastindex.org/">https://podcastindex.org/</a>.</p>
<h2 id="2-5-admins"><a class="zola-anchor" href="#2-5-admins" aria-label="Anchor link for: 2-5-admins">2.5 Admins</a></h2>
<p>I don't really understand anything they talk about most of the time since it's
very sysadmin stuff, but I still find it entertaining and listen every episode.
Maybe sometimes I learn something.</p>
<h2 id="algorithms-data-structures-programs"><a class="zola-anchor" href="#algorithms-data-structures-programs" aria-label="Anchor link for: algorithms-data-structures-programs">Algorithms + Data Structures = Programs</a></h2>
<p>This is a weird podcast. It's couple guys that can't stay on topic. I kinda like it.
I don't listen every episode, especially if they start to ramble on about sports,
but there are good bits about it.</p>
<h2 id="c-club"><a class="zola-anchor" href="#c-club" aria-label="Anchor link for: c-club">C++ Club</a></h2>
<p>Very no-nonsense podcast about developments in C++ world. I kinda like the format
and listen it whenever there's an episode, just to learn more about the language
I often use with my FOSS contributions and so on.</p>
<h2 id="coding-blocks"><a class="zola-anchor" href="#coding-blocks" aria-label="Anchor link for: coding-blocks">Coding Blocks</a></h2>
<p>General programming podcast, very educational. They mostly talk about webdev from
what I've gathered, so even if it doesn't touch my area of interest, it's still
entertaining.</p>
<h2 id="contributor"><a class="zola-anchor" href="#contributor" aria-label="Anchor link for: contributor">Contributor</a></h2>
<p>Interviews with various open-source projects. I like this one a lot, since
it's more about developers being enthusiastic about their projects than
some guy who likes their own voice a lot.</p>
<h2 id="corecursive-coding-stories"><a class="zola-anchor" href="#corecursive-coding-stories" aria-label="Anchor link for: corecursive-coding-stories">CoRecursive: Coding Stories</a></h2>
<p>This is one of the best programming podcasts I know. A lot of interesting stories
around programming and computing world. Often feels like I'm in an interesting
history class. (Yes, that's a good thing!)</p>
<h2 id="cppcast"><a class="zola-anchor" href="#cppcast" aria-label="Anchor link for: cppcast">CppCast</a></h2>
<p>Apparently they started to make new episodes again by other hosts? Anyhow
I listen this from time to time, there are a lot of things to learn from this
podcast.</p>
<h2 id="floss-weekly"><a class="zola-anchor" href="#floss-weekly" aria-label="Anchor link for: floss-weekly">FLOSS Weekly</a></h2>
<p>Interviews of people contributing and maintaining FLOSS projects. Also sometimes
just discussions about some things that may affect FLOSS. I try to listen every episode
but sometimes something just doesn't interest me, and that's fine.</p>
<h2 id="fragmented-the-software-podcast"><a class="zola-anchor" href="#fragmented-the-software-podcast" aria-label="Anchor link for: fragmented-the-software-podcast">Fragmented: The Software Podcast</a></h2>
<p>This is more about Android/iOS development. I don't do any of that (yet, maybe in future), but
I still find things to learn from this podcast.</p>
<h2 id="koodia-pinnan-alla"><a class="zola-anchor" href="#koodia-pinnan-alla" aria-label="Anchor link for: koodia-pinnan-alla">Koodia pinnan alla</a></h2>
<p>Finnish programming podcast that concentrates more on the backend programming that
users do not necessarily see.</p>
<h2 id="late-night-linux-linux-after-dark-linux-downtime"><a class="zola-anchor" href="#late-night-linux-linux-after-dark-linux-downtime" aria-label="Anchor link for: late-night-linux-linux-after-dark-linux-downtime">Late Night Linux, Linux After Dark, Linux Downtime</a></h2>
<p>I like all of these. Covering some Linux news with lots of banter and humor.
There's also more indepth discussions (sometimes heated ones) about Linux and FOSS
related things. I listen every episode and enjoy them a lot.</p>
<h2 id="linux-lads"><a class="zola-anchor" href="#linux-lads" aria-label="Anchor link for: linux-lads">Linux Lads</a></h2>
<p>Also entertaining Linux podcast, similar vein to Late Night Linux. Bunch of lads
talking about FOSS.</p>
<h2 id="programming-throwdown"><a class="zola-anchor" href="#programming-throwdown" aria-label="Anchor link for: programming-throwdown">Programming Throwdown</a></h2>
<p>More programming interviews. I don't listen all of them, just the ones that I'm interested in.
Can be educational.</p>
<h2 id="reality-2-0"><a class="zola-anchor" href="#reality-2-0" aria-label="Anchor link for: reality-2-0">Reality 2.0</a></h2>
<p>General technology podcast. Seems to be around how technology affects us and it's very FOSS-sided,
which I appreciate. However they called Mastodon a "protocol" which is WROOONG. :P</p>
<h2 id="talk-python-to-me"><a class="zola-anchor" href="#talk-python-to-me" aria-label="Anchor link for: talk-python-to-me">Talk Python To Me</a></h2>
<p>Python is not my favorite language but I do like listening this one, since I use a lot of Python at work.
It's more than just Python which is also nice.</p>
<h2 id="the-changelog"><a class="zola-anchor" href="#the-changelog" aria-label="Anchor link for: the-changelog">The Changelog</a></h2>
<p>A fine podcast, been around a long time. A bit too techbro-ish maybe for my tastes, but aside that there are things to learn.</p>
<h2 id="two-s-complement"><a class="zola-anchor" href="#two-s-complement" aria-label="Anchor link for: two-s-complement">Two's Complement</a></h2>
<p>Very VERY educational podcast. That being said I don't always understand what is being talked about, lol. Lots of compilers and testing.</p>
<h1 id="list-of-podcasts-i-used-to-listen-but-stopped"><a class="zola-anchor" href="#list-of-podcasts-i-used-to-listen-but-stopped" aria-label="Anchor link for: list-of-podcasts-i-used-to-listen-but-stopped">List of podcasts I used to listen but stopped</a></h1>
<p>I also wanted to mention couple podcasts I wish I could still listen to but.. Well, you'll see.
Basically they do not align with my views anymore. They're free to do whatever they want,
obviously. I'm not here to tell them stop. But here's why <em>I</em> stopped listening.</p>
<h2 id="jupiter-broadcasting-podcasts"><a class="zola-anchor" href="#jupiter-broadcasting-podcasts" aria-label="Anchor link for: jupiter-broadcasting-podcasts">Jupiter Broadcasting podcasts</a></h2>
<p>I used to listen a lot of these. One of the first Linux related podcasts I listened was by them.
Now there's much <a href="https://web3isgoinggreat.com/">cryptocoin scams</a>, I don't know what I can trust in the podcasts anymore.
Also, the episodes are full of annoying sound effects.</p>
<p>Special mention for Coder Radio: I liked it at one point but when I realised it's all about
being a "troll" to get a "reaction" or something, I kind of lost all my trust towards it.
Then of course on top of that we have the obsession over cryptocoin scams.</p>
<h2 id="destination-linux"><a class="zola-anchor" href="#destination-linux" aria-label="Anchor link for: destination-linux">Destination Linux</a></h2>
<p>I liked them at first but..
I had an issue in their Matrix channel and I don't feel like listening it anymore:
I shared a link to an itch.io game bundle but it was deemed "too political." I left the Matrix channel quickly after that.
Petty drama I guess, but I just don't feel it anymore.</p>
<h1 id="any-suggestions"><a class="zola-anchor" href="#any-suggestions" aria-label="Anchor link for: any-suggestions">Any suggestions?</a></h1>
<p>Feel free to comment and suggest me any podcasts and Youtube/Peertube channels with good programming
and Linux related content! :) I'm always interested for more.</p>
<h3 id="also-mentioning-my-own-podcast-aksdev-cast"><a class="zola-anchor" href="#also-mentioning-my-own-podcast-aksdev-cast" aria-label="Anchor link for: also-mentioning-my-own-podcast-aksdev-cast">Also mentioning my own podcast: AksDev Cast</a></h3>
<p>I run a atleast-once-a-month where I talk about things that I find interesting: Linux, FOSS, games, gamedev... A lot of ranting too about the bullshit I see around.
I also update my community on things I am making or made, be it games or other things.</p>
<p>Basically if you want to listen an angry Finnish guy rant with a shitty microphone.. Well, I don't
understand what kind of masochist you are but that's my podcast lol.</p>
<p>It comes out as a stream at first, then uploaded to the podcast RSS feed.</p>
<p>Check it out here if you're interested: <a href="https://cast.akselmo.dev/">https://cast.akselmo.dev/</a></p>
Pointless tribalism in FOSSFri, 06 Jan 2023 00:00:00 +0000Akselipersonalsoftwarefoss
https://akselmo.dev/posts/pointless-tribalism-in-foss/
https://akselmo.dev/posts/pointless-tribalism-in-foss/<p><em>Rant incoming. This isn't written that well but idgaf. I just need to get this out of my system.</em><span id="continue-reading"></span></p>
<p>I really enjoy chatting in FOSS communities. KDE, Linux in general, other desktop environments, so on and so forth.</p>
<p>What I don't like is that we have these very silly "feuds" over some things.
Like we're some weird tribes, fighting over who has the nicest looking flag.</p>
<ul>
<li>It doesn't serve any purpose but putting others down.</li>
<li>It drives away users, new and old, and potential contributors.</li>
<li>It makes people afraid to report bugs or ask questions.</li>
</ul>
<p><strong>It's entirely pointless.</strong></p>
<p>I'm not talking about critique. Assholes of the world love to pretend
their behavior is "critique" but rest of us know that's not how it works.
<strong>If it uses inflammatory language and insults, it's not critique.</strong></p>
<p>I for sure ignore any complaints about my games and projects that start with telling me off, either directly or indirectly.
I do not care at that point. Seethe.</p>
<p>Sure this is more an internet/human problem in general, but
there's nothing to gain from this, especially in FOSS world.
We're a small community, trying to survive against big money corporations.
<strong>FOSS projects don't suddenly get more money if people go "X is better and Y users are dumby smelly."</strong>
There just is no reason to be an ass about any of this.</p>
<p>Why jeopardise all these years of survival for some shit-talk?</p>
<p>The usual one is the GNOME vs KDE "debate", that is so pointless I don't even
understand why it exists.</p>
<p>The answer to these "debates" is simple: Try all desktop environments that interest you.
Stick with the one that you like best.</p>
<p>No need to bring flamewars into this. Completely pointless.</p>
<p>It wastes everyone's time.</p>
<p>Desktop environments all have their strengths and weaknesses. It's entirely
subjective. Yes, there are cases where you have to measure security and other such things: You don't have to put down the others if they don't fit your usecase.</p>
<p>It's like fighting over a fucking desktop wallpaper.</p>
<p>When it comes to the Flatpak vs Snap vs Appimages, I have the same answer: Use what works for you.
Avoid those that do not work for you. Critique well and respectfully.</p>
<p>I personally don't see any of the three to be something I prefer. I like my distro provide the packages for me.
But I do not bring people down because they choose to use one of those packaging methods. That would be asinine.</p>
<p>All these fights help burn bridges between projects and worsens the ecosystem for the whole community.</p>
<p>Leave the useless fights to proprietary world. We have learned from that world that you have
to "fight" to have your cake and eat it too.
Luckily in FOSS world, we don't need that. We can all have our cakes, share recipes, improve them, make entirely our own... And eat them as well.</p>
<h1 id="but-i-don-t-like-a-thing"><a class="zola-anchor" href="#but-i-don-t-like-a-thing" aria-label="Anchor link for: but-i-don-t-like-a-thing">But I don't like a thing :(</a></h1>
<p>Give <strong>good</strong> critique about why you don't like it. My rule of thumb is:</p>
<ul>
<li>Compliment the things you like first
<ul>
<li>Optional but seeing someone go "I use X because I really like it, I just wish Y would.." is super motivating! Like hell yeah let's make things better for you if we can.</li>
</ul>
</li>
<li>Be respectful!</li>
<li>Avoid inflammatory language or snarky embellishments: They just slow down the process</li>
<li>Consider: Maybe the thing is just not made for you? Maybe there's better alternative for your usecase?</li>
</ul>
<p>If the maintainer(s) of the project do not see your critique an issue, you can always:</p>
<ol>
<li>Fork</li>
<li>Improve, either alone or in a team that shares your view</li>
<li>Offer to contribute your changes to upstream</li>
</ol>
<p>Repeat and improve together. Proprietary world doesn't have that strength.</p>
<p>And for those who are going to say "I can't code, improve or w/e" then
I'm sorry but the nature of computers is that you either need programming knowhow or
you need to know people who can do things for you. Ask around. Talk to people. Communicate.
<strong>Without being an ass about it!</strong></p>
<p>We're all in this together. We should damn well act like it.</p>
How to use MatrixThu, 29 Dec 2022 00:00:00 +0000Akselipersonalsoftwarematrix
https://akselmo.dev/posts/how-to-use-matrix/
https://akselmo.dev/posts/how-to-use-matrix/<p>As I've gotten more into FOSS, I've noticed a lot of FOSS projects, like KDE, use <a href="https://matrix.org/">Matrix</a> protocol.<span id="continue-reading"></span></p>
<p>A protocol that lets you use any client you wish to chat with each other. Basically, it's IRC but
with more features.</p>
<p>And I'm into that! So I decided to move my <a href="https://matrix.to/#/#aksdev-space:matrix.akselmo.dev">Aks_Dev community</a> from Discord to Matrix.
Just to support the project in general but also I do not want my community to be tied to one client.
In fact I've been using <a href="https://github.com/matrix-org/matrix-appservice-discord">Matrix-Discord bridge</a> for a while, but it is not the optimal way to chat, IMO. Some things just drop out, like replies from Discord side. It works but.. It would be better if everyone was just on the Matrix side.</p>
<p>On top of the bridge being Very Good but Not Optimal, Discord being proprietary platform can easily follow the path of Twitter.
Who knows when Discord decides to add <a href="https://www.nme.com/news/gaming-news/discord-walks-back-cryptocurrency-integration-plans-3093283">cryptocurrencies</a> or other meaningless crap? Who knows where your data is going to?
And if you want to use different client, Discord just can easily ban you because it's their walled garden and you're the prisoner of convenience.</p>
<p><em>Ahem</em>..</p>
<p>Enough of ranting, here's how you get most of Da Matrix, in my holy opinion:</p>
<h1 id="create-account-to-one-of-the-instances"><a class="zola-anchor" href="#create-account-to-one-of-the-instances" aria-label="Anchor link for: create-account-to-one-of-the-instances">Create account to one of the instances</a></h1>
<p>Try to avoid Matrix.org if you can. Meanwhile it is the biggest instance, that is also its downside. If Matrix.org runs out of money to host the server, then it's bye-bye for all the accounts using it.</p>
<p>I think one good alternative to Matrix.org is Mozilla's instance: <a href="https://wiki.mozilla.org/Matrix">https://wiki.mozilla.org/Matrix</a></p>
<p>Edit: I have learned that Mozilla's instance is hosted by the Element Matrix Services, so it's not as decentralized as I hoped. If that doesn't matter to you, you can just use it, but if it does, read on.</p>
<p>If you are savvy enough, just self-host your own instance. But if you know how to do that, you probably are not reading this post anyhow.</p>
<p>You can also get your own instance through these hosting services: <a href="https://matrix.org/hosting/">https://matrix.org/hosting/</a></p>
<p>Make sure the instance you join is not ACL-banned (Access Control List) by Matrix.org. This will
make it harder for you to federate with other servers.</p>
<p>Here is also one list I found from searching: <a href="https://joinmatrix.org/servers/">https://joinmatrix.org/servers/</a></p>
<p>Pick one with rules and privacy policy, then make sure you read the rules well. Check that there is nothing <em>weird</em> about the instance.</p>
<p>Edit: The host of the joinmatrix.org contacted me and told me to create a report for them if the list has a <em>weird</em> instance.</p>
<p><em>But I don't want to think too much of this!</em></p>
<p>Then, go for either Matrix.org or Mozilla's instance.</p>
<h1 id="use-element-to-set-up-things"><a class="zola-anchor" href="#use-element-to-set-up-things" aria-label="Anchor link for: use-element-to-set-up-things">Use Element to set up things</a></h1>
<p>Meanwhile <a href="https://app.element.io/">Element</a> is not my daily-drive client, I always create the new account using it and set it up wit it. It is made by people who also work with Matrix protocol, so it usually has all the features needed to get you going.</p>
<p>So, use Element to create your account and set it up. I think of Element as the "control panel" of my account, and not the actual chat client I use.</p>
<h1 id="pick-your-client"><a class="zola-anchor" href="#pick-your-client" aria-label="Anchor link for: pick-your-client">Pick your client</a></h1>
<p>This is not necessary if you like Element and it has all you need! But I've noticed many new Matrix users have problems using Element since it has <em>a lot of going on!</em></p>
<p>So many buttons and widgets. So many things cluttering around. And no custom emoji support (as of writing this)!</p>
<p>This is why I recommend getting another client. My favorite newcomer-friendly client is definitely <a href="https://cinny.in/">Cinny</a>!</p>
<p>It has custom emoji support, it has less noisy interface, it works with E2EE and basically, it works well as a basic chat client.</p>
<p>There is also desktop version of Cinny, but it's a bit hidden for some reason: <a href="https://github.com/cinnyapp/cinny-desktop/releases/">https://github.com/cinnyapp/cinny-desktop/releases/</a></p>
<p>You can find more clients from here if you're curious: <a href="https://matrix.org/clients/">Official client list</a></p>
<p>However, what I would do is the following:</p>
<p><strong>Element</strong> as control panel and back-up client. <strong>Cinny</strong> as the main client I use daily, either on desktop or web-browser.</p>
<h1 id="e2ee-verification-stuff"><a class="zola-anchor" href="#e2ee-verification-stuff" aria-label="Anchor link for: e2ee-verification-stuff">E2EE verification stuff</a></h1>
<p><em>E2EE = end-to-end encryption</em></p>
<p>This is where the UX is not very good yet... Basically, when logging in to Cinny, you'll see a popup that says something about "verify your client/account."</p>
<p>This means that the encryption key, that is used to encrypt your conversations, will be shared between these clients. So when you verify a device, the client with the key will send it to the other client. In this case it would be from Element to Cinny.</p>
<p>The usual verification dance is following:</p>
<ol start="0">
<li>You have set up your account in Element, but want to now try a new client.</li>
<li>You open the new client in another window, for example Cinny, and log in. <strong>Keep Element open!</strong></li>
<li>Cinny or Element warns you that your account is unverified, since there is a new client connected to it.</li>
<li>You click the shiny Verify button in either client (I usually always start the verification process from Element)</li>
<li>You accept the verification process in the other client.</li>
<li>You have to check if some emoji's match and say Yes in both clients.</li>
<li>This dance now should be done.</li>
</ol>
<p>I think there are better ways to do this, like QR codes or something, but it's clearly still in WIP to see what kind of verification method will be the one that'll stick.</p>
<p>If you do not use chats with E2EE enabled, the verification process is not necessary. But I do it anyhow because the popups are annoying, lol.</p>
<p>My community does not use encrypted chats, because bots do not work with those.</p>
<h1 id="android-client"><a class="zola-anchor" href="#android-client" aria-label="Anchor link for: android-client">Android client</a></h1>
<p>I don't know anything about iOS, but on Android, <a href="https://fluffychat.im/">Fluffychat</a> is what I use. Works well for my usage. Android version of Element is also fine, but it doesn't have custom emoji support. See the client list linked above for more.</p>
<p>And yes, you'll have to do the verification dance here as well. Again I recommend starting it from Element on desktop.</p>
<h1 id="voice-and-video"><a class="zola-anchor" href="#voice-and-video" aria-label="Anchor link for: voice-and-video">Voice and Video</a></h1>
<p>These are still WIP. I think only Element and <a href="https://nheko-reborn.github.io/">Nheko</a> clients have voice chat working, and I'm not sure if anything else but Element has video chat working.</p>
<p>For these, you're probably best served with Discord. If you want FOSS voice-chatting, check out <a href="https://www.mumble.info/">Mumble</a>. It's the old reliable and I've used it for years.</p>
<p>For video chats, I do not know at all what would work. Leave comment if you do, though!</p>
<h1 id="quick-summary-for-the-tldr-peeps"><a class="zola-anchor" href="#quick-summary-for-the-tldr-peeps" aria-label="Anchor link for: quick-summary-for-the-tldr-peeps">Quick Summary for the TLDR peeps</a></h1>
<ol>
<li>Use Element to create an account to Matrix.org or Mozilla's instance.</li>
<li>Set up your account inside Element.</li>
<li>Download Cinny for your desktop and/or use it from your browser.</li>
<li>Use Cinny as your chat client, Element as your "control panel" client.</li>
<li>Get some mobile client if you wish.</li>
<li>Set up E2EE by verifying the other clients from Element.</li>
</ol>
<h1 id="what-about-xmpp-and-irc-why-matrix"><a class="zola-anchor" href="#what-about-xmpp-and-irc-why-matrix" aria-label="Anchor link for: what-about-xmpp-and-irc-why-matrix">What about XMPP and IRC? Why Matrix?</a></h1>
<p>I actually love both XMPP and IRC. I've used both and they still are very reliable ways to chat.</p>
<p>However, most folk I chat with seem to use Matrix, and if you run your own homeserver like I do, you can easily bridge to both XMPP and IRC if needed. That's why I've chosen to stick with Matrix in this case.</p>
<p>Personally I don't really care about the protocol, I just want something that is not proprietary and the communities I am in use. Matrix seems to bridge with anything so for me it made most sense.</p>
<p><strong>The best thing we can do, however, is not to fight over protocols but make these open protocols easily to talk to each other, so we can choose anything we wish.</strong></p>
<p><strong>To have any chance against proprietary stuff, we must not fight among ourselves, but work together. We are all in this together, after all!</strong></p>
<p>+++<br></p>
<p>Aaaand that's all. I hope this "guide" helped a bit.</p>
<p>Matrix is still very young and figuring things out. It's complicated and I believe they're adding features a bit too fast, so things are not always very fleshed out.</p>
<p>But for basic text chatting it works fine for me, and is not proprietary.</p>
<p>So if you want a community to join in with your Matrix account, hop on to Aks_Dev chat!</p>
<p><a href="https://matrix.to/#/#aksdev-space:matrix.akselmo.dev">Aks_Dev Matrix Community</a></p>
<p>You can ask me questions about Matrix in there or just comment to this post. :)</p>
How to rotate an actor with Raylib without math knowledgeTue, 22 Nov 2022 00:00:00 +0000Akselidevelopmentgamedev
https://akselmo.dev/posts/how-to-rotate-an-actor-with-raylib/
https://akselmo.dev/posts/how-to-rotate-an-actor-with-raylib/<p><em>Rotate what now? Aks, what are you talking about?</em><span id="continue-reading"></span></p>
<p>I wanted to write down how I made the enemy characters in <a href="https://codeberg.org/akselmo/artificial-rage">Artificial Rage</a> rotate towards the player,
since I couldn't find a simple answer.</p>
<p>Most things I found was math. Now math is fun and good, but when you're tired
and want to get one thing just to <em>work</em> at 4 am, it's not gonna help you.</p>
<p>Especially since I've never learned linear algebra at any school I've went to (or I just likely don't remember),
and double especially since all the math lingo is in English and I have <em>no idea what any of it means!!!</em></p>
<p>Getting Gooder at math is on my eternal to-do list, but anyhow, for those like me
who just need to get something done, here's how I did it.</p>
<p>First off, I just wanted the character to rotate around it's Y-axis: If you would
stick a.. well stick in a grape and twirl the stick in your fingers, that's the Y-axis of the grape.
This means the following snippet does not take account the other axises. But I'm sure it could be used for it.</p>
<p>Code dump incoming:</p>
<pre data-lang="c" style="background-color:#181818;color:#ffffff;" class="language-c "><code class="language-c" data-lang="c"><span style="color:#808080;">// C99 code
</span><span style="color:#33ffff;">void </span><span style="font-weight:bold;color:#838fff;">Actor_RotateTowards</span><span>(Actor_Data</span><span style="font-weight:bold;color:#33ffa0;">* </span><span style="color:#ff9233;">actor</span><span>, Vector3 </span><span style="color:#ff9233;">targetPosition</span><span>)
</span><span>{
</span><span> </span><span style="color:#808080;">// Rotates the actor around Y axis
</span><span> Vector3 diff </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>Vector3Subtract(actor->position, targetPosition);
</span><span> </span><span style="color:#33ffff;">float</span><span> y_angle </span><span style="font-weight:bold;color:#33ffa0;">= -</span><span>(</span><span style="color:#838fff;">atan2</span><span>(diff.z, diff.x) </span><span style="font-weight:bold;color:#33ffa0;">+</span><span> PI </span><span style="font-weight:bold;color:#33ffa0;">/ </span><span style="color:#ff9233;">2.0</span><span>);
</span><span> Vector3 newRotation </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>(Vector3) { </span><span style="color:#ff9233;">0</span><span>, y_angle, </span><span style="color:#ff9233;">0 </span><span>};
</span><span>
</span><span> </span><span style="color:#808080;">// Use quaternion slerping for smoother rotation, so the actor always follows the shortest path
</span><span> Quaternion start </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>QuaternionFromEuler(actor->rotation.z, actor->rotation.y, actor->rotation.x);
</span><span> Quaternion end </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>QuaternionFromEuler(newRotation.z, newRotation.y, newRotation.x);
</span><span> Quaternion slerp </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>QuaternionSlerp(start, end, actor->rotationSpeed </span><span style="font-weight:bold;color:#33ffa0;">* </span><span>GetFrameTime());
</span><span>
</span><span> actor->model.transform </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>QuaternionToMatrix(slerp);
</span><span> actor->rotation </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> newRotation;
</span><span>}
</span></code></pre>
<p>I'll quickly walk you through the code:</p>
<ol>
<li>First you need the position of the target, so the actor knows where to rotate towards.</li>
<li>Get the difference between actors position and targets position</li>
<li>Measure the <a href="https://en.wikipedia.org/wiki/Atan2">counterclockwise angle for the X- and Z-axis of the difference of the actor and target position</a>, then rub some PI on it. Divide this with two because my friend <a href="https://furry.engineer/@CapitalEx">CapitalEx</a> said so. Something about radians/euler angles. Math. Comment if you can explain this like you would for a 5 year old. hlep</li>
<li>Your new rotation is now ready, just use the y_angle you got for the, well, Y-axis.</li>
<li>Uhhhhh quaternions. Create Quaternion for start position that is the current rotation of the actor, end position that is the target rotation so the thing you just got. We use quaternions so the computer uses shortest rotation path possible.</li>
<li><a href="https://en.wikipedia.org/wiki/Slerp">Slerrrrrrrp</a> the rotation from start to end with your wanted speed. Don't forget to apply frame deltatime or the higher the fps, the faster the spins.</li>
<li>Give the new cool slerped quaternion you just got as a matrix to the model's transform. Don't forget to update the rotation to the new one.</li>
<li>Done! Nice.</li>
</ol>
<p>I wish I understood this better. I've tried to learn quaternions with this fun website: <a href="https://eater.net/quaternions">https://eater.net/quaternions</a>.
It works for a while, but then I forget it.</p>
<p>Anyhow, that's the gist of it. Now the 3d models rotate around their Y-axis towards anything you would ever want. Nice!</p>
<p>Feel free to explain math in the comments to me. Again, math words in English are difficult for me, but if explained simple enough I think I would understand it.
Also if you have videos you can recommend me about the topic, do share!</p>
<p>That's all for this time, thanks for reading!</p>
I made outlines for KDE Breeze window decorationMon, 31 Oct 2022 00:00:00 +0000Akselidevelopmentsoftwarekde
https://akselmo.dev/posts/i-made-outlines-for-kde-breeze/
https://akselmo.dev/posts/i-made-outlines-for-kde-breeze/<p>Window outlines! Yet another KDE contribution by yours truly! <span id="continue-reading"></span> This was fun.
Not easy at all, but fun. I'm pretty happy how they turned out.</p>
<p>Breeze Dark</p>
<p><a href="/assets/images/kde/outline_dark.jpg"><img src="/assets/images/kde/outline_dark.jpg" alt="Outline Dark" /></a></p>
<p>Breeze Light</p>
<p><a href="/assets/images/kde/outline_light.jpg"><img src="/assets/images/kde/outline_light.jpg" alt="Outline Light" /></a></p>
<p><em>I hope Nate you don't mind me taking the screenshots from your <a href="https://pointieststick.com/2022/10/28/this-week-in-kde-next-generation-improvements/">blog post</a>, I'm just.. Lazy. I have no excuse. Lol.</em></p>
<p>For those who just want to see how it's made, here's link to the merge request: <a href="https://invent.kde.org/plasma/breeze/-/merge_requests/241">https://invent.kde.org/plasma/breeze/-/merge_requests/241</a></p>
<p>Also I am probably gonna make couple LOTR references due to talking about binding and light and dark and I'm sorry about that beforehand.</p>
<h2 id="but-why-make-them"><a class="zola-anchor" href="#but-why-make-them" aria-label="Anchor link for: but-why-make-them">But why make them?</a></h2>
<p>I have big problem making distinctions between windows if they have dark theme and on top of each other. Window shadows are often
dark as well, so the windows just kind of blend into each other and the shadows do not help much. Disable shadows altogether and you got
windows that just disappear into each other. This can even happen with light themes, sometimes the shadows just are not enough.</p>
<p>They also look a bit better with the outlines, in my opinion. They give some kind of "constraint" for the window and they
ease my weird brain.</p>
<p>To sum up, it just makes the windows feel like they're their own entities which calms my brain, they look nice and
they stop windows from blending into each other.</p>
<h2 id="where-are-they-drawn"><a class="zola-anchor" href="#where-are-they-drawn" aria-label="Anchor link for: where-are-they-drawn">Where are they drawn?</a></h2>
<p>First I had to figure out where the hecc I draw these outlines?</p>
<p>Well, I wanted to make them their own thing, separated completely from other elements. But this would've meant
I would need to actually make more in-depth modifications to KDecoration (I think?) and make the outlines their own
draw calls and whatnot.</p>
<p>So instead, I made them play nice with shadows. Basically, the outlines are just part of the shadow drawcall.</p>
<p><em>But what happens if shadows are disabled?</em></p>
<p>Something cheeky happens! I actually draw the shadows with 0% alpha channel!</p>
<pre data-lang="cpp" style="background-color:#181818;color:#ffffff;" class="language-cpp "><code class="language-cpp" data-lang="cpp"><span> CompositeShadowParams params </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>lookupShadowParams(m_internalSettings->shadowSize());
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">if </span><span>(params.isNone()) {
</span><span> </span><span style="color:#808080;">// If shadows are disabled, set shadow opacity to 0.
</span><span> </span><span style="color:#808080;">// This allows the outline effect to show up without the shadow effect.
</span><span> params </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>CompositeShadowParams(QPoint(</span><span style="color:#ff9233;">0</span><span>, </span><span style="color:#ff9233;">4</span><span>), ShadowParams(QPoint(</span><span style="color:#ff9233;">0</span><span>, </span><span style="color:#ff9233;">0</span><span>), </span><span style="color:#ff9233;">16</span><span>, </span><span style="color:#ff9233;">0</span><span>), ShadowParams(QPoint(</span><span style="color:#ff9233;">0</span><span>, </span><span style="font-weight:bold;color:#33ffa0;">-</span><span style="color:#ff9233;">2</span><span>), </span><span style="color:#ff9233;">8</span><span>, </span><span style="color:#ff9233;">0</span><span>));
</span><span> }
</span></code></pre>
<p>So the shadows are always there, they're just invisible. But the outlines will show up.</p>
<p><em>Hold on, you could've just skipped drawing shadows entirely!</em></p>
<p>Yes, but actually no.</p>
<p>Before shadows are even drawn, they make some very very useful calculations for me. And on top of that, remember that
outlines are part of the shadow drawcall. Outlines are just one more colored part of the shadow, basically.</p>
<p>No shadows, no outlines. In darkness together, I've bound them.</p>
<h2 id="bordering-madness"><a class="zola-anchor" href="#bordering-madness" aria-label="Anchor link for: bordering-madness">Bordering madness</a></h2>
<p>I get it all look nice and fancy with borders, they look all nice and rounded on bottom border... And then I disable borders.</p>
<p>And everything looks off.</p>
<p>The bottom border disappears completely and leaves a sharp window edge. The outline then rounds behind the window.
It looks bad!!!</p>
<p><a href="/assets/images/kde/outline_bad.png"><img src="/assets/images/kde/outline_bad.png" alt="Outline Bad" /></a></p>
<p>So, if borders are disabled, we do a magic trick and draw the outline path on our own.</p>
<pre data-lang="cpp" style="background-color:#181818;color:#ffffff;" class="language-cpp "><code class="language-cpp" data-lang="cpp"><span>
</span><span> </span><span style="color:#808080;">// Draw window outline
</span><span> </span><span style="color:#33ffff;">const</span><span> qreal outlineWidth </span><span style="font-weight:bold;color:#33ffa0;">= </span><span style="color:#ff9233;">1.001</span><span>;
</span><span> </span><span style="color:#33ffff;">const</span><span> qreal penOffset </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> outlineWidth </span><span style="font-weight:bold;color:#33ffa0;">/ </span><span style="color:#ff9233;">2</span><span>;
</span><span>
</span><span> </span><span style="color:#808080;">// Titlebar already has an outline, so move the top of the outline on the same level to avoid 2px width on top outline.
</span><span> QRectF outlineRect </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> innerRect </span><span style="font-weight:bold;color:#33ffa0;">+ </span><span>QMarginsF(penOffset, </span><span style="font-weight:bold;color:#33ffa0;">-</span><span>penOffset, penOffset, penOffset);
</span><span> qreal cornerSize </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>m_scaledCornerRadius </span><span style="font-weight:bold;color:#33ffa0;">* </span><span style="color:#ff9233;">2</span><span>;
</span><span> QRectF </span><span style="font-weight:bold;color:#838fff;">cornerRect</span><span>(outlineRect.x(), outlineRect.y(), </span><span style="color:#ff9233;">cornerSize</span><span>, </span><span style="color:#ff9233;">cornerSize</span><span>);
</span><span> QPainterPath outlinePath;
</span><span>
</span><span> outlinePath.arcMoveTo(cornerRect, </span><span style="color:#ff9233;">180</span><span>);
</span><span> outlinePath.arcTo(cornerRect, </span><span style="color:#ff9233;">180</span><span>, </span><span style="font-weight:bold;color:#33ffa0;">-</span><span style="color:#ff9233;">90</span><span>);
</span><span> cornerRect.moveTopRight(outlineRect.topRight());
</span><span> outlinePath.arcTo(cornerRect, </span><span style="color:#ff9233;">90</span><span>, </span><span style="font-weight:bold;color:#33ffa0;">-</span><span style="color:#ff9233;">90</span><span>);
</span><span>
</span><span> </span><span style="color:#808080;">// Check if border size is "no borders"
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">if </span><span>(borderSize(</span><span style="color:#ff9233;">true</span><span>) </span><span style="font-weight:bold;color:#33ffa0;">== </span><span style="color:#ff9233;">0</span><span>) {
</span><span> outlinePath.lineTo(outlineRect.bottomRight());
</span><span> outlinePath.lineTo(outlineRect.bottomLeft());
</span><span> } </span><span style="font-weight:bold;color:#33ffa0;">else </span><span>{
</span><span> cornerRect.moveBottomRight(outlineRect.bottomRight());
</span><span> outlinePath.arcTo(cornerRect, </span><span style="color:#ff9233;">0</span><span>, </span><span style="font-weight:bold;color:#33ffa0;">-</span><span style="color:#ff9233;">90</span><span>);
</span><span> cornerRect.moveBottomLeft(outlineRect.bottomLeft());
</span><span> outlinePath.arcTo(cornerRect, </span><span style="color:#ff9233;">270</span><span>, </span><span style="font-weight:bold;color:#33ffa0;">-</span><span style="color:#ff9233;">90</span><span>);
</span><span> }
</span><span> outlinePath.closeSubpath();
</span></code></pre>
<p>This part was actually fixed by Noah Davis: <a href="https://invent.kde.org/plasma/breeze/-/merge_requests/241#note_541478">https://invent.kde.org/plasma/breeze/-/merge_requests/241#note_541478</a></p>
<p>So, uh, I'm not 100% sure what's going on here but it seems that:</p>
<ul>
<li>Draw a rectangle with top left and top right with an arc, since they're always rounded</li>
<li>Check if we have border on or off</li>
<li>Draw bottom corners with an arc if borders are on, or draw sharp lines if they're off</li>
</ul>
<p>I think I got it right..? But I can say, my solution was more messy and I'm glad it's not there. It involved basically blending two rectangles
together. This is <em>much</em> better!</p>
<h2 id="outline-colors"><a class="zola-anchor" href="#outline-colors" aria-label="Anchor link for: outline-colors">Outline colors!</a></h2>
<p>The biggest puzzle of this was actually how to get the color for the outlines. We could have just gone with basic
black and white coloring here, but it would be too much contrast in some situations and look jarring to some.</p>
<p>So I started with a simple idea: Take the background color of the window, then light or dim it based on its lightness value (HSL).
If lightness is equal or over 50%, then dim the color. Otherwise lighten it.</p>
<p>At first I used HSV, which caused a bit weird situations.
In HSL, lightness is basically how much the color is lightened or darkened, but in HSV, the value dictates how the color acts under light.
For this situation HSL was better since we're not playing with lighting values, but just want to know if the color is "dark" or "light" to our eyes.</p>
<p>Anyhow, here's some copy-pasta from the source files:</p>
<pre data-lang="cpp" style="background-color:#181818;color:#ffffff;" class="language-cpp "><code class="language-cpp" data-lang="cpp"><span> </span><span style="color:#33ffff;">auto</span><span> s </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>settings();
</span><span> </span><span style="color:#33ffff;">auto</span><span> c </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>client().toStrongRef();
</span><span> </span><span style="color:#33ffff;">auto</span><span> outlineColor </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> c->color(c->isActive() </span><span style="font-weight:bold;color:#33ffa0;">?</span><span> ColorGroup::Active </span><span style="font-weight:bold;color:#33ffa0;">:</span><span> ColorGroup::Inactive, ColorRole::TitleBar);
</span><span>
</span><span> </span><span style="color:#808080;">// Bind lightness between 0.1 and 1.0 so it can never be completely black.
</span><span> </span><span style="color:#808080;">// Outlines only have transparency if alpha channel is supported
</span><span> outlineColor.setHslF(outlineColor.hslHueF(),
</span><span> outlineColor.hslSaturationF(),
</span><span> qBound(</span><span style="color:#ff9233;">0.1</span><span>, outlineColor.lightnessF(), </span><span style="color:#ff9233;">1.0</span><span>),
</span><span> s->isAlphaChannelSupported() </span><span style="font-weight:bold;color:#33ffa0;">? </span><span style="color:#ff9233;">0.9 </span><span style="font-weight:bold;color:#33ffa0;">: </span><span style="color:#ff9233;">1.0</span><span>);
</span></code></pre>
<p><em>Hold on, you said background color of the window, but you're using titlebar color?</em></p>
<p>When using the background color <code>ColorRole::Frame</code> the problem is that when having colored titlebar, the outline color feels
<em>very</em> out of place. It just doesn't look good.</p>
<p>But using <code>ColorRole::TitleBar</code> we get a fun colored outline effect when having a separately colored titlebar!</p>
<p><a href="/assets/images/kde/outline_colored.png"><img src="/assets/images/kde/outline_colored.png" alt="Outline Colored" /></a></p>
<p>Also there's the whole <code>qBound(0.1, outlineColor.lightnessF(), 1.0)</code> thing. Like the comment says, if the lightness value is black or very dark,
the outline will also be black or very dark. Binding the lightness avoids situations where the outline
blends into the dark background color.</p>
<p>And of course, finally we check if transparency is enabled and set it accordingly to avoid awkward situations.</p>
<p>But colors are tricky. Some like this solution, some don't. I am <em>probably</em> going to make a drop-down setting where people can select
does the outline use background or titlebar color, or are they just off.</p>
<h2 id="continuous-iteration"><a class="zola-anchor" href="#continuous-iteration" aria-label="Anchor link for: continuous-iteration">Continuous Iteration</a></h2>
<p>My part was done and the outlines got merged! It was long long long ride and I learned a lot. But I'm super happy I managed to
do this part, now it just needs to be iterated on so we can get something that looks <strong>The Best.</strong></p>
<p>Nate Graham already made the colors <strong>pop</strong> a bit more by fixing the lighten/darken values: <a href="https://invent.kde.org/plasma/breeze/-/merge_requests/263">https://invent.kde.org/plasma/breeze/-/merge_requests/263</a></p>
<p>Also there was initially a feature that if the window color was super light, we just didn't show outlines at all due to the outlines being so dim
it created a weird blur effect as the outlines were gray, the shadow black and the window white. But with this tweak that doesn't need to be done anymore.</p>
<p>There's still probably work to be done on this, but the biggest hurdle seems to be over! <em>Knocks on wood</em></p>
<p>As I said, I may make the settings section for this, but we'll see. I need a short break from KDE contributions, I got my own projects to work on too lol.</p>
<p>There's also been talk that we could use the separator (the <code>|</code> thing that separates buttons in menus etc etc) color as the outline color, and make that separator color
modifiable. I think that would make A Lot Of Sense... But I would still keep the outline color as the titlebar color if the titlebar is colored. :)</p>
<h2 id="thanks"><a class="zola-anchor" href="#thanks" aria-label="Anchor link for: thanks">Thanks!</a></h2>
<p>Thanks for reading this ramble. I really enjoyed making this contribution and once again I learned <strong>A LOT</strong>. Open source contributions are great
way to learn new stuff and I'm happy I get to make stuff like this for KDE. Also I've learned I kinda enjoy writing C++!</p>
<p>And thanks for all the comments and feedback and code reviews and <em>everything</em> anyone did to help me get this outline thing through.
Based on the feedback I've read on Da Internets, this is something many people didn't realise they needed!</p>
I made my own PineTime watchfaceSun, 04 Sep 2022 00:00:00 +0000Akselidevelopmentfosssoftware
https://akselmo.dev/posts/i-made-my-own-pinetime-watchface/
https://akselmo.dev/posts/i-made-my-own-pinetime-watchface/<p>I have really enjoyed using my PineTime as a watch, so I really wanted to make my own watchface.<span id="continue-reading"></span>
I based it around the colors of my <a href="https://codeberg.org/akselmo/aks_themes">KDE Plasma theme</a>.</p>
<p>Here's what it looks like:</p>
<p><a href="/assets/images/pinetime/watchface_small.jpg"><img src="/assets/images/pinetime/watchface_small.jpg" alt="Custom watchface" /></a></p>
<p><a href="https://codeberg.org/akselmo/Aksdark-Watchface">Link to Codeberg repository</a></p>
<p>And next I'm gonna ramble how I did it, what I learned etc. I wanted to share this due to being asked
how it was like.</p>
<h1 id="preface"><a class="zola-anchor" href="#preface" aria-label="Anchor link for: preface">Preface</a></h1>
<p>PineTime uses something called <a href="https://github.com/InfiniTimeOrg/InfiniTime">InfiniTime</a> as it's OS.
By default it has four different watchfaces: analog, digital, PineTimeStyle and terminal.</p>
<p>It also has plenty of different kind of applications like heartbeat sensor, music controls etc. If you
want to learn more about it, I posted about it in here: <a href="https://www.akselmo.dev/2021/12/18/Thoughts-on-my-PineTime.html">Thoughts on my PineTime</a></p>
<p>So what I exactly did here was creating my own watchface.</p>
<h1 id="infinisim"><a class="zola-anchor" href="#infinisim" aria-label="Anchor link for: infinisim">InfiniSim</a></h1>
<p><a href="https://github.com/InfiniTimeOrg/InfiniSim">InfiniSim</a> is a great InfiniTime simulator
that lets me modify the InfiniTime software quite fast, without having me to upload the software every time to my watch.</p>
<p>I basically opened the InfiniSim project in my CLion and then instead of building just the simulator, it also built the
InfiniTime source as well. I could pretty easily modify the sourcecode of InfiniTime and just run the simulator with one
click.</p>
<p>I think this tool is pretty much essential if you want to modify InfiniTime. It makes things so much easier.</p>
<h1 id="adding-fonts"><a class="zola-anchor" href="#adding-fonts" aria-label="Anchor link for: adding-fonts">Adding fonts</a></h1>
<p>First things first: I wanted a new font. I've recently fallen in love with the <a href="https://www.ibm.com/plex/">IBM Plex Font</a> and I wanted
my watch look good with it. Luckily, adding fonts wasn't too bad of an ordeal, but it did require some ThinkingTM.</p>
<p>At first I had to add the new fonts to a <a href="https://github.com/InfiniTimeOrg/InfiniTime/compare/develop...Akselmo:InfiniTime:personal-watchface#diff-9cd4f7eefb64934be3c2e2b3db5ce9a1f5ebd672d16007ac3861ea07d73c4269">fonts.json</a> file.</p>
<p>What was scary at first was that I would need to find the position of the glyphs in hex form... However, luckily, the Jetbrains fonts used by default
had the exact same glyph positions so I could just use their hex values for the <code>range</code>.</p>
<p>After declaring the fonts in the JSON file, I went to the <a href="https://github.com/InfiniTimeOrg/InfiniTime/compare/develop...Akselmo:InfiniTime:personal-watchface#diff-d75c2fe90af8f3b003221f82adcb06ffe840f29f2f7bbb2572c095f121bd8d60">CMakeLists.txt</a> file and declared all the new fonts in there.</p>
<p>And last, I added the fonts to the <a href="https://github.com/InfiniTimeOrg/InfiniTime/compare/develop...Akselmo:InfiniTime:personal-watchface#diff-78ca59463856360e2aedcc8a31a39a4c49002f967bdea90bd3b515bce65e1e97">lv_conf.h</a> file.</p>
<p>Now I could use my own fonts across the project.</p>
<h1 id="watchface-modification"><a class="zola-anchor" href="#watchface-modification" aria-label="Anchor link for: watchface-modification">Watchface modification</a></h1>
<p>For the watchface, I took the terminal watchface and began to modify the file. I quickly learned how to move things around,
the source code was really easy to read.</p>
<p><a href="https://github.com/InfiniTimeOrg/InfiniTime/blob/develop/src/displayapp/screens/WatchFaceTerminal.cpp">Link to the terminal watchface source code</a></p>
<p>However what I didn't like, was the amount of repetition in the original code. I decided to make my own functions
for setting up the labels how I wanted them. I do not know if there was an actual reason for the repetition, like
does adding custom functions to the file add more memory usage?</p>
<p>Anyhow, whatever the case may be, I wanted to test my skillz and make my own functions for it. So instead of
copy pasting functions, I just did the following:</p>
<pre data-lang="c" style="background-color:#181818;color:#ffffff;" class="language-c "><code class="language-c" data-lang="c"><span>
</span><span style="color:#808080;">//In the initializer
</span><span style="color:#33ffff;">const int</span><span> step_x </span><span style="font-weight:bold;color:#33ffa0;">= </span><span style="color:#ff9233;">40</span><span>;
</span><span style="color:#33ffff;">const int</span><span> step_y </span><span style="font-weight:bold;color:#33ffa0;">= </span><span style="color:#ff9233;">100</span><span>;
</span><span>stepValue </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>lv_label_create(lv_scr_act(), nullptr);
</span><span>SetupLabel(stepValue, step_x, step_y, </span><span style="font-weight:bold;color:#33ffa0;">&</span><span>plex_mono_20);
</span><span>stepIcon </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>lv_label_create(lv_scr_act(), nullptr);
</span><span>SetupIcon(stepIcon, step_x </span><span style="font-weight:bold;color:#33ffa0;">- </span><span style="color:#ff9233;">27</span><span>, step_y, </span><span style="color:#ff9233;">0xffbf40</span><span>, Symbols:</span><span style="font-weight:bold;color:#33ffa0;">:</span><span>shoe);
</span><span>
</span><span style="font-weight:bold;color:#33ffa0;">...
</span><span>
</span><span style="color:#33ffff;">void</span><span> WatchFaceAksdark:</span><span style="font-weight:bold;color:#33ffa0;">:</span><span>SetupLabel(lv_obj_t</span><span style="font-weight:bold;color:#33ffa0;">*</span><span> label, </span><span style="color:#33ffff;">int</span><span> x_ofs, </span><span style="color:#33ffff;">int</span><span> y_ofs, _lv_font_struct</span><span style="font-weight:bold;color:#33ffa0;">*</span><span> font)
</span><span>{
</span><span> lv_label_set_recolor(label, </span><span style="color:#ff9233;">true</span><span>);
</span><span> lv_obj_align(label, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, x_ofs, y_ofs);
</span><span> lv_obj_set_style_local_text_font(label, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font);
</span><span>}
</span><span>
</span><span style="color:#33ffff;">void</span><span> WatchFaceAksdark:</span><span style="font-weight:bold;color:#33ffa0;">:</span><span>SetupIcon(lv_obj_t</span><span style="font-weight:bold;color:#33ffa0;">*</span><span> label, </span><span style="color:#33ffff;">int</span><span> x_ofs, </span><span style="color:#33ffff;">int</span><span> y_ofs, </span><span style="color:#d970ff;">uint32_t</span><span> hexColor, </span><span style="color:#33ffff;">const char</span><span style="font-weight:bold;color:#33ffa0;">*</span><span> icon)
</span><span>{
</span><span> lv_obj_align(label, nullptr, LV_ALIGN_IN_LEFT_MID, x_ofs, y_ofs);
</span><span> lv_obj_set_style_local_text_color(label, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(hexColor));
</span><span> lv_label_set_text_static(label, icon);
</span><span>}
</span></code></pre>
<p>For some labels I wanted an icon next to them (the example above has the show icon next to amount of footsteps).</p>
<p>This let me move the labels and icons around pretty nicely, without having to modify too many commands.</p>
<p>I then also added my own watchface, <code>WatchFaceAksdark</code> to same place as the other watchfaces were. I would've also
kept all the four watchfaces and added mine as the fifth, but I would've had to modify the watchface settings
screen so that it's scrollable. Too lazy so I just replaced the terminal watchface with mine.</p>
<p>For the battery icon, I took the implementation from the PineTimeStyle watchface and just added the label next to it,
showing the battery value in percentages.</p>
<p>After everything was declared, I began to modify the <code>Refresh()</code> method and some places had old texts, like bluetooth was in text
instead of icons, I removed them and changed my icon implementations in place.</p>
<p>Honestly, there's not <em>that</em> much to write about. After getting the build environment set up and fonts added, it was quite simple.
My plan wasn't to make a watchface from scratch anyhow, just to modify an existing one and this seemed to work nicely.</p>
<h2 id="building-it-for-my-device"><a class="zola-anchor" href="#building-it-for-my-device" aria-label="Anchor link for: building-it-for-my-device">Building it for my device</a></h2>
<p>Now building for the InfiniSim is a click of a button, but building a zip file that can be sent to the Pinetime itself..</p>
<p>That was a bit of a headscratcher.</p>
<p><a href="https://github.com/InfiniTimeOrg/InfiniTime/blob/develop/doc/buildAndProgram.md#build-the-project">The official documentation</a> says:</p>
<blockquote>
<p>If you just want to build the project and run it on the Pinetime, using pinetime-app is recommended.</p>
</blockquote>
<p>This was not enough for <a href="https://codeberg.org/Freeyourgadget/Gadgetbridge">Gadgetbridge</a> to update my device.
Or maybe it was, and I did something wrong.</p>
<p>Anyhow, I found a different command that is used to build the <code>dfu</code> files, so here's the shell script I used
to build it as a zip file. Gadgetbridge can then use this to update the device.</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span style="color:#808080;">#!/usr/bin/env bash
</span><span>cmake</span><span style="color:#ff9233;"> -DARM_NONE_EABI_TOOLCHAIN_PATH</span><span style="font-weight:bold;color:#33ffa0;">=</span><span>./nrf52/gcc-arm/</span><span style="color:#ff9233;"> -DNRF5_SDK_PATH</span><span style="font-weight:bold;color:#33ffa0;">=</span><span>./nrf52/sdk/</span><span style="color:#ff9233;"> -DBUILD_DFU</span><span style="font-weight:bold;color:#33ffa0;">=</span><span>1 ../
</span><span>make</span><span style="color:#ff9233;"> -j</span><span> pinetime-mcuboot-app
</span></code></pre>
<p>The <code>-DBUILD_DFU=1</code> was the key flag here, then I had to build it as <code>pinetime-mcuboot-app</code>. This
zips the file for you and then you can just put it in your phone and use Gadgetbridge to upload it.</p>
<h2 id="what-i-learned"><a class="zola-anchor" href="#what-i-learned" aria-label="Anchor link for: what-i-learned">What I learned</a></h2>
<p>I learned that making stuff for embedded devices is fun! I just scratched the surface but honestly
I feel like making software for embedded devices would be my kind of thing, and would love to have a job
making something for embedded devices. <em>pls hire me i learn fast</em></p>
<p>The libraries used in InfiniTime, like <a href="https://lvgl.io/">lvgl</a> is really simple to understand and use.
I kinda feel like making my own applet for InfiniTime next, just need to come up with something fun. Maybe
a tiny game, although I have Arduboy waiting for that as well..</p>
<p>If you have Pinetime, I recommend trying to modify a watchface, like changing colors or something. It's
a cool device and because it's open source, being able to modify it for your liking is great.</p>
<p>I also <a href="https://github.com/InfiniTimeOrg/InfiniTime/pull/1300">added a true pink color</a> to the device because my fiancee wanted it so much. :)</p>
<p>So yeah, go forth and tinker!</p>
Uploaded my themes to KDE StoreMon, 22 Aug 2022 00:00:00 +0000Akselikdesoftwarefoss
https://akselmo.dev/posts/uploaded-my-themes-to-kde-store/
https://akselmo.dev/posts/uploaded-my-themes-to-kde-store/<p>Hey, just a quick post, I uploaded some themes I've made for Aurorae and Plasma to KDE store.<span id="continue-reading"></span></p>
<p>They're simple themes that follow your colorscheme but are made for dark color schemes.
The accent themes follow your accent color for the outlines.</p>
<p>The reason I made these themes is that I need a strong outline around my windows and other elements: Otherwise all the windows I have just "blend" together no matter how strong shadow I have enabled.</p>
<p>Aurorae Themes:</p>
<ul>
<li><a href="https://store.kde.org/p/1887649">Without accent color</a></li>
<li><a href="https://store.kde.org/p/1887668">With accent color</a></li>
</ul>
<p>Plasma Themes:</p>
<ul>
<li><a href="https://store.kde.org/p/1887659">Without accent color</a></li>
<li><a href="https://store.kde.org/p/1887679">With accent color</a></li>
</ul>
<p>Here's screenshots of them in use:</p>
<p>Without accent outlines:
<a href="/assets/images/kde/no_accent.png"><img src="/assets/images/kde/no_accent.png" alt="Non-accented theme" /></a></p>
<p>With accent outlines:
<a href="/assets/images/kde/with_accent.png"><img src="/assets/images/kde/with_accent.png" alt="Accented theme" /></a></p>
<p>And finally, link to the repository: <a href="https://codeberg.org/akselmo/aks_themes">https://codeberg.org/akselmo/aks_themes</a></p>
<p>I hope you like them!</p>
I added some localization settings to KDEThu, 18 Aug 2022 00:00:00 +0000Akselikdesoftwarefoss
https://akselmo.dev/posts/i-added-localization-settings-for-kde/
https://akselmo.dev/posts/i-added-localization-settings-for-kde/<p>This was my biggest contribution so far! And it was a bit more involved than I expected,
so I wanted to write down what I learned.<span id="continue-reading"></span></p>
<p>Here's a screenshot:</p>
<p><img src="/assets/images/kde/kdecontrib1.png" alt="KDE Locale settings in system settings, the ones I added are outlined in red" /></p>
<p>I added the settings there that are in the red box. I also added the <code>Paper size</code> setting earlier in another
contribution, but it was pretty simple.</p>
<p>This was not, since Qt did not have builtin functions for these three settings: <code>LC_ADDRESS</code>, <code>LC_NAME</code> and <code>LC_TELEPHONE</code>.
I assume it's because only <code>glibc</code> has these settings.</p>
<p>Before I go any further, you can look at the commit in here:
<a href="https://invent.kde.org/plasma/plasma-workspace/-/commit/c7c2a3a85e5b7f74dcb2eadc35defe9e4b55c737">Add LC_ADDRESS, LC_IDENTIFICATION, LC_NAME and LC_TELEPHONE to region settings</a></p>
<h1 id="the-settings-part-themselves"><a class="zola-anchor" href="#the-settings-part-themselves" aria-label="Anchor link for: the-settings-part-themselves">The settings part themselves</a></h1>
<p>Most of the settings was actually easy to implement, since I could follow the old parts of the code and just
reimplement them separately for the <code>LC_ADDRESS</code> and friends.</p>
<p>What gave me most trouble though, were the examples. My post will be mostly about them.</p>
<h1 id="figuring-out-how-to-parse-stuff"><a class="zola-anchor" href="#figuring-out-how-to-parse-stuff" aria-label="Anchor link for: figuring-out-how-to-parse-stuff">Figuring out how to parse stuff</a></h1>
<p>To get a nice example to see what the locale you're setting looks like, we have to pull the format string
from the locale object/file.</p>
<p>For example, Finnish <code>postal_fmt</code> string is <code>%f%N%d%N%b%N%a%N%s %h%t%e%t%r%N%z %T%N%c%N</code>.</p>
<p>Yeah, fun. This website was REALLY helpful during making this: <a href="https://lh.2xlibre.net/locale/fi_FI/">https://lh.2xlibre.net/locale/fi_FI/</a></p>
<p>Archive it, cherish it.</p>
<p>I was going to make my own silly regexp parser thing, but luckily KDE has something called <code>KMacroExpander::expandMacros</code>,
that takes a hashmap and the format string. I gave the job to that method and it returned a nice parsed string.</p>
<p>However... How to get the correct locale? Now THIS, THIS was pain.</p>
<h1 id="nl-langinfo-or-nl-langinfo-l"><a class="zola-anchor" href="#nl-langinfo-or-nl-langinfo-l" aria-label="Anchor link for: nl-langinfo-or-nl-langinfo-l">nl_langinfo or nl_langinfo_l</a></h1>
<p>I just wanted to tell the C function that hey, I got this locale, how to get it's format string?</p>
<p>After hours of searching, <code>nl_langinfo_l</code> seemed the obvious choice. Except that you need to give it
<code>locale_t</code> struct and I still don't know what could give me that struct. There was only ways to make
new locales with <code>newlocale</code> and meanwhile it could duplicate existing locales, it also required <code>locale_t</code>.</p>
<p>I tried to make my own <code>locale_t</code> at first since I couldn't find any <code>getlocale_t</code> functions. It was messy
and it didn't work, so I just groaned and tried to just use <code>nl_langinfo</code>. What this does is that it gets
the information of the locale that is currently active. Close, but not quite.</p>
<p>Due to being unable to get <code>locale_t</code> anywhere, I decided to do something a bit dirty. I set the locale
that the example is for with <code>setlocale</code>. So when the example is being built, the locale is active, and
thus <code>nl_langinfo</code> can get it's data, without me having to create a new <code>locale_t</code> by hand.</p>
<p>It is not ideal solution. I got asked about it many times. But when I asked how to get <code>locale_t</code>,
it was just nowhere to be found. Nobody knew, and I don't blame them. I quickly learned this locale stuff
is pretty much dark wizardry that only few understand.</p>
<p>At least the examples were <em>finally</em> working and I didn't see any weird side-effects.</p>
<p>If you, my dear reader, know how to get <code>locale_t</code> from <code>QLocale</code>, do share and I'll do this the proper way.</p>
<h1 id="what-if-the-locales-are-not-generated"><a class="zola-anchor" href="#what-if-the-locales-are-not-generated" aria-label="Anchor link for: what-if-the-locales-are-not-generated">What if the locales are not generated</a></h1>
<p>I was told quickly that this will not work, if there's no locales generated and all the locale files are still
in the <code>/usr/share/i18n/locales/</code>.</p>
<p>So you gotta parse those files. Have fun!</p>
<p>Well, I did actually. It sounded more difficult than it was, but with simple regex I could get the right value:
The locale files in the folder were pretty well formatted, so it was quite easy to regex through it.
I had to just look for the name of the format, for example <code>postal_fmt</code>, then whitespace, then match and capture the value.</p>
<p>Of course, I didn't loop through all files, but only the file that matches the locale name. So for <code>fi_FI</code> locale we only
look for the <code>fi_FI</code> file.</p>
<h1 id="getting-language-code-from-the-locale"><a class="zola-anchor" href="#getting-language-code-from-the-locale" aria-label="Anchor link for: getting-language-code-from-the-locale">Getting language code from the locale</a></h1>
<p>After the examples were done, we wanted to localize the examples to the native language of the locale
the example is shown for. So Finnish address example actually is in Finnish, and not in English.</p>
<p>This felt a bit silly and I feel like there should've been better way to do this.</p>
<p>I could not figure out how to get the locale <em>language shortcode</em> from the locale name.</p>
<p>So the <code>en</code> part of <code>en_US</code>. I couldn't find anything that does this in Qt libraries, there were methods
that return the full name of the language but not the first part.</p>
<p>Regex to rescue again, just a simple regex, right? Wrong: <code>([a-z]*)($|[\-]).*</code>.</p>
<p>This regex first looks for and captures as many lowercase letters there are, then ends the capture
when either meeting end of string or <code>\</code> or <code>-</code>. I am not sure why I added the <code>\</code> there but I do remember
the <code>locale.bcp47Name()</code> returning locales with <code>\</code> too. Or I was just sleep deprived.</p>
<p>Anyhow,do share if you have an idea for simpler solution, be it simpler regex or "you should've just used this one
hidden function."</p>
<h1 id="some-things-i-learned"><a class="zola-anchor" href="#some-things-i-learned" aria-label="Anchor link for: some-things-i-learned">Some things I learned</a></h1>
<p>Here's few things I learned thanks to the reviewers:</p>
<ul>
<li>
<p>Examples should be easy to understand: Instead of having name example like <code>Jane Belle Doe</code> you should have <code>Firstname Middlename Lastname</code>, at least in this context.
This helps the user recognize the name order between locales, since in some locales lastname may be first etc.</p>
</li>
<li>
<p>Using <code>i18nc</code>: This will give the translators <em>context</em> besides just the string to translate for. Example: <code>i18nc("This is a contextual translation", "Hello")</code></p>
</li>
<li>
<p><code>const</code> is a friend in C++ (and I assume in C as well). If you have a variable that is initialized once but never modified after, just add <code>const</code> in front of it.
This tells the compiler that "hey this variable won't change" and also keeps it from accidentally changing. (Usually.)</p>
</li>
<li>
<p>Instead of returning empty QString <code>""</code>, just return <code>{}</code>. Avoids accidental non-empty strings, since the object is empty. Probably other reasons too.</p>
</li>
<li>
<p>Use <code>QLatin1String</code> when comparing strings, it's usually safer so that the decoding/encoding won't mess things up.</p>
</li>
</ul>
<p>Feel free to tell me if you know better why some things are like this. Most of these are based on my own experiences.</p>
<h1 id="conclusion"><a class="zola-anchor" href="#conclusion" aria-label="Anchor link for: conclusion">Conclusion</a></h1>
<p>So yeah, it was way more involved than I expected. I was honestly expecting Qt having some premade classes and methods
for the locale trio, but nope. So I had to get my hands dirty and do it myself.</p>
<p>I may sound grumpy in text but I legit enjoyed it even it was quite challenging for my tiny brain. I've never really
worked with C++ before due to people scaring me that it's a scary spooky hellish language.</p>
<p>Well, it certainly is a bit scary language. But I managed to make something nice with it.</p>
<p>Also there was no need for me to be scared of the review process. It was actually super educational
and I learned a lot from it. I am thankful for all the people who helped me work on this!!</p>
<p>All in all, I'm proud of myself. I'm proud that I managed to contribute something small like this.
And I am super excited to find more things to contribute to.</p>
<p>Just no locales anymore. Please.</p>
Simple Arduino Temperature meterSat, 13 Aug 2022 00:00:00 +0000Akselidevelopmentembeddedarduino
https://akselmo.dev/posts/simple-arduino-temperature-meter/
https://akselmo.dev/posts/simple-arduino-temperature-meter/<p>I decided it was time to dust off my Arduino starter kit I got like.. over 5 years ago?<span id="continue-reading"></span>
I had also bought a tiny <a href="https://sonoff.tech/product/accessories/am2301/">AM2301</a> temperature
and humidity meter, so why not combine that and the LCD display that came with the starter kit.
No idea if it's the same I linked but it has same part number.. Idk. Could be cheap clone.</p>
<p>Anyway I'm happy I did try this!
The project was super simple, I was basically following the directions
<a href="https://docs.arduino.cc/learn/electronics/lcd-displays">here</a>
to make the LCD display work.</p>
<p>Here's an image of it in action:</p>
<p><img src="https://codeberg.org/akselmo/ArduinoTempMeter/media/branch/main/in_action.jpg" alt="Arduino Temp Meter" /></p>
<p>I pretty much followed it to the T. Only problem was that I had my breadboard "glued wrong-way-around"
on the tiny thing that holds both the arduino and the breadboard, so I had to put the negative wire
to the rail that's marked positive on the breadboard.</p>
<p>Not that it's an issue at all, but that's why it's "wrong" in the image.</p>
<p>I got the thing working, but I had some wires wrong as well, so the display tried to draw characters
all wrong ways. What was kind of cool was when removing the green wires while the display was on,
it would get corrupted and show all kinds of characters. Kinda got a kick out of that.</p>
<p>After I got the LCD monitor to work, I just hooked the wires of the sensor to 5V and GND, and
the yellow wire to Arduino's digital pin, in my case pin 7.</p>
<p>Then I could use the arduino to read it, following these directions:
<a href="https://electropeak.com/learn/interfacing-dht21-am2301-temperature-humidity-sensor-with-arduino/">Electropeak.com tutorial</a></p>
<p>After I got the serial port to read the values, I could just feed them to the LCD screen.</p>
<p>You can find the code for this project here: <a href="https://codeberg.org/akselmo/ArduinoTempMeter">https://codeberg.org/akselmo/ArduinoTempMeter</a></p>
<p>I'm still astonished how super simple this was. I felt like I was cheating somehow: Surely this must be
more complicated than this!</p>
<p>But nope, Arduino is super simple thanks to people making a lot of good tutorials and libraries.
I'm glad I gave it a try and I think I will try to extend this by getting a Wifi module,
which then would yell to my Raspberry Pi which would host the values in our local network.</p>
<p>Sure, I <em>could</em> just use Raspberry Pi to do all of that, but I kinda wanna do it the "hard way" to
learn how to interface between Arduino and RPi.</p>
<p>Just may take another 5 years.. Lol.</p>
<p>I was also thinking of getting a proper PCB and soldering the thing so I could have this in smaller
form factor, but also I think I shouldn't waste Arduino Uno just for this small project. Maybe there
is some smaller Arduino I could sacrifice for dead simple project like this.</p>
<p>Wonder what else I could make.. Maybe a Discord bot that tells arduino to spin a motor or something?</p>
<p>Anyhow, this was just a small post of me being happy about something tiny I made. Gotta celebrate those
small successes as well! :)</p>
Testing GoatCounterTue, 09 Aug 2022 00:00:00 +0000Akselipersonalsoftware
https://akselmo.dev/posts/testing-goatcounter/
https://akselmo.dev/posts/testing-goatcounter/<p>Just a super short post this time!<span id="continue-reading"></span></p>
<p>I'm testing this analytics tool called <a href="https://www.goatcounter.com/">GoatCounter</a>.</p>
<p>I just added it to this site and if you don't want to be tracked, you can use Ublock Origin to block it,
or just disable Javascript.</p>
<p>My blog should work fine without Javascript anyway, only disables analytics and comments.</p>
<h1 id="why-u-add-analytics-ree"><a class="zola-anchor" href="#why-u-add-analytics-ree" aria-label="Anchor link for: why-u-add-analytics-ree">Why u add analytics ree???++</a></h1>
<p>Idk man I just wanted to see if anyone reads this stuff lol. So mostly curiosity.</p>
<p>It looks like this:</p>
<p><a href="/assets/images/goatcounter.png"><img src="/assets/images/goatcounter.png" alt="GoatCounter" /></a></p>
<p>To my next adventures!</p>
<p>PS. I was cosplaying this weekend and I'll make a post about it at some point when I feel like it.</p>
Server migration, from Digital Ocean to HetznerFri, 05 Aug 2022 00:00:00 +0000Akseliserverssoftware
https://akselmo.dev/posts/migrating-servers-from-digital-ocean-to-hetzner/
https://akselmo.dev/posts/migrating-servers-from-digital-ocean-to-hetzner/<p>Well that took a while.<span id="continue-reading"></span></p>
<p>After 6 hours I am finally done with this. It was hell but I feel accomplished.
However I'm still tying up lose ends.</p>
<h1 id="why"><a class="zola-anchor" href="#why" aria-label="Anchor link for: why">Why?</a></h1>
<p>I wanted to move my stuff from Digital Ocean to Hetzner for few reasons:</p>
<ul>
<li>Digital Ocean is american owned company, Hetzner is german</li>
<li>They have datacenters in Finland, where I live, thus I have lower ping</li>
<li>They are cheaper and have better specs for the prices (as of writing this)</li>
</ul>
<p>I just feel safer when my data recides in same country I live in. Also supporting European companies just feels nice.</p>
<p>That and the cheaper price of course.</p>
<h1 id="gitea-and-my-blog"><a class="zola-anchor" href="#gitea-and-my-blog" aria-label="Anchor link for: gitea-and-my-blog">Gitea and my blog</a></h1>
<p>This was the least painful thing to move.</p>
<p>First I moved my blog. It was pretty easy, just install apache2 and copy the files to <code>/var/www/</code> and set up the config.</p>
<p>However I could not get Gitea <code>dump</code> command to work to make a proper backup. So I gave up.</p>
<p>Since I already had the most repos on my PC, I just copied the bare repos from gitea's folders to my PC,
reinstalled Gitea completely and just.. Pushed the repos back there. Didn't take too long.</p>
<h1 id="matrix"><a class="zola-anchor" href="#matrix" aria-label="Anchor link for: matrix">Matrix</a></h1>
<p>This was also a hassle but.. Eh? I don't really even remember what I did.</p>
<p>I just basically reinstalled the whole thing like I mentioned in my older post: [Matrix stuff]({% post_url 2022-04-01-Playing-with-Matrix-Conduit-and-Synapse %})</p>
<p>But instead of creating all the files from scratch, I copied the homeserver.db over with scp from the other server.</p>
<p>I was dumb at first and tried to copy the file to my own PC then back to the new server but that would've taken ages.</p>
<p>Use <code>scp</code> for between server transfers. It's great. Or <code>rsync</code>.</p>
<h1 id="nextcloud"><a class="zola-anchor" href="#nextcloud" aria-label="Anchor link for: nextcloud">Nextcloud</a></h1>
<p>Argh. This took some time.</p>
<p>Again, installed it as usual. Tried to follow this here <a href="https://help.nextcloud.com/t/migrate-nextcloud-snap-installation-from-one-vps-to-another/85297/9">forum post</a>.</p>
<p>It mostly worked, but I had copied my data to wrong place and I had to move it. Then I had to run <code>nextcloud.occ maintenance:repair</code> so that everything
clicked in the right places.</p>
<p>So when using commands from internet like that, double check them.</p>
<h1 id="dns"><a class="zola-anchor" href="#dns" aria-label="Anchor link for: dns">DNS</a></h1>
<p>Luckily I didn't have that much problems with DNS. Hetzner has a cool automatic way to get all the DNS stuff, except for my e-mail settings.
That I just copy-pasted all the rest.</p>
<p>It just takes time for nameservers to switch around so I had to set both Nextcloud DNS and Hetzner DNS to point in same things.</p>
<h1 id="why-did-it-take-so-long"><a class="zola-anchor" href="#why-did-it-take-so-long" aria-label="Anchor link for: why-did-it-take-so-long">Why did it take so long?</a></h1>
<p>It took so long because everything is scattered in million places, there's barely any information for your specific problems, etc.</p>
<p>I had to basically take all information on the internet and slap them together in a giant mess, then parse that mess for all the relevant stuff.</p>
<p>I don't want to ever migrate my stuff ever again. If I have to change cloud providers, I'll just download all my shit to my PC and reinstall everything,
then reupload back.</p>
<p>Urgh.</p>
<p>Now excuse me while I reinstall Jekyll and all the fun stuff for this blog to the server so I can upload this post.</p>
What worries me about AI toolingSun, 17 Jul 2022 00:00:00 +0000Akselipersonalairant
https://akselmo.dev/posts/what-worries-me-about-ai-tools/
https://akselmo.dev/posts/what-worries-me-about-ai-tools/<p>I was listening <a href="https://linuxdowntime.com/linux-downtime-episode-51/">Linux Downtime episode 51</a> and meanwhile
it was nice to hear that Copilot has been helpful for open source developers.. It still worries me. <span id="continue-reading"></span></p>
<p>First off I still don't like they're selling the tool. A <em>proprietary</em> tool.</p>
<p>Like I guess I'm glad my awful code could benefit some system that helps to solve problems. But also I am not glad
that some big billion software house took it and sold it. It's unethical to me, but corporations have never cared about
ethics. So I am yelling at a wall basically.</p>
<h3 id="anyhow-that-s-not-my-main-worry"><a class="zola-anchor" href="#anyhow-that-s-not-my-main-worry" aria-label="Anchor link for: anyhow-that-s-not-my-main-worry">Anyhow, that's not my main worry.</a></h3>
<p>The actual worry is that suddenly everything has their own AI assisted service and that you're soon to be expected
to use them to live "normally." We already live in this subscription bs, now slap AI on top of it as another layer.</p>
<p>Now the current subscription bs is not necesary for you to live, but AI can be something that is soon to be expected
for everyone to have to help them, and anyone who doesn't use it is considered slow. Because in the end it's a productivity
helper.</p>
<p>And that of course kicks out anyone who is too poor to have one or just simply doesn't want an AI assisted tooling.</p>
<p>This will keep happening if the AI stuff is kept proprietary. It may be the next "internet" style of thing, it may
not. But if we want to make AI tooling etc. more widespread, we really need to have somekind of open standards for them and
all AI tooling should be open and free.</p>
<p>I am actually <em>not</em> against proprietary software in the first place, or even proprietary systems. But tools are different
to me, since they're tools. Anyone should be able to build their own tools for free. It gives everyone a chance to start.</p>
<p>Another thing is that if all AI tooling is kept closed, who knows what they're doing behind the scenes. Github Copilot,
for example, could be very easily gathering more stuff to it's training database from places it has no legal access,
like Gitlab repositories.</p>
<p>Now imagine tens of these AI tools, competing against each other... I just don't think it's gonna be sustainable, and
I am quite sure the code quality will suffer from it.</p>
<h3 id="i-ll-keep-avoiding-ai-tooling-for-now"><a class="zola-anchor" href="#i-ll-keep-avoiding-ai-tooling-for-now" aria-label="Anchor link for: i-ll-keep-avoiding-ai-tooling-for-now">I'll keep avoiding AI tooling for now</a></h3>
<p>But yeah, as always, corporations don't care about ethics of things. And that's why I don't want to use Copilot.</p>
<p>Besides I feel like my learning capabilities would suffer a lot when I can just press tab key and have magically everything
appear on my screen. Learning is one of the main reasons why I like programming, I don't want to take that away from myself.</p>
<p>Honestly the only way I am going to trust any kind of AI tooling is that I can peer behind the scenes,
<strong>even if I don't understand anything what's going on.</strong></p>
<p>And why I don't trust it? Well, would you trust a random person walking by you suddenly telling you how to write a program?
They may be correct, but would you <em>trust</em> them?</p>
<p>But that could be because I'm Finnish. :P</p>
I was told I don't careThu, 14 Jul 2022 00:00:00 +0000Akselipersonalrantgamedev
https://akselmo.dev/posts/i-was-told-i-dont-care/
https://akselmo.dev/posts/i-was-told-i-dont-care/<p>Today in Gaming On Linux discord group I was told that "I don't care about my playerbase" <span id="continue-reading"></span> by one
person and I got so frustrated I decided to write a blogpost about this.
That's fucking insulting and just false.</p>
<p><em>Note: The mods of the discord group apologized to me and have said this was the persons last warning. The group itself is nice and helpful.</em></p>
<p>Anyway, here's the whole story:</p>
<p>We were discussing the Unity+MalwareAdCompanyWhichNameIDontRemember merger.</p>
<p>Paraphrasing, I said something along the lines of</p>
<blockquote>
<p>I find it funny that many gamers don't really care about the game engine unless it tells you
straight up what the engine is.</p>
</blockquote>
<p>I may have used "fuck" there somewhere for emphasis. I've been told that I sound often "angry"
through text. English is not my native language so I don't know how to write proper prose that
keeps everyone happy.</p>
<p>Now in the return I got a huge wall of text, that basically boiled down to</p>
<blockquote>
<p>"You insult gamers, you don't care about gamers. You don't care about your userbase."</p>
</blockquote>
<p>Let's go through this BS one by one.</p>
<h1 id="i-don-t-think-any-gamer-should-care-about-the-game-engine"><a class="zola-anchor" href="#i-don-t-think-any-gamer-should-care-about-the-game-engine" aria-label="Anchor link for: i-don-t-think-any-gamer-should-care-about-the-game-engine">I don't think any gamer should care about the game engine</a></h1>
<p>My "I find it funny" was mostly aimed at people who go "unity bad peepeepoopoo" and then play Unity
games without knowing they're Unity games, since the game doesn't tell them. When it comes to the
context of the discussion we were having, I thought it was obvious. This could be my bad and I
admit it: I am bad with these sort of things. Heck I went therapy because of it. I'm still learning.</p>
<p>Anyhow. Gamers should NOT NEED TO care what engine is being used. Engine is just a tool. Does anyone care how their
chair or table was made? I doubt many do, and those who do are chair and table connosseurs, and we have those
people in gaming world too. If you do care about the engine, more power to you! You can make educated choices
and that's fantastic.</p>
<p>But the majority should not need to care. And many don't. They double click the icon on their desktop and play.</p>
<p>That is totally fine.</p>
<p>But it's funny when someone cares, says engine x poopoo and is hypocritical about it.</p>
<h1 id="i-care-about-my-userbase-a-lot"><a class="zola-anchor" href="#i-care-about-my-userbase-a-lot" aria-label="Anchor link for: i-care-about-my-userbase-a-lot">I care about my userbase. A lot.</a></h1>
<p>Telling me that I don't care about my users and putting words in my mouth definitely made me angery
enough to write this blogpost.</p>
<p>I have been making games around.. 10 years soon? <em>Holy shit.</em></p>
<p>During these times, I've published around 5 titles on Itch.io and all of them have gotten feedback.
I love receiving feedback and I've listened, trying to make my newer title always better than the old one.</p>
<p>Then on the whim I made Penance. It has over 14k downloads. It got rough feedback at first. I improved the game,
I even made my own maps for it. The download count around that time just exploded.</p>
<p>I did this because I fucking care. I spent many nights sleep-deprived thinking how to make the game better.
Eventually shit got so tough I had to tell myself "Okay, one last update, and no more for this project."</p>
<p>I was asked to make speedrun pages for Penance: I did. I now moderate it and just couple days ago I got plenty of new
runs. I love seeing my games being speedran.</p>
<p>I've tried my best to keep my fanbase happy and people chat in my Discord group a lot nowadays, mostly about programming
and that makes me super happy. I try to keep that place clean because I care about the quality there.</p>
<p>Now I know I am a no-name gamedev, but I DO A LOT of stuff to keep my lovely community happy.
New gamedevs sometimes join and ask me questions and I do my best to help them.</p>
<p>I care about every single one of you in my Discord/Matrix community. Thank you for staying with me on this ride.</p>
<h3 id="but-you-do-it-all-for-money-111one"><a class="zola-anchor" href="#but-you-do-it-all-for-money-111one" aria-label="Anchor link for: but-you-do-it-all-for-money-111one">But you do it all for money!!!!111one</a></h3>
<p>HA! I've spent around like 700€ for assets, engine stuff, etc etc. Guess how much I've made in all of these 10 years?</p>
<p><strong>250€</strong>.</p>
<p>So I'm like... 450€ loss. Lol. But I don't care about money. I care about making fun games.</p>
<p>Anyhow, that is because my games are pay-what-you-want titles. People are allowed to put 0€ if they wish. Sometimes someone
likes the game enough to pay for it and for that I am very grateful.</p>
<p>Why pay-what-you-want? Because I care enough that everyone who wants gets to play my games.</p>
<p>And now I am making completely open source, moddable retro-FPS. Why? Because I care enough that someone might
find it easy way to get into gamedev and find it fun to tinker with.</p>
<p>I love entertaining people, gamedev is for me the easiest way to do so.</p>
<p>To end this incoherent ramble: <strong>Don't ever fucking tell me I don't care.</strong></p>
<p>Anyhow, if someone doesn't like my stuff, that's fine. The shittalk is not.
If you shittalk me, you're never going to be my customer. I will refuse to sell to you.</p>
<p><strong>We gamedevs have put up with toxic bullshit long enough.</strong></p>
<p>Insult my games and whatever, but never tell me I don't care.</p>
<p>Cheers and sorry for this blogpost. I hope I don't have to write any more posts like this.</p>
Easy way to open Discord through Firefox without address bar!Sun, 05 Jun 2022 00:00:00 +0000Akselidiscordfirefoxsoftware
https://akselmo.dev/posts/discord-firefox-window/
https://akselmo.dev/posts/discord-firefox-window/<p>Since the Electron wrapper of Discord is so <a href="https://theevilskeleton.gitlab.io/2022/05/29/a-letter-to-discord-for-not-supporting-the-linux-desktop.html">bad and outdated</a>,
especially on Linux,<span id="continue-reading"></span> here's a way to start Discord through Linux in a "single page app" way.</p>
<p>I got the help for it from <a href="https://old.reddit.com/r/firefox/comments/li2lqg/now_that_mozilla_killed_the_ssb_feature_what/">here</a> but I wanted to
write this down in step-by-step way. (Honestly mostly for myself so I dont have to find it again lol)</p>
<h2 id="1-create-discord-profile"><a class="zola-anchor" href="#1-create-discord-profile" aria-label="Anchor link for: 1-create-discord-profile">1. Create Discord profile</a></h2>
<p>Open <code>about:profiles</code> in Firefox, and create a new profile called Discord.</p>
<p>Set the default profile as the one you're currently using, it should say "This is the profile in use and it cannot be deleted" on top of it.</p>
<h2 id="2-set-up-the-profile-to-hide-address-bar"><a class="zola-anchor" href="#2-set-up-the-profile-to-hide-address-bar" aria-label="Anchor link for: 2-set-up-the-profile-to-hide-address-bar">2. Set up the profile to hide address bar</a></h2>
<p>Open the new profile through terminal with</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>firefox --no-remote -P "Discord"
</span></code></pre>
<p>And check you're using the correct profile by opening <code>about:support</code> and checking the Profile Directory.</p>
<p>Then you can click the "Open Directory" button.</p>
<p>In that folder, create new folder called <code>chrome</code> and in that folder, create file <code>userChrome.css</code>.</p>
<p>Paste the following in the file, this will hide the address bar:</p>
<pre data-lang="css" style="background-color:#181818;color:#ffffff;" class="language-css "><code class="language-css" data-lang="css"><span>TabsToolbar {
</span><span> </span><span style="color:#d970ff;">visibility</span><span>: </span><span style="color:#d970ff;">collapse</span><span>;
</span><span>}
</span><span>
</span><span style="font-weight:bold;color:#838fff;">:root:not</span><span>([</span><span style="font-weight:bold;color:#838fff;">customizing</span><span>]) </span><span style="font-weight:bold;color:#838fff;">#navigator-toolbox:not</span><span>(</span><span style="font-weight:bold;color:#838fff;">:hover</span><span>)</span><span style="font-weight:bold;color:#838fff;">:not</span><span>(</span><span style="font-weight:bold;color:#838fff;">:focus-within</span><span>) {
</span><span> </span><span style="color:#d970ff;">max-height</span><span>: </span><span style="color:#ff9233;">1</span><span style="font-weight:bold;color:#33ffa0;">px</span><span>;
</span><span> </span><span style="color:#d970ff;">min-height</span><span>: </span><span style="color:#838fff;">calc</span><span>(</span><span style="color:#ff9233;">0</span><span style="font-weight:bold;color:#33ffa0;">px</span><span>);
</span><span> </span><span style="color:#d970ff;">overflow</span><span>: </span><span style="color:#d970ff;">hidden</span><span>;
</span><span>}
</span><span>
</span><span style="font-weight:bold;color:#838fff;">#navigator-toolbox::after </span><span>{
</span><span> </span><span style="color:#d970ff;">display</span><span>: </span><span style="color:#d970ff;">none </span><span style="font-weight:bold;color:#33ffa0;">!important</span><span>;
</span><span>}
</span><span>
</span><span style="font-weight:bold;color:#838fff;">#main-window</span><span>[</span><span style="font-weight:bold;color:#838fff;">sizemode</span><span style="font-weight:bold;color:#33ffa0;">=</span><span style="color:#5fff33;">"maximized"</span><span>] </span><span style="font-weight:bold;color:#838fff;">#content-deck </span><span>{
</span><span> </span><span style="color:#d970ff;">padding-top</span><span>: </span><span style="color:#ff9233;">8</span><span style="font-weight:bold;color:#33ffa0;">px</span><span>;
</span><span>}
</span></code></pre>
<p>Save the file and go back to Firefox.</p>
<p>In Firefox, open <code>about:config</code> and set <code>toolkit.legacyUserProfileCustomizations.stylesheets</code> to <code>true</code>.</p>
<p>It should save automatically. You can now close Firefox.</p>
<h2 id="3-create-a-shortcut"><a class="zola-anchor" href="#3-create-a-shortcut" aria-label="Anchor link for: 3-create-a-shortcut">3. Create a shortcut</a></h2>
<p>Go to <code>~/.local/share/applications</code> and create a new <code>discordfirefox.desktop</code> file.</p>
<p>Open that file and paste the following:</p>
<pre data-lang="desktop" style="background-color:#181818;color:#ffffff;" class="language-desktop "><code class="language-desktop" data-lang="desktop"><span>[Desktop Entry]
</span><span>Comment[en_GB]=Opens Discord in Firefox
</span><span>Comment=Opens Discord in Firefox
</span><span>Exec=firefox --no-remote -P "Discord" https://discord.com/channels/@me\n
</span><span>GenericName[en_GB]=Opens Discord in Firefox
</span><span>GenericName=Opens Discord in Firefox
</span><span>MimeType=
</span><span>Name[en_GB]=Discord (Firefox)
</span><span>Name=Discord (Firefox)
</span><span>Path=
</span><span>StartupNotify=true
</span><span>Terminal=false
</span><span>TerminalOptions=
</span><span>Type=Application
</span><span>X-DBUS-ServiceName=
</span><span>X-DBUS-StartupType=
</span><span>X-KDE-SubstituteUID=false
</span><span>X-KDE-Username=
</span></code></pre>
<p>You may want to add icon to it, but you should be able to do that by right clicking the desktop file and going
properties. You can also type <code>Icon=icon/path/here.svg</code> to the desktop file.</p>
<h2 id="done"><a class="zola-anchor" href="#done" aria-label="Anchor link for: done">Done</a></h2>
<p>That should be it! Now you should have a Discord faux-single-page-app.</p>
<p>A good idea is to also install Ublock Origin to the same profile, so you can also block any ads
if you are shared links.</p>
<p>If you move your mouse on top of the window, the address bar should pop up so you can use it like normal Firefox instance
if needed.</p>
I deleted Windows! And switched to FedoraFri, 06 May 2022 00:00:00 +0000Akselilinuxwindowssoftware
https://akselmo.dev/posts/i-deleted-windows-and-switched-to-fedora/
https://akselmo.dev/posts/i-deleted-windows-and-switched-to-fedora/<p>Last sunday I finally decided it's time to leave Windows properly behind.<span id="continue-reading"></span> I had Windows installed on my PC
just in case I want to dualboot back to it.</p>
<p>But almost year has been gone by since I switched to Kubuntu and.. Nope. I didn't boot Windows single time
during this ~11 months.</p>
<p>Also I switched to Fedora because things went wrong with partition resizing...</p>
<h2 id="partition-games"><a class="zola-anchor" href="#partition-games" aria-label="Anchor link for: partition-games">Partition games</a></h2>
<p>First I just wanted to delete Windows from my disks and then resize partitions to take up its space.
I had done this before so I knew to take backups of things, and went for it.</p>
<p>Boot up from live USB, start KDE Partition Manager, delete old stuff and start resizing...</p>
<p>First it took an hour to resize my NVME drive from 700gb to ~1tb. What the fuck, but okay.</p>
<p>Then it was time for resizing my SSD from 1.2tb to ~2tb. It started, did something and.. KDE Partition Manager
stopped responding. It crashed and burned.</p>
<p>I knew it was in unsaveable situation, even the NVME drive partition had crapped itself.</p>
<p>Lucky for me for those backups. <strong>EXCEPT I LOST MY MORROWIND SAVES AND I AM STILL SAD ABOUT IT!</strong></p>
<p>I decided it's time to try something new, so I tipped my head towards Fedora, since I had heard many good
things about it.
<em>Sorry not sorry about the pun.</em></p>
<h2 id="installing-fedora"><a class="zola-anchor" href="#installing-fedora" aria-label="Anchor link for: installing-fedora">Installing Fedora</a></h2>
<p>Here's where things get a bit funny. When installing Fedora, the installation was pretty straightforward,
except I got very confused by the disk selection part.</p>
<p>At first, I chose both of my disks when installing. I thought it would just format both as EXT4, automount my SSD,
that kind of thing...</p>
<p>Well I had no idea Fedora uses BTRFS and it went like "oh two drives? Raid 0 (or 1?) time!"</p>
<p>When booting up my PC first time after installation, I was confused how I had 3tb of space. It quickly dawned
on me that Fedora had combined both of my drives into one.</p>
<p>But I wanted to separate the drives: I wanted to install my games on the SSD, and keep everything else on the
NVME.</p>
<p>Que me searching internet how to separate the two drives with the BTRFS commands. Luckily I hadn't installed much
on the PC yet because I did one command too many or something, since next boot I just got "EMERGENCY MODE!"</p>
<p>Fuck.</p>
<h2 id="installing-fedora-properly-this-time"><a class="zola-anchor" href="#installing-fedora-properly-this-time" aria-label="Anchor link for: installing-fedora-properly-this-time">Installing Fedora properly this time</a></h2>
<p>I gave up trying to recover that the situation, cleaned both drives with live image
and reinstalled Fedora again, but this time I made damn sure that I chose
ONLY the NVME drive to install on. Otherwise the installation was smooth sailing as last time.</p>
<p>Success. Then I formated the SSD drive as EXT4, mounted it and did the usual <code>fstab</code> magic.</p>
<p>And finally I could install games on my SSD only on Steam, just like the gods intended.</p>
<p>Then I just set up my system from all the backups I have etc etc. The usual guff.</p>
<h2 id="using-fedora-for-almost-a-week"><a class="zola-anchor" href="#using-fedora-for-almost-a-week" aria-label="Anchor link for: using-fedora-for-almost-a-week">Using Fedora for almost a week</a></h2>
<p>I've loved using it so far! DNF is superior package manager, there's updates really often, my games have
slightly better time running (especially on Wayland but more of that later).. Many nice things.</p>
<p>My biggest source of happiness has been how <em>easy</em> it is to build packages from scratch with Fedora, especially
KDE related stuff.</p>
<p>Most things are already in repos, I can just install all dependencies and start building things, poking around,
testing and having fun.</p>
<p>Otherwise since it's KDE, I have pretty much same workflow I had on Kubuntu and there's not that much of
difference.</p>
<p>To sum up, major positive differences:</p>
<ul>
<li>No snaps! :) I don't need to fiddle with uninstalling those anymore</li>
<li>DNF is very good for installing packages and managing them. It also has very nice search function.</li>
<li>Frequent updates for new stuff! Haven't had stability issues yet.</li>
</ul>
<p>And since Wayland is the default, I finally got to try it.. However..</p>
<h2 id="wayland-is-not-for-me-just-yet"><a class="zola-anchor" href="#wayland-is-not-for-me-just-yet" aria-label="Anchor link for: wayland-is-not-for-me-just-yet">Wayland is not for me just yet</a></h2>
<p>Wayland is great. It's very fast, it's smooth on my two monitors, it is just dang nice to use. Note, I have AMD
GPU: RX 480.</p>
<p>But it has still some hiccups, especially with KDE, so I couldn't just yet stay with it.
There's tiny bugs like application menu highlight getting stuck on some app, Yakuake had difficult time
running, tooltips can jump up anywhere, system tray popups can pop up in middle of screen...</p>
<p>Also games can still lose mouse focus and suddenly I'm clicking on other screen. Same happens in
X11, but I have a script that forces my mouse to stay on the first monitor. I haven't found Wayland
variation of it, so if you know any, do send a comment!</p>
<p>They're really tiny issues. But they annoy me. And I don't like it.. :'(</p>
<p>So I went back to X11 for now.</p>
<p>After tasting Wayland, I can feel the sluggishness of X11 a bit now. But Wayland is still bit too early
for my usecases. But when it works, it's fricking beautiful and I wish all the best for developers working
on it. You're making something amazing there, please keep it up!</p>
<h2 id="sum-up"><a class="zola-anchor" href="#sum-up" aria-label="Anchor link for: sum-up">Sum up</a></h2>
<p>I am having fun using Fedora and I don't have to worry about Canonical's shenaningans anymore.
Building software is REALLY easy on Fedora and I get cool new stuff/upgrades faster. Stability hasn't
been an issue at all.</p>
<p>I just wish the installation was a bit more clear, especially when it comes to installing on many drives.
The installer should ask user if they want to combine the drives or install OS on first and have rest as
data drives.</p>
<p>But yeah, no more Windows. End of an era. WinXP will always have soft spot in my heart (and Win7 too honestly),
but Microsoft is pushing way too much privacy invading ads and other crap that I don't want to be part of that
anymore.</p>
<p>Oh yeah, I had to do way less to set up my rig for gaming on Fedora. It just worked without additional installs!</p>
<p>Thanks for reading!</p>
Fixing DNS issues in Kubuntu 22.04Sun, 01 May 2022 00:00:00 +0000Akselilinuxsoftware
https://akselmo.dev/posts/fixing-dns-issues-in-kubuntu-22-04/
https://akselmo.dev/posts/fixing-dns-issues-in-kubuntu-22-04/<p>DNS. It's always the effing DNS.<span id="continue-reading"></span></p>
<p>I had Kubuntu 21.10 installed with snaps disabled. Decided to run an update to Kubuntu 22.04. I'm on "normal" track, so this is for <strong>non-LTS</strong> version.</p>
<p>The update went fine but DNS refused to work after reboot.</p>
<p>After scouring through Stack Overflow I found my answer to fix it.</p>
<p>First edit <code>sudoedit /etc/resolvconf/resolv.conf.d/head</code> with following:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span style="color:#808080;"># Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
</span><span style="color:#808080;"># DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
</span><span style="color:#808080;"># 127.0.0.53 is the systemd-resolved stub resolver.
</span><span style="color:#808080;"># run "systemd-resolve --status" to see details about the actual nameservers.
</span><span>nameserver 8.8.4.4 </span><span style="color:#808080;">#could probably be 1.1.1.1 if you prefer
</span></code></pre>
<p>Then edit <code>sudoedit /etc/resolvconf/resolv.conf.d/base</code> with:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>nameserver 8.8.8.8
</span></code></pre>
<p>Then just restart your machine and there you go.</p>
<p>Also if <code>sudoedit</code> doesn't work for you, just use <code>sudo nano</code> or whatever works for you.</p>
<p>I get why people get frustrated with Systemd at times...</p>
<p>Anyway just wanted to share if someone else has the same problem.</p>
(I was) Scared of programmingSun, 24 Apr 2022 00:00:00 +0000Akselidevelopmentpersonal
https://akselmo.dev/posts/scared-of-programming/
https://akselmo.dev/posts/scared-of-programming/<p>I have always dabbled with programming languages, even as a kid.<span id="continue-reading"></span> But I never made anything
with them until I was in my 20s. Most extensive things I did before my 20s was simple
modifications to some files or dumb tiny javascript files.</p>
<p>The thing is, people always told me programming is very difficult (which is true!) and
I am the kind of person that always downplays their abilites. So I wanted to make programs
and games, but I never wanted to do the actual programming because how people treated it.
I always looked for non-programming game engines and such.</p>
<p><strong>Programming was scary!</strong></p>
<p>I was scared of breaking my PC, or just general failure. The latter is of course a personal
problem, but I wish people had told me that it's not as scary as I thought. Failure is big
part of programming, that's how most of us learn.</p>
<p>Well, eventually I had to overcome my fears: Our class at college had nobody who could do
programming, so I decided it's time to try at least.. And I got hooked.</p>
<p>I eventually realised it's not that scary and that my mind <em>can</em> wrap around these mystical
words I am typing to make things happen. C# was my entry to programming, it was the language that
got me hooked. Python also made me happy.</p>
<p><strong>However, there's something I was always still afraid to try: C and C++.</strong></p>
<p>I was told to not use C unless I "know what I'm doing." It's valid advice, but also
it was more of this "ooo scary spooky language" thing that made me just ignore it and
keep working with higher level languages.</p>
<p>I wish that instead I would've been told "It's old and weird, but it can be very very
useful language to know and work with." And nowadays, especially with libraries like Raylib,
it's pretty simple to get going and start making a game. Difficult for sure. But never scary.</p>
<p>Making my Raylib FPS in pure C has been one of the most fun programming projects I've had
in years!</p>
<p>Same thing happened with C++. People told me it's an awful language to work with, I should never
bother with it, yadda yadda. Again, difficult language for sure! Challenging even. But not scary.
I finally decided to work making my ESO Addon Manager in C++ and Qt. Sure it's complicated but also
there is a challenge, a puzzle, that my mind really enjoys!</p>
<p>What I am trying to point here is that..</p>
<p><strong>Stop scaring people away from trying!</strong></p>
<p>You're free to have opinions, even scathing ones, of languages. I know I have those about Javascript.
But your dislike may be someones like, which they never get to realise because you scared
them away. Let people try. Let people fail!</p>
<p>I found out about my likes way later because I was spooked away. I would've never learned
how much I actually enjoy writing C if I just hadn't taken the plunge. I went in with complete
"oh god is this going to suck" and I am glad to say, it hasn't sucked at all.</p>
<p>The challenges both C and C++ have given me are great.
I learned that I enjoy lower level programming, despite it's weird own world where the computer
doesn't help you out of sticky situations! (Like memory handling)</p>
<p>I am no more scared! I am excited!
I just wish I had realised this when I was 15. And that's why I'm ranting about this.</p>
<p><em>Okay, well maybe assembly still scares me a bit. But maybe one day I'll tackle that too!</em> :D</p>
<p>PS. this is a bit incoherent ramble probably because it's late and I just wanted to get this out of my system lol</p>
Playing with Matrix: Conduit and SynapseFri, 01 Apr 2022 00:00:00 +0000Akselimatrixsoftware
https://akselmo.dev/posts/playing-with-matrix-conduit-and-synapse/
https://akselmo.dev/posts/playing-with-matrix-conduit-and-synapse/<p>I've been playing around with Matrix homeservers.<span id="continue-reading"></span> I like the idea of running my own federated server to join random channels in.</p>
<p>Here's the two I've played around with so far and what I've thought about them.</p>
<p>My plan is also to create proper Space for my Aks_Dev channels and bridge them to my Discord "server."</p>
<h2 id="conduit-0-2-and-0-3"><a class="zola-anchor" href="#conduit-0-2-and-0-3" aria-label="Anchor link for: conduit-0-2-and-0-3">Conduit 0.2 and 0.3</a></h2>
<p><strong>Note</strong>: I was testing the Conduit 0.2, 0.3 and Next versions. These are very much still in their early phase of development.</p>
<p><a href="https://conduit.rs">Conduit.rs</a> is a very simple, easy to set up Matrix homeserver. It's made in Rust if you're into that
sort of thing, but that's not why I was using it.</p>
<p>Conduit promises very simple way to get a server up and running, which is why I wanted to try it. It also apparently takes very
little space and resources, so it was perfect for a small 5€/month Digitalocean "droplet" I am running.</p>
<p>Setting up was a breeze. The manual they have in their <a href="https://gitlab.com/famedly/conduit/-/blob/next/DEPLOY.md">Gitlab</a> was
really good and to the point. I was up and running within an hour or so.</p>
<p>At first, it was promising. I joined servers just fine.. Until I tried to join bigger channels with thousands of people.
That's where Conduit slowed down a lot, at least for me and my tiny cheap server. Maybe something beefier would've been fine.</p>
<p>I also used the default SQLite database with it, so that also slows it down. I prefer to roll with defaults when it comes to
this stuff since I am very new to self-hosting things.</p>
<p>I had some weird problems where my account got stuck in somekind of limbo. I don't really remember it, but what I do remember
is that the developer of Conduit helped me <em>a lot</em> in their Matrix channel. They even made a custom patch for me to get the
situation fixed. That convinced me to keep trying. After all, my mishaps probably helped debug something so I hope it was some
use! :D</p>
<p>After the problems were solved, it was pretty much smooth sailing from there. Bigger channels still took some time to join,
smaller channels joined pretty much instantly.</p>
<p>But why switch to Synapse then? Well, I was missing couple of features I find personally important:</p>
<h3 id="spaces"><a class="zola-anchor" href="#spaces" aria-label="Anchor link for: spaces">Spaces</a></h3>
<p>Spaces are very important thing to me since I wanted to set up my own Discord space. Conduit, at the time of writing, supports
spaces only partially: You can join spaces but you can't explore them. This makes it harder for me to set up the space
I wanted since I would have to use another account to do that etc. etc.</p>
<p>On top of that, joining a new space with many channels to explore for was also difficult. Again I had to use two accounts.</p>
<h3 id="notifications"><a class="zola-anchor" href="#notifications" aria-label="Anchor link for: notifications">Notifications</a></h3>
<p>Edit: I will leave the old part below, but here is the clarified reason by Timo why the notifications aren't working:
<a href="https://mastodon.social/@timokoesters/108066689733053957">Link to Mastodon Toot</a></p>
<blockquote>
<p>Timo: One clarification: Notifications don't work on Conduit v0.3.0 because we are sending nulls in the wrong places and the push gateway drops the messages. This is fixed on the 'next' branch and will make it into the v0.4.0 release soon hopefully. The /notifcations endpoint (used for optaining notification history) is not necessary for push notifications on any client I know.</p>
</blockquote>
<p>(Old post below)</p>
<p>This is a bit funky, since Conduit does support notifications, but it doesn't have the /notifications endpoint that most
clients lean on for all the notifs. Thus, some clients work with notifs and some don't.</p>
<p>Let's just say my fiancee wasn't terribly happy when I kept missing her messages! :'D</p>
<h3 id="unfamiliar-with-codebase"><a class="zola-anchor" href="#unfamiliar-with-codebase" aria-label="Anchor link for: unfamiliar-with-codebase">Unfamiliar with codebase</a></h3>
<p>I don't know anything about Rust. I can't help debug it. Sure this is not a big problem and it could maybe be a good way to learn
but I wanted something simpler at first. Programming network/server stuff is something I'm not very familiar with.</p>
<p>I am sure in future Conduit will support the features I need and I will very likely go back!</p>
<h2 id="synapse"><a class="zola-anchor" href="#synapse" aria-label="Anchor link for: synapse">Synapse</a></h2>
<p>Synapse is kind of the opposite. Very complicated to set up, takes more resources... But it supports all the features I want and
need. There's a lot of documentation and lots of it gives mixed signals. My first time setup went all kinds of bonkers, nothing
worked so I just wiped the following off my server: Nginx, Apache2, Synapse... Purged and cleaned all kinds of wonky old
configs I had laying about and then tried again.</p>
<p>Here's what I needed to do to get it to work.</p>
<h3 id="installation"><a class="zola-anchor" href="#installation" aria-label="Anchor link for: installation">Installation</a></h3>
<p>First off, the documentations give you all kinds of packages to install. I don't know which is the correct one for real, but
this one worked for me:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>
</span><span>sudo apt install matrix-synapse-py3
</span><span>
</span></code></pre>
<p>Note the -py3 in the end. That was important bit and mentioned in the official documentation: <a href="https://matrix-org.github.io/synapse/latest/setup/installation.html#matrixorg-packages">Link</a></p>
<p>Other guides, like the one offered by Digitalocean, didn't have that and caused me tear hair out of my head,
and I don't have much of that left.</p>
<p>But there was one guide that helped me to continue: <a href="https://www.howtoforge.com/tutorial/how-to-install-matrix-synapse-on-ubuntu-1804/">HowToForge</a></p>
<p>I pretty much followed it, except I didn't change the HTTP and HTTPS listener ports at all.</p>
<p>I did add the <code>registration_shared_secret</code> however, and I had already set letsencrypt on this server since it was running
a website before.</p>
<p>The guide asks you to add a configuration, but I didn't use that one. I used the one in official documentation, except
I added the bits for my own website.</p>
<p>Here's the config I used:</p>
<pre data-lang="nginx" style="background-color:#181818;color:#ffffff;" class="language-nginx "><code class="language-nginx" data-lang="nginx"><span>
</span><span>server {
</span><span> listen 80;
</span><span> server_name matrix.akselmo.dev;
</span><span> return 301 https://$server_name$request_uri;
</span><span>}
</span><span>
</span><span>
</span><span>server {
</span><span> listen 443 ssl http2;
</span><span> listen [::]:443 ssl http2;
</span><span>
</span><span> # For the federation port
</span><span> listen 8448 ssl http2 default_server;
</span><span> listen [::]:8448 ssl http2 default_server;
</span><span>
</span><span> server_name matrix.akselmo.dev;
</span><span>
</span><span> ssl_certificate /etc/letsencrypt/live/matrix.akselmo.dev/fullchain.pem;
</span><span> ssl_certificate_key /etc/letsencrypt/live/matrix.akselmo.dev/privkey.pem;
</span><span>
</span><span> # If you don't wanna serve a site, comment this out
</span><span> root /var/www/html;
</span><span>
</span><span> location ~ ^(/_matrix|/_synapse/client) {
</span><span> # note: do not add a path (even a single /) after the port in `proxy_pass`,
</span><span> # otherwise nginx will canonicalise the URI and cause signature verification
</span><span> # errors.
</span><span> proxy_pass http://localhost:8008;
</span><span> proxy_set_header X-Forwarded-For $remote_addr;
</span><span> proxy_set_header X-Forwarded-Proto $scheme;
</span><span> proxy_set_header Host $host;
</span><span>
</span><span> # Nginx by default only allows file uploads up to 1M in size
</span><span> # Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
</span><span> client_max_body_size 50M;
</span><span> }
</span><span>}
</span><span>
</span></code></pre>
<p>And now both my website and the Synapse server started running!</p>
<p>Again, I didn't set up myself Postgresql, even I probably should have! I may do that later at some point.</p>
<p>Luckily when it came to the configs, I didn't really have to mess around with it.</p>
<h3 id="experience"><a class="zola-anchor" href="#experience" aria-label="Anchor link for: experience">Experience</a></h3>
<p>Again, the server is a bit slow when joining big channels, but once joined it works pretty fast. I believe this is issue
with using SQLite, just like with Conduit.</p>
<p>All features that matrix.org homeserver has work for me too, so spaces and notifications etc. etc.</p>
<p>I am happy with this server and it fits in the 2gb of RAM my server has. I will update this post if I see any big issues
with resources.</p>
<h2 id="conclusion"><a class="zola-anchor" href="#conclusion" aria-label="Anchor link for: conclusion">Conclusion</a></h2>
<p><strong>I do really like Conduit.</strong> It was so, very painless to setup and the people working on it were super helpful and nice!
But for now, the lacking features made me try Synapse, and I will stay in Synapse until Conduit is ready.</p>
<p>Early adopting just is not for me, I suppose.. :)</p>
<p>Synapse should have very simple and to the point installation guide for someone like me, who just wants to run a server
for one or two accounts. But now that I got it working, I'll be using it.</p>
<h2 id="i-am-not-an-expert"><a class="zola-anchor" href="#i-am-not-an-expert" aria-label="Anchor link for: i-am-not-an-expert">I am not an expert!</a></h2>
<p>If there are some big oversights you see in this post, do share! I want to know more about this stuff. I am not a pro at all
when it comes to server side software.</p>
<p>I also wanted to share my experience as someone who doesn't know what they're really doing! :D Maybe it'll be useful to someone.</p>
<p>Thanks for reading!</p>
Why I find Linux gaming important?Sat, 05 Feb 2022 00:00:00 +0000Akselipersonalgame
https://akselmo.dev/posts/why-i-find-linux-gaming-important/
https://akselmo.dev/posts/why-i-find-linux-gaming-important/<p>People who read this mess of a blog may have noticed that I am very Linux-y.<span id="continue-reading"></span> This wasn't actually always the case.</p>
<p>I used to be very comfort oriented. Didn't mean that I didn't like to tinker with things, but more like
when I got home I just wanted to play games and that's it. Click and play.</p>
<p>I tried Linux desktop back then and I enjoyed using it but what held me back was gaming. I needed my
games, especially as a youngster who just wanted to play cool_new_thing with friends. Sure there were
ways to get games to work, like PlayOnLinux, but it was too much for me.</p>
<p>Nowadays though, my thoughts have shifted. I rather tinker with my device a little to play
some game, just so I can avoid Microsoft or other BigCorp. Maybe my rebellious phase is kicking
in way later, I don't know. I never had that as a teen lol.</p>
<p>But I think Linux gaming is way more than that, and here's few points why I find Linux gaming
very important for the future of games.</p>
<h2 id="competition-in-pc-platform-space"><a class="zola-anchor" href="#competition-in-pc-platform-space" aria-label="Anchor link for: competition-in-pc-platform-space">Competition in PC platform space</a></h2>
<p>Big part of computer world, as evident by the massive Steam user count, is gaming. I am young,
but not too young to remember DOS era. Even back then, games were a thing. And those games were great, by the way.</p>
<p>The unfortunate thing in PC platform is that there's not much competition. There's two big names,
Mac and Windows. And if you play games, it's almost always Windows.</p>
<p>Now that Linux gaming is rising, we can FINALLY start thinking about alternatives. We can finally
tell MS that hey, maybe we don't like all this telemetry you're doing. I just want to play games,
I don't want my PC to spend it's resources doing whatever your telemetry stuff is doing. I want all
that perf for my games. And that's what Linux distros let me do.</p>
<p>Now hopefully, Linux desktop as a gaming platform keeps rising. Even more hopefully PC manufacturers
will give option to install some distro instead of Windows when you buy a PC, when they
realise that gamersTM really are into it out of sudden.</p>
<p>That's the dream anyway. I know reality is harsh, but maybe Steam Deck will help people
learn that there's more to computers than Windows.</p>
<p>And maybe in return MS steps up and makes better Windows. I'm not switching anytime soon, hopefully
never, but I hope this will make the platform better for my friends who use it.</p>
<h2 id="games-taught-me-a-lot"><a class="zola-anchor" href="#games-taught-me-a-lot" aria-label="Anchor link for: games-taught-me-a-lot">Games taught me a lot</a></h2>
<p>Games have taught me a lot about computers, programming and of course English language. Even some
social stuff!</p>
<p>How does this tie into Linux desktop? The barrier of entry to computers nowadays is
hardware + OS, especially if you want to game. Shaving that extra 100€ (Windows price) from the computer
sale will help many who are getting their new PC, especially younger people.</p>
<p>What I'm trying to say that when the OS is free, the barrier of entry lowers down,
and this helps younger people to learn more since they can spend that extra 100€ for a game or two.</p>
<p>In general it lowers the barrier of entry, not just gaming but everyone everywhere. The only main problem
I see with this is that the main Linux distros need to keep up their newbie friendliness and make it better
and easier for new users whenever they can.</p>
<h2 id="windows-live-gold-can-happen-again-any-time"><a class="zola-anchor" href="#windows-live-gold-can-happen-again-any-time" aria-label="Anchor link for: windows-live-gold-can-happen-again-any-time">Windows Live Gold can happen again any time</a></h2>
<p>Remember that thing? Remember Games for Windows Live?</p>
<p>Remember when MS wanted people to pay some dumb subscription to play PC games online
like you have to do on XBox?</p>
<p>Nothing is stopping MS from doing that again. There may be huge backlash, but it doesn't stop
them.</p>
<p>If more people switch to Linux for gaming, especially IF that happens, it sends a clear signal
to MS.</p>
<p>Having a whole gaming system in hands of one corporation is <strong>bad.</strong></p>
<h2 id="linux-can-wake-up-older-pc-s-for-gaming"><a class="zola-anchor" href="#linux-can-wake-up-older-pc-s-for-gaming" aria-label="Anchor link for: linux-can-wake-up-older-pc-s-for-gaming">Linux can wake up older PC's for gaming</a></h2>
<p>Win10 was pretty rough on my +5 year old PC I gave for my sister for gaming. It was super slow
and clunky as heck, considering it has still old HDD, instead of SSD.</p>
<p>Had I installed some Linux distro for it, I think she would have better time using that PC.
If I did that again now I would slap Ubuntu on it with Minecraft pre-installed.</p>
<p>This also lowers e-waste when people don't have to buy he newest thing just to run the OS.
TPM 2.0 anyone?? :P</p>
<h2 id="more-users-for-linux-userspace"><a class="zola-anchor" href="#more-users-for-linux-userspace" aria-label="Anchor link for: more-users-for-linux-userspace">More users for Linux userspace</a></h2>
<p>The more the merrier, I think. Every user is a possible contributor.</p>
<p>Heck, without Linux gaming being a thing, I wouldn't have changed my OS, I would
never report some of the bugs I've seen, I would never contribute to the OS in a way or another...</p>
<p>I am even thinking of making my next game Linux first title. (Well I've basically decided it already, since I develop it on Linux..)</p>
<p>Had Linux gaming not been a thing like it is now, I would've just continued making games on Windows and never
contributed those bug reports or stuff like <a href="https://github.com/Akselmo/ESOLinuxAddonManager">ESO Linux Addon Manager</a>.</p>
<p>I am not trying to say that "you should be glad i switched!!11" Just think the people we can get around here to contribute
to the software we use daily. And some of them like to play games on their free time.</p>
<h2 id="everyone-deserves-privacy"><a class="zola-anchor" href="#everyone-deserves-privacy" aria-label="Anchor link for: everyone-deserves-privacy">Everyone deserves privacy</a></h2>
<p>Linux and FOSS in general are very privacy-first oriented software.
On other hand, proprietary OS like Mac and Windows are not (despite what they want you to think).</p>
<p>Everyone deserves to have privacy if they want it, even the kids who just wanna dab on noobs in Fortnite.</p>
<p>Privacy is a human right, after all.</p>
<h1 id="but-wait-what-about-proprietary-gaming"><a class="zola-anchor" href="#but-wait-what-about-proprietary-gaming" aria-label="Anchor link for: but-wait-what-about-proprietary-gaming">But wait, what about proprietary gaming????</a></h1>
<p>Someone asked me once why do you give proprietary games a free pass? Why should they be allowed in our free software?</p>
<p>I believe strongly that basic software and needs in computer world, like using internet, office software, chatting, learning and studying etc. etc.
should be free for everyone. Both free as in freedom and beer.
Everyone should have an access to same tools to build their careers, talk to their relatives and friends and so on.</p>
<p>But games are art and unfortunately, for now, art is a luxury.
Luxury is something that we don't <em>need</em> to live.
I would love to see every software ever made open source of course, but it will take time to reach that goal.</p>
<p>We have to start from somewhere, and I believe getting the basic necessities in order at first is a huge
step alone. We need to concentrate on that at first.</p>
<p>Of course this doesn't mean to stop making FOSS games, I am making my own as well. FOSS engines and games
deserve all the love and care they get. Please keep making them.</p>
<p>But my priorities are: necessities first, then we can focus on luxuries. Hopefully one day
we can share luxuries around without worry.</p>
<p>That's why I give proprietary games a free pass:
<em>It's not my priority to get games FOSS. It's all the basic stuff first.</em></p>
<h1 id="i-want-linux-gaming-to-succeed-what-do"><a class="zola-anchor" href="#i-want-linux-gaming-to-succeed-what-do" aria-label="Anchor link for: i-want-linux-gaming-to-succeed-what-do">I want Linux gaming to succeed, what do?</a></h1>
<ul>
<li>Buy games from developers who make Linux games!</li>
<li>Donate to FOSS game engines like Godot!</li>
<li>Also <strong>USE</strong> FOSS game engines! Tell people about them.</li>
<li>Switch to Linux in your older laptop for example, try it out. Play some games with it</li>
<li>Support open platforms like Steam Deck or other Linux based gaming platforms.</li>
<li>Ask developers for Linux support. Yes I know this may go to deaf ears, but asking is free.
<ul>
<li>Indie devs are more lenient in this, usually!</li>
</ul>
</li>
<li>Try open source games and software even on Windows!</li>
<li>If you feel like you're ready to switch, give dual booting a try!
<ul>
<li>I have a guide for Kubuntu here: <a href="https://www.akselmo.dev/2021/11/12/Setting-up-Kubuntu-for-gaming.html">Setting up Kubuntu for gaming</a></li>
</ul>
</li>
</ul>
<p><em>Thanks for reading! I've wanted to make this post for a long while but didn't have the energy until now.</em></p>
My Devterm experienceSun, 16 Jan 2022 00:00:00 +0000Akselipersonalhardware
https://akselmo.dev/posts/my-devterm-experience/
https://akselmo.dev/posts/my-devterm-experience/<p>So I got a Devterm...<span id="continue-reading"></span></p>
<p>Back in June I ordered a <a href="https://www.clockworkpi.com/devterm">Devterm</a>. It finally arrived this month.</p>
<p>I enthusiastically retrieved the package and started assembling. The assembly part was pretty easy, since there's really no tools needed except for couple very tiny screws. Luckily I have an iFixit kit for that kind of stuff. If there was a screwdriver in the box, I entirely missed it.</p>
<p>During the first boot, I received... Nothing! The screen was blank. I searched the forums for information about it and someone mentioned maybe the backlight doesn't work.</p>
<p>Well I was bummed so I checked if it was just backlight or something else. I placed a flashlight on top of the screen and sure enough, there was text, it was the backlight that was broken.</p>
<p>I was torn. I had waited this 300€ device for 6 months. I disassembled the device and noticed on closer inspection that yep, the screen backlight ribbon cable was torn a lil bit, so that one of the two connections was broken.</p>
<p>I was just as torn as that ribbon cable at that point. I tend to get really excited about stuff like this, so it was a really big let down. Naturally I asked for a refund.. I don't like doing that, at all. I feel so guilty when asking for refund, but did it anyway. My money situation has been bit weak lately and getting even partial refund would help me a ton. Luckily the ClockworkPi folks were understanding and gave me part of my money back. I was going to wait for better days and if they have replacement screens on sale, I could get one by then.</p>
<h2 id="but-maybe-i-could-fix-it-myself"><a class="zola-anchor" href="#but-maybe-i-could-fix-it-myself" aria-label="Anchor link for: but-maybe-i-could-fix-it-myself">But maybe I could fix it myself?</a></h2>
<p>I have NEVER fixed anything like this myself. Never, ever. I got a soldering iron as a chrimbus present like couple years ago and I have only used it once, to de-solder a part from friends old Amiga, but that's it.</p>
<p>Anyway, since I was like "well, if I fuck it up, at least it's already broken" I disassembled the whole screen. I noticed the ribbon cable backlight connectors and tested them out with multimeter, and sure enough, only the negative side of the circuit was broken. I checked the Devterm forums and found someone with similar issue, and they had fixed it like this: <a href="https://forum.clockworkpi.com/t/how-to-fix-devterm-a0604-screen-not-turning-on/7476/11">Link</a></p>
<p>So I salvaged a wire from some super old ATI Radeon fan (Yes, ATI) and soldered it to the ribbon cable connector, then jammed it near the third LED from top. And quite magically, it began to work. (There was a bit more than that in this troubleshooting process, such as using multimeter to test the wire etc etc but that's the gist of it really.)</p>
<p>I then used electric tape to keep the other end of the wire near the LED, since it is soooooooo tiny that I couldnt figure out how to solder it there. It's not optimal solution, I know, but it works.. For now. Until that tape gives in I guess lol.</p>
<p>I then carefully began to assemble the screen back and had to cut some of the screen case parts so I can slide the wire underneath. And then.. I cut my thumb to the damn screen metal part. Ow.</p>
<p><em>I've been told electronics require blood sacrifices sometimes.</em></p>
<p>After all of that, I assembled the whole thing and voila, we have light.</p>
<p><a href="/assets/images/devterm/let_there_be_light.jpg"><img src="/assets/images/devterm/let_there_be_light.jpg" alt="Devterm with backlight on" /></a></p>
<p>I just wish I could have soldered the wire properly like in the image in that forum link, but I have no tools/skills for that. I assumed I have no skills with fixing electronics in the first place..</p>
<p>But I am glad I was wrong. I'm super proud of this fix, even it was very tiny one.</p>
<p>I am kind of glad that the screen arrived broken, I learned a lot from this and it was somewhat fun even, despite slicing my thumb.</p>
<p>I probably will buy a replacement screen in future however, just so I can have it working 100% sure and properly. But this will work for now as I play around with this thing.</p>
<p><strong>The moral of this story: Always give something a try! You never know, you'll probably surprise yourself.</strong></p>
Thoughts on my PineTimeSat, 18 Dec 2021 00:00:00 +0000Akselipersonalhardware
https://akselmo.dev/posts/thoughts-on-my-pinetime/
https://akselmo.dev/posts/thoughts-on-my-pinetime/<p>So I got myself a <a href="https://www.pine64.org/pinetime/">PineTime</a> watch about 8 days ago, <span id="continue-reading"></span>and so far I've enjoyed using it!</p>
<p>It's a rather simple smartwatch, but that's why I like it. No complicate BS, just the basic stuff
and that's it. And it was only ~30€! (Plus 10€ shipping :P )</p>
<h1 id="initial-setup"><a class="zola-anchor" href="#initial-setup" aria-label="Anchor link for: initial-setup">Initial setup</a></h1>
<p>The device arrived in around 10 days from ordering it, which is relatively quick considering the world
situation + chrimbus time.</p>
<p><a href="/assets/images/pinetime/package.jpg"><img src="/assets/images/pinetime/package.jpg" alt="Unpackaging" /></a></p>
<p>I appreciate how little stuff there was. Just the bare necessities, no unnecessary flair.</p>
<p>I however would appreciate a bit more illustrated manual perhaps, showing where to find things.
Personally I had no problem with following the guide, but someone else might.</p>
<p>The manual basically said "go there, download this app or some alternative, connect your device to the
watch, install updates." I was fine with that, but someone else might be a bit confused. Even a number
ordered list would do some good.</p>
<p>I luckily didn't have to install any firmware updates, since it was already up-to-date, in version 1.0.0.
I however had to update the InfiniTime "OS" that runs the show.</p>
<p>The size of the watch is pretty much what I expected. It's a watch, not a bulky rock like modern smartwatches are.</p>
<p><a href="/assets/images/pinetime/all.jpg"><img src="/assets/images/pinetime/all.jpg" alt="Size comparison" /></a></p>
<p>I booted up the watch and installed <a href="https://gadgetbridge.org/">Gadgetbridge</a> on my Android phone. At first, I was
trying to connect the watch through Gadgetbridge, but unfortunately that didn't work just like that.</p>
<p>What you need to do, is to first use the Bluetooth settings in your phone to pair the device, then separately
pair the device from Gadgetbridge. I did this, but first time it didn't work.. Gadgetbridge got stuck loading something.
But rebooting both the watch and my phone, and then trying to connect again through Gadgetbridge, it worked.</p>
<p>It was a bit more of a hassle than I expected, but honestly I could see same thing happen with any modern smartwatch.</p>
<p>After that I updated the device. It was pretty simple, I had to just download the newest <a href="https://github.com/InfiniTimeOrg/InfiniTime/releases">InfiniTime</a> release on my phone (the <code>dfu</code> one), then open the zip with Gadgetbridge and it did the rest, very
painlessly.</p>
<h1 id="daily-drive"><a class="zola-anchor" href="#daily-drive" aria-label="Anchor link for: daily-drive">Daily drive</a></h1>
<p>I've been daily driving the watch since it arrived and I've been really happy with it!</p>
<p>It shows me the notifications whenever I get them, I can control music from it (yes, even spotify!),
it counts my steps, and best of all, it shows time.</p>
<p><a href="/assets/images/pinetime/active.jpg"><img src="/assets/images/pinetime/active.jpg" alt="PineTime display" /></a></p>
<p>I think it also looks very stylish. There's three different watch faces, two that are the default digital watch,
one analogue watch face, and the one in the picture which is called PineTimeStyle. I like it the most since you can
change the color of it as well. The tiny circle on the bottom right shows my steps goal, and other statuses are showin with
nice tiny icons.</p>
<p>I could set the watch to turn the screen on when I raise my wrist, but sometimes it doesn't realise I'm doing so,
I have to flick my wrist a bit and then the display turns on. I raise my hands slowly, I am lazy.</p>
<p>The notifications pop up and make the watch vibrate a bit whenever one arrives, so it's easy to check them quickly.
The vibration is not too aggressive either in my opinion, so it doesn't bother me if I choose to ignore the watch.</p>
<p>There's also a lot of tiny apps in the watch, like the music changing mode. But there is also couple games, like pong and 2048
(which I find quite addictive lol), heart rate meter, BPM meter that makes the watch vibrate along the set BPM, then bunch of different
timers and stopwatches.</p>
<p>What I would love to see is a month view. Just showing me the current month and it's days. Maybe eventually show the events too, but that's
quite complicated thing to make on small device like this so I'm not surprised it's not there yet.</p>
<p>About the heart rate meter, please don't rely it. Currently it's more a curiosity and it's not very accurate at all.
It just gives you the sense of your heartrate but nothing anyone should rely on.</p>
<p>The battery ran out after 7-8 days of daily driving the watch, which I think is pretty good, considering most smartwatches last
only day or two.</p>
<p>I only really used the notifications feature, as it's cold in here and I rather use my bluetooth headphones to change the music.
I did play some 2048 with it though and it worked really well. And speaking of cold, the battery time might be affected a little bit
because of the below zero temperature. I assume that in summer it'll work longer.</p>
<p>There's also no tracking bullshit that Google/Samsung etc watches have. I don't need those features, I just wanted a watch
that shows me notifications, and it does that pretty much perfectly. The notifications are lacking umlauts like Ä or Ö, so messages in
Finnish look like they're typed in drunk. There's also no emoji support, which is both good and bad. :P</p>
<p>Bluetooth has only cut out for me once, but I feel like it was my phone acting out instead of the watch.</p>
<h1 id="would-i-recommend-one"><a class="zola-anchor" href="#would-i-recommend-one" aria-label="Anchor link for: would-i-recommend-one">Would I recommend one?</a></h1>
<p>If you just want to quickly check on notifications on your watch and maybe play a bit of pong every now and then, and quickly change skip
music tracks on your watch, it's perfect! If you're also somewhat privacy conscious like me, the no-tracking is nice (although I have my
phone as a tracking device already so.. Eh). On top of that, since everything is open source, from Firmware to OS, you can modify it
if you have the skills. I tried to modify the watch a bit, but I had trouble already setting up my developer environment for the watch..</p>
<p><em>Btw big props for the devs of this watch and InfiniTime. You have added a lot of content in such a small package and it's impressive!</em></p>
<p>For anyone who wants somekind of healthy fit super duper chad watch, PineTime's not gonna work. For that, you need somekind of sporty watch,
just remember those arent open source and when they break, they break and create e-waste. And of course they report your every hand movement
to Big Tech lol.</p>
<p>I feel like this is more a nerd watch, than sportyboi watch. And it's been excellent for me. And it's only 30€, so for such a low price
it's been pretty great quality!</p>
<p>In summary: <strong>It does it's job, doesn't lie about it's capabilities and that's all I wanted.</strong></p>
<p><em>Maybe one day I will try to delve deeper in this InfiniTime OS running on it, and maybe change fonts or something.</em></p>
My character and Matrix serverThu, 02 Dec 2021 00:00:00 +0000Akselipersonalmatrix
https://akselmo.dev/posts/my-character-and-matrix-channel/
https://akselmo.dev/posts/my-character-and-matrix-channel/<p>Just a quick post, I wanted to share two things.<span id="continue-reading"></span></p>
<h1 id="commissioned-art"><a class="zola-anchor" href="#commissioned-art" aria-label="Anchor link for: commissioned-art">Commissioned art</a></h1>
<p>First, I got this really nice commission of my character Huntra wearing Linux shirt.
I really like <a href="https://xenia-linux-site.glitch.me/">Xenia</a> so I wanted to see my
character in something similar.</p>
<p><a href="/assets/images/oc/HuntraLinux.png"><img src="/assets/images/oc/HuntraLinux.png" alt="HuntraLinux" /></a></p>
<p>Thank you for making this for me <a href="https://saikkuart.tumblr.com/">Saikkunen</a>!
Go commission them!!! :D</p>
<h1 id="matrix-channel"><a class="zola-anchor" href="#matrix-channel" aria-label="Anchor link for: matrix-channel">Matrix channel</a></h1>
<p>I started running a Matrix channel for anyone who may read this blog or follow me on
Twitter/Mastodon and is interested in techy FOSS-y things and my games! It's bridged to
my Aks_Dev discord!</p>
<p>You're welcome to join, just behave!</p>
<p><a href="https://matrix.to/#/#aksdev:matrix.org">Aks_Dev -matrix channel</a></p>
<p><em>Yes it was called Cool Tech Nerds at some point but instead running two separate Matrix channels I just wanted to run one.</em></p>
Kubuntu multimonitor woes and fixesSat, 27 Nov 2021 00:00:00 +0000Akselilinux
https://akselmo.dev/posts/kubuntu-multimonitor-woes-fixes/
https://akselmo.dev/posts/kubuntu-multimonitor-woes-fixes/<p>I have had some problems with Kubuntu working well with multimonitor setup. <span id="continue-reading"></span>I use X11 so the reason is most likely there, not just Kubuntu's fault.</p>
<p>When booting up my PC and ending up in SDDM, I see the login screen in both screens. Bit weird, but fine. I can live with that.</p>
<p>However after logging in, my first screen would always reset to 60hz and my second would be 144hz. Saving my first monitor
to 144hz and restarting the PC would reset that.</p>
<p>I feel like the problem is that the SDDM doesn't remember my settings or something, but I managed to fix it so I don't have to think about it anymore
and here's how.</p>
<h2 id="first-the-fix"><a class="zola-anchor" href="#first-the-fix" aria-label="Anchor link for: first-the-fix">First, the fix</a></h2>
<p>First, set your monitor settings correct with the Kubuntu display settings.</p>
<p>Then open terminal and do the following command</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>xrandr</span><span style="color:#5fff33;">'
</span></code></pre>
<p>You should be getting something like this:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 16384 x 16384
</span><span>DisplayPort-0 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 521mm x 293mm
</span><span> 1920x1080 60.00 + 143.85</span><span style="font-weight:bold;color:#33ffa0;">*</span><span> 119.98 99.93 50.00 59.94
</span><span> 1680x1050 59.95
</span><span> 1280x1024 75.02 60.02
</span><span> 1440x900 59.89
</span><span> 1280x960 60.00
</span><span> 1280x800 60.00
</span><span> 1152x864 75.00
</span><span> 1280x720 60.00 50.00 59.94
</span><span> 1440x576 50.00
</span><span> 1024x768 75.03 70.07 60.00
</span><span> 1440x480 60.00 59.94
</span><span> 800x600 72.19 75.00 60.32 56.25
</span><span> 720x576 50.00
</span><span> 720x480 60.00 59.94
</span><span> 640x480 75.00 72.81 66.67 60.00 59.94
</span><span> 720x400 70.08
</span><span>DisplayPort-1 disconnected (normal left inverted right x axis y axis)
</span><span>HDMI-A-0 disconnected (normal left inverted right x axis y axis)
</span><span>HDMI-A-1 disconnected (normal left inverted right x axis y axis)
</span><span>DVI-D-0 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 531mm x 298mm
</span><span> 1920x1080 60.00 + 144.00</span><span style="font-weight:bold;color:#33ffa0;">*</span><span> 119.98 99.93 59.94
</span><span> 1680x1050 60.00
</span><span> 1280x1024 119.96 75.02 60.02
</span><span> 1440x900 119.85
</span><span> 1280x800 60.00
</span><span> 1152x864 75.00
</span><span> 1280x720 60.00
</span><span> 1024x768 119.99 75.03 60.00
</span><span> 832x624 74.55
</span><span> 800x600 119.97 75.00 60.32
</span><span> 640x480 75.00 60.00 59.94
</span><span> 720x400 70.08
</span></code></pre>
<p>Copy this part somewhere, you will base your settings to this text.
The start behind the hz rating is what you're using at the moment.
It will list all the resolutions and hz available to all ports you have connected.
Notice that even if your monitor may be marked 144hz, it can be a bit different. Like for me it is 143.85 for my other monitor.</p>
<p>Open Xsetup file for editing</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo nvim /usr/share/sddm/scripts/Xsetup
</span></code></pre>
<p>(Use your editor of choice :P )</p>
<p>In there, add the following to end of the file</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>xrandr</span><span style="color:#ff9233;"> --output</span><span> FirstMonitor</span><span style="color:#ff9233;"> --mode</span><span> resolution</span><span style="color:#ff9233;"> --post</span><span> 0x0</span><span style="color:#ff9233;"> --rate</span><span> hz</span><span style="color:#ff9233;"> --primary
</span><span>xrandr</span><span style="color:#ff9233;"> --output</span><span> SecondMonitor</span><span style="color:#ff9233;"> --mode</span><span> resolution</span><span style="color:#ff9233;"> --rate</span><span> hz
</span></code></pre>
<p>So for me, that is</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>xrandr</span><span style="color:#ff9233;"> --output</span><span> DVI-D-0</span><span style="color:#ff9233;"> --mode</span><span> 1920x1080</span><span style="color:#ff9233;"> --pos</span><span> 0x0</span><span style="color:#ff9233;"> --rate</span><span> 144</span><span style="color:#ff9233;"> --primary
</span><span>xrandr</span><span style="color:#ff9233;"> --output</span><span> DisplayPort-0</span><span style="color:#ff9233;"> --mode</span><span> 1920x1080</span><span style="color:#ff9233;"> --rate</span><span> 143.85
</span></code></pre>
<p>Save the file, then move on to next file:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo nvim /etc/sddm.conf
</span></code></pre>
<p>In there, add following under the <code>[XDisplay]</code>, and if it doesn't exist, you can just add it there.</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>[XDisplay]
</span><span>DisplayCommand</span><span style="font-weight:bold;color:#33ffa0;">=</span><span style="color:#5fff33;">/usr/share/sddm/scripts/Xsetup
</span></code></pre>
<p>This will make the SDDM load the script you just edited. It may already be there, so you don't necessarily
have to add anything.</p>
<p>Reboot and see if it helps.</p>
<h2 id="second-the-groaning"><a class="zola-anchor" href="#second-the-groaning" aria-label="Anchor link for: second-the-groaning">Second, the groaning</a></h2>
<p>I totally agree I shouldn't have to do anything like this to set up my multimonitor setup.
Computer should automatically do this when I save my settings in the GUI.</p>
<p>I think this may just be a bug somewhere, because it did work before I updated to Kubuntu 21.10,
and I have reported it as well as I could.</p>
<p>Anyways, part of Linux is doing tinkering like this. I don't <em>mind</em> it, but I am slightly groaning that
I had to do this manually.</p>
<p>And please, <strong>report all the bugs you find.</strong> That's the best way we can get these issues solved, since in the end
it's a community run system.</p>
<p>I firmly believe that what I get in free software, I pay in having to fill in bug reports. And I am totally fine with that, personally.</p>
<p>+++</p>
<p>PS. I'm writing this on my birthday!</p>
<p>Woop!</p>
Who is Linux for?Sat, 20 Nov 2021 00:00:00 +0000Akselilinuxsoftware
https://akselmo.dev/posts/who-is-linux-for/
https://akselmo.dev/posts/who-is-linux-for/<p>A bit of boring rambling. Something I've been thinking about. Not really answering the question directly.<span id="continue-reading"></span>
I am talking about <strong>desktop Linux</strong> and not just the server side.
Just remember, these are my <strong>opinions</strong> and nothing factual. I hate that I have to repeat this but hey this is internet,
people like to get mad about anything in here.</p>
<p>Also no, I am not the type who goes around "you must use linuxxxxxx!!!" because I know it's not for everyone. This post should make it pretty clear, but wanted to mention it separately.</p>
<h2 id="freedom-and-relief"><a class="zola-anchor" href="#freedom-and-relief" aria-label="Anchor link for: freedom-and-relief">Freedom and relief</a></h2>
<p>For me, the switch from Windows to Kubuntu has been one of the best things I've done when it comes to the
computer life. And honestly, most of my life is computer life. I think about tech all the time, I play games a lot
and so on.</p>
<p>I am, in other words, a nerd. I remember when that word was used as an insult all the time, probably still is somewhere
but not here really. It still has a light negative connotation, as in, "eww a nerd" but nowadays I am just proud if someone
calls me that lol. But yeah, I've been "eww nerd"-ed at many times when I was younger. Kids are evil. :P</p>
<p>I mention this because this is probably what my take is basically: Linux is for us nerds and geeks (still don't kow what
the difference between these words really is, but hey). It's for us, who love learning, who love technology.</p>
<p>For us who love the freedom to switch around things, in both software and hardware.</p>
<p>Freedom is one of those things that I've always believed it comes with a cost. In Linux world, it comes often with the cost of
"agh, this isnt working after all!" which is mostly because the device vendor doesnt support Linux or something else.</p>
<h2 id="but-what-do-i-mean-with-relief-part"><a class="zola-anchor" href="#but-what-do-i-mean-with-relief-part" aria-label="Anchor link for: but-what-do-i-mean-with-relief-part">But what do I mean with relief part?</a></h2>
<p>Well, first of all, I am free to update my system when I damn well please. Windows updates were horrific for my anxiety.
Yes, I got anxiety over Windows updates. I am a bit dumb like that. Whenever Windows updated, I was always scared that
I wouldn't get to play games today, or work on something.</p>
<p>Now if that were to happen in Linux, I have freedom to fix the issue myself. Instead of being anxious that
the update breaks something, my mind goes like this: "if it breaks, I can look for help and fix it together with people
on the internet and figure it out, instead of <em>waiting for some vendor who doesn't really give a shit if I don't have enough money
to fix it</em>. Reminds me, how many times you have searched help for Windows problems, and there's always some tosser saying "just
run sfc scannow lmaoo bro" and it doesn't do jack shit.</p>
<p>Second relief is privacy and trust oriented. Microsoft, Google and the like deserve zero trust. None of it. They're mindless corporations
and they can collect all the info they want because they have money.</p>
<p>Linux side, I am pretty sure the distro maintainers only care about fixing bugs and not what kind of stuff I searched today to sell me ads.
I mean, it could happen that they track that. But <em>I trust them not to</em>. And that is a big relief for me.</p>
<p>In short: <strong>Freedom to repair, which gives me relief.</strong></p>
<h2 id="programming-is-easier"><a class="zola-anchor" href="#programming-is-easier" aria-label="Anchor link for: programming-is-easier">Programming is easier</a></h2>
<p>Programming stuff, especially C, is soooooo much easier to set up and just do things. With Windows you have to install bunch of stuff,
then manually set things in your environment variables, all that jazz.</p>
<p>In Linux, you very likely have compiler already installed in your distro, so you can just start writing code and tinkering with it.</p>
<p>On top of that, most webdev stuff is very easy to install from package managers because the servers use same stuff. Very easy to code,
run and test.</p>
<p>Gamedev side though, at least when it comes to Unity, it can be a bit more rough since you don't have Visual Studio. However,
Visual Studio Code works well on Linux and can be used as an IDE. I've even read people setting up Neovim for Unity programming.
But yes, it takes a bit more effort on that front. Godot runs fine out of the box though!</p>
<h2 id="but-commandline-spooky"><a class="zola-anchor" href="#but-commandline-spooky" aria-label="Anchor link for: but-commandline-spooky">But commandline spooky</a></h2>
<p><em>First of all, if you're a programmer who is afraid of commandline, I.. I don't know what to say. But anyway.</em></p>
<p>Alrrright, let's get this talked over here in the same post, even it's barely on-topic. It's something I always bump into.</p>
<p>You don't need to use terminal all the time, but using it can add a lot of value to your Linux experience.
It is way, WAY easier to help each other when it comes to commandline, since it's pretty much the "only shared standard between distributions."
What this means, is that for most common commands, I can help you with Fedora, even I use Kubuntu, which are different distributions.</p>
<p>Lets say, you want to look at your filesystem in command line, something simple. The same <code>ls</code> command works in all common Linux distribution.</p>
<p>Now lets say, you would like to do the same in GUI. Well, what filemanager do you use? Oh, that's way different than mine, I don't know how to use that....</p>
<p>Commandline, and terminal, <em>unifies</em> Linux distributions in a level the GUI just can't, since everyone is <em>free</em> to change the GUI to anything they prefer (or none at all!).</p>
<p>And this is why I want people to use more Linux commandline. <strong>It helps us to help you!</strong></p>
<p><del>also makes you look like youre a cool hacker in normies eyes lmao</del></p>
<h2 id="remember-that-linux-will-require-learning"><a class="zola-anchor" href="#remember-that-linux-will-require-learning" aria-label="Anchor link for: remember-that-linux-will-require-learning">Remember that Linux will require learning</a></h2>
<p>You have used Windows for most of your life, then suddenly switch to Linux. Of course you're confused, you want to do same stuff like on Windows but.. It's different!</p>
<p><strong>Of course it is different.</strong> Linux is not Windows. You wouldn't expect Mac to work same as Windows, would you?</p>
<p>It will require learning some new ways to do same things, but luckily those are often simpler. Like installing apps on Linux is literally <code>sudo apt install appname</code> in the terminal.
No need to click through billion pages and install some adware accidentally or some shit like that.</p>
<p>Thankfully due to the versatility of Linux distros, you can often set them up very similar to Windows. I personally don't see the appeal, but hey it's there.</p>
<h2 id="remember-also-the-platform-is-mostly-community-supported"><a class="zola-anchor" href="#remember-also-the-platform-is-mostly-community-supported" aria-label="Anchor link for: remember-also-the-platform-is-mostly-community-supported">Remember also, the platform is mostly community supported</a></h2>
<p>The Linux desktop side is mostly supported by various communities. By supporting I mean both helping with issues and bugs, but also developing them and fixing them.</p>
<p>There is no giant corporation that pays 23890472903748907829734789€ to fix some bugs (that don't even solve the issue that you were having in the first place...)
No giant corps also to fuck up your system and then ask money to fix it.</p>
<p>You just gotta search the thing that is broken, and ask the people who work on it or use it. Usually the answer is there. If there is no answer and the project is dead,
which unfortunately can happen, you will probably have to change the thing to other one, or fix it on your own.</p>
<h2 id="you-didn-t-answer-the-question-who-is-it-for"><a class="zola-anchor" href="#you-didn-t-answer-the-question-who-is-it-for" aria-label="Anchor link for: you-didn-t-answer-the-question-who-is-it-for">You didn't answer the question, who is it for?</a></h2>
<ul>
<li>
<p>Linux is for the privacy conscious who just want to avoid most telemetry and other crap.</p>
</li>
<li>
<p>Linux can be for those who like to play games, thanks to Valve for Proton and Wine. I love games and I can play almost all I like just fine! Native Linux builds run even better than on Windows!</p>
</li>
<li>
<p>Linux is for those who just use internet every now and then. A grandma who uses internet just every now and then to pay bills might be just fine with old PC running Linux.</p>
</li>
<li>
<p>Linux is for those who want to use old hardware to avoid generating more e-waste.</p>
</li>
<li>
<p>Linux is for programmers, who want to do more programming and less setting up your programming environment. I've been way more productive on Linux on this front.</p>
</li>
<li>
<p>Linux is for anyone who loves customizing. Because oh boy, you will have time of your life to make your PC look kewl. I know I did! :D</p>
</li>
<li>
<p>Linux is for those who don't have the money or just don't want to buy expensive Windows license. You're valid and are allowed to use computers as well.</p>
</li>
<li>
<p><strong>Linux is for us nerds/geeks, tinkerers and hobbyists.</strong> For us, who are not afraid to learn new things.
For us who like helping each other to learn and make computer world a bit better place.</p>
</li>
<li>
<p>For us, who feel very strongly about computer things and hate how it's more a corporate minefield nowadays.</p>
</li>
</ul>
<p>In short, if you are interested in learning new things and playing around with new ways of doing stuff, I welcome you warmly! Feel free to ask any questions in the comments :D</p>
<p><em>"But I don't want to learn anything, I just want to play games!!"</em></p>
<p>Then use Windows. It runs out of the box for that.</p>
<h2 id="you-gatekeeping-elitist-buttface"><a class="zola-anchor" href="#you-gatekeeping-elitist-buttface" aria-label="Anchor link for: you-gatekeeping-elitist-buttface">You gatekeeping elitist buttface!!!!!!</a></h2>
<p>Maybe a little, I admit. I'm sorry if I seem that way. I am just tired of people trying Linux, expecting it to be "Windows but good"
but then it turns to be something different and they go on rants how Linux is bad and blabla. It may be bad for your usecase, but it doesn't mean
the OS is bad as a whole.</p>
<p>Just know to temper your expectations and expect to learn a new thing instead of using all your Leet Windows Skillz, and you will be fine.
Some of those skills translate over, but most things, you may have to relearn.</p>
<p>And that's what I am trying to emphasize heavily in this post:</p>
<p><em>You must be willing to learn new things to enjoy this.</em></p>
<p>I know I am enjoying using Linux way more than Windows. I am learning more of it's use every day and there is nocorporation to stop me from learning because "you are not allowed to modify that, here is an update that breaks everything btw."</p>
<p><strong>And despite me being all "nerds club" here, I do hope that we get more common users in the Linux ecosystem. They can help us to fix archaic things and make things more streamlined. It is valuable information.</strong></p>
<p>But learning must be your "drive", I think. If you just want to do your work as always, you're probably better off with what you are already using.</p>
<p>+++</p>
<p><em>Also there is nothing wrong with using Windows or Mac, to be honest. They both have their uses, their places.
I have to mention this because someone might otherwise get upset that I am dissing their system or whatever. USE WHAT WORKS FOR YOU.</em></p>
Setting up Kubuntu for gamingFri, 12 Nov 2021 00:00:00 +0000Akselilinuxgame
https://akselmo.dev/posts/setting-up-kubuntu-for-gaming/
https://akselmo.dev/posts/setting-up-kubuntu-for-gaming/<p>I have Kubuntu non-LTS version myself, <span id="continue-reading"></span>so I wanted to write down how I set up Kubuntu for basic gaming.
Hopefully it'll help someone. Setting up Linux can be tricky, but it's well worth it.</p>
<p>Note: I use AMD GPU so I don't have proper guide for Nvidia users when it comes to drivers.</p>
<p>Anyway, first, ask yourself:</p>
<h2 id="is-linux-for-me"><a class="zola-anchor" href="#is-linux-for-me" aria-label="Anchor link for: is-linux-for-me">Is Linux for me?</a></h2>
<p><em>You may want to check my other post [Who is Linux for]({% post_url 2021-11-20-Who-is-Linux-for %}), but the text below is pretty much the same in short, and more gaming related.</em></p>
<p>I'll say it straight: In my opinion, if you're not willing to learn new things, or experiment with technology,
Linux is probably not for you, especially gaming wise. It is still a bit more hurdle than playing games
on Windows. Some games will not work: They may run, but they either have anticheat or some other third party thing
(like launcher) that doesn't work properly. Steam Proton and Lutris make this MUCH easier than it was before, but it's
still <strong>community</strong> supported platform. Most people do things like software (like Lutris) on Linux on their free time, for free.</p>
<p>If you're also afraid of terminal, or simply refuse to learn using it, Linux may not be for you. It's a very good
tool to set up, install and launch things, due to it being <strong>distro-agnostic.</strong> What this means is that I can give you
advice for Kubuntu, but same terminal commands will very likely work for you in Linux Mint or Ubuntu.</p>
<p>That is why you see command lines everywhere! It's easier to tell someone "run this command" than "Open your UI, go there,
then there.. Oh wait, you use completely different looking UI than I do." There are differences between distros when
it comes to commands too, however they're usually related to package managers (things that install software for you).</p>
<p>Linux is perfect platform for nerds and geeks who just think computers are cool and like learning new things every day.
It's perfect for those who want to get into computer stuff more as well.</p>
<p>In other hand, Windows also has it's own tinkering you need to do sometimes, especially for older games:
Changing INI files, changing registry keys with regedit, that kind of thing. Linux gaming, for now, sometimes has a bit
more of it, especially when it comes to some older titles that have super weird dependencies on older DLL's or
stuff like that. With more modern titles however, if there's no anticheat involved, Steam Proton and Wine have
ran the games really well for me.</p>
<p>And of course, if the developers are cool enough, there's also Linux native builds, like for Splitgate, that run
better than on Windows.</p>
<p>One more thing: If you have never installed Windows yourself, this guide may be too technical for you. I suggest
starting from the basics before attempting to dig into the Linux world. Linux installation is super simple and easy
process (IMO easier than Windows) but for someone who has never installed any OS on any system, it may be bit more difficult.</p>
<h2 id="why-kubuntu"><a class="zola-anchor" href="#why-kubuntu" aria-label="Anchor link for: why-kubuntu">Why Kubuntu?</a></h2>
<p>I've used Linux Mint, Ubuntu, Xubuntu... And now Kubuntu. And I've found that Kubuntu is the easiest to setup for gaming.
Linux Mint is also a brilliant distro, but Kubuntu has KDE Plasma and other KDE tools, which are awesome and modern.
Then theres huge community support of Ubuntu behind it all, which makes troubleshooting a lot easier.</p>
<p>I will probably distro-hop in future, but I gotta say, Kubuntu has made me really happy with it's huge amount of customization
and stability. For newcomers to Linux, it feels a bit like Windows by default, which makes things easier.</p>
<p>I do recommend to explore what works for your workflow and go with that, eventually.</p>
<h2 id="the-guide"><a class="zola-anchor" href="#the-guide" aria-label="Anchor link for: the-guide">The Guide</a></h2>
<p>Before you install anything, I want you to run <a href="https://kubuntu.org/getkubuntu/">Kubuntu</a> in either Virtual Machine or
through the Live USB. Yes, you can run Kubuntu (and many other Linux distros) from USB without installing anything.</p>
<p>For gaming, I recommend going with the Non-LTS version. This means that the software and kernel is a bit more up-to-date
than with LTS version, which means that you get the newer GPU driver stuff and other software faster.</p>
<p>In this guide, I assume you use the non-LTS version. That's what I use as well.</p>
<p>Get that Kubuntu ISO flashed on your USB stick, reboot and boot into Kubuntu. (Internet is full of tutorials for that.)</p>
<p>I want you to first test if everything works on that Live-USB mode. Any weird glitches with video? Any other issues?
Write them down and look for results, help and tutorials to fix them, since those issues may continue after installing.</p>
<h2 id="installation"><a class="zola-anchor" href="#installation" aria-label="Anchor link for: installation">Installation</a></h2>
<p>So, you checked everything and you are pretty sure everything seems good. Alright, awesome! I recommend installing
it alongside Windows, in case you regret everything <del>you have ever done</del> installing The Penguin on your PC.</p>
<p>However, if at all possible, you could install Linux on another HDD/SSD entirely: This way, Windows updates will less likely
break the dual-boot capability. But this usually means that when dual booting, instead of getting a simple UI to select
which system to boot to, you have to select the right boot-drive from BIOS instead.</p>
<p>When the installation is done, let Kubuntu update <em>everything</em>. Just let it update in peace.</p>
<h2 id="nvidia-gpu-users"><a class="zola-anchor" href="#nvidia-gpu-users" aria-label="Anchor link for: nvidia-gpu-users">Nvidia GPU users</a></h2>
<p>Alright, this is where I am gonna fall flat on my face with this guide: I don't have Nvidia, so I don't know how to help
with the Nvidia drivers. I've only heard that people should use the proprietary Nvidia drivers.</p>
<p>The best way to get Nvidia drivers on your device is to search for your distro's wiki/forums for how people have instaled it.
I was told the way of Nvidia driver installation has changed many times, so there's lots of outdated information out there.</p>
<h2 id="amd-gpu-users"><a class="zola-anchor" href="#amd-gpu-users" aria-label="Anchor link for: amd-gpu-users">AMD GPU users</a></h2>
<p>Congrats, since AMD drivers are open source, they're already in the kernel! This means that you don't have to download
separate drivers for it. There is proprietary AMD GPU drivers as well, but I've heard many times they're not as good
as the open source ones. I assume they're more for server stuff anyway.</p>
<h2 id="mesa-drivers"><a class="zola-anchor" href="#mesa-drivers" aria-label="Anchor link for: mesa-drivers">Mesa drivers</a></h2>
<p>Mesa is the thing that helps your GPU do OpenGL stuff. You want that to be fairly fresh. Luckily with Non-LTS version of
Kubuntu, it's pretty new already, so if your games run out of the box, then you don't have to worry about it.</p>
<p>If something breaks however, there are two PPA's you can use to get more up-to-date or stable drivers:</p>
<ul>
<li><a href="https://launchpad.net/~oibaf/+archive/ubuntu/graphics-drivers">Oibaf PPA</a>
<ul>
<li>Updates fast, follows the Git updates.</li>
</ul>
</li>
<li><a href="https://launchpad.net/~kisak/+archive/ubuntu/kisak-mesa">Kisak PPA</a>
<ul>
<li>More stable, slower than Oibaf, can be a bit slower than non-LTS Kubuntu as well.</li>
</ul>
</li>
</ul>
<p>Look into these more yourself, ask around questions, sometimes you don't need to update Mesa drivers at all anyway.</p>
<h2 id="vulkan-drivers"><a class="zola-anchor" href="#vulkan-drivers" aria-label="Anchor link for: vulkan-drivers">Vulkan drivers</a></h2>
<p>Vulkan is pretty essential since it is used to translate DirectX stuff to Vulkan, which makes the DirectX games run on Linux.</p>
<p>For Vulkan, following command should be enough:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo apt install libvulkan1 mesa-vulkan-drivers vulkan-tools
</span></code></pre>
<p>This will install Vulkan library, drivers for Mesa (Nvidia has it's own afaik) and Vulkan tools.
After installation, you can try it out and see if it works by opening terminal and typing
<code>vkcube</code>. If you get a spinning cube inside a window, congrats, Vulkan is working for you!</p>
<p>This is all I had to do to get Vulkan working on my AMD setup. If you have issues, ask around.</p>
<h2 id="steam"><a class="zola-anchor" href="#steam" aria-label="Anchor link for: steam">Steam</a></h2>
<p>For steam, I recommed installing it through the "tried and true" .deb file. Flatpacks are cool, but they can sometimes have permission issues when
they trie to "talk" to other files in the system. Snaps have same thing. <em>I am not expert on these things</em>, but with .deb it will very likely work.
At least for me it did. :)</p>
<p>To get steam, just open terminal and type</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo apt update
</span><span>sudo apt install steam
</span></code></pre>
<p>It's that simple!</p>
<p>After logging into Steam, do the following:</p>
<ol>
<li>Open Steam settings</li>
<li>Select Steam Play</li>
<li>Check "Enable Steam Play for supported titles"</li>
<li>Also check "Enable Steam Play for all other titles"</li>
<li>Keep "Run other titles with:" as "Proton Experimental"</li>
</ol>
<p>I'll also guide how to get Proton-GE installed, which is community supported version of Proton. This means it gets updated more frequently,
and sometimes has better support for some games.</p>
<p>Proton Experimental is pretty solid, but sometimes you need to switch the version of Proton the game uses.
To do that, do the following:</p>
<ol>
<li>Right click the game in the Steam game library list</li>
<li>Select "Properties..."</li>
<li>Select "Compatibility"</li>
<li>Check "Force the use of specific Steam Play compatibility tool"</li>
<li>From the list, select other Proton version.</li>
<li>Try playing around with different versions to see if it helps.</li>
</ol>
<p>To save some time, check out <a href="https://www.protondb.com/">ProtonDB</a> where you can search for a specific game,
and see how others have gotten the game running (if they have). It's an excellent site you should keep an eye on!</p>
<h2 id="lutris"><a class="zola-anchor" href="#lutris" aria-label="Anchor link for: lutris">Lutris</a></h2>
<p>Lutris is a community powered tool that can help running and installing games from GOG.com etc.
Since it's community powered, it may be outdated when it comes to some games installation scripts.
However, it works as a great launcher for non-Steam titles, since you can use Wine-GE (same as Proton-GE but without the Steam parts) with it!</p>
<p>To install lutris, do the following commands in terminal</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo add-apt-repository ppa:lutris-team/lutris
</span><span>sudo apt update
</span><span>sudo apt install lutris
</span></code></pre>
<p>First command adds the Lutris repository to your system,
second updates all the sources, and third installs Lutris.</p>
<p>Inside Lutris you can log in to GOG.com, install Origin, search for games to install etc. etc.
There's so much stuff in Lutris I am not going to cover all of it in this guide.</p>
<h2 id="proton-ge-and-wine-ge"><a class="zola-anchor" href="#proton-ge-and-wine-ge" aria-label="Anchor link for: proton-ge-and-wine-ge">Proton-GE and Wine-GE</a></h2>
<p>Proton and Wine GE versions (GE = GloriousEggroll) are definitely something you want to use,
especially with newer titles or more obscure ones. They're versions of Proton and Wine that are
updated more frequently by the community, to keep games working.</p>
<p>For example I had problem with EVE Online launcher not working, Proton-GE got update to it within
hours from the trouble first appearing. :D</p>
<p>Many people in ProtonDB use Proton-GE, so having same version than others there will help a lot!</p>
<p>For keeping Proton and Wine GE up to date, check out <a href="https://davidotek.github.io/protonup-qt/">ProtonUp-Qt</a></p>
<p>It's the easiest, simplest way to update newer GE versions.</p>
<h2 id="disable-compositing-when-gaming"><a class="zola-anchor" href="#disable-compositing-when-gaming" aria-label="Anchor link for: disable-compositing-when-gaming">Disable compositing when gaming</a></h2>
<p>Compositor is the thing that makes your desktop look snazzy with all the transparency stuff, shadows etc.
When gaming, you want to disable that. It eats some of your perf, and sometimes it can be quite noticeable.</p>
<p>For me some games get +20 fps boost from disabling compositing, which is pretty wild.</p>
<p>The default hotkey to disable compositing is <code>Alt+Shift+F12</code></p>
<p>You can also set, at least on Kubuntu, the window automatically disable compositing.</p>
<ol>
<li>Press ALT+F3 when having some window open you want to disable compositing for</li>
<li>Go to "More Actions" -> "Configure Special Window/Application settings" (it doesn't really matter which, I usually select application)</li>
<li>Click "Add Property"</li>
<li>Search for "Block Compositing"</li>
<li>Set it to "Force" and "Yes"</li>
<li>Click "Apply" and "OK"</li>
</ol>
<p>Now whenever this window/app is open, it will tell compositor to shutdown.</p>
<p>Enjoy your FPS boost! :D</p>
<h2 id="optional-enhancements"><a class="zola-anchor" href="#optional-enhancements" aria-label="Anchor link for: optional-enhancements">Optional enhancements</a></h2>
<p>I will update this list whenever I find out something!</p>
<h3 id="dxvk"><a class="zola-anchor" href="#dxvk" aria-label="Anchor link for: dxvk">DXVK</a></h3>
<p>DXVK is a tool that translates DirectX 11 stuff to Vulkan, so your Linux PC can run it.</p>
<p>Usually Proton does this part for you, but if you need to run stuff without Proton, you may want to install it yourself.</p>
<p>It is pretty simple to install, you should follow the Readme on it's github site: <a href="https://github.com/doitsujin/dxvk">https://github.com/doitsujin/dxvk</a></p>
<p>You can omit the <code>export WINEPREFIX</code> part completely to make it install itself to your default Wine prefix, which is usually
<code>~/.wine</code>. However I had to install it to <code>~/.wine64</code> as well.</p>
<h3 id="remove-snap"><a class="zola-anchor" href="#remove-snap" aria-label="Anchor link for: remove-snap">Remove Snap</a></h3>
<p>Alright, without getting into the whole "snaps vs flatpacks" debacle, I am just gonna say
that for me, Snaps added additional boot time.</p>
<p>Also things may change for snap in future, so I dont know how future proof this part is.</p>
<p>First, remove everything you have installed with snap.</p>
<p>List all packages:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>snap list
</span></code></pre>
<p>Remove the packages with</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo snap remove</span><span style="color:#ff9233;"> --purge</span><span> package_name_here
</span></code></pre>
<p>Delete snap cache</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo rm</span><span style="color:#ff9233;"> -rf</span><span> /var/cache/snapd/
</span></code></pre>
<p>Delete snapd</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo apt autoremove</span><span style="color:#ff9233;"> --purge</span><span> snapd
</span></code></pre>
<p>Clear snap folder from your home</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>rm</span><span style="color:#ff9233;"> -rf </span><span>~/snap
</span></code></pre>
<p>Now this is pretty important part, and keeps snap being reinstalled to your system:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo apt-mark hold snapd
</span></code></pre>
<p>Now you should be snap free and your boot time should not be as slow! Maybe.
For me it helped though!</p>
<p>+++
<strong>NOTE</strong>: If you break your system, you're on your own. I am not responsible for your systems health.</p>
<p>I hope this guide helped to figure out what you may have to do to get the optimal gaming setup on
your Linux system!</p>
<p>Also if I forgot something or you have ideas, enhancements, guides of your own, feel free to drop a comment!</p>
I am tired of social mediaFri, 24 Sep 2021 00:00:00 +0000Akselipersonal
https://akselmo.dev/posts/im-tired-of-social-media/
https://akselmo.dev/posts/im-tired-of-social-media/<p>Yeah, not uncommon these days.<span id="continue-reading"></span></p>
<p>I am so tired of using Twitter and being flooded with random, uninteresting crap. The algorithm still does it's thing even when you have "latest tweets" enabled.</p>
<p>On top of that, the muted words thing works like ass. It sometimes filters out words, sometimes doesn't.</p>
<p>And the ads don't seem to respect those filters, of course.</p>
<p>So I gave up with Twitter. I still have mine up, but I'm on <a href="https://mastodon.technology/@huntra">Mastodon</a> now and I use it as my main thing. There are actually interesting topics discussed there and no algos telling me to buy newest spyware software or w/e.</p>
<p>Mastodon just doesn't try to keep you constantly "enganged" (addicted) on their platform. It doesn't try to keep you "doomscrolling" so you see more ads. It doesn't have ads. It just is a place where people can toot their thoughts, announce things, that's about it. And I'm super happy with that. <em>And I can also use it from my terminal!!!</em> It's kinda fun to just type <code>toot post</code> in my terminal and share my brainfarts. I tried some Twitter related terminal apps but none of them really worked.</p>
<p>I also use <a href="https://moa.party/">Moa Bridge</a> so I can just send my toots/tweets in both platforms with specific hashtag. I just use <em>#xp</em> as my hashtag for that.</p>
<p>Another place I've stopped using as much is Youtube. Youtube used to be a video site with some comments and such. Now it's more a social media place, also trying to get you addicted to their content to watch more ads and make more bank. I stopped using Youtube from browser, but instead use <a href="https://freetubeapp.io/">Freetube</a>. No ads, no BS, just list of videos and it plays them through Invidious instances so there's (probably) not any tracking either. Also it has sponsor skip integrated to it, which is nice. On mobile I use <a href="https://newpipe.net/">NewPipe</a> which is basically the same, but on mobile.</p>
<p>On IM side, I've started using <a href="https://matrix.org/">Matrix.org</a> with my fiancee. It has end-to-end encryption, which helps with my trust issues, but I'm more into the freedom of choosing your client. I can use Matrix from my <a href="https://weechat.org/">Weechat</a> that has my IRC channels too, or I can use <a href="https://github.com/Nheko-Reborn/nheko">nheko</a> which is more feature rich. On my phone I use <a href="https://fluffychat.im/en/">Fluffychat</a>.</p>
<p>I have also added many <a href="https://matrix.org/docs/projects/bridge/matrix-appservice-discord">Discord-Matrix</a> bridges to my servers, so I can see what my Discord friends are doing even in Matrix. That however doesn't support E2E-encryption.</p>
<p>Is this all a big hassle to set up? Not really, in my opinion at least, but it may require some tinkering. But it gives me freedom of choice and I value that more than just simply starting something. Besides, I like tinkering!</p>
<p>Anyways, <strong>these alternatives let me choose when I want to use these services</strong>, instead of the services telling me "HEY LOOK NEW NOTIFICATION PLEASE CLICK ME NOW AND WATCH FEW ADS AT THE SAME TIME GOD PLEASE." Sure, you could go "just ignore it" and I did, but there's still the tracking issues n all that shit. And ignoring the problem doesn't solve the problem, just moves it to later date.</p>
<p>I am more comfortable these open source solutions and that I can choose things.</p>
<p>In short I'll be taking (hopefully indefinite) break from Twitter, but <strong>will crosspost important game/other announcements</strong> there. I don't like it anymore. Too noisy. See you in Mastodon!</p>
<p>ps. My <a href="https://github.com/Akselmo/artificial-rage">open source FPS</a> project has been really fun to do and it's going forward slowly but surely. My secret game project also is on route, but I let artists finish their work before I really sit down and work on it. But it's all there and will happen, some day. :)</p>
Some cosplay photosSun, 05 Sep 2021 00:00:00 +0000Akseliphotoscosplay
https://akselmo.dev/posts/cosplay-photos/
https://akselmo.dev/posts/cosplay-photos/<p>Disclaimer: I may be cringe but I am free<span id="continue-reading"></span></p>
<p>So I have this lizard partial suit I ordered from here: <a href="https://www.lisanotuspaja.com/en/">https://www.lisanotuspaja.com/en/</a></p>
<p>And I love wearing it! I just rarely have time/energy lol.</p>
<p>The character is my own OC Huntra!</p>
<p>Anyways, here's some photos we took today for Tracoff event.</p>
<p><a href="/assets/images/cosplay2021/IMG_4932-3.jpg"><img src="/assets/images/cosplay2021/IMG_4932-3.jpg" alt="Gun" /></a></p>
<p>"Where am I?"</p>
<p><a href="/assets/images/cosplay2021/IMG_4934-2.jpg"><img src="/assets/images/cosplay2021/IMG_4934-2.jpg" alt="Chill" /></a></p>
<p>"Might as well chill here."</p>
<p><a href="/assets/images/cosplay2021/IMG_4935-2.jpg"><img src="/assets/images/cosplay2021/IMG_4935-2.jpg" alt="Sad" /></a></p>
<p>"Peekaboo!"</p>
<p><a href="/assets/images/cosplay2021/IMG_4953-2.jpg"><img src="/assets/images/cosplay2021/IMG_4953-2.jpg" alt="Peekaboo1" /></a></p>
<p><a href="/assets/images/cosplay2021/IMG_4954-2.jpg"><img src="/assets/images/cosplay2021/IMG_4954-2.jpg" alt="Peekaboo2" /></a></p>
<p>,,/</p>
<p><a href="/assets/images/cosplay2021/IMG_4966-2.jpg"><img src="/assets/images/cosplay2021/IMG_4966-2.jpg" alt="Metal" /></a></p>
<p><a href="/assets/images/cosplay2021/IMG_4970-2.jpg"><img src="/assets/images/cosplay2021/IMG_4970-2.jpg" alt="Metal1" /></a></p>
<p><a href="/assets/images/cosplay2021/IMG_4973-2.jpg"><img src="/assets/images/cosplay2021/IMG_4973-2.jpg" alt="Metal2" /></a></p>
<p>Thank you <a href="https://twitter.com/tecsiederp/">https://twitter.com/tecsiederp/</a> for taking and editing the photos!</p>
Image: Quake Logo ANSIISat, 21 Aug 2021 00:00:00 +0000Akseliart
https://akselmo.dev/posts/image-quake-logo-ansii/
https://akselmo.dev/posts/image-quake-logo-ansii/<p>Quake Logo ANSII<span id="continue-reading"></span></p>
<p><a href="/assets/images/art/QuakeANSII.png"><img src="/assets/images/art/QuakeANSII.png" alt="QuakeANSII" /></a></p>
<p>Played around with <a href="https://www.gridsagegames.com/rexpaint/">REXPaint</a>. It works fine under Wine. Felt like making Quake logo because of Quakecon and Quake being 25 years old!</p>
Quake Champions on LinuxSat, 21 Aug 2021 00:00:00 +0000Akselilinuxgame
https://akselmo.dev/posts/quake-champion-on-linux/
https://akselmo.dev/posts/quake-champion-on-linux/<p>I just wanted to write down what I had to do to make Quake Champions more playable on my Kubuntu setup. It had lots of stuttering problems for me, so here's what I did to fix it.<span id="continue-reading"></span></p>
<h3 id="move-the-game-to-ssd"><a class="zola-anchor" href="#move-the-game-to-ssd" aria-label="Anchor link for: move-the-game-to-ssd">Move the game to SSD</a></h3>
<p>I had QC on my NVME/M.2 drive at first, but I searched the interwebs a bit and found that if NVME drives heat up too much, the games may start stuttering. Considering my NVME drive is right near my GPU, it probably heats a lot during gaming, so I moved the game to my SSD, which is better cooled.</p>
<h3 id="disable-nvidia-low-latency-whatever-thing"><a class="zola-anchor" href="#disable-nvidia-low-latency-whatever-thing" aria-label="Anchor link for: disable-nvidia-low-latency-whatever-thing">Disable Nvidia low latency whatever thing</a></h3>
<p>In QC settings, there's somekind of Nvidia low latency "Reflex" settings. Just disable it. It didn't add any boost to my game, just made it have lots of micro stuttering.</p>
<h3 id="use-proton-ge"><a class="zola-anchor" href="#use-proton-ge" aria-label="Anchor link for: use-proton-ge">Use Proton-GE</a></h3>
<p>I still had some issues with stuttering, especially when things were loading in. It seems that default Steam Proton doesn't load assets asynchronously and causes the main thread to halt. This is really bad when you're trying to frag someone, and someone on other side of the map jumps, letting out a new sound your game hasn't loaded yet... And the game halts.</p>
<p>To fix this, I downloaded <a href="https://github.com/GloriousEggroll/proton-ge-custom/releases/tag/6.15-GE-2">Proton-6.15-GE-2</a> and installed it, following the <a href="https://github.com/GloriousEggroll/proton-ge-custom#installation">installation directions</a>, then enabled it for the Quake Champions.</p>
<p>Then, the actual fix: You have to add following line to the game <strong>launch options</strong>:</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>DXVK_ASYNC=1 gamemoderun %command%
</span></code></pre>
<p><a href="https://www.protondb.com/app/611500#TRkg3ijCW">Thanks d3rh4ns and Ph42oN</a>!</p>
<p>This will make sure the assets are loaded asynchronously and not halting the thread whenever new things are loaded in.</p>
<p>That should be it, for me the game now works pretty much like it did on Windows: Mostly smooth but some hitches here and there, but those are because of the game engine isn't really the best, I guess.</p>
<p>Hope this helps someone who has same issue!</p>
Restrict mouse to first screen on LinuxThu, 12 Aug 2021 00:00:00 +0000Akselilinux
https://akselmo.dev/posts/restrict-mouse-to-first-screen-on-linux/
https://akselmo.dev/posts/restrict-mouse-to-first-screen-on-linux/<p><strong>If there is alternative, better ways, do tell!</strong> <span id="continue-reading"></span></p>
<p>Edit: I figured out that this problem may arise mostly when alt+tabbing out of the game. Sometimes, the alt key gets "stuck" and you have to either press it again, or alt+tab to the game again. <strong>I managed to fix this issue by changing the alt+tab hotkey to meta+tab!</strong> Games usually ignore the meta key completely.</p>
<p>I had some problems with mouse cursor escaping fast paced games such as Quake Champions and Splitgate when playing them and doing flick shots, so I searched for some solutions. I am using Kubuntu so it has KWin window manager.</p>
<p>I could really not find much except a script someone used for their drawing tablet and to restrict the input in that.</p>
<p>That script works well for gaming as well, so I decided to save it as a gist:</p>
<p><a href="https://gist.github.com/Akselmo/d4f35798a222b9af5d0c0f1b4021d11d">Github Gist: Restrict mouse to screen</a></p>
<p><strong>NOTE</strong>: I didn't make this script or modify it in any way! If there are any improvements that could be done to it, feel free to comment on the Gist!</p>
<p>It doesn't affect your mouse any other ways than keeping it inside the coordinates what you give to it.</p>
<h2 id="how-to"><a class="zola-anchor" href="#how-to" aria-label="Anchor link for: how-to">How to:</a></h2>
<p>First, just download the script and put it in some folder.</p>
<p>Then, download <strong>xdotool</strong>, the script needs that to work:</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>sudo apt install xdotool
</span></code></pre>
<p>Inside the folder the script is, run this inside terminal:</p>
<pre style="background-color:#181818;color:#ffffff;"><code><span>bash ./restrictmouse.sh 1 1 1919 1079
</span></code></pre>
<p>This restricts the mouse inside your first 1080p monitor: First from left to right. Also, it's a good idea to set the coordinates 1 pixel less (or more if on the left side) so your mouse wont even accidentally go to other screens.</p>
<p>It's good idea to run the script from terminal so it's easier to close as well. You can close it from task manager (subprocess of bash) or htop if you run it without terminal, of course.</p>
<p>Optional: I also made a desktop file for it and added it to my KDE app launcher, so I can just click it and it'll run the script inside a terminal to restrict the mouse. This way I don't forget using it easier.</p>
<h2 id="my-dumb-opinion"><a class="zola-anchor" href="#my-dumb-opinion" aria-label="Anchor link for: my-dumb-opinion">My dumb opinion</a></h2>
<p>This is just unnecessary opinions about this, but I wish <strong>I wouldn't have to do this.</strong> Unfortunately some games have trouble on Linux keeping the mouse inside the game, especially if it's fast paced enough that you move the mouse faster than the game can "keep" it inside the window. It's a really weird.. Bug? Feature? Anyways, hope this helps you.</p>
Sennheiser GSP 670 wireless on Linux (Ubuntu based)Thu, 12 Aug 2021 00:00:00 +0000Akselilinuxsoftware
https://akselmo.dev/posts/sennheiser-gsp-670-wireless-on-linux/
https://akselmo.dev/posts/sennheiser-gsp-670-wireless-on-linux/<p>Update!</p>
<p>This patch has been added to the kernel, so if you have kernel 5.14.15-200 you should be good to go! It seems to also work on 5.13.0-28 on Kubuntu!<span id="continue-reading"></span></p>
<p>Here's link to the patch <a href="https://mailman.alsa-project.org/pipermail/alsa-devel/2021-October/191190.html">https://mailman.alsa-project.org/pipermail/alsa-devel/2021-October/191190.html</a></p>
<p><strong>However</strong>, you may need to still set up the Pulseaudio profile, so check that out if it's not working for you even on the right kernel.</p>
<hr />
<p>I got myself a new wireless headset and while it works fine on Windows, it had some problems running on my Kubuntu: It would only work over a wire.</p>
<p>However, you can get it to work with a Kernel module fix. I got help for this in this nice Github thread: <a href="https://github.com/szszoke/sennheiser-gsp670-pulseaudio-profile/issues/13">https://github.com/szszoke/sennheiser-gsp670-pulseaudio-profile/issues/13</a></p>
<p>Many thanks to this blog post: <a href="https://includeguitar.home.blog/2019/06/18/boss-katana-linux-%e2%9d%a4%ef%b8%8f/">https://includeguitar.home.blog/2019/06/18/boss-katana-linux-%e2%9d%a4%ef%b8%8f/</a>!</p>
<p>Most of the steps are same and I will be shamelessly copy pasting some of the commands, but I want to show the steps specific for this headset. <strong>Again, huge thanks to everyone involved in that Github issue thread!!! All the thanks go to them!</strong> Also these steps are typed for Kubuntu in mind, so they should work on any Ubuntu based distro.</p>
<h2 id="before-you-start"><a class="zola-anchor" href="#before-you-start" aria-label="Anchor link for: before-you-start">Before you start</a></h2>
<p>Before you begin, just few things you should keep in mind:</p>
<ul>
<li>First, modifying kernel, if it goes badly, <strong>can make things unusable and your computer may not even boot up.</strong> Be careful around these parts. This is necessary scary part to point out.</li>
<li>Second, when your kernel gets updates, you have to do these steps all over again, unless someone pushes the fix up to the kernel developers. When that happens, this fix is not necessary.</li>
<li>Last but not least: <strong>Take backups!</strong></li>
</ul>
<h2 id="download-kernel-and-install-dependencies"><a class="zola-anchor" href="#download-kernel-and-install-dependencies" aria-label="Anchor link for: download-kernel-and-install-dependencies">Download kernel and install dependencies</a></h2>
<p>First, unplug your headset dongle and headset itself, just make sure its not connected to the PC. Then install build dependencies in your terminal:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo apt install build-essential</span><span style="color:#ff9233;"> -y
</span><span>sudo apt build-dep linux</span><span style="color:#ff9233;"> -y
</span></code></pre>
<p>Then make a directory where to download the kernel:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>mkdir ~/gspquirk
</span><span style="color:#838fff;">cd </span><span>~/gspquirk
</span><span>apt source linux
</span></code></pre>
<p>I named mine with "gspquirk" because that's what we're going to be doing: Add a "quirk" for the GSP headset.</p>
<p>If you can't download the kernel sources or install dependencies because of <code>E: You must put some 'source' URIs in your sources.list</code>, do the following: Go to terminal and type</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo software-properties-</span><span style="font-weight:bold;color:#33ffa0;">*
</span></code></pre>
<p>This should open your software property window. In there, enable "Source code" box and close.</p>
<h2 id="modifying-the-quirks-table-h"><a class="zola-anchor" href="#modifying-the-quirks-table-h" aria-label="Anchor link for: modifying-the-quirks-table-h">Modifying the quirks-table.h</a></h2>
<p>Navigate to the kernel source folder you downloaded and get your configuration and Module.symvers from your current kernel fith following commands.</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>cp /lib/modules/`uname</span><span style="color:#ff9233;"> -r</span><span>`/build/.config .</span><span style="color:#ff9233;"> -v
</span><span>cp /lib/modules/`uname</span><span style="color:#ff9233;"> -r</span><span>`/build/Module.symvers .</span><span style="color:#ff9233;"> -v
</span></code></pre>
<p>Update the <code>Makefile</code> according to your current kernel:</p>
<p>Check your <code>uname -r</code> output. For me it is <code>5.11.0-25-generic</code></p>
<p>Open the <code>Makefile</code> and make sure the following parts match, on top of the makefile:</p>
<pre data-lang="cpp" style="background-color:#181818;color:#ffffff;" class="language-cpp "><code class="language-cpp" data-lang="cpp"><span>VERSION </span><span style="font-weight:bold;color:#33ffa0;">= </span><span style="color:#ff9233;">5
</span><span>PATCHLEVEL </span><span style="font-weight:bold;color:#33ffa0;">= </span><span style="color:#ff9233;">11
</span><span>SUBLEVEL </span><span style="font-weight:bold;color:#33ffa0;">= </span><span style="color:#ff9233;">22
</span><span>EXTRAVERSION </span><span style="font-weight:bold;color:#33ffa0;">= -</span><span style="color:#ff9233;">25</span><span style="font-weight:bold;color:#33ffa0;">-</span><span>generic
</span></code></pre>
<p>For me, the extra version part was missing, so I added it there myself.</p>
<p>Save your changes and run this command inside the same folder:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>make modules_prepare
</span></code></pre>
<h2 id="add-pulseaudio-profile-settings"><a class="zola-anchor" href="#add-pulseaudio-profile-settings" aria-label="Anchor link for: add-pulseaudio-profile-settings">Add pulseaudio profile settings</a></h2>
<p>Find out your headset id values by running</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>lsusb
</span></code></pre>
<p>For me, since my headset is on newer firmware, it is: <code>Bus 003 Device 003: ID 1395:0300 Sennheiser Communications EPOS GSA 70</code>.</p>
<p>It could also be different, and the ID part could also be <code>1395:0089</code> if you're on older firmware.</p>
<p>Write that ID number down somewhere.</p>
<p>Next, you want to make a new rules file for your headset, on your current machine, not the linux kernel you downloaded!</p>
<p>Check the rules folder if you already have <code>pulseaudio-sennheiser-gsp670.rules</code> file: <code>ls /etc/udev/rules.d/</code>.</p>
<p>If not, make a file called <code>91-pulseaudio-sennheiser-gsp670.rules</code> (this is what it's for me, the 91 could also be 90 or some other number) in there and add following text inside it:</p>
<pre data-lang="cpp" style="background-color:#181818;color:#ffffff;" class="language-cpp "><code class="language-cpp" data-lang="cpp"><span># GSA</span><span style="font-weight:bold;color:#33ffa0;">-</span><span style="color:#ff9233;">70</span><span> dongle with updated firmware
</span><span>ATTRS{idVendor}</span><span style="font-weight:bold;color:#33ffa0;">==</span><span style="color:#5fff33;">"1395"</span><span>, ATTRS{idProduct}</span><span style="font-weight:bold;color:#33ffa0;">==</span><span style="color:#5fff33;">"0300"</span><span>, ENV{PULSE_PROFILE_SET}</span><span style="font-weight:bold;color:#33ffa0;">=</span><span style="color:#5fff33;">"usb-gaming-headset.conf"
</span><span># GSA</span><span style="font-weight:bold;color:#33ffa0;">-</span><span style="color:#ff9233;">70</span><span> dongle with older firmware
</span><span>ATTRS{idVendor}</span><span style="font-weight:bold;color:#33ffa0;">==</span><span style="color:#5fff33;">"1395"</span><span>, ATTRS{idProduct}</span><span style="font-weight:bold;color:#33ffa0;">==</span><span style="color:#5fff33;">"0089"</span><span>, ENV{PULSE_PROFILE_SET}</span><span style="font-weight:bold;color:#33ffa0;">=</span><span style="color:#5fff33;">"usb-gaming-headset.conf"
</span><span># GSP</span><span style="font-weight:bold;color:#33ffa0;">-</span><span style="color:#ff9233;">670</span><span> headset
</span><span>ATTRS{idVendor}</span><span style="font-weight:bold;color:#33ffa0;">==</span><span style="color:#5fff33;">"1395"</span><span>, ATTRS{idProduct}</span><span style="font-weight:bold;color:#33ffa0;">==</span><span style="color:#5fff33;">"008a"</span><span>, ENV{PULSE_PROFILE_SET}</span><span style="font-weight:bold;color:#33ffa0;">=</span><span style="color:#5fff33;">"usb-gaming-headset.conf"
</span></code></pre>
<p>Also if you already have the file inside it, make sure your rules file looks similar. Notice the IDs? One of them is the same you found with <code>lsusb</code></p>
<p>Save and then restart pulseaudio:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>pulseaudio</span><span style="color:#ff9233;"> -k
</span><span>pulseaudio</span><span style="color:#ff9233;"> -D
</span></code></pre>
<p>Now you should have a new rule for your headset that you can assign inside pulseaudio settings. We'll get back to that later.</p>
<h2 id="adding-the-quirk"><a class="zola-anchor" href="#adding-the-quirk" aria-label="Anchor link for: adding-the-quirk">Adding the quirk</a></h2>
<p>Back inside the linux source folder you downloaded, open following file: <code>sound/usb/quirks-table.h</code></p>
<p>Inside the file, find the last quirk. They usually have comments on them, for me the last one was</p>
<pre data-lang="cpp" style="background-color:#181818;color:#ffffff;" class="language-cpp "><code class="language-cpp" data-lang="cpp"><span>{
</span><span> </span><span style="color:#808080;">/*
</span><span style="color:#808080;"> * Pioneer DJ DJM-450
</span><span style="color:#808080;"> * PCM is 8 channels out @ 48 fixed (endpoint 0x01)
</span><span style="color:#808080;"> * and 8 channels in @ 48 fixed (endpoint 0x82).
</span><span style="color:#808080;"> */
</span><span>
</span><span> (snip)
</span><span>},
</span></code></pre>
<p>As you can see, they always end with a comma. Add the following quirk behind the last quirk.</p>
<p>Notice that if you have older headset firmware, you have to change the <code>0x0300</code> next to <code>USB_DEVICE(0x1395, ID_HERE)</code> to <code>0x0089</code> or whatever <code>lsusb</code> shows to you!</p>
<pre data-lang="cpp" style="background-color:#181818;color:#ffffff;" class="language-cpp "><code class="language-cpp" data-lang="cpp"><span>{
</span><span> </span><span style="color:#808080;">/*
</span><span style="color:#808080;"> * Sennheiser GSP670: Load interfaces in a different order
</span><span style="color:#808080;"> */
</span><span> USB_DEVICE(</span><span style="color:#ff9233;">0x1395</span><span>, </span><span style="color:#ff9233;">0x0300</span><span>),
</span><span> .driver_info </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>(</span><span style="color:#33ffff;">unsigned long</span><span>) </span><span style="font-weight:bold;color:#33ffa0;">&</span><span>(</span><span style="color:#33ffff;">const struct</span><span> snd_usb_audio_quirk) {
</span><span> .ifnum </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> QUIRK_ANY_INTERFACE,
</span><span> .type </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> QUIRK_COMPOSITE,
</span><span> .data </span><span style="font-weight:bold;color:#33ffa0;">= &</span><span>(</span><span style="color:#33ffff;">const struct</span><span> snd_usb_audio_quirk[]) {
</span><span> </span><span style="color:#808080;">// Communication
</span><span> {
</span><span> .ifnum </span><span style="font-weight:bold;color:#33ffa0;">= </span><span style="color:#ff9233;">3</span><span>,
</span><span> .type </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> QUIRK_AUDIO_STANDARD_INTERFACE
</span><span> },
</span><span> </span><span style="color:#808080;">// Recording
</span><span> {
</span><span> .ifnum </span><span style="font-weight:bold;color:#33ffa0;">= </span><span style="color:#ff9233;">4</span><span>,
</span><span> .type </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> QUIRK_AUDIO_STANDARD_INTERFACE
</span><span> },
</span><span> </span><span style="color:#808080;">// Main
</span><span> {
</span><span> .ifnum </span><span style="font-weight:bold;color:#33ffa0;">= </span><span style="color:#ff9233;">1</span><span>,
</span><span> .type </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> QUIRK_AUDIO_STANDARD_INTERFACE
</span><span> },
</span><span>
</span><span> {
</span><span> .ifnum </span><span style="font-weight:bold;color:#33ffa0;">= -</span><span style="color:#ff9233;">1
</span><span> }
</span><span> }
</span><span> }
</span><span>},
</span><span>
</span></code></pre>
<p>(Thanks <a href="https://github.com/szszoke/sennheiser-gsp670-pulseaudio-profile/issues/13#issuecomment-891662521">bundabrg</a>!)</p>
<p>Also make sure the quirk is <strong>above</strong> these lines!</p>
<pre data-lang="cpp" style="background-color:#181818;color:#ffffff;" class="language-cpp "><code class="language-cpp" data-lang="cpp"><span style="font-weight:bold;color:#33ffa0;">#undef</span><span> USB_DEVICE_VENDOR_SPEC
</span><span style="font-weight:bold;color:#33ffa0;">#undef</span><span> USB_AUDIO_DEVICE
</span></code></pre>
<p>And, make sure that you didn't accidentally add the quirk inside another quirk.</p>
<p>Then, save the file, and it's time to build!</p>
<p>Build the USB audio module:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>make M=sound/usb
</span></code></pre>
<h2 id="install-the-module"><a class="zola-anchor" href="#install-the-module" aria-label="Anchor link for: install-the-module">Install the module</a></h2>
<p>First, back up your old module:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo cp /lib/modules/`uname</span><span style="color:#ff9233;"> -r</span><span>`/kernel/sound/usb/snd-usb-audio.ko /lib/modules/`uname</span><span style="color:#ff9233;"> -r</span><span>`/kernel/sound/usb/snd-usb-audio.ko.old</span><span style="color:#ff9233;"> -v
</span></code></pre>
<p>Then make sure you have <strong>ALL USB AUDIO DEVICES UNPLUGGED</strong>, so you can remove the module that is in use:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo rmmod snd-usb-audio
</span></code></pre>
<p>Overwrite the current module with the one you just made</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo cp ./sound/usb/snd-usb-audio.ko /lib/modules/`uname</span><span style="color:#ff9233;"> -r</span><span>`/kernel/sound/usb/snd-usb-audio.ko</span><span style="color:#ff9233;"> -v
</span></code></pre>
<p>Refresh the modules:</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo depmod</span><span style="color:#ff9233;"> -a
</span></code></pre>
<p>And then, load the module!</p>
<pre data-lang="sh" style="background-color:#181818;color:#ffffff;" class="language-sh "><code class="language-sh" data-lang="sh"><span>sudo modprobe snd-usb-audio
</span></code></pre>
<p>You can now plug in all your headsets and sound devices. Have fingers crossed that they work. If not, remember the backup you made? You'll have to unload the modules, rename the backup as the current file, then refresh and load the modules again.</p>
<h2 id="make-sure-you-use-correct-audio-rule"><a class="zola-anchor" href="#make-sure-you-use-correct-audio-rule" aria-label="Anchor link for: make-sure-you-use-correct-audio-rule">Make sure you use correct audio rule</a></h2>
<p>Open audio/pulseaudio settings and find where you can configure the rules. You may have to search for this one, since I only know how to do it for Kubuntu:</p>
<p>On Kubuntu, in Audio settings there is a Configure button. Click that and you should see "EPOS GSA 70"</p>
<p>Under that, there is dropdown selection for "Profile"
From there, select <code>Chat Output + Game Output + Chat Input</code></p>
<p>Test the headset from the dropdown that is below, and you can test your mic in any app that supports it really.</p>
<h2 id="that-should-be-it"><a class="zola-anchor" href="#that-should-be-it" aria-label="Anchor link for: that-should-be-it">That should be it</a></h2>
<p>For me, these steps worked and made my headset work. It's a lot of stuff to do just to get a headset to work, but I hope in future these are already applied to kernel so we don't have to dabble with these kind of settings again. :)</p>
<p>If your headset doesnt work after these steps, try rebooting your PC once so kernel will load everything proper. And again, remember the backup you made, so you can load the old usb sound module in case the new one didn't work.</p>
Image: Lizard VectorTue, 03 Aug 2021 00:00:00 +0000Akseliart
https://akselmo.dev/posts/image-lizard-vector/
https://akselmo.dev/posts/image-lizard-vector/<p>Lizard Vector<span id="continue-reading"></span></p>
<p><a href="/assets/images/art/lizardvector.png"><img src="/assets/images/art/lizardvector.png" alt="LizardVector" /></a></p>
<p><a href="/assets/images/art/lizardvector_dither.png"><img src="/assets/images/art/lizardvector_dither.png" alt="LizardVector_dither" /></a></p>
<p>Made this lil wallpaper thing by tracing over the wireframe of a 3D model my friend <a href="https://twitter.com/Satokekkyu">Rotlich</a> made for me!</p>
Loputon has been canceledSun, 01 Aug 2021 00:00:00 +0000Akseligamedev
https://akselmo.dev/posts/loputon-has-been-canceled/
https://akselmo.dev/posts/loputon-has-been-canceled/<p>Bit of sad news: I had to cancel my ARPG project "Loputon."<span id="continue-reading"></span></p>
<p>Loputon was going to be retro aesthetic 3D first person dungeon crawling game, with 6 player races, random generated dungeons, leveling and inventory system.</p>
<p>But, in the end, I realised.. It's just too much for me alone.</p>
<p>So I am sorry for those who waited for the project. But I felt like I was doing the project a disservice, if I was going to "force it through." I wouldn't have enjoyed making the game, thus the game wouldn't have turned out good.</p>
<p>I had been working on this project for 2-4 years. Yeah.</p>
<h3 id="i-want-to-make-games-things-i-love-to-make"><a class="zola-anchor" href="#i-want-to-make-games-things-i-love-to-make" aria-label="Anchor link for: i-want-to-make-games-things-i-love-to-make">I want to make games/things I love to make.</a></h3>
<p>The codebase was a mess. The whole game project was actually called "2d_Adventure." It was supposed to be simple, top-down RPG. That then morphed into first person dungeon crawler with grid based movement, with 2D sprites as enemies. That, then again, turned into actual 3D RPG, something like Morrowind. Which I then was going to turn into simple 3D first person dungeon crawling, but without the grid movement and 3D enemies.</p>
<p>I actually got to the last part. But I was so <em>exhausted</em> of the whole thing. I didn't want to look at the project, but was constantly telling myself that if I force it through, it will be worth it.</p>
<p>Nah. I don't want to force myself doing things that I really don't have to. Nobody is paying me to work on Loputon and expecting results. My fans (still weirds me out I have fans lol) would understand, and they did.</p>
<p>I was afraid I would get shitted on by multiple people for cancelling this project. But people were very supportive and acknowledged that sometimes, you just gotta let go. "Kill your darlings" as they say.</p>
<p>If I had forced myself through, it would just have sucked. Bugs everywhere, codebase that was awful to maintain and add new features to, A LOT of graphical work (which I don't have money for!!), only one launch and if you fuck it up, that's pretty much that...</p>
<p>I cant' make this alone, I need a team. And when I got that team, I will be making the spiritual successor to Morrowind I've always dreamt of. It just may take some years.</p>
<p>However, it was not an useless project: I learned a lot of new things! Itemization, inventory management, saving/loading... And learning more about <strong>my own limits</strong>, which has been the most important thing I've learned in gamedev so far.</p>
<p><strong>To sum it all up</strong>: The project drained me dry, thinking about it made me dislike the thought of working on it, I wasn't interested in gamedev in general at all... It just felt all kinds of wrong and on top of it, I can't just make some games alone, and that's alright.</p>
<p>I will move back to making smaller games and more fun projects. Look out for <a href="https://github.com/Akselmo/Artificial-Rage">Artificial Rage</a>, my open source FPS. There is also other ideas brewing, as always... And I think people might like my next one. ;)</p>
<p><strong>This is labour of love, after all. Not labour of force. Not for me, anyway.</strong></p>
<p>Thank you for understanding. <3</p>
Back to Linux!Wed, 28 Jul 2021 00:00:00 +0000Akselilinuxsoftware
https://akselmo.dev/posts/back-to-linux/
https://akselmo.dev/posts/back-to-linux/<p>I wanted to give another Linux distro a try, so I installed Kubuntu instead. <span id="continue-reading"></span>
And I'm glad I did!</p>
<p><img src="/assets/images/linux_desktop_2.png" alt="My Kubuntu" /></p>
<p>I feel like <a href="https://kubuntu.org/">Kubuntu</a> suits my needs way better than Linux Mint: I wanted a simple, light desktop with customization but it stays out of my way when gaming. And that's what KDE is doing. As much as I like XFCE, it's just.. Old. And not much of cool stuff is being made for it anymore. KDE is also easier to customize and let's you do way more things than XFCE, in my opinion. I'm probably wrong but hey.</p>
<p>When it comes to gaming, I found a way to update my <a href="https://launchpad.net/~kisak/+archive/ubuntu/kisak-mesa">Mesa drivers</a>, so they my PC runs games better now than on Linux Mint. On top of that, I realised one big problem why my Linux Mint was having problem with games: It didn't disable composition when playing.</p>
<p>Composition is what gives eyecandy to your desktop: animations, transperancy, all that. It also seems to eat your perf when playing games, I suspect it's because it keeps updating your desktop in middle of game's draw calls, so it gets wonky. Disabling it helps immensely when playing. I suspect Windows does something like this automatically.</p>
<p>Linux would also do it automatically, but KDE has trouble detecting fullscreen apps when they're ran through Proton, so I have to set every game disable it manually. I hope there will be a fix soon, however thanks to KWin (i assume?) letting me add window behaviors, I can disable composition to every game I want that way.</p>
<p>It's amazing to play all the games I used to play with Windows, but on top of that, having an OS which is just plain fun to use and tinker with is big plus. It feels "free" and less "corporate" than Windows, and I love it. And of course, programming is way much easier on Linux, since I can just install all the dependencies easy and quick through the terminal.</p>
<p>Will definitely try gamedeving this weekend if I got time and right mindset lol, maybe even with Unity.</p>
<p>PS. As you may have noticed, I've added tiny banners to my sidebar! Check the links! There's stuff to be found.</p>
New theme!Thu, 08 Jul 2021 00:00:00 +0000Akselipersonal
https://akselmo.dev/posts/new-theme/
https://akselmo.dev/posts/new-theme/<p>Hi! I made a new theme (or layout) for the blog! <span id="continue-reading"></span></p>
<p>I used Minima as the base, then just edited the default layout and css files. Seems to work fine!</p>
<p>If you spot any problems with it, feel free to comment about it.</p>
<p>Here's the commit and merge if you want to see what I changed: <a href="https://github.com/Akselmo/akselmo.github.io/commit/b5b801136b6f74da58e604c22d44da072d49fbd8">Clicky!</a></p>
Bitksel blog archivedSat, 26 Jun 2021 00:00:00 +0000Akselibitkselpersonal
https://akselmo.dev/posts/bitksel-blog-archived/
https://akselmo.dev/posts/bitksel-blog-archived/<p>Hi, just a quick update!<span id="continue-reading"></span> I imported some of my favorite posts from my old Wordpress blog <a href="https://bitkselblog.wordpress.com/">Bitksel</a>, since I wanted to archive them here. The images wont show up correctly, however you can highlight the image link and open it in new tab to see it. Wordpress doesn't like directly linking some of the images it seems.</p>
<p>I will also keep up the Bitksel blog on Wordpress as long as possible, so you can read the originals from there. But just in case Wordpress decides to remove it all, at least the texts are safe here.</p>
<p>Cheers! Hope you enjoy my old posts. I recommend the "Ah, Morrowind" -post, it was written with love.</p>
I gave Linux gaming a goSat, 12 Jun 2021 00:00:00 +0000Akselilinuxsoftwaregame
https://akselmo.dev/posts/i-gave-linux-gaming-a-go/
https://akselmo.dev/posts/i-gave-linux-gaming-a-go/<p>I upgraded my PC with Ryzen 5 3600,<span id="continue-reading"></span> which also meant I needed a new motherboard. I bought myself a small update package with CPU, RAM and the mobo, plus an M.2 drive. So far I've been enjoying my beefier PC! My old CPU was i7-4770k, which is an excellent CPU that still holds up, but I felt like it was time to upgrade anyway. My GPU has stayed the same, RX 480 8Gb.</p>
<p>I then decided to try Linux Mint as my main OS for few days since I had to reinstall everything anyway. I really enjoyed the freedom of tinkering it gives to the user and I spent couple days just making the OS look more "mine."</p>
<p><img src="/assets/images/linux_desktop.png" alt="My Linux desktop" /></p>
<p>Then, I began trying games out. I had some problems with games installing through Lutris since my other drive was in NTFS and not ext4 filesystem, so if I had realised that,
I could have saved some time and frustration and spent time actually playing games. (Lutris warned me but I wasn't sure it would affect me. Now I know better. :P )</p>
<p>Anyway, after playing few matches of Quake Champions, I was surprised how well it ran on my Linux desktop. I also tried Mordhau and ESO, which all ran well and good! Except for one thing: The performance was comparable to my old i7-4770k, maybe slightly worse.
There were some hitches with FPS, especially with frametimes (time it takes from frame 1 to go to frame 2).
My FPS could be over 100 but it wouldn't mean anything if the frametimes made the game feel bit stuttery and laggy. Proton is excellent though, and I believe it will just get even better over time. For some games I just had to press play on Steam and it worked staright away!</p>
<p>It was really nice to see majority of my games being playable despite the performance issues. But here's the another thing: The tinkering required to get some games to work the way I want them to.
Now I love tinkering with things, but this issue was a bit more mental health oriented. I got exhausted quick.</p>
<p><strong>I do tinkering with devices and testing them, breaking them and all that at work.</strong> So setting games up and running on Linux reminded me of work and I wasn't really relaxing while playing the games: Instead, I was worrying how I could get it run better etc etc.
My brains just couldn't rest at all. Even when playing I just couldn't stop focusing on fixing and improving things.</p>
<p>I had to call it quits and move back to Windows. Also, the performance difference between QC on Windows and on Linux through Proton is not that big: Similar FPS but Windows doesn't have frametime hitching nearly as much. It felt like I didn't get the performance boost I expected on Linux from these new components, but on Windows I clearly notice it.</p>
<p>If I had even beefier PC, I feel like I could make Linux gaming work for me. But to make it work for me, I'll have to work a lot.. And I'd just rather go rocketjumping instead of tinkering for hours to get better frametimes.</p>
<p>Outside gaming, I enjoyed using Linux Mint a lot. Everything was snappy and quick, it was very easy to install stuff with apt commands.. And the customization! If Windows had the same level customization available as Linux does, I would be one happy guy.</p>
<p><strong>I love Linux, but I won't be switching yet!</strong> Linux gaming has taken serious steps forward thanks to Proton and Lutris, and if you're not a FPS snob like me, you can have excellent time with it. Especially if you only play just a few games. But for me, it wasn't enough. Not yet.</p>
<p>Anyways thanks for reading my slightly sleep-deprived post. Feel free to comment your experiences about Linux!</p>
Raylib 3D level collisionFri, 04 Jun 2021 00:00:00 +0000Akselisoftwaregamedev
https://akselmo.dev/posts/raylib-3d-level-collision/
https://akselmo.dev/posts/raylib-3d-level-collision/<p>I just wanted to quickly recap how I got collisions <span id="continue-reading"></span>working in Raylib with firstperson camera and the level itself. It took me some time to realise how to get it work but with the help of <a href="https://raylib.com">Raylib</a> discord, I managed to do it!</p>
<p>Just a note: Since this collision method uses bounding boxes, this will only work if your level consists of multiple meshes: Every mesh should ideally be one building block. For example, if you want to make a tunnel, you should make it from four meshes, instead of one with a hole inside it.</p>
<p>First I made a level generator that makes a level out of series of cubes. Sure, it's not the most performance efficient since it draws textures even when player can't see them, but it'll do for now.</p>
<p>The level building blocks, models, are inside an array of structs that contain block model and position. You can then draw them easily to their correct positions.</p>
<p>To get collisions work with these blocks, you'll have to create a function that takes players position and size to account, then compares it to each walls bounding box, which is created from position and size.</p>
<p>Here's the function I use:</p>
<pre data-lang="c" style="background-color:#181818;color:#ffffff;" class="language-c "><code class="language-c" data-lang="c"><span>
</span><span style="color:#33ffff;">bool </span><span style="font-weight:bold;color:#838fff;">CheckLevelCollision</span><span>(Vector3 </span><span style="color:#ff9233;">entityPos</span><span>, Vector3 </span><span style="color:#ff9233;">entitySize</span><span>)
</span><span>{
</span><span> LevelData</span><span style="font-weight:bold;color:#33ffa0;">*</span><span> levelData </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>GetLevelData();
</span><span>
</span><span> BoundingBox entityBox </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>(BoundingBox){(Vector3){ entityPos.x </span><span style="font-weight:bold;color:#33ffa0;">-</span><span> entitySize.x</span><span style="font-weight:bold;color:#33ffa0;">/</span><span style="color:#ff9233;">2</span><span>,
</span><span> entityPos.y </span><span style="font-weight:bold;color:#33ffa0;">-</span><span> entitySize.y</span><span style="font-weight:bold;color:#33ffa0;">/</span><span style="color:#ff9233;">2</span><span>,
</span><span> entityPos.z </span><span style="font-weight:bold;color:#33ffa0;">-</span><span> entitySize.z</span><span style="font-weight:bold;color:#33ffa0;">/</span><span style="color:#ff9233;">2 </span><span>},
</span><span> (Vector3){ entityPos.x </span><span style="font-weight:bold;color:#33ffa0;">+</span><span> entitySize.x</span><span style="font-weight:bold;color:#33ffa0;">/</span><span style="color:#ff9233;">2</span><span>,
</span><span> entityPos.y </span><span style="font-weight:bold;color:#33ffa0;">+</span><span> entitySize.y</span><span style="font-weight:bold;color:#33ffa0;">/</span><span style="color:#ff9233;">2</span><span>,
</span><span> entityPos.z </span><span style="font-weight:bold;color:#33ffa0;">+</span><span> entitySize.z</span><span style="font-weight:bold;color:#33ffa0;">/</span><span style="color:#ff9233;">2 </span><span>}};
</span><span>
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">for </span><span>(</span><span style="color:#33ffff;">int</span><span> i</span><span style="font-weight:bold;color:#33ffa0;">=</span><span style="color:#ff9233;">0</span><span>; i </span><span style="font-weight:bold;color:#33ffa0;"><</span><span> levelBlockAmount; i</span><span style="font-weight:bold;color:#33ffa0;">++</span><span>)
</span><span> {
</span><span> Vector3 wallPos </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> levelData[i].levelBlockPosition;
</span><span> Vector3 wallSize </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>{</span><span style="color:#ff9233;">1.0</span><span style="color:#33ffff;">f</span><span>,</span><span style="color:#ff9233;">1.0</span><span style="color:#33ffff;">f</span><span>,</span><span style="color:#ff9233;">1.0</span><span style="color:#33ffff;">f</span><span>};
</span><span> BoundingBox levelBox </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>(BoundingBox){(Vector3){ wallPos.x </span><span style="font-weight:bold;color:#33ffa0;">-</span><span> wallSize.x</span><span style="font-weight:bold;color:#33ffa0;">/</span><span style="color:#ff9233;">2</span><span>,
</span><span> wallPos.y </span><span style="font-weight:bold;color:#33ffa0;">-</span><span> wallSize.y</span><span style="font-weight:bold;color:#33ffa0;">/</span><span style="color:#ff9233;">2</span><span>,
</span><span> wallPos.z </span><span style="font-weight:bold;color:#33ffa0;">-</span><span> wallSize.z</span><span style="font-weight:bold;color:#33ffa0;">/</span><span style="color:#ff9233;">2 </span><span>},
</span><span> (Vector3){ wallPos.x </span><span style="font-weight:bold;color:#33ffa0;">+</span><span> wallSize.x</span><span style="font-weight:bold;color:#33ffa0;">/</span><span style="color:#ff9233;">2</span><span>,
</span><span> wallPos.y </span><span style="font-weight:bold;color:#33ffa0;">+</span><span> wallSize.y</span><span style="font-weight:bold;color:#33ffa0;">/</span><span style="color:#ff9233;">2</span><span>,
</span><span> wallPos.z </span><span style="font-weight:bold;color:#33ffa0;">+</span><span> wallSize.z</span><span style="font-weight:bold;color:#33ffa0;">/</span><span style="color:#ff9233;">2 </span><span>}};
</span><span>
</span><span> DrawBoundingBox(levelBox,GREEN);
</span><span>
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">if </span><span>(CheckCollisionBoxes(entityBox,levelBox))
</span><span> {
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return </span><span style="color:#ff9233;">true</span><span>;
</span><span> }
</span><span> }
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return </span><span style="color:#ff9233;">false</span><span>;
</span><span>}
</span></code></pre>
<p>It's probably not the most efficient, but it works! I basically followed the example here: <a href="https://www.raylib.com/examples/web/models/loader.html?name=models_box_collisions">https://www.raylib.com/examples/web/models/loader.html?name=models_box_collisions</a></p>
<h2 id="about-raycasts"><a class="zola-anchor" href="#about-raycasts" aria-label="Anchor link for: about-raycasts">About raycasts</a></h2>
<p>When comparing mesh and raycast, make sure you use proper Transform matrix! This was something I struggled for long time, but luckily I got Raylib discord to help me.</p>
<p>Here's how I got my player weapon raycasting collide with the level:</p>
<pre data-lang="c" style="background-color:#181818;color:#ffffff;" class="language-c "><code class="language-c" data-lang="c"><span style="color:#33ffff;">float </span><span style="font-weight:bold;color:#838fff;">TestLevelHit</span><span>(Ray </span><span style="color:#ff9233;">rayCast</span><span>)
</span><span>{
</span><span> </span><span style="color:#33ffff;">float</span><span> distance </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> INFINITY;
</span><span> LevelData</span><span style="font-weight:bold;color:#33ffa0;">*</span><span> levelData </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>GetLevelData();
</span><span> </span><span style="color:#808080;">//Make sure the level size is all the cubes
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">for </span><span>(</span><span style="color:#33ffff;">int</span><span> i</span><span style="font-weight:bold;color:#33ffa0;">=</span><span style="color:#ff9233;">0</span><span>; i </span><span style="font-weight:bold;color:#33ffa0;">< </span><span>GetLevelBlockAmount(); i</span><span style="font-weight:bold;color:#33ffa0;">++</span><span>)
</span><span> {
</span><span>
</span><span> Vector3 pos </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> levelData[i].levelBlockPosition;
</span><span> RayHitInfo hitLevel </span><span style="font-weight:bold;color:#33ffa0;">= </span><span>GetCollisionRayMesh(rayCast,levelData[i].levelBlockModel.meshes[</span><span style="color:#ff9233;">0</span><span>],MatrixTranslate(pos.x,pos.y,pos.z));
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">if </span><span>(hitLevel.hit)
</span><span> {
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">if </span><span>(hitLevel.distance </span><span style="font-weight:bold;color:#33ffa0;"><</span><span> distance)
</span><span> {
</span><span> distance </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> hitLevel.distance;
</span><span> id </span><span style="font-weight:bold;color:#33ffa0;">=</span><span> levelData[i].modelId;
</span><span> }
</span><span> }
</span><span>
</span><span> }
</span><span> </span><span style="font-weight:bold;color:#33ffa0;">return</span><span> distance;
</span><span>}
</span></code></pre>
<p><strong>You can find the full code of my Raylib FPS here: <a href="https://github.com/Akselmo/Artificial-Rage">https://github.com/Akselmo/Artificial-Rage</a></strong></p>
<p>I hope these code snippets will be useful to someone who is battling with same problems!</p>
How and why I got into gamedevSun, 30 May 2021 00:00:00 +0000Akselipersonalgamedev
https://akselmo.dev/posts/how-and-why-i-got-into-gamedev/
https://akselmo.dev/posts/how-and-why-i-got-into-gamedev/<p>I’ve tried many, many creative outlets and other hobbies.<span id="continue-reading"></span> I’ve tried writing, drawing, painting, playing guitar, playing piano and some more. I’ve tried many hobbies among gaming, such as football (not handegg) and airsoft (which I actually really liked).</p>
<p>But every time, I’ve quit those things. I’ve maybe tried to pick them up later, but end up quitting. I just never got that something out of them. So I only had gaming as my hobby.</p>
<p>Before I explain how I got into actual gamedev, I’ve actually been making “games” for long time. In fact, I made my first “game” when I was around 5-6 years old. This “game” didn’t include programming or anything like that. And no, it wasn’t a board-game nor a card-game, although I made couple of those too.</p>
<p>It was, what I like to call, a <strong>PowerPoint-game</strong>.</p>
<p><strong>A what?!</strong> Yeah, hear me out.</p>
<p>Let’s go back to sometime during 1999-2002, I was about 6 – 11 years old. We used to visit my grandparents often, since they had a PC with internet access: 56kbps modem that let out the screech of the damned when it connected. We didn’t have a PC during that time. Our parents used it to pay bills, and my grandparents got the PC for work e-mail. And I got to use it too, mostly for DOS games, such as Mad Dog 2, NASCAR, Tomb Raider, Descent, Jazz Jackrabbit… Can’t forget the Windows classics either, like Chip’s Challenge, Rodent’s Revenge and SkiFree. Many goodies. Most of them were shareware though, but I had so much fun playing them.</p>
<p>But I always found the MS Office software interesting too, possibly because the words “document” (“Asiakirja” in Finnish, translates directly to “case-book” or something like that) etc. sounded cool to me. So I made often all kinds of stupid documents and PowerPoint -presentations, Excel sheets, even MS Access things.</p>
<p>I figured out eventually that in PowerPoint you could assign certain elements do certain things. You could insert buttons that change slides or even animate images. You can see where this is going.</p>
<p>My first “game” was basically a PowerPoint presentation, where the player could move an image of a car around by pressing buttons that were arranged as direction keys. I thought it was super cool and enjoyed playing with it a lot. Sometimes even more than playing games. But I didn’t really realise what I was doing, I only realised this many years after that hey, I actually did some sort of game.</p>
<p>“But that’s not a game!” Yeah, I agree with you, that’s why I quoted it. But it was close to one. It was interactive thing, where you could move an object by pressing direction buttons.</p>
<p>I just want to mention that I also made my first webpage during that age. I had a crappy old Win 95 PC that took literally 10 minutes to boot up. I installed some free games on it from random discs we got with computer magazines, but I spent a lot of time just making things with MS Frontpage.</p>
<p><img src="/assets/images/ekasivu.png" alt="My first webpage" /></p>
<p>This is the only thing I’ve saved from that time. I had it on some old floppy disk and saved those files on my external hard drive, where they are to this day. Anyway, of course none of those forms work. But, the “Tyhjennys” (clear) button does! And the “Aloita etsintä” (search) button tries to search something.</p>
<p>I also had a more elaborate site, that had sidebar where user could login and such, and it had multiple pages. Most of them were nonsense about things I liked. Wish I still had that site, I remember talking about it at school and my classmates mostly laughed at me. I don’t think my parents really understood what was so cool about just a page full of text and forms either, heh.</p>
<p>Anyway, I found this kind of thing super fun. Especially the PowerPoint “games.”</p>
<p>Now let’s go to around year 2005 – 2007. I make my first Morrowind mod during those times, that was a mod for a gaming forum I used to frequent on. I asked the people there what kind of characters they have and recreated them all around a campsite, and gave them their own dialogue. Seeing characters talk in Finnish in Morrowind was kinda funny. I loved making that mod, too bad I don’t have it anymore.. I also made somekind of house mod later, adding a new house for my character.</p>
<p>2008, I made my first game. I used an engine called FPSCreator, that let anyone make first-person shooter games very easily. My first game was called “Ammu tai Kuole” (Shoot or Die), where you spawn in a room full of guns, then go through a door to an open field and you have to keep killing respawning enemies as long as you can. You can’t go back into the room where you spawned in.</p>
<p><img src="/assets/images/ak1.png" alt="Ammu tai kuole: beautiful menu" /></p>
<p><img src="/assets/images/ak2.png" alt="Ammu tai kuole: arena" /></p>
<p><img src="/assets/images/ak3.png" alt="Ammu tai kuole: AGH IM HIT" /></p>
<p><img src="/assets/images/ak4.png" alt="Ammu tai kuole: GUNS" /></p>
<p>By the way, if you run this game on modern computer, it runs so fast you die in seconds. The FPS is directly tied to game speed. It's great, rofl.</p>
<p>The game was based on some inside joke my friend told me, I can’t really remember that well, but I thought the game was hilarious. Especially the menu graphics made in 5 min with Paint. It wasn’t a super seriously done game, even back then. I knew it was shite. But I was still kinda happy that I had made a game.. So I tried to make a more serious one, about you waking up in a laboratory full of zombies, and you had just a pistol. It was pretty much inspired by Half-Life. You had to crawl in ventilation ducts and hallways, shoot things etc. But I never got it fully done, I think I just made the first level. But I remember it really well, and it was the thing that sparked my interest into game development.</p>
<p>I also made a text-adventure with C++, which was just basically bunch of if-statements and choices that end in a way or another. It wasn’t very long, but it was fun to do.</p>
<p>When it comes to webpages, I played around with JavaScript and made those dumb “What’s your name? Oh your name is X, your name is stupid.” things and clocks. It was entertaining at least.</p>
<p>Another thing I did was those dumbass VBS scripts that would never go away and put them on our school computers, because I was such a h4x0r.</p>
<p>Anyway, fast forward to 2013. I got into an art-school that had also gamedev stuff. But no programming. So I had to learn that myself. Anyway, during that time, I made my first Unity-games and other prototype/demo things. This was when I actually got really into gamedev, and it became my thing.</p>
<p>I finally had a thing. Not drawing, writing, music.. It was gamedev. It’s basically all of those, plus programming. I always enjoyed making things difficult to myself, I guess. Luckily I have Tecsie to help me with the artsy side, and friends to help me with other sides, so I can concentrate mostly on programming.</p>
<p>That’s how I got into gamedev.</p>
<h2 id="so-how-do-i-like-it-so-far"><a class="zola-anchor" href="#so-how-do-i-like-it-so-far" aria-label="Anchor link for: so-how-do-i-like-it-so-far">So, how do I like it so far?</a></h2>
<p><em>It’s fucking awesome. Seriously.</em></p>
<p>The excitement of making a thing moveable. Then adding physics to it. Then making a world for it. Then adding other moving things to that world. Then making the things interact with each other. It’s like making whole worlds. But it’s really, REALLY difficult!</p>
<p>I’m not a pro at this by all means. I’m very amateurish still, even after +5 years of gamedev. It’s a constant learning process, and most of the things you have to learn yourself. The games I’ve made so far are quite bad when compared to others, but I am still proud of every single one of them I’ve done. And as long as they make someone, even one person smile, I’m happy. Sounds very cliche, but that’s how I honestly feel about it.</p>
<p>For example, <a href="https://akselmo.itch.io/penance">Penance</a> has been hugely popular (compared to my other titles). And I've been told that it's great. People want more of it, which I just can't even begin to understand, because I know what kind of buggy mess it actually is.</p>
<p><img src="/assets/images/penance.png" alt="Penance" /></p>
<p>I was told someone wanted to know how I come up with concept for a game. It all just simply pops up in my head, when I’m trying to sleep or concentrate on something else. “Oh, this idea sounds fun.” I think, then start writing things down (and lose my sleep). What is the core of the game, what makes it fun, what does it need and so on. At that point, the concept possibly dies because “I don’t have skills/resources for it” or “It doesn’t sound that good after all.” But sometimes, the concept lives on forward and it joins my neverending list of game ideas, that I hopefully tackle on someday.</p>
<p>Currently I'm working on an RPG called Loputon with Unity and unnamed Scifi FPS made with C using <a href="https://www.raylib.com/">Raylib</a>.</p>
<p><em>In conclusion, gamedev is my thing. I love it and I hope to make games till the end. If you haven’t felt at home with drawing, writing, video making or other creative outlets, give gamedev a try!</em></p>
<p>+++</p>
<p><em>Note: This post was originally for <a href="https://tecsielity.wordpress.com/2018/10/13/guest-post-how-and-why-i-got-into-game-dev-akselmo/">Tecsiederp's (my fiancees) blog</a>, however I wanted to preserve it here as well. It was originally written in 2018-10-13, and I have removed outdated information.</em></p>
Quick CMake setup for VSCodeSat, 29 May 2021 00:00:00 +0000Akselidevelopmentsoftware
https://akselmo.dev/posts/quick-cmake-setup/
https://akselmo.dev/posts/quick-cmake-setup/<p>When setting up my <a href="https://github.com/Akselmo/Artificial-Rage">ScifiFPS</a> C/<a href="https://www.raylib.com/">Raylib</a> project,<span id="continue-reading"></span> I was having lots of problems with Makefiles. Apparently this is not uncommon, however I'm pretty new in C and makefiles in the first place, <em>and</em> setting it all up with VSCode was also a bit of a hassle.</p>
<p>I however managed to get my CMake files work nicely with VSCode. Keep in mind this <strong>has only been tested on Windows</strong>, because as much as I'd love to run Linux as my daily driver, I haven't had the chance to do the switch yet. Also this was made for <strong>Raylib</strong> project, so you probaby will have to modify your build command etc. to suit your needs.</p>
<p><strong>If you just want to get VSCode to build your project using CMake Tools when you press F5, skip to section 4!</strong></p>
<h4 id="here-s-how-i-got-vscode-build-my-raylib-c-project-with-cmake-on-windows"><a class="zola-anchor" href="#here-s-how-i-got-vscode-build-my-raylib-c-project-with-cmake-on-windows" aria-label="Anchor link for: here-s-how-i-got-vscode-build-my-raylib-c-project-with-cmake-on-windows">Here's how I got VSCode build my Raylib C project with CMake on Windows:</a></h4>
<ol>
<li>
<p>First, download <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools">CMake Tools -extension</a> for your VSCode. You'll also have to install <a href="https://cmake.org/">CMake</a></p>
</li>
<li>
<p>In the root of your C project folder, add <code>CMakeLists.txt</code> and copy the following to the file</p>
<pre data-lang="cmake" style="background-color:#181818;color:#ffffff;" class="language-cmake "><code class="language-cmake" data-lang="cmake"><span style="color:#838fff;">cmake_minimum_required</span><span>(</span><span style="color:#ff9233;">VERSION </span><span>3.0)
</span><span style="color:#838fff;">project</span><span>(scififps C)
</span><span>
</span><span style="color:#838fff;">set</span><span>(CMAKE_C_STANDARD 99)
</span><span>
</span><span style="color:#838fff;">add_subdirectory</span><span>(src)
</span><span>
</span><span style="color:#838fff;">add_executable</span><span>(${PROJECT_NAME} ${SOURCE_CODE})
</span><span style="color:#808080;">#Currently compiles only for Windows.
</span><span style="font-weight:bold;color:#33ffa0;">IF </span><span>(WIN32)
</span><span> </span><span style="color:#808080;">#ADD YOUR WINDOWS COMPILE COMMAND HERE
</span><span> </span><span style="color:#808080;">#I used following for Raylib.
</span><span> </span><span style="color:#838fff;">target_link_libraries</span><span>(${PROJECT_NAME} </span><span style="color:#ff9233;">PRIVATE </span><span>${CMAKE_CURRENT_SOURCE_DIR}/lib/libraylib.a opengl32 gdi32 winmm)
</span><span style="font-weight:bold;color:#33ffa0;">ELSE</span><span>()
</span><span> </span><span style="color:#808080;">#Here goes other platforms. You can make your own for Linux and such.
</span><span style="font-weight:bold;color:#33ffa0;">ENDIF</span><span>()
</span><span>
</span><span style="color:#838fff;">target_compile_definitions</span><span>(${PROJECT_NAME} </span><span style="color:#ff9233;">PUBLIC </span><span>ASSETS_PATH=</span><span style="color:#5fff33;">"${</span><span>CMAKE_CURRENT_SOURCE_DIR</span><span style="color:#5fff33;">}/assets/"</span><span>)
</span><span>
</span></code></pre>
<p>And yes, I know I could have built the libraylib.a straight from source, but I didn't want to build libraylib.a every time I build the game.</p>
</li>
<li>
<p>Put this in your <code>src</code> directory inside <code>CMakeLists.txt</code> file</p>
<pre data-lang="cmake" style="background-color:#181818;color:#ffffff;" class="language-cmake "><code class="language-cmake" data-lang="cmake"><span style="color:#838fff;">file </span><span>(</span><span style="color:#ff9233;">GLOB_RECURSE </span><span>SOURCE_CODE *.h *.c)
</span><span style="color:#838fff;">set </span><span>(SOURCE_CODE </span><span style="color:#5fff33;">"${</span><span>SOURCE_CODE</span><span style="color:#5fff33;">}" </span><span style="color:#ff9233;">PARENT_SCOPE</span><span>)
</span></code></pre>
<p>This will fetch all the *.h and *.c files and link them to source code, so you don't have to type them all. Thanks to <a href="https://github.com/GoldenThumbs/raylibGame/blob/main/src/CMakeLists.txt">GoldenThumbs</a> for showing me this!</p>
</li>
<li>
<p>To get VSCode build your project when you press F5, add the following to your project root inside <code>.vscode</code> folder.</p>
<p><code>launch.json</code></p>
<pre data-lang="json" style="background-color:#181818;color:#ffffff;" class="language-json "><code class="language-json" data-lang="json"><span>{
</span><span> </span><span style="color:#5fff33;">"version"</span><span>: </span><span style="color:#5fff33;">"0.2.0"</span><span>,
</span><span> </span><span style="color:#5fff33;">"configurations"</span><span>: [
</span><span> {
</span><span> </span><span style="color:#5fff33;">"name"</span><span>: </span><span style="color:#5fff33;">"Run target"</span><span>,
</span><span> </span><span style="color:#5fff33;">"type"</span><span>: </span><span style="color:#5fff33;">"cppdbg"</span><span>,
</span><span> </span><span style="color:#5fff33;">"request"</span><span>: </span><span style="color:#5fff33;">"launch"</span><span>,
</span><span> </span><span style="color:#5fff33;">"preLaunchTask"</span><span>: </span><span style="color:#5fff33;">"build"</span><span>,
</span><span> </span><span style="color:#5fff33;">"program"</span><span>: </span><span style="color:#5fff33;">"${command:cmake.launchTargetPath}"</span><span>,
</span><span> </span><span style="color:#5fff33;">"cwd"</span><span>: </span><span style="color:#5fff33;">"${workspaceFolder}/build"
</span><span> }
</span><span> ]
</span><span>}
</span></code></pre>
<p><code>tasks.json</code></p>
<pre data-lang="json" style="background-color:#181818;color:#ffffff;" class="language-json "><code class="language-json" data-lang="json"><span>{
</span><span> </span><span style="color:#5fff33;">"version"</span><span>: </span><span style="color:#5fff33;">"2.0.0"</span><span>,
</span><span> </span><span style="color:#5fff33;">"tasks"</span><span>: [
</span><span> {
</span><span> </span><span style="color:#5fff33;">"label"</span><span>: </span><span style="color:#5fff33;">"build"</span><span>,
</span><span> </span><span style="color:#5fff33;">"type"</span><span>: </span><span style="color:#5fff33;">"shell"</span><span>,
</span><span> </span><span style="color:#5fff33;">"command"</span><span>: </span><span style="color:#5fff33;">"{cmake.debugTarget}"</span><span>,
</span><span> </span><span style="color:#5fff33;">"options"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"cwd"</span><span>: </span><span style="color:#5fff33;">"${workspaceFolder}/build"
</span><span> },
</span><span> </span><span style="color:#5fff33;">"group"</span><span>: {
</span><span> </span><span style="color:#5fff33;">"kind"</span><span>: </span><span style="color:#5fff33;">"build"</span><span>,
</span><span> </span><span style="color:#5fff33;">"isDefault"</span><span>: </span><span style="color:#ff9233;">true
</span><span> }
</span><span> },
</span><span> ]
</span><span>}
</span></code></pre>
<p>Now every time you press F5, VScode uses the Cmake extension to build and debug your project.</p>
</li>
</ol>
<h3 id="that-should-be-it"><a class="zola-anchor" href="#that-should-be-it" aria-label="Anchor link for: that-should-be-it">That should be it!</a></h3>
<p>Again, remember that the first <code>CMakeLists.txt</code> file I mentioned, the one that goes to the root of your project, you may have to tailor for your own needs. The one I copied there works for me when I build Raylib projects.</p>
<p>Also, <strong>I'm new in all of things related to C!</strong> If you have better ideas how to make CMake files, don't hesitate to contact me on my <a href="https://www.twitter.com/akselmo">twitter</a> or if you spot me in Discord. I'd like to know and learn.</p>
<p>However I hope this is useful someone! Happy coding, and happy less-make-file..ing. <em>That sounded better in my head..</em></p>
Welcome to my dev blog!Sat, 29 May 2021 00:00:00 +0000Akselipersonal
https://akselmo.dev/posts/welcome-to-my-dev-blog/
https://akselmo.dev/posts/welcome-to-my-dev-blog/<p>Man this took long time to set up.<span id="continue-reading"></span> I first tried to get Jekyll set up on my own server, but I couldn't get it to work. I also tried Hugo and all kinds of other website platforms. Setting up servers really ain't for me, but oh well.</p>
<p>Anyway, hi! I wanted to make a place where I can share my programming and gamedev related stuff. While writing this, I'm working on an RPG with Unity, and a small FPS with C using Raylib library.</p>
<p>Hopefully you will find this blog entertaining and maybe even useful.</p>
<p>Now I'm gonna go play something, I spent way too long setting things up.</p>
<p>Meanwhile you're here, check out my <a href="https://akselmo.itch.io/">itch.io</a>!</p>
<p>Cheers!</p>
<p>PS. Don't change your github page theme through github itself. It just breaks the site.</p>
Bitksel - I joined One Hour Game JamSat, 16 Jun 2018 00:00:00 +0000Akselipersonalbitkselgame
https://akselmo.dev/posts/i-joined-one-hour-game-jam/
https://akselmo.dev/posts/i-joined-one-hour-game-jam/<p>This is how it went, or at least how I remember it. It was so hectic this may be out of order but anyway!<span id="continue-reading"></span></p>
<p><a href="http://onehourgamejam.com/">One Hour Game Jam</a> is a gamejam where everyone has to make a game, you guessed it, in one hour.</p>
<p>The theme for the jam I joined was "Your favorite game but as simple as possible." So naturally, I recreated Elder Scrolls 3: Morrowind in simplest way I could think, meanwhile trying to make it in an hour.</p>
<p>IT WAS STRESSFUL! Super stressful, but so so rewarding when you got something made. I had never done this kind of gamejam before, so I had no idea how stressful would it get. I managed to calm myself down by just thinking that it's just for good fun, so no need to stress about it. Then I got to work.</p>
<p>First, I used Unity speedtree to make some trees. Just quickly whipped up something and moved on. Two kinds of trees were made, dead and normal trees. Dead trees were just normal trees without leaves.</p>
<p>I then proceeded to make a terrain. I didn't try to make it look like Morrowind world map since I didn't have time to think such things, just wanted to make something that vaguely looked like Vvardenfell. Few hills here and there, and tall mountain in middle of it.</p>
<p>For terrain I needed some textures. Instead of using default textures, I opened Pyxel and whipped up few lowres (32x32) textures. Grass, swamp, lava, stone and ash. Then I applied those to the terrain, and proceeded to paint the terrain with trees.</p>
<p>After the terrain was done I added the default Unity FPS character to the scene. I got myself some sound effects for walking on grass, edited them in audacity and replaced the default sound effects.</p>
<p>Under terrain I just added a plane with water material that came with Unity default assets. Didn't think much on that. I had to raise my terrain however and make it a bit different, since I wanted a tiny river go through the terrain.</p>
<p>Since it's Morrowind, it needed tall mushrooms because those are a staple for Morrowind. I made them from Unity's own 3D objects, just a cylinder with a flat sphere on top of it. I covered some areas with those mushrooms, but learned I couldn't use the terrain editor's tree tool for that for some reason.</p>
<p>40 minutes was suddenly gone. I had 20 minutes left.</p>
<p>I proceeded to look for a background music, because that's important for atmosphere, which was my main thing in this game: Make it feel at least a little bit like Morrowind.</p>
<p>This took me ten minutes or so. Finding a good background music, which also has proper license was difficult. But I got lucky and found something from <a href="http://freemusicarchive.org/">Free Music Archive</a>, thanks to their good search function.</p>
<p>10 minutes left.</p>
<p>I quickly added a cube to the player object, then made it a rectangle, then gave it a shiny metallic material. Then I animated it to swing around a bit, and attached a script that would play that animation whenever player clicked mouse button.</p>
<p>Time for testing! When I moved around and swung my sword, it would fly off a bit, because of coordinates ruining my animation. Just removed those coordinates and tried again. Now the sword worked.</p>
<p>I was around 4 minutes overtime when everything was done. I thought that this is as good as it gets and built the project and put it on my itch.io.</p>
<p><a href="https://akselmo.itch.io/the-simple-books-simplewinds">https://akselmo.itch.io/the-simple-books-simplewinds</a></p>
<p>Give it a try!</p>
<p><img src="https://bitkselblog.files.wordpress.com/2018/06/cover.png" alt="cover" /></p>
<h2 id="my-feelings-after-the-whole-thing"><a class="zola-anchor" href="#my-feelings-after-the-whole-thing" aria-label="Anchor link for: my-feelings-after-the-whole-thing">My feelings after the whole thing</a></h2>
<p>It was super stressful for me, but it also helped me to think _less. _I had to come up with something, anything and not think about the small things at all. This kind of workflow gave me lots of freedom to do anything and it was really refreshing!</p>
<p>After I got it uploaded on itch.io and the site, I was relieved and happy. I made a game in an hour. Sure I used a lot of Unity's features, but whatever, I'm pleased with myself. If I ever join this next time, I know how it'll be like and how to work with things. I may even try to make something that requires more coding.</p>
<p>All these games are streamed by the 1HGJ people, so it was nice to see my game being played. The guy streaming mentioned that I should've added acrobatics stat and jumping around would've make my character acrobatics skill higher. Great idea, but even if I had thought of that, I wouldn't have had the time to make it. Cutting corners was essential.</p>
<p>All in all, refreshing and pleasant experience. I recommend it to anyone who is into gamedev! It's weekly thing, every saturday and only one hour of your life, so why not? :D</p>
Bitksel - Space Craze: ASTROXSun, 25 Mar 2018 00:00:00 +0000Akselipersonalbitkselgame
https://akselmo.dev/posts/space-craze-astrox/
https://akselmo.dev/posts/space-craze-astrox/<p>More space games! This time I'm writing about a very simple yet addicting spaceship game called ASTROX: Hostile Space Excavation. I really enjoyed this game and it's getting a sequel soon!<span id="continue-reading"></span></p>
<p>ASTROX is a space simulation game where you can mine, haul, do missions and of course shoot pirates. You start the game in a dinky little ship out in the butt of space, and the only way now is up. You must gather resources to buy better ships, upgrade them and make a name for yourself. It is rather simple on paper, but that is what makes the game so addictive. If you have ever played EVE Online, this game is a bit like EVE-lite.</p>
<p>First when you launch the game, you are allowed to modify the rules for your universe. Every play session can be as different or similar as you want and I love it when games let you tweak settings extensively. Everything from starting spaceship to universe size and pirate aggression can be tweaked.</p>
<p><img src="https://bitkselblog.files.wordpress.com/2018/03/astrox_2018-03-25_20-52-54.png" alt="astrox_2018-03-25_20-52-54" /></p>
<p>After setting up your universe settings and choosing your characters face (there's just a few premade face images), it's time to play.</p>
<p>[gallery ids="399,404,398" type="rectangular"]</p>
<p>There's no real story or anything, but you're being told that you're a prisoner that is working for some entity to gain freedom. However I like to think that I have a different story every time, from bounty hunter to miner and so on. It's sandbox game, so do whatever you wish!</p>
<p>The UI is really simple and has the basic functions stated very clearly. Most of the time you are controlling your ship with autopilot, but you can use WASD to move your ship aswell, even though it feels a bit too sensitive. You can also fly from first person view, however it can get disorienting. Unfortunately in first person view you don't see your cockpit or anything like that, which is something I require from all the space sims I like to play.</p>
<p>Usually at beginning, it's good idea just to mine away. Dock to a station, buy a better cargohold, then fill it with ore and sell it all. Repeat this until you have money for a better ship, because the scout ship you get at the beginning is not very good for really anything.</p>
<p>Mining is simple activity, you just target an asteroid, activate your mining lasers and.. Wait. You can also purchase mining drones and better mining lasers to accelerate the process.</p>
<p>[gallery ids="401,402,403" type="rectangular"]</p>
<p>In stations, you can sell and buy things at the market, refine or sell your ore, buy ships, accept missions, modify your ship and you know, the basic station stuff. The UI is very simplistic and clear, so it's not hard to navigate around the menus. One thing to remember is to every so often level up your characters skills in the universities found around stations. The skills can cost a lot of money, but upgrading them will be worthwhile. I recommend getting reduce fuel usage -skills at first, since otherwise you can get a nice fast ship, but run out of fuel quickly.</p>
<p>[caption id="attachment_400" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2018/03/astrox_2018-03-25_20-58-19.png" alt="astrox_2018-03-25_20-58-19" /> You can see your characters skills and achievements in the character menu[/caption]</p>
<p>Which brings us to the spaceship mechanics. Your ship has hull health, shield health, power and fuel. Shield protects your hull, if your hull explodes you are dead, power is used for modules and fuel is used by engines. If you run out of fuel, your engines will use power instead. In my older saves (which I lost because my computer went potato) I had a ship that ran really quick out of fuel, but could keep power at max for long time even when firing your weapons and using power as your fuel. So yes, you can do bit of trickery with different ship outfits and modifications. It's as fun as it sounds! Also some ships turn faster than others and your ships modules can affect that.</p>
<p>[gallery ids="409,405,406" type="rectangular"]</p>
<p>Then there's combat. The ship aims for you, all you have to do is to activate your weapons, select your enemy and get close enough. Monitor your power though, it can run out quickly, depending on your modules. There's three kinds of weapons: laser, projectile and missiles. Laser don't need ammo, but they can eat a lot of power. Projectile weapons eat barely any power, but they use ammo. And missiles are, well, missiles. Bigger ships can also use drones to fight other ships.</p>
<p>Most fights are easy (depending on your settings of course), however if you stray into some corner of space that is full of pirates, you may get annihilated in seconds. I love that. It adds so much danger and excitement to the game. Be careful where you jump.</p>
<p>[caption id="attachment_407" align="alignnone" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2018/03/astrox_2018-03-25_21-03-29.jpg" alt="astrox_2018-03-25_21-03-29" /> System map[/caption]</p>
<p>[caption id="attachment_408" align="alignnone" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2018/03/astrox_2018-03-25_21-03-43.jpg" alt="astrox_2018-03-25_21-03-43" /> Universe map, every universe is a bit different, depending on your settings[/caption]</p>
<p>System and universe maps are opened by just zooming out. System map is really just real time view of everything in the system, the game just slaps icons on ships and other things to make them more clearer from far away. If you zoom even further out, you get the universe map. I kinda like this kind of map system, because it shows you all you need and very quickly too, just one scroll away. I would like it to be a bit more "flashier" though, maybe have different background when you have zoomed out, like something more computer-y.</p>
<p>All in all, everything seems pretty self explanatory, right? The game isn't difficult to learn at all, but it has it's own quirks and knickknacks you will learn during play. It's not a big game, nor best simulation ever with the most realistic physics, but it doesn't try to be that either. It just simulates the life of spaceship captain and it does it well. Sure the graphics look like from 2005, but to me that's part of the charm. The sound effects and music remind me of late 90's and early 2000's space games, and it has it's own great atmosphere. I'm sure this game would also work well on older PC's too.</p>
<p>What really blows my mind is that all of this has been greated by just one dude, <a href="https://www.youtube.com/user/jacemasula">Jace Masula</a>. And now he is creating a sequel for this game. I can't wait to get to try it, since there's been so many improvements. In his Youtube channel, you can find devlogs about the newest game. Hats off to you Jace, hope to create something as cool as you have someday!</p>
<p>ASTROX does exactly what it says on the tin, and I enjoy it a lot. It's a very relaxing space game and I like to play it when I don't feel like playing EVE. ;) I recommend this game for anyone who likes EVE and/or just wants a simple spaceship game. You can get it from <a href="http://store.steampowered.com/app/414720/Astrox_Hostile_Space_Excavation/">Steam</a> for only 10€ and I think the pricing is spot on.</p>
<p>Thanks for reading and fly safely! Or dangerously, if that's what you prefer.. ;)</p>
Bitksel - Space Craze: X3: Terran Conflict/Albion PreludeSat, 03 Mar 2018 00:00:00 +0000Akselipersonalbitkselgame
https://akselmo.dev/posts/space-craze-x3-terran-conflict-albion-prelude/
https://akselmo.dev/posts/space-craze-x3-terran-conflict-albion-prelude/<p>Sorry for the month of silence, I didn't have much time/energy to write anything here.<span id="continue-reading"></span> But now, I wanna tell you guys about a space sim that I really like! I'm playing the Albion Prelude expansion in these screenshots, but TC and AP are really similar to each other. AP just has some quality of life fixes and a huge war going on in a few systems.</p>
<p>X3: Terran Conflict is a very popular space sim in space sim communities. The game basically throws you into a huge universe in a dinky lil ship and then tells you to do whatever you want. This can be overwhelming at the beginning, but when you start realising how things work and what there is to do, it gets fun!</p>
<p>[caption id="attachment_385" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2018/03/x3ap_2018-03-03_16-04-02.jpg" alt="X3AP_2018-03-03_16-04-02" /> Me and my Nova[/caption]</p>
<p>There's multiple ways to start the game: different kind of scenarios or custom game. Scenarios have stories tied to them and you get different amounts of money and ships to start the game with. I prefer custom game myself, since it detaches you from the story and let's you do whatever you wish. It's more a playground for modders, but I found it enjoyable.</p>
<p>[caption id="attachment_386" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2018/03/x3ap_2018-03-03_16-00-16.png" alt="X3AP_2018-03-03_16-00-16" /> I haven't even discovered all the systems yet.[/caption]</p>
<p>[caption id="attachment_392" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2018/03/dllhost_2018-03-03_16-44-26.png" alt="dllhost_2018-03-03_16-44-26" /> You travel between systems via these stargates. If your ship has a jump module, you can use that too.[/caption]</p>
<p>The player can choose to do whatever they wish in this huge X3 universe. There's the good old trading, piratism, combat missions, delivery missions and so on. Unfortunately there's no simple bounty hunting system, but instead you have to buy a "police license" for certain race and then you're paid for every pirate killed in those systems. If you get rich enough, you can even build your own space stations and start selling your own products. You can even manufacture or buy lots of ships and assign them all to follow you, creating your own personal army. One of my favorite things to do was capturing pirate transports: Shoot the transport ship enough and sometimes the NPC jumps out the ship, leaving it to you. Then you can leave your own ship, capture the NPC ship and make it follow you, or fly it. I usually sell these ships, making nice profit, since transport ships aren't cheap. Another good way to make profit is the stock exchange: Buy company stocks for cheap, wait, sell them for high. Good, quick money, but some say it's a bit game breaking.</p>
<p>Spaceships! There's lots of them, I mean a lot. Every race has their own ships (there's about 8 races total), and there's multiple ship classes, from tiny civilian ships to huge titan class ships. I won't even list of them here, there's just.. So many. I'm flying a Fighter class ship Nova in my screenshots. Do note that the cockpits are not in the game by default! The cockpits are modded in, I'm using <a href="https://forum.egosoft.com/viewtopic.php?t=254635">PSCO1 CockpitMod v1.33</a> and I highly recommend it to anyone who wants to play this game, since it makes X3 so much more immersive. Traveling with ships in this game can be pretty slow, since there's no warp feature, but there's a SETA-button, that accelerates the game time. When you press it, the game fast forwards, so traveling becomes a bit more quicker. Just beware with autopilot while using SETA, sometimes the computer doesn't know what to do and crashes you into things, because the game is going too fast.</p>
<p>[caption id="attachment_387" align="alignnone" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2018/03/x3ap_2018-03-03_16-04-42.jpg" alt="X3AP_2018-03-03_16-04-42.jpg" /> A war is going on in this system, and I don't want to get caught in the middle of it.[/caption]</p>
<p>[caption id="attachment_388" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2018/03/x3ap_2018-03-03_16-10-01.jpg" alt="X3AP_2018-03-03_16-10-01" /> You can eject from your ship and repair it after a fight. No need to pay expensive repairing fees, just DIY![/caption]</p>
<p>The dogfighting in this game is really fun. Some ships are more nimbler than others, some can house more powerful guns and every ship can be tuned and upgraded the way you want it to be. My Nova is upgraded to the max and has lots of blasters, so it drains energy quickly when firing, but it does lots of damage. I also have bunch of missiles ready for bigger targets.</p>
<p>[gallery ids="391,390,389" type="slideshow"]</p>
<p>In X3, you can add tiny camera-windows that show your target. I really like these, since they help you to determine from further away if you hit your target or not. And of course, you can see the explosions better!</p>
<p>The game sounds good, but you can hear it's.. Oldness. The music is a bit weird too at times, but some songs have been really memorable. I tend to usually just play something from my own playlists however.</p>
<p>Last but not least, the game is really gorgeous. Even for an old game, the textures and graphics are really good. The cockpit mod I mentioned earlier adds more immersion to the game. I wish I had more screenshots, but I keep forgetting pressing the screenshot key.. :D</p>
<p>[caption id="attachment_393" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2018/03/x3ap_2018-03-03_16-01-04.jpg" alt="X3AP_2018-03-03_16-01-04" /> Menacing.[/caption]</p>
<p>X3: Terran War Pack can be bought from <a href="https://www.gog.com/game/x3_terran_war_pack">GOG</a> (and it's on -80% sale at the time of writing!!), it comes with both Terran Conflict and Albion Prelude. You can buy the same pack on <a href="http://store.steampowered.com/sub/12588/">Steam</a>, or just get them separately.</p>
<p>For new players, play with Terran Conflict at first, learn how to fly and all that, and then if you crave for big wars, go for Albion Prelude. There's lots of things to do, use your imagination!</p>
<p>PS. The "Space Craze" thing in the title is probably gonna be series of sci-fi games I'm gonna write about. Dunno what's next, but there's quite a few on my list.</p>
Bitksel - STRAFE, run 'n gun gore galoreSun, 07 Jan 2018 00:00:00 +0000Akselipersonalbitkselgame
https://akselmo.dev/posts/strafe-run-n-gun-gore-galore/
https://akselmo.dev/posts/strafe-run-n-gun-gore-galore/<p>Happy new year 2018 folks!<span id="continue-reading"></span> I decided the first blog post for this year would be about STRAFE, which is an old-school styled FPS. Fast, fun and gorey, just how I like my FPS games.</p>
<p>First of all, STRAFE had a bit rough start. People were critiquing it for it's bugginess, map design and especially for it's randomization. It says 90's on the tin, however the procedural generation stuff kind of implies about 2010's, making it a bit of mixed bag. This is an opinion some people still hold, however after the Millenium Edition update, things have smoothed out. And that's the version of the game I got.</p>
<p>Let's go with the positives first: STRAFE really nails the fast paced run 'n gun stuff I love. I'm a fan of games like Serious Sam, Painkiller, Quake, Tribes, Unreal.. So on and so forth. So the gameplay and style of STRAFE scratches my ye olde FPS itch.</p>
<p>Visually STRAFE looks really fun and old-school. However there's a bit too much "boxes" going on. Older games still tried to give as much shape as possible to their visual style, even though boxes were the basic shape. For example, look at the slideshow below and pause to the image that has the weapon selection. See those things guns are in? They could be a bit more round (With this, I mean slanted edges, not actual smooth roundness) and the textures could be bit more blurry (This is due to me always having texture filtering on in games when I was younger). Add more slanted edges to things, not everything has to be a box. BUT, this is just my opinion and it's probably stupid anyway.</p>
<p>[gallery ids="346,347,349" type="slideshow"]</p>
<p>At the beginning of the game, you choose between three weapons: Shotgun, Machinegun and Railgun. They all function differently (obviously) and I'm sure everyone can find a fitting weapon for their playstyle. I'm more the in-your-face kind of type, so I mostly pick shotgun. It's just so damn satisfying to use, but so are all guns. One interesting thing about guns is that the main gun doesn't have ammo pool, but has clips instead. So if you have 6 ammo left and reload, you will lose all those 6 ammo. Reload wisely!</p>
<p>There are bunch of different kind of enemies in the game, with distinct looks and behaviours. There's goblin looking enemies that try to melee you, yellow hazmatsuit enemies that throw grenades at you, blue suited enemies that fire guns at you and so on. The first three levels have very similar enemies, however starting from level 4 the game adds more enemies to the mix, like big rock dudes and weird blood-ants. There's also different variations of the enemies, however the silhouette is always the same, which is important. You always recognize the enemys behaviour, but they take/give different amounts of damage.</p>
<p>[caption id="attachment_351" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2018/01/20180107231815_1.jpg" alt="20180107231815_1" /> I actually have yet to finish the 4th map, I always die on this one.[/caption]</p>
<p>The maps are always randomised, but not completely: The maps are made out of modules that are big enough to be recognized as different parts of the map, so if you learn the module, you can use that knowledge in future even the whole map would be a bit different... If that makes sense. These modules are designed well and there's secrets to be found, so they're not boring and give you quite fun firefights.</p>
<p>To advance through maps, you have to find keycards a la Doom and Quake. They're found around the map, usually being held by some random dead body. I've also stumbled upon an eye-reader, that requires you to find a random head around the map and carry it in your hands to the eye-reader. It gives a little twist to the constant keycard hunting.</p>
<p>The movement in the game is really fast and there's no sprint key. You are always sprinting. If that's not enough, STRAFE has strafejumping and it's something I really like in FPS games. If you master strafejumping, you can jump around the maps really fast and finish them really quick.</p>
<p>[gallery ids="353,352,354" type="slideshow"]</p>
<p>Since the game is partially a roguelike, you can find weapons, scrap-to-useful-stuff-machines, gun upgraders and actual stores while playing. There are many different kind of weapons in the game, such as plasma guns, assault rifles, shotguns, railguns, rocket launchers, grenade launchers.. There's a lot and I doubt I have yet found all of them. Scrap-thingies convert scrap you collect from enemies to useful stuff, such as shield or ammo. Gun upgraders add a random boost to your gun, like more damage or different kind of alt-fire mechanism. I think they can stack too, so you can make your main weapon very versatile. The shops you can find sell you items you can buy with credits. You can find credits around the map or convert scrap to credits at the shop. The items can be very useful, so I always try to save up scrap to buy myself some nice item.</p>
<p>[gallery ids="358,357,356,355" type="slideshow"]</p>
<p>So yes, there's lots of things that aren't in older FPS games. Is it bad thing? Not in my opinion, but I understand why someone would feel that way, especially when expecting STRAFE is a 90's shooter. But it's not just a shooter, it's shooter and roguelike mix. Some like those, some don't, I personally like roguelikes to a degree.</p>
<p>And here's some negativity because I'm annoying like that:</p>
<p>Even though I enjoy the randomized maps, they make me wish for a bit more. I wish there would be a separate mode with maps that are always the same. Maybe somekind of seed system, where people can type a seed and always get similar map. When the maps are different every time, it takes longer time to learn the quirks of the game. That's not negative in itself, but as this game is marketed towards the old-school crowd, it stands out.</p>
<p>Next, I really like the random guns you can find around the map. Sometimes more than the default gun you get. But.. When you pick up a random gun, for example a disc-launcher, it's fun for those 10 shots only. Most of the random guns have barely any ammo, so the fun ends very quickly. If I could get ammo for those guns too, it would make the game more fun in my opinion. I want to collect a huge arsenal of guns and use them in different situations. Right now what happens is that when you use up all the ammo in the gun, it turns into a melee weapon and gets destroyed in the process.. So you have to collect it again. It's just a shame, really. I'd wager the game would be much more fun if you could keep the random guns and collect ammo for them.</p>
<p>[caption id="attachment_359" align="alignnone" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2018/01/20180107230511_1.jpg" alt="20180107230511_1" /> Disc-launcher that is out of ammo turns into a melee weapon that breaks on contact.[/caption]</p>
<p>However, despite all these faults of randomization and roguelike-ish aspects, STRAFE is great fun and I like it a lot! It's probably not the 90's game everyone expected it to be, but it tried and became it's own thing. I still recommend it to anyone who likes fast-paced shooters, just don't go in expecting new Quake.</p>
<p><a href="http://store.steampowered.com/app/442780/STRAFE_Millennium_Edition/">You can get STRAFE from Steam.</a> Also their website is <a href="http://www.strafe1996.com/">lovely</a>.</p>
<p>Edit: Clarified and cleaned a bit the part where I talk about old-school graphics. My English skills have failed me, sorry about that.</p>
Bitksel - Pillars of Eternity stole my heartSat, 25 Nov 2017 00:00:00 +0000Akselipersonalbitkselgame
https://akselmo.dev/posts/pillars-of-eternity-stole-my-heart/
https://akselmo.dev/posts/pillars-of-eternity-stole-my-heart/<p>I finally finished <a href="http://store.steampowered.com/app/291650/Pillars_of_Eternity/">Pillars of Eternity</a> and it's White March expansions, <span id="continue-reading"></span>and yes, it got it's deserved place on my "favorite games" list! It's very hard for me to even start to explain how much I like it, but I'll try. I also keep this a bit shorter than the Tyranny overview: There's so much things in this game it's hard for me to talk about everything without writing this for next 10 hours.. <del>It's 5 am while I'm writing this and I really got to sleep.</del></p>
<p>The game starts with making a character, obviously. Character creation is really nice and simple: You give your character name, race, subrace, class, statpoints, culture and background and appearance.</p>
<p>[caption id="attachment_314" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2017/11/pillarsofeternity_2017-11-25_04-12-31.jpg" alt="PillarsOfEternity_2017-11-25_04-12-31" /> Character Creation[/caption]</p>
<p>When that's done, it's time to start the game with the first "cutscene."</p>
<p>Pillars of Eternity has beautiful narrative "cutscenes" whenever a new chapter begins. They're voice acted and have beautiful imagery in them and they're a nod towards older CRPG's that handled cutscenes like this. I really like them and they build athmosphere really well. They're not really cutscenes, but I don't know what else to call them.</p>
<p>[caption id="attachment_315" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2017/11/pillarsofeternity_2017-11-25_03-58-28.jpg" alt="PillarsOfEternity_2017-11-25_03-58-28" /> "Cutscene"[/caption]</p>
<p>At first, your character starts in campsite. You have been traveling with a caravan towards greener pastures, thinking of settling down to nearby town, or just wandering the new lands. However, things never go as well as you'd hope: You have an illness that needs curing. You got this illness during the travels. Luckily, the area has a remedy and you go looking for it.</p>
<p>When you come back to the camp.. Well, let's say that events start to transpire, and rapidly. This starting area hooked me to the game really quick and before you knew, you were deep in all kinds of stuff and you have to figure out what's going on.</p>
<p>But in short, the game is heavily about souls and reading them, and you learn you're something they call "Watcher." There are also gods and other weird things. It's all really interesting and the writing is excellent in my opinion. Obsidian truly knows how to write, but I doubt anyone would say otherwise!</p>
<p>[caption id="attachment_318" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2017/11/pillarsofeternity_2017-11-25_04-51-19.jpg" alt="PillarsOfEternity_2017-11-25_04-51-19" /> My elven wizard: Dahl. He is the character I used my first playthrough.[/caption]</p>
<p>[caption id="attachment_319" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2017/11/pillarsofeternity_2017-11-25_04-51-25.jpg" alt="PillarsOfEternity_2017-11-25_04-51-25" /> Enjoy my shiny armor![/caption]</p>
<p>I'm gonna talk about the combat first. Like in Tyranny, I'm not big on combat in Pillars either. It can be really tactical and challenging, if you so wish, but I played on easiest difficulty. I just wanted to explore the story and the world. However, the combat is fun and it's fun to watch your dudes whoop ass.</p>
<p>There are lots and lots of skills, spells and whatnot to fight with and against. You can do really cool tactical stuff, if you know how. But unlike Tyranny, Pillars doesn't have any combo skill stuff. When playing the game through with my mage character, I loved whacking people in the head with my grimoire, which is my characters spellbook.</p>
<p>[caption id="attachment_317" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2017/11/pillarsofeternity_2017-11-25_04-29-56.jpg" alt="PillarsOfEternity_2017-11-25_04-29-56" /> Combat can get quite chaotic. Luckily you can pause and slow down the game![/caption]</p>
<p>Next, the dialogue system. It's really simple, you press links to talk back to people and so on. Sometimes it's voiced, sometimes it's not. There's lots of reading and dialogue, which I personally really liked. This can be off putting to some, since the writing can be a bit "dry."</p>
<p>I loved how you could talk enemies out of fighting you, or just taunt them, or change the outcome of something big with a silver tongue. Your dialogue choices do matter and it's good to raise those skills that help you with dialogue, so you get most of it if you enjoy playing someone who can talk their way out of anything. Attributes like strength help with dialogue too: You can flex your muscles to someone and intimidate them to let you go and so on. It's a big part of the game and the devs made it really fun!</p>
<p>[caption id="attachment_316" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2017/11/pillarsofeternity_2017-11-25_04-08-48.jpg" alt="PillarsOfEternity_2017-11-25_04-08-48" /> Dialogue system[/caption]</p>
<p>During your travels, you get followers you can talk with. They can give you quests if they like you enough. You can also travel completely alone if you so choose and the game even has achievements for that.</p>
<p>I do recommend getting all the followers though. They all have their own stories and things and they're all really interesting and fun. I was never annoyed nor bored by any of them, and they were all memorable to me. They react to your actions and comment on them every so often.</p>
<p>My favorite follower was Eder. He constantly tried to pet random animals, then complained that they bit him. His backstory was somewhat sad, which made helping him feel even better. I also really liked Aloth, who is a bit more complicated character and he gets more and more interesting the more you travel with him.</p>
<p>Also minor spoiler: You get a stronghold in this game, so you can place your characters there. You have to build your stronghold by repairing things and hiring people to guard it and it plays a key part at one point of the game.</p>
<p>[caption id="attachment_320" align="aligncenter" width="714"]<img src="https://bitkselblog.files.wordpress.com/2017/11/pillarsofeternity_2017-11-06_00-00-08.png" alt="PillarsOfEternity_2017-11-06_00-00-08" /> The gang[/caption]</p>
<p>I have to mention the "Choose your own adventure" style action scenes.</p>
<p>[caption id="attachment_321" align="aligncenter" width="1920"]<img src="https://bitkselblog.files.wordpress.com/2017/11/pillarsofeternity_2017-11-06_01-50-02.jpg" alt="PillarsOfEternity_2017-11-06_01-50-02" /> Careful...[/caption]</p>
<p>I <strong>loved</strong> these! They fit the nature of the game perfectly and were beautifully illustrated! The outcomes of these things were affected by your characters (and your followers) skills and attributes and so on. Even spells. They were actually one of my favorite part of the game.</p>
<p>But the best part of the game, for me, is the exploration!</p>
<p>[gallery ids="322,325,323,324,326" type="slideshow"]</p>
<p>Pillars of Eternity is a damn beautiful game. The graphics are stunning and the enviroments are always beautiful, no matter if you're walking in sewers or the nearby forest. There's so much things to see and do in the world, and many kind of secrets and treasures to find! It's hard for me to even begin to explain how much pleasure just walking around and looking at the environment gave me.</p>
<p>On top of that, amazing soundtrack that builds athmosphere and the really good writing which adds to everything you do in the game. I read everything in this game, except for some books. But next playthrough I'm going to read even all the books and delve deeper into the lore.</p>
<p>I explored the game 100%. Did most sidequests, if not everything. Even the bounty quests. And that makes me a bit sad: I wish I could forgot it all just to experience it all over again. The ending of the game was really pleasing too, and according to the developers, you can use your Pillars 1 character in the Pillars 2 that is coming early next year! (Hopefully.)</p>
<p>I can't say I rushed the game. I took my time with it and it took me ~50h to complete the game. I paid ~50€ total, basegame + expansions later and I have zero regrets. Well worth the money, especially since the game has replayability.</p>
<p>Pillars of Eternity got on my "favorite RPG's of all time" list. It's a short list, but every game that is in there deserve it. In fact, I would say Pillars is my second favorite RPG ever, behind Morrowind. Yes, I found it that good.</p>
<p>So, I would recommend this game to any RPG/Exploration fan, even if you haven't played CRPG's before! In fact, Pillars was the game that got me into CRPG's: Now I'm playing stuff like Divinity Original Sin 2, Icewind Dale etc.</p>
<p>You can get the Pillars of Eternity Definitive edition from <a href="http://store.steampowered.com/app/291650/Pillars_of_Eternity/">Steam </a> and <a href="https://www.gog.com/game/pillars_of_eternity_definitive_edition">GOG</a>. Definitive edition comes with basegame and the White March expansion, that added a beautiful snowy places to the game and a new story.</p>
<p>What are you waiting for, the world of Eora isn't going to explore itself! Now excuse me, I got to sleep.. And start my second playthrough tomorrow.</p>
<p>PS. I'm sorry about the lack of screenshots, I like to spam my game overviews with screenshots but... Since my game is from GOG, it doesn't have the screenshot key like Steam has, so I kept forgetting to take screenshots. Hopefully you still can see the beauty and intrigue of this game, and of course, Google offers more screenshots. :D</p>
Bitksel - Game Project Summary: Crypt of DarneFri, 03 Nov 2017 00:00:00 +0000Akselipersonalbitkselgamedev
https://akselmo.dev/posts/game-project-summary-crypt-of-darne/
https://akselmo.dev/posts/game-project-summary-crypt-of-darne/<p>I wanted to write this quick summary of how my <a href="https://akselmo.itch.io/crypt-of-darne">Crypt of Darne</a> game project went,<span id="continue-reading"></span> now that I've collected data long enough. Without further ado, let's begin!</p>
<p><a href="https://bitkselblog.files.wordpress.com/2017/11/da8a9-5kbo252bz.png"><img src="https://bitkselblog.files.wordpress.com/2017/11/da8a9-5kbo252bz.png?w=300" alt="" /></a></p>
<p><em>You enter the Crypt of Darne and you're looking for a specific gem. Will you survive?"</em></p>
<p><em>Crypt of Darne is a free roguelike-ish dungeon delving game, where you make a character out of few race-class combinations and explore a crypt, trying to find a specific gem. You'll know it when you see it, but it is hidden deeply in the crypt. Good luck!</em></p>
<p>Crypt of Darne was supposed to become a proper roguelike, however I remembered to keep the scope small and decided to just make a simple dungeon crawler style game. It has roguelike-ish elements, such as permadeath. The game is completely controlled with keyboard, but you can see the name of any tile with hovering your mouse over it. I created the game for Games Made Quick 2017 gamejam, however I continued working on it even after the jam. It took me two months total to make it to version 1.0.0.</p>
<h3 id="the-good-stuff"><a class="zola-anchor" href="#the-good-stuff" aria-label="Anchor link for: the-good-stuff">The good stuff</a></h3>
<p>Man, I learned A LOT! I learned how to work with Python and LibtcodPy, how to publish a game on itch.io, how to do pixel art, how ASCII tilesets work... So many things that.. I kind of forgot some of it. Sorry, it's been so long since I worked on it last time. I have to give an honorary mention to the tutorial I used to make this game: <a href="http://www.roguebasin.com/index.php?title=Complete_Roguelike_Tutorial,_using_python%2Blibtcod">Roguebasin Roguelike Tutorial</a>.</p>
<p>Making the game definitely helped me grow as gamedev! Sometimes I was having so much fun making the game I barely wanted to stop. Hours flew by as I typed out more and more code, drew tiles or just dabbled on the game's backstory.</p>
<p>There's not many interesting things behind the scenes I could really share. It's very What You See Is What You Get -style game.</p>
<p>The best part however was that someone donated me 3€ for this game!! And my friend also gave me 1€! Sure it's not much, barely anything, but this game was the first game that has gotten me anykind of revenue. I will always cherish it because of that and it helped me to figure out that maybe making games truly is my thing!</p>
<p>Over the course of three months, the game gained 981 views total and 93 downloads total. I got most views through Reddit, where I shared a link to my game on a finnish subreddit. So, marketing is important and social media is truly the best way to do it. I expect the game to still get a few odd views here and there and maybe an occasional download, however I don't expect it to explode in popularity.</p>
<p>I also want to mention that I had much fun writing a backstory and a book about the playable races. I wrote them "in character" as in I was writing them as someone from the same world where the game is located in. You get these pdf's when you download the game.</p>
<h3 id="and-the-bad-stuff"><a class="zola-anchor" href="#and-the-bad-stuff" aria-label="Anchor link for: and-the-bad-stuff">And the bad stuff</a></h3>
<p>So, what was bad then? Sometimes I ended up with a bug or slump I couldn't really get over until after a break for few days. It was super frustrating and gave me headaches. I was also trying to add too many things in the game at first and was stumped by my own lack of skills. Python is simple enough but LibtcodPy isn't very easy, atleast not for me, so having to work with that definitely took some time for me.</p>
<p>Drawing also isn't my strongest suit, so I had to fight with my programmer-art few times to get anything look right. I learned, but it was also really frustrating at times.</p>
<p>Balancing the game, so that no character would be too overpowered, was also quite difficult, but it also was very rewarding when I got it all right. Lots of spreadsheets and math!</p>
<h3 id="summary"><a class="zola-anchor" href="#summary" aria-label="Anchor link for: summary">Summary</a></h3>
<p>All in all, I'd say this project was very good learning experience to me and I mostly enjoyed making it. I'm glad I did it all and I hope that atleast one person liked it. :) As long as there's one person that likes my game, I'm happy and I feel like I've made a contribution to society, as clichey as that sounds.</p>
<p>Feel free to give me any kinds of comments on the game, the good or bad (please be gentle), on either here or on itch.io. Also if you have some questions about working on the game, ask ahead and I'll try to answer as best as I can!</p>
Bitksel - INFRA: Urban exploration the gameSat, 30 Sep 2017 00:00:00 +0000Akselipersonalbitkselgame
https://akselmo.dev/posts/infra-urban-exploration-the-game/
https://akselmo.dev/posts/infra-urban-exploration-the-game/<p>Yesterday I finished <a href="http://store.steampowered.com/app/251110/INFRA/">INFRA</a>, a game about urban exploration.<span id="continue-reading"></span> I'll start this bluntly: INFRA got on my "favorite games of all time" -list. It's just that good. Here are my thoughts about it and I'm sorry that they're spread a bit everywhere. I'm influenced by whisky as I'm writing this, lol.
_
_In INFRA, you play as a guy called Mark, who is some sort of building inspector at Stalhburg City. You know, inspecting the state of buildings, infrastructure, all that. Sounds rather.. Boring, right? Wrong!</p>
<p>The game starts from Mark's workplace, where you are in a meeting. Your workmates talk about some stuff, and you get an assignment to inspect a dam. At this point, you get some time to freeroam around your workplace, looking for things and so on. It's a good place to get the feeling for the game and learn the controls. Eventually you arrive at the dam and you get some further directions. Then, it's up to you to find your way to the objective.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/251110_screenshots_20160516235945_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Near the dam. The game is really beautiful.
</td>
</tr>
</tbody>
</table>
_I have to apologize for the quality of my screenshots. I was so immersed in the game I forgot to take them in the most interesting sections. Some of the screenshots are from the [Loiste Interactive press kit](http://press.loisteinteractive.com/sheet.php?p=INFRA)._
<p>The game is completely non-violent and based purely on exploration. This means that your only items you have with you are camera and a flashlight. You use your camera to take pictures of things that are wrong, like broken stairways, walls, collapsed bridges, etc. Unfortunately for you, both your flashlight and camera drain batteries like a drunk Finn drinks beer, so you have to constantly keep looking for beer- eh, I mean, batteries. Mark even comments on that at some point. You also find some temporary items to carry to get through places like keys for doors, etc.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/251110_screenshots_20160516234613_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >BEER. You'll be seeing it a lot.
</td>
</tr>
</tbody>
</table>
Speaking of beer, it's everywhere in this game. And I'm not even surprised, the game is made by Finnish people. Many places have saunas and other things related to Finnish culture. Even the environments are very Finnish looking. However, the game doesn't seem to be placed in Finland, but I'm not really sure about that. It really does make me feel right at home and everything, to me, makes sense. I wonder how someone who isn't Finnish perceives this games look and environment.
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/20170929225458_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >It's a Finnish game alright.
</td>
</tr>
</tbody>
</table>
<p>The story of the game evolves when you play, but you have to keep a keen eye on things: You may miss key things regarding the story if you don't explore every nook and cranny. Most of the most important story elements are placed on your path so it's hard to miss them, but if you want to know more, you'll have to dig deeper. I don't want to spoil the story at all, other than there's a lot of corruption going on and lot's of mystery around it. I love this kind of storytelling, you have to put the pieces together yourself. Also, the NPC's don't tell you the story, it's the environment that talks to you. Notes, voice recordings, journals.. Even graffitis on walls.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/infra_c6_m5_stormdrain0009-d77a93.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >You'll have to climb up there. See what I mean by hazardous?
</td>
</tr>
</tbody>
</table>
<p>Now, about the gameplay. Like I earlier mentioned, it's completely non-violent game. There aren't enemies to chase you. But, there is one enemy: The hazardous environment. Lots of collapsed things, floors breaking, tight spaces, high falls, mushrooms (yep), explosions, things running over you.. In short, many hazards. Thus the game isn't really a horror game, but the enviroments can be terrifying. I love the fact that I can take my time and explore the place without being chased by some mutation.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/20170929190535_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >What on earth..?
</td>
</tr>
</tbody>
</table>
<p>While you're sliding down sewer pipes or riding a raft in an underground cavern, you'll have to take photos. It's actually important and affects the end of the game, or at least that's how it felt like to me. There are few different endings.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/251110_screenshots_20170928193925_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Outside.. For now.
</td>
</tr>
</tbody>
</table>
<p>The environments change a lot during the gameplay. At first you may be outside, then you end up in a water treatment plant. From there, you end up a cave, that leads to a metro station that leads to a bunker and.. Suddenly you're in suburban neighborhood inside a garage next to a biker bar. Even if the environment changes around a lot, it never feels unnatural. The flow between the levels is absolutely amazing and believable. Everything feels just.. Right. You may ask first "Oh how did I get in here" but then you get that "Oh.. It makes sense why I'm here."</p>
<p>Between exploring, there's also a lot of puzzles. These puzzles can be very simple or very difficult, which depends on which kind of environment you're exploring. For example, some simple puzzles are "how to get on the other side of this pool of electrified water with couple boxes" and the more advanced are "how to fix a water treatment plant." None of these puzzles are explained straight (except at few points where an NPC helps you over radio/phone), you first have to find the puzzle, then work on it. However, none of the puzzles were overly hard, some just needed more trial and error: Hard enough to piss you off just right amount, that you keep trying. If I can get through these puzzles, you can too. If you get truly stuck, the Steam community forums for this game have been really helpful. Even the developers give hints for people on those forums.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/coldwater.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >There's a lot of valve's to open/close and steam to avoid.
</td>
</tr>
</tbody>
</table>
<p>The atmosphere in these environments is very immersive. You can almost smell the stuffy smell of the underground tunnels, feel the dangers of an unused industrial complex with a lot of rusted machinery, feel the wind breezing through broken windows.. It's hard to explain, it's something you just have to experience. The soundscape of this game is amazing as well, the ambient noises just enhance everything you see and add to the immersion. The music is really well done too, even you don't hear it much, mostly just at the beginning of a level.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/16293917044028473974_screenshots_2013-04-12_00001.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Stunning.
</td>
</tr>
</tbody>
</table>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/infra_c3_m3_tunnel30006.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >For the dungeon dwellers, there's a lot of this.
</td>
</tr>
</tbody>
</table>
<p>Someone may wonder if this game is just a simple "walking simulator." I'd say <strong>hell no</strong>. The puzzles, the environments and all that are engaging and interactive, so you're not just walking through everything. Think about Mirror's Edge, but instead of Faith you have 40 year old slightly alcoholic Mark with snarky attitude. Oh and you get to ride things too, and even pilot a tiny boat!</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/20170929211356_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Too bad I don't have my fishing gear with me.
</td>
</tr>
</tbody>
</table>
<p>Now why am I thinking it's one of the best games I've ever played? It surprised me in every way! I was expecting some simple exploration game with urban exploration theme. But no, the game was actual urban exploration experience! I was so immersed in the game, I played it in multiple 3-4h sessions, finishing it completely in around 20 hours. I just couldn't stop! On top of the exploration, the mystery story begged me to solve it. I love mysteries and secrets in video games and INFRA delivered. Last but not least, the easter eggs. None of the environments were boring, because if there was some place that looked a bit boring but you went further, you could find some funny easter egg. Some of them were very Finnish culture related though, so if you're not Finnish you may miss out on some.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/251110_screenshots_20170606154951_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Easter eggs <3
</td>
</tr>
</tbody>
</table>
<p>But the main thing what makes me like this game so much is that **you can truly feel the love and passion the developers have for this game. **I appreciate that so much and it's something crucial some games miss these days.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/251110_screenshots_20170604200642_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Good ol' BSOD- Er, I mean, TOWEL error.
</td>
</tr>
</tbody>
</table>
<p>If I have to mention some negative things, it's that the game crashed sometimes during loading screens and the NPC animations are a bit.. Stiff. There aren't many NPC's around in the game however so it makes sense they didn't really concentrate on them.</p>
<p>This game is only 22€. Full price. On sale even less. However, it's worthy of every damn cent I paid for it, and even after 20h I still was left for an incentive to replay the whole game: Hunt achievements, solve the mystery completely and see the other endings. So if you have any interested in urban exploration and dislike horror, this game is made for you. Get it. You won't regret it.</p>
<p>I applaud you Loiste Interactive. I hope to make something as good as you have done, and can't wait to see what's next.</p>
Bitksel - Tyranny, the game of choices and consequencesMon, 18 Sep 2017 00:00:00 +0000Akselipersonalbitkselgame
https://akselmo.dev/posts/tyranny-the-game-of-choices-and-consequences/
https://akselmo.dev/posts/tyranny-the-game-of-choices-and-consequences/<p>Yesterday, after 13 hours of play, I finished Tyranny.<span id="continue-reading"></span> I bought the game only couple a days ago and I just couldn't stop playing it, so I finished it rather quickly. Here's some of my thoughts about it.</p>
<p>Tyranny is remarkably similar to Pillars of Eternity, since they use the same engine. The only big change is the story and setting itself, so they aren't tied to each other. I absolutely loved Pillars of Eternity, so I will be doing some comparing between the two. I will write a post about Pillars when I have finished the White March expansions.</p>
<p>In Tyranny, you start your game creating your character. The character creation is pretty basic, there's no other playable races than human and you can only choose your past and weapons, then skill points and all that good stuff. After that, though, you will get into "conquest" mode.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/223ca-20170918202447_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Conquest
</td>
</tr>
</tbody>
</table>
In conquest-mode you will be making decisions that shape the world. Your decisions in this game **will matter**, and it shows! From what I gathered when playing, there's no really right or wrong, there's just choices and consequences. But the consequences can hinder your gameplay, or make it easier.
<p>After you've done conquesting, you see a tiny cutscene, well, more like a slideshow with narration, but the artstyle and writing is really worth your attention! You will then play in a tiny tutorial area, that is also part of the story... And things begin to unravel.</p>
<p><a href="https://bitkselblog.files.wordpress.com/2017/09/1f8a8-20170918201843_1.jpg"><img src="https://bitkselblog.files.wordpress.com/2017/09/1f8a8-20170918201843_1.jpg?w=300" alt="" /></a></p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/45078-20170918201844_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >My character Tobias
</td>
</tr>
</tbody>
</table>
Quickly about the combat: I'm not much into the combat in these type of games. I'm the kind of wuss that plays on story mode, because I'm more interested in the story than the intricacies of the combat. Yes, me, who loves the crap out of FPS games, don't really care for combat in this sort of games. I always feel like I'm way too stupid to get it, so I just put the game on easy and watch the carnage. It's just my way to play these type of games.
<p>Anyway, the combat is fun. It's very similar to Pillars: It's realtime combat but you can pause it any time, you can have multiple weapons and switch between them during battle and you have tons of skills to choose from. There's also spellmaking sort of thing, where you can make spells for your characters, but I didn't really dabble with that so I can't talk much about it.</p>
<p>The one thing that stood to me the most was the combo-skills between your character and their companions. If you made friends (or made your companion fear you), you would gain these combo-skills. They made the gameplay much easier and much more fun. It added a bit more flow to the combat and gave more weight for the choices: "Do I wanna piss this guy off, just so I can keep him helping me in the combat, even I hate this opinions on things?"</p>
<p>The combat also feels nice, even to a wuss like me who plays on easy: The sound effects add nice impact to it and it's visually nice looking. One thing that annoyed me though was the characters constantly, I mean **constantly **complaining when their weapons didn't do damage for reason to another. My favorite was when one of the characters said: "This weapon is like nipples on a man: Useless!"</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/e4eba-20170918211625_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Combo skill in action
</td>
</tr>
</tbody>
</table>
I don't want to spoil much, but I have to explain the story a little. There are two armies, Disfavored and Charlet Chorus working under a big dude Overlord. Of course those two armies are having their own lil' fights and you have to be the middleman, listening their whining. I felt like I was babysitting two idiots who are leading big packs of idiots. It was great, since it really gave you either reason to really hate the two or like one of them. Ultimately you have to choose between the two and shit hits the fan: boom, civil war between the two armies.
<p>At this point the story starts and you'll be running around the area called as The Tiers doing oddjobs here and there. There's lots of things to do, lots to see. On my first playthrough I missed a lot of stuff, so I'll be definitely replaying this game at some point. One nice thing about the story is that there is a possibility to betray either one or both of the two armies and give a big middle finger to everything. I will definitely try that on my next playthrough.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/13015-20170918204010_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Tiny portion of the map of The Tiers, with not much areas unlocked yet
</td>
</tr>
</tbody>
</table>
During the story, you learn that you can control these weird towers called Spires. The story is heavily around them, so I don't want to say much. In Pillars you had the stronghold of Caed Nua, the Spires are basically your stronghold in Tyranny, except you can have many of them. In Spires you can hire people and get them to do your bidding. To get a spire, you have to do some puzzles and maybe some dungeon delving. That was honestly one of my favorite parts of the game, but unfortunately there wasn't much of it.
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/7aa3e-20170918202017_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Top of a Spire
</td>
</tr>
</tbody>
</table>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/e58a6-20170918201913_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Spire management
</td>
</tr>
</tbody>
</table>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td >[](https://bitkselblog.files.wordpress.com/2017/09/5cd94-20170918202156_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Finding our way to unlock a Spire
</td>
</tr>
</tbody>
</table>
<p>The enviroments are really nice looking. I spent some time just looking at the tiny details in walls and floors, looking at the pretty lights and so on. I have no idea how they're done, I assume there's been a lot of 3D modeling and then rendering them to images. The most realtime 3D things you see on your screen are any characters that are moving.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/bbfb3-20170918202258_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >One of my favorite places was the Burning Library, just because how it looked
</td>
</tr>
</tbody>
</table>
Then there are the characters. Most characters I liked, some I didn't really get to know that well due to my decisions. I did manage to get most of them to like me and there was one character that I didn't even meet, hinted by the ending of the game. Talking with characters is just like in Pillars: You got text, then links for dialogue and tooltips that tell you details.
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/0fa6b-20170918202038_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Having a chat
</td>
</tr>
</tbody>
</table>
I have to say one of my favorite characters was Tunon the Adjucator. He seems to be some sort of force of justice and when you're in his court, it truly feels like you're being judged by him. It felt refreshing, in most modern games you get away with lots of things but in Tyranny... Tunon is watching. Always.
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/507c1-20170918204111_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Tunon's Court, and Tunon overlooking at us
</td>
</tr>
</tbody>
</table>
<p>Besides of normal conversation stuff, there's also a thing called missives. It's basically a mailbox and you get mail from some characters while your story goes on. You can reply to these missives in different ways and they either provide you more backstory or give you good advice. Or bad, if you make someone unhappy with your sloppy response. It works like the conversation system, except there's more text.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/b6fc6-20170918202004_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Missives
</td>
</tr>
</tbody>
</table>
<p>One thing I hope to see in Pillars 2 is the reputation system Tyranny has. You have all the factions, characters, things, etc. in one big reputation list, and you can check how anyone or anything feels like about you. On top of that, reputation can give you skills and passives, so basically making some dude very angry can give you powers against his faction. It's really cool system and I liked it a lot.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/09/e2fab-20170918201900_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Reputation
</td>
</tr>
</tbody>
</table>
So in conclusion, I liked the game and it's features. It was really fun to play, I enjoyed the story and the visuals, but I had constantly this nagging feeling of something missing: There wasn't really sense of exploration in the game. Instead, you're being railroaded by everything and even if you don't want to be anyone's lapdog, you kinda have to to progress in the story. It was a bit more.. Linear, than Pillars. That can be a good thing or bad thing, depending of the player. For me, it kind of diminished the sense of wonder and wanderlust. In Pillars, I was constantly exploring, reading everything, just absorbing the world and the information. In Tyranny I found myself sometimes just quickly reading the dialogue without any second thought and sometimes even pushing myself forward, instead of naturally going with the "flow."
<p>I can't really explain it any better than that. It simply felt like something was lacking. Maybe it was because I wasn't that interested in the world of Tyranny compared to Pillars of Eternity, or maybe the game didn't really give me a chance to get interested. You are pretty much dropped into the world and you have to spend some time researching things yourself. Otherwise you will be very lost in the lore of Tyranny.</p>
<p>The ending was a bit underwhelming too. It just.. ended. Very unexpectedly. I was waiting for more than 13 hours of gameplay. Maybe I just rushed things, I'm not sure. I still enjoyed the ending, even it was very cliffhanger-y.</p>
<p>Since the game has New Game+, I will definitely try Tyranny again someday and see what other kind of choices I can make, and what the outcomes are.</p>
<p>I would recommend this game to anyone who likes RPG's, especially if you enjoyed Pillars of Eternity. Just don't expect similar world or story. Tyranny is very, very different, and that's a good thing.</p>
Bitksel - Story about why “keeping the scope small” is importantMon, 04 Sep 2017 00:00:00 +0000Akselipersonalbitkselgamedev
https://akselmo.dev/posts/story-about-why-keeping-the-scope-small-is-important/
https://akselmo.dev/posts/story-about-why-keeping-the-scope-small-is-important/<p><em>This is another post from my old devlog I'm transfering here. I really liked this post so I thought I'll keep it.</em><span id="continue-reading"></span></p>
<p>This happened before I started to make that roguelike, but I feel like I should talk about this, I think it’s important for the newcomers in gamedev. This is gonna be an incoherent rambling, but I hope my point comes across.</p>
<p>Dunno about others, but I’m sure many gamedevs have so many ideas they don’t know where to start. I had this panic before the Games Made Quick gamejam started, I wanted a solid project to work on, something I could possibly finish before the gamejam ends. (Even in the gamejam rules it’s said that “even returning an empty unity project counts” so I was basically panicking for nothing.)</p>
<p> </p>
<p>I have had this idea of making my own RPG for long time, called Enegrond. It would be a hybrid of Morrowind and some other RPG’s, and it would look like an old PS1 game with blocky graphics and all the polygon jitter and clunky animations. Partially because it looks cool, partially because my artistic side is crap so if I tried something photorealistic I would cry.</p>
<p> </p>
<p>Well, I thought I would continue this project in this gamejam, but I wanted to make something concrete, something that could possibly be ready before the gamejam is over. Then I found this roguelike tutorial I talked in my earlier post, however it didn’t really seem like what I have had in mind for this RPG.</p>
<p> </p>
<p>Then I thought, hey, what about Gamemaker, I have Gamemaker Pro license thanks to Humble Bundle so I went and looked around how it would work for an RPG and found some nice asset that lets me easily start making RPG’s.</p>
<p> </p>
<p>I weighed all my options and..</p>
<p> </p>
<p>Panic.</p>
<p> </p>
<p>What to do?! Where to start!? So many options, so little time!</p>
<p> </p>
<p>I wanted to make something cool in such a little time, I first tried my Unity project again and realised that hell, it’s gonna take me years to make it complete. So I scratched it.</p>
<p> </p>
<p>Back to the roguelike idea, something I possibly could get done rather quick, but not really what I had in mind, so I scratched that too. Before that though, I spent a lot of time figuring things out for the roguelike in case I was gonna make it, wasting precious time.</p>
<p> </p>
<p>Then to the Gamemaker RPG idea.. I was thinking it’s plausible, so I went heck yea, bought the 18€ asset (oops) and started making things happen.. Until I realised that this is also gonna take for many months to make correctly.</p>
<p> </p>
<p>I was kind of sad that I had bought something I won’t use immediatly and just gave up momentarily. My head was literally hurting from all the thinking, pondering, wondering, whatever. I almost cried because I had wasted what little money and still didn’t know what to do, and had another panic, repeating the process of bouncing all three different engines/ideas again, and one more time!</p>
<p> </p>
<p>It was now late into the night, I felt like completely giving up anything gamedev related, I was little ball of angriness because I was angry at myself for not making any solution.</p>
<p> </p>
<p>Then I remembered the magic words.</p>
<p> </p>
<p><strong>“Keep the scope small.”</strong></p>
<p>** **</p>
<p>These words are often repeated to the newcomers in gamedev stuff. We all have such grand ideas for games, so many amazing worlds, so, oh so many amazing gameplay figured out in our heads.. But we often lack the skill to do these, especially alone, and if not skill then we lack time. We newcomers easily forget this, since we’re so lost in our own worlds.</p>
<p> </p>
<p>I took deep breath and figured a new area on the RPG world Enegrond I had been thinking about. “Why not make a roguelike about a dangerous dungeon in this world? Let’s make it into a small-ish dungeon delve, with fun things, extra races, anything that we can fit into our small timeframe…”</p>
<p> </p>
<p>This realisation made me smile again. I started to read the roguelike tutorials religiously, creating a list of things I could add to it after I’m done, but keeping it realistic and keeping the scope small.</p>
<p>Now I’ve been working on it the last few days and I’ve loved (almost) every second of it. </p>
<p> </p>
<p>Even I thought I wasted money on that asset I bought, I’ve been thinking of making my next game with Gamemaker and using that asset with it. I’ll start doing that after I’m done with the roguelike.</p>
<p>So the point of this story is:</p>
<p> </p>
<p>**Avoid headache and keep the scope small. **You don’t have to make the best game ever as your first game, or even as the tenth game. Make many tiny games, learn more every time, until you’re absolutely sure you’re ready to make your “magnum opus”, your biggest and best game ever. <strong>And never be afraid to ask for help!</strong></p>
Bitksel - The 'I don't feel like playing' problemThu, 24 Aug 2017 00:00:00 +0000Akselipersonalbitkselgame
https://akselmo.dev/posts/the-i-dont-feel-like-playing-problem/
https://akselmo.dev/posts/the-i-dont-feel-like-playing-problem/<p>Sometimes when I read internet forums like Reddit to rot my brain,<span id="continue-reading"></span> I stumble upon on threads where people are asking stuff like: "I haven't felt like playing anything for ages, what to do?" or "I have hundreds of games but no desire to play." I've never really felt this way since I always find something to play, but I have few tips for people who wish to "get back to gaming" again. Hopefully these are helpful.</p>
<h3 id="1-nostalgia-trip"><a class="zola-anchor" href="#1-nostalgia-trip" aria-label="Anchor link for: 1-nostalgia-trip">1. Nostalgia trip</a></h3>
<p>One that always has worked for me whenever I'm in gaming slump is that I pick up some game that I absolutely loved as a kid, or just have fond memories about. Games such as Morrowind, Oblivion, Halo, old NES games, Wipeout games on PS1, Harry Potter games.. Too many to list for me. Everyone has their bunch of nostalgic favorites, or if you're completely new to gaming, try the first game you liked.</p>
<p>Seeing how technology has moved forward in the gaming front always makes me very inspired. I always want to find out more and more differences between old and new. Finding secrets that you have never seen from your favorite childhood game is also very possible and it may give you that spark to keep wanting to find more. I always start to wonder how many secrets the newer games have.</p>
<p>The point however, is to remind yourself why you liked gaming in the first place. Try finding that thing you like from your huge list of games. It'll be a proper research, but you most likely will end up having fun.</p>
<h3 id=""><a class="zola-anchor" href="#" aria-label="Anchor link for: "></a></h3>
<h3 id="2-slow-down-take-your-time-details"><a class="zola-anchor" href="#2-slow-down-take-your-time-details" aria-label="Anchor link for: 2-slow-down-take-your-time-details">2. Slow down, take your time (details)</a></h3>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/08/251110_screenshots_20160517031546_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >It's the little things. Game: INFRA
</td>
</tr>
</tbody>
</table>
<p>People are busy these days and tend to rush even during their free time. Having huge backlog of games may pressure you to play games faster just to get to the next one. Games aren't intended (usually) to be played that way. Look at the details. Look at the textures and models the devs made you, hear the sound effects and take them in, experiment with the gameplay and learn its little tricks.</p>
<p>Too many people just run past a big portion of the game, then wondering why it didn't feel any fun: You didn't give it enough attention to become fun. "But I don't have time for it!" you may say. The games aren't going anywhere, play them when you do have time and feel like it. Don't force it.</p>
<p><strong>Bonus</strong>: Hunt for bugs and glitches! Those can be really fun, for example Skate 3 has a lot of funny glitches, as demonstrated by a youtuber <a href="https://www.youtube.com/watch?v=TP5XKTuJZBU">Helixsnake</a></p>
<h3 id="-1"><a class="zola-anchor" href="#-1" aria-label="Anchor link for: -1"></a></h3>
<h3 id="3-don-t-collect-just-play"><a class="zola-anchor" href="#3-don-t-collect-just-play" aria-label="Anchor link for: 3-don-t-collect-just-play">3. Don't collect, just play</a></h3>
<p>So you have a huge intimidating backlog, but there's that new game coming out you reaaaally want. So you gotta buy it right? Nope! Well, you can, but there's a risk it becomes another game in your backlog.</p>
<p>You may be addicted to buying games, instead of playing them. Collecting things is fun and it's what us humans do, but what fun is to collect things if you can't enjoy them?</p>
<p>Stop buying new games until you have completed at least 5 of the latest games you have bought. And if you find out you truly don't enjoy the game, go to the next one, but you have to actually complete 5 games. Soon you realize you have spent a lot of time on these games, your backlog is shorter and the game you really wanted could possibly be on sale! Be patient with buying things. You don't need to jump the bandwagon while others do, unless it's some multiplayer game everyone and their grandmother is buying and you really wanna join in.</p>
<p>Remember though, gaming is hobby, so never force yourself.</p>
<p>Also shout out to <a href="https://www.reddit.com/r/patientgamers/">/r/patientgamers</a>.</p>
<h3 id="-2"><a class="zola-anchor" href="#-2" aria-label="Anchor link for: -2"></a></h3>
<h3 id="4-learn-about-how-games-are-made"><a class="zola-anchor" href="#4-learn-about-how-games-are-made" aria-label="Anchor link for: 4-learn-about-how-games-are-made">4. Learn about how games are made</a></h3>
<p>This is something that has helped me a lot. The moment I got into gamedev, I began to "see behind" the games. I see how some things are made, I can theorize how some parts of the game have been coded, I can troubleshoot games easier when I have a hunch what's going wrong.</p>
<p>Obviously this is something not everyone isn't interested in, or they don't want to be a gamedev. But there are a lot of Youtube videos of how games work, here's one of my favorites about Pokemon games: <a href="https://www.youtube.com/watch?v=9l8V_eQ6wGQ">"An Exclusive Look At Pokémon’s Early Design Documents"</a></p>
<p>Check it out, you may find it intriguing. And be warned, some gamedevs have said that knowing how games are made have taken out of the immersion, but for me that has never been an issue. It has only added to the experience.</p>
<h3 id="-3"><a class="zola-anchor" href="#-3" aria-label="Anchor link for: -3"></a></h3>
<h3 id="5-get-out-of-your-gaming-comfort-zone"><a class="zola-anchor" href="#5-get-out-of-your-gaming-comfort-zone" aria-label="Anchor link for: 5-get-out-of-your-gaming-comfort-zone">5. Get out of your gaming comfort zone</a></h3>
<p>So you have your favorite genres like FPS or RPG's or platformers, and you tend to play only those kind of games. You see a game that looks interesting but then learn it's not a genre you like, and don't even give it a try.</p>
<p>I used to do that, especially with JRPG's. I have never liked Final Fantasy series, but lately I got to try Tales of Zestiria, which isn't a traditional JRPG but it's close enough. I have really enjoyed it, despite the anime-ish look. I've gotten more into anime and manga in general, thanks to my fiancee.</p>
<p>It was so refreshing to get out of my circle of games. It's very possible that you won't like most of the games in the genre, but when there's that one you do like, you will be very happy you gave it a shot! So explore a bit! Go on a gaming adventure!</p>
<h3 id="-4"><a class="zola-anchor" href="#-4" aria-label="Anchor link for: -4"></a></h3>
<h3 id="6-take-a-break"><a class="zola-anchor" href="#6-take-a-break" aria-label="Anchor link for: 6-take-a-break">6. Take a break.</a></h3>
<p>It works, honestly. When you're on break, you may find yourself thinking about games more and more often and feel the urge to play everything. And boom, you're back in gaming.</p>
<p>There's also a slight possibility that you find a new hobby and stop gaming completely, however I've never seen anyone who has played video games completely quit. You may feel like that you have wasted money on all this stuff if you stop now, but it's never really wasted. The games aren't going anywhere, unless they're on Steam and Steam explodes or something. They will be there, awaiting for your return.</p>
<p>Like I've said earlier, don't force yourself to do anything. I've done that, I still keep doing that and it takes all the fun out of things. Human mind is a weird thing and sometimes taking a breather can help, not just in gaming world but in everything. The length of the break is completely on you. For me personally, when I take a break from gaming, after day or two I get the "itch" to play something.</p>
<p>That's all I got. If you have your own protips, feel free to share em. I hope these help!</p>
Bitksel - Ah, MorrowindSat, 07 Jan 2017 00:00:00 +0000Akselipersonalbitkselgame
https://akselmo.dev/posts/ah-morrowind/
https://akselmo.dev/posts/ah-morrowind/<p>I've been playing lots of <a href="http://www.uesp.net/wiki/Morrowind:Morrowind">The Elder Scrolls III: Morrowind</a> lately. <span id="continue-reading"></span>It's an older role-playing game for PC and classic Xbox, but I play it on PC. I got it back in 2005, but I still play it from, time to time. It's my favorite game of all time.</p>
<p>I remember the day I bought this game like it happened yesterday. I was on a class trip back in elementary school. It was true hell and I hated almost every single moment of it. But during the trip back home, we stopped by in some city for two hours. After having a hamburger at the local Hesburger I went to look through stores etc. I thought I wasn't gonna buy anything but then I spotted the cheap games section at some store.. And there it was, Morrowind, just for 5€.</p>
<p>I looked at the back of the case and there were a few intriguing screenshots and praises how it's one of the best first person RPGs and whatnot. The key words were "first person" because I love FPS games.</p>
<p>This may sound a bit weird, but back then I had to ask a permission from my parents to buy games. I have no idea what it was about, I just remember them not really wanting games on the family PC, because they "slow down the computer." I'm sure some of you have had something similar. Well, I called my mom and asked "Can I buy this game it's only 5€????" and luckily she let me buy it.</p>
<p>Back home I then unpacked my bags and went to install Morrowind right away. Aand..</p>
<p>I had no idea what I was doing! My English skills weren't so good back in the day, I had no idea what people were saying to me, I had no idea what skills did what and so on. I learned lots of things by simple trial and error. "Oh, I can't pick that up without everyone hating me. Oh, that button fires spells," etc.</p>
<p>Slowly but surely I grasped the main gameplay aspects of the game: How to fight, rest, gain levels, talk (even I didn't understand almost anything) and how to use spells.</p>
<p>There was a second problem however: I was too scared to play. I was 12 at the time, so traveling from Seyda Neen to Balmora while a swarm of cliffracers chase you was quite scary. The worst was when I got lost in a tomb full of skeletons and heard them rattle while they were chasing me, eventually meeting my demise because of the Morrowind's infamous combat system.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](http://i.imgur.com/rA832.gif)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Welcome to (modded) Morrowind. No idea who made the gif. Original video [here](https://www.youtube.com/watch?v=S4rXsrZRchQ)
</td>
</tr>
</tbody>
</table>
And thirdly: Our computer was really, really slow. I can't remember anything else than it had only 256 Mb RAM. It played some games like a champ, I played Counter-Strike: Source a lot with it, but Morrowind had very long loading times, so me rapidly dying + reloading the game for long times wasn't very fun.
<p>I then borrowed the game to my friend. He was much better in English than me and he never was scared of any enemies in games, for some reason. He loved the game and I loved to watch him play. His family had a way better PC so it ran Morrowind really well, loading times were really quick and so on.</p>
<p>I was his friend for long time, I visited him often and had a sleepover there for quite a many times. Almost every time we played Morrowind. He played the game, did quests, translated me some of the text if I didn't understand and I gave suggestions for things to do. Those were some golden times in my life, I miss all of that a lot. So hey dude, if you are reading this, contact me and come visit, let's play some Morrowind together!</p>
<p>I also found a forum about TES games and luckily for me it was in Finnish. I still remember my first post there: "What is the plot of Morrowind?" I got quite hilarious replies, such as "you got to kil dagot ur <em>(sic.)</em> and build a pillow fortress." Anyway, the folk there explained things for me and after some time I was the one helping others. I also spent a lot of time there talking about other things than games, made some good friends who unfortunately later disappeared from my life for some reason.. Or it was vice versa, I can't remember.</p>
<p>Morrowind Construction Set was my first game modding experience, that ignited the spark of gamedev in me. I made a campfire in Morrowind, surrounded by the characters of people from the TES:Finland forum. They sent me screenshots of their characters and their outfits, and I made some custom dialogue for them. It was a fun experience, so I made myself a house mod, too. Unfortunately I lost all those mods ages ago..</p>
<p>Later on I got my own computer and played Oblivion on it. I also installed Morrowind and I've been playing it ever since, every year, almost every month. I always go back to Vvardenfell, to relive old memories and find new ones.</p>
<p>And next, about the game!</p>
<h3 id="about-morrowind"><a class="zola-anchor" href="#about-morrowind" aria-label="Anchor link for: about-morrowind">About Morrowind</a></h3>
<p>The Elder Scrolls III: Morrowind is roleplaying game about you, a prisoner who has been released for some mysterious reason, arriving in the tiny coast town of Seyda Neen in Vvardenfell, an island in the Morrowind province. You are given some papers you must deliver to Caius Cosades in Balmora, but you can toss those papers in the nearest lake and do whatever you wish. Don't do that though if you want to finish the main quest!</p>
<p><em>Please note that the screenshots I've taken are from modded version of Morrowind, the original game looks more, well, older.</em></p>
<p>In the beginning of Morrowind, you get to choose from 10 races:</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/dllhost_2017-01-08_00-01-08.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Races of Morrowind. [Source](http://imgur.com/REK7WN5)
</td>
</tr>
</tbody>
</table>
<p>Imperial, Nord, Redguard, Breton, Altmer (High Elf), Dunmer (Dark Elf), Bosmer (Wood Elf), Khajiit, Argonian and Orc.</p>
<p>Imperials, Nords, Redguards and Bretons are the basic human races. Altmer, Dunmer and Bosmer, as you may have guessed already, are the elven races. Khajiit and Argonian are the so called beast races, and Orcs are.. Well, Orcs. Every race has their own racial bonuses and skills, for example Argonians have a skill for breathing underwater and Dunmers resist fire spells. If you're interested, more reading here: <a href="http://www.uesp.net/wiki/Morrowind:Races">http://www.uesp.net/wiki/Morrowind:Races</a> <em>By the way, if you ever do any reading about lore or other TES games, use UESP, it's the most reliable Wiki for Elder Scrolls games, and it has been around for quite a long time and is still active.</em></p>
<p>After choosing your race, you choose a class or make your own. There are quite a many skills in the game, so I'm not gonna list them all here. To put it simply, almost anything you can do in the game, has a skill. Skills improve by training with other NPC's, or simply doing what the skill implies. For example, to get marksman skill higher, you just have to use bow/darts/throwing stars actively.</p>
<p>Now, meet Hun-Tra, a character I have remade for at least thousand times during all these years I've played Morrowind!</p>
<p><a href="https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b20-48-12-636.png"><img src="https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b20-48-12-636.png?w=300" alt="" /></a></p>
<p><a href="https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-082b00-12-47-490.png"><img src="https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-082b00-12-47-490.png?w=300" alt="" /></a></p>
<p>I've been adventuring as him for many hours now and he is becoming quite formidable adventurer! I am planning to get all his skills to 100, eventually.</p>
<p>Now, let's talk about the combat: It can suck, and many people who have been interested in Morrowind have dropped it because of the combat. By default, Morrowind combat is all about the dice rolls and comparing skill levels etc. in the background, even if you see your sword, spell or arrow hit the enemy on the screen. This can be really frustrating. Thankfully, modders are here to rescue us. I wish they didn't have to, but I'm not complaining either way. I have a mod that makes the combat more about actually hitting the enemy and then rolling dices, so it feels much more better. I will list all mods I use later. On later levels though, combat gets really easy, even in vanilla (non-modded) version. One hit kills left and right. Considering the main quest, it kinda makes sense, but I'm not gonna spoil anything. The combat is either done in first person or in third person, however Morrowind in third person is barely playable.</p>
<p>Spells in the game work like normal combat, but you can do either ranged spells like fireballs or touch spells like paralyzing touch. There's also self healing spells etc. One of the coolest spells in Morrowind is levitation. Yes, you can fly! There's also Mark and Recall spells, that let you set a place to teleport to. Mark marks the teleport spot, Recall brings you there. Those are really useful when you have lots of loot and just want to quickly get home.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b20-52-36-595.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Have you seen any mudcrabs lately? Filthy creatures!
</td>
</tr>
</tbody>
</table>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b20-53-44-235.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >They really don't like me, but I don't like bandits either.
</td>
</tr>
</tbody>
</table>
<p>The world of Morrowind, Vvardenfell, is full of things to explore. I've spent so many hours playing this game and there are still new things to be found. I find the size of the map and the fact that everything is hand crafted really impressive. There's no procedural generation in the game at all. There's also Solstheim and Mournhold. Solstheim comes with the Bloodmoon expansion and Mournhold comes with the Tribunal expansion.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](http://www.uesp.net/w/images/b/bb/MW-Map-Vvardenfell.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >The base game map that comes with the game case. [Source](http://www.uesp.net/wiki/File:MW-Map-Vvardenfell.jpg)
</td>
</tr>
</tbody>
</table>
<p>Solstheim is a smaller island near Vvardenfell, full of Nords, werewolves and snow. Fun fact: You can swim from Vvardenfell to Solstheim if you're brave enough.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://www.imperial-library.info/sites/default/files/imagecache/node-gallery-display/gallery_files/bloodmoon_map_lg.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Solstheim, Bloodmoon expansion. [Source](https://www.imperial-library.info/content/solstheim-map-official)
</td>
</tr>
</tbody>
</table>
<p>Mournhold is the capital city of Morrowind, where you meet Almalexia, one of the gods of the Tribunal. This map doesn't show the complex sewer network under Mournhold, which is quite large aswell.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://www.imperial-library.info/sites/default/files/imagecache/node-gallery-display/gallery_files/maptribhuge.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Mournhold city, Tribunal expansion. [Source](https://www.imperial-library.info/content/maps-morrowind)
</td>
</tr>
</tbody>
</table>
<p>So yes, there are lots of things to explore, many things to find and many quests to do!</p>
<p>Morrowind has many creatures, but most of them are not the usual fantasy creatures you see in other games. For example, I've never seen anything like netches, guars or silt striders outside of TES games.</p>
<table cellpadding="0" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b21-00-47-930.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Betty Netch, calm creatures unless you attack them.
</td>
</tr>
</tbody>
</table>
<table cellpadding="0" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b21-08-07-057.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >A peaceful Guar, many of them attack on sight but this guy didn't care.
</td>
</tr>
</tbody>
</table>
<table cellpadding="0" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b21-09-43-857.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >This guy was less peaceful however.
</td>
</tr>
</tbody>
</table>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b21-09-10-254.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >AAAHH WHAT IS THAT?!
</td>
</tr>
</tbody>
</table>
You can travel by foot, boat or silt strider. Foot and boat are self explanatory, but silt striders are another oddity of Morrowind. They're huge insects that can carry loads of cargo and people in Morrowind use them to travel around. Unfortunately in the game you can't see them walking around, but there are mods that change that.
<table cellpadding="0" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b21-16-50-254.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Silt Strider, the Taxi service of Morrowind. Bull Netch floating in the background.
</td>
</tr>
</tbody>
</table>
<table cellpadding="0" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b21-28-05-374.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Coasts of Vvardenfell can be really beautiful and athmospheric.
</td>
</tr>
</tbody>
</table>
<p>Even buildings in Morrowind can get really weird. There are huge mushrooms pretty much everywhere, and people in Morrowind use them as buildings. There are also mushroom buildings around castles. Almost every city has an unique look to them, but depending who owns the city, the buildings change too. Usually imperials have very basic brick houses and castles and dunmers have their weird mushroom towers or bug shell houses.</p>
<table cellpadding="0" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b21-59-16-816.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Tel Vos, a castle with a twist.
</td>
</tr>
</tbody>
</table>
<table cellpadding="0" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b21-16-44-179.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Balmora
</td>
</tr>
</tbody>
</table>
<table cellpadding="0" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b21-26-23-184.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Ald'Ruhn and Ghostfence in the background
</td>
</tr>
</tbody>
</table>
<table cellpadding="0" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b21-43-47-426.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >City of Vivec. And yes, that's a moon.
</td>
</tr>
</tbody>
</table>
Leveling up in Morrowind works by resting in a bed, so you need to rest in the game. As players resting places go, they can rent a room in a tavern and sleep there, sleep outside the city on ground, kill a resident of a house and live there (grim, I know!) or if they complete a questline for one of the great houses, they get their own manor!
<table cellpadding="0" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b22-01-47-880.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >A tavern in Pelagiad
</td>
</tr>
</tbody>
</table>
<p>Morrowind also has lots of books to read. You can read them all in the game and my goal for long time has been to collect every book in the game and place them somewhere and then read them all. You can even read magical scrolls, if you can decipher them that is.</p>
<table cellpadding="0" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b21-19-32-094.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Can you read it?
</td>
</tr>
</tbody>
</table>
<p>Speaking of reading, most of the Morrowind dialogue is text. NPC's grunt and talk if you bump into them, but if you want to ask them questions, you have to read a lot. There's no voice acting for the dialogue. You press the blue links to jump around topics.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b21-18-49-309.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Morrowind Dialogue system. Don't mind the "...Commands" option, that's a mod just for commands like "Follow me" etc.
</td>
</tr>
</tbody>
</table>
Morrowind tracks quests in your personal journal, which you can open by pressing J. Your character automatically writes there if there's something to write about, and you can find all the quests you have active there. I kinda miss this kind of system in modern games, before arrows pointing you in the right direction. In Morrowind, you have to read what the people say. To find some place, they usually tell you "go north until you see X and then go east" and so on. I think it's a really cool way to do quests.
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2017/01/morrowind2b2017-01-072b21-25-09-302.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Player journal.
</td>
</tr>
</tbody>
</table>
I would like also to share a short story I shared on my TES Discord server, which describes well how athmospheric and immersive Morrowind can get:
<p>"Okay that was cool: I found a cave with a boat that had a corpse on it, like it was a Nord burial site. I then noticed something glimmering above my head and levitated there. There was a daedric battlehammer and a daedric helm. Well I was overencumbered so I couldnt move after picking those up, but I had a recall and mark spell. Since I had already marked my home I could teleport there, so I spent over two days of ingame time trying to recall myself home, because my mysticism skill is very low so the chance for recalling was only like 18% per try, and it always ate lots of magicka.
I just imagine my character eating and sleeping for six hours, then trying to recall, then be weary again and having to rest another six hours. And who said greedy can't survive?"</p>
<p>Here's a list of a few mods I recommend. Some of them can be found here: <a href="http://wiki.step-project.com/Guide:Morrowind">http://wiki.step-project.com/Guide:Morrowind</a> and others can be found here: <a href="http://mw.modhistory.com/home">http://mw.modhistory.com/home</a>
<strong>But as always, first try the game without mods!</strong></p>
<ul>
<li>
<p>Morrowind Code Patch</p>
</li>
<li>
<p>MGEXE (Adds widescreen support and MWSE, which is needed for some mods)</p>
</li>
<li>
<p>Script Improvements</p>
</li>
<li>
<p>4GB Patch</p>
</li>
<li>
<p>Morrowind Patch 1.6.6</p>
</li>
<li>
<p>Texture Fix</p>
</li>
<li>
<p>Texture Fix Blood Moon</p>
</li>
<li>
<p>Poorly Placed Object Fix</p>
</li>
<li>
<p>Mesh Fix</p>
</li>
<li>
<p>Telvanni Exterior UV Fix</p>
</li>
<li>
<p>Improved Imperial fort UV</p>
</li>
<li>
<p>Correct Meshes</p>
</li>
<li>
<p>Correct UV Rocks</p>
</li>
<li>
<p>Correct UV Trees</p>
</li>
<li>
<p>Correct UV Mudcrabs</p>
</li>
<li>
<p>Better Bodies</p>
</li>
<li>
<p>Better Heads for Better Bodies</p>
</li>
<li>
<p>Hold It - Replacer</p>
</li>
<li>
<p>Graphic Herbalism</p>
</li>
<li>
<p>The regulars - Sitting NPC's</p>
</li>
<li>
<p>Better Beasts</p>
</li>
<li>
<p>LGNPC_Merged_Lt (Adds more background stories to characters, very optional but fun mod)</p>
</li>
<li>
<p>Apoapse's Attack (Makes Morrowind combat much more modern, essential if the vanilla combat makes you angry)</p>
</li>
</ul>
<p><em>I may edit this list later if I forgot something</em></p>
<p>I think that's the basics covered. I could go on and on about the game, covering every simple minimal aspect of it, or babble about TES lore, so it's hard to stop typing this. I love this game to bits, it's the game I always install first on any computer I get. I think I will keep playing it forever.</p>
<p>If you want to buy Morrowind, I recommend getting the <a href="https://www.gog.com/game/the_elder_scrolls_iii_morrowind_goty_edition">GOG version</a>, since it's DRM free and comes with all the official addons and expansions. It works the best with most mods, better than the Steam version in some cases since Steam overlay can bug out with MGEXE. You can disable the Steam overlay of course, but just sayin'.</p>
<p>Thank you for reading! I hope it was fun to read this or atleast it was fun to oogle at the pictures! :)</p>
<p>I think I'll go back to play Morrowind now..</p>
Bitksel - Bricks with speakers + logosThu, 29 Dec 2016 00:00:00 +0000Akselipersonalbitkselphones
https://akselmo.dev/posts/bricks-with-speakers-logos/
https://akselmo.dev/posts/bricks-with-speakers-logos/<p>During christmas holidays I visited my <span id="continue-reading"></span>parents and took some photos of the old Nokia phones I used to have. Thankfully my parents had kept them safe, I'm sure some of them would still work if recharged, but I'm not sure if the batteries are good anymore so I didn't take that risk.</p>
<p>I will type anything I remember about them on this post, but I won't go into technical details since you can find those elsewhere.</p>
<h3 id=""><a class="zola-anchor" href="#" aria-label="Anchor link for: "></a></h3>
<h3 id="nokia-2010"><a class="zola-anchor" href="#nokia-2010" aria-label="Anchor link for: nokia-2010">Nokia 2010</a></h3>
<p><a href="https://bitkselblog.files.wordpress.com/2016/12/bdc9d-img_20161224_222210.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/bdc9d-img_20161224_222210.jpg?w=225" alt="" /></a><a href="https://bitkselblog.files.wordpress.com/2016/12/8dab3-img_20161224_222250.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/8dab3-img_20161224_222250.jpg?w=225" alt="" /></a></p>
<p>I actually never <em>used</em> this phone, just played around with it. It was a "toy phone" for me when I was very young, which explains me trying to pimp it out with a sharpie. I'm kinda bummed I did that, but well, kids. I wanted to cover it here since it still used those huge sim cards, as you can see in the back of the phone. The battery is really big too, and even without the battery the phone is really heavy. It really is a brick.</p>
<h3 id="-1"><a class="zola-anchor" href="#-1" aria-label="Anchor link for: -1"></a></h3>
<h3 id="nokia-2110"><a class="zola-anchor" href="#nokia-2110" aria-label="Anchor link for: nokia-2110">Nokia 2110</a></h3>
<p><a href="https://bitkselblog.files.wordpress.com/2016/12/0ef1b-img_20161224_222019257e2.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/0ef1b-img_20161224_222019257e2.jpg?w=225" alt="" /></a><a href="https://bitkselblog.files.wordpress.com/2016/12/739bc-img_20161224_222049257e2.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/739bc-img_20161224_222049257e2.jpg?w=225" alt="" /></a></p>
<p>I'm not exactly sure if I ever used this either, but I remember either my mom or my dad using it. It's a really cool looking phone, also a huge brick, but smaller than the 2010. I think it still would work if I were to recharge it.</p>
<h3 id="-2"><a class="zola-anchor" href="#-2" aria-label="Anchor link for: -2"></a></h3>
<h3 id="nokia-3110"><a class="zola-anchor" href="#nokia-3110" aria-label="Anchor link for: nokia-3110">Nokia 3110</a></h3>
<p><a href="https://bitkselblog.files.wordpress.com/2016/12/c7da5-img_20161224_222331.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/c7da5-img_20161224_222331.jpg?w=225" alt="" /></a><a href="https://bitkselblog.files.wordpress.com/2016/12/07a6c-img_20161224_222342257e2.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/07a6c-img_20161224_222342257e2.jpg?w=225" alt="" /></a></p>
<p>Now this phone I did use. It was my first phone ever, I was about 6 years old when I got it as you can see from the racing cover on the front and Ferrari sticker on the battery. I think it's my uncles old phone, and when he got a new one I got this one. First it was just a "toy phone" without a SIM card, but I didn't really play with it. I remember always whining about "I want a working phone" and "I want an e-mail address" and my parents just replied "What would you use those for?" They were right, really. 6 year old in those days didn't really need a phone.</p>
<p>But eventually I started elementary school and moved outside alone, going to my friends place etc. I think it was halfway through the first grade my parents decided to get a SIM card for this phone. I was usually bullied at school, but the day I brought this phone to school I was the "cool kid" for the day. "Oh wooow you have a phone?! Does it have any games?!" they asked. During that time 3210 was a new thing and phones started to have games, so naturally they asked if this brick had too. Unfortunately, it didn't.</p>
<p>Me bringing this phone to school kinda started some kind of mobile phone craze in our class: Fast forward few weeks and everyone had a phone, and people had games on them, such as Snake-game.</p>
<h3 id="-3"><a class="zola-anchor" href="#-3" aria-label="Anchor link for: -3"></a></h3>
<h3 id="nokia-3210"><a class="zola-anchor" href="#nokia-3210" aria-label="Anchor link for: nokia-3210">Nokia 3210</a></h3>
<p><a href="https://bitkselblog.files.wordpress.com/2016/12/01332-img_20161224_222558.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/01332-img_20161224_222558.jpg?w=225" alt="" /></a><a href="https://bitkselblog.files.wordpress.com/2016/12/e23cc-img_20161224_222611.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/e23cc-img_20161224_222611.jpg?w=225" alt="" /></a></p>
<p>Obviously, I didn't want to fall behind others, so I pestered my parents for a new phone and I got myself 3210. 3310 had just appeared on the markets so this one was cheaper, so I got it. It was the first phone with games I ever used. I also bought logos to this phone: Logos are images that replace your operator name in the lock screen of your phone. It was basically the phones wallpaper. I will cover some of them later in this post.</p>
<h3 id="-4"><a class="zola-anchor" href="#-4" aria-label="Anchor link for: -4"></a></h3>
<h3 id="nokia-3310"><a class="zola-anchor" href="#nokia-3310" aria-label="Anchor link for: nokia-3310">Nokia 3310</a></h3>
<p><a href="https://bitkselblog.files.wordpress.com/2016/12/241ac-img-20161226-wa0003.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/241ac-img-20161226-wa0003.jpg?w=169" alt="" /></a><a href="https://bitkselblog.files.wordpress.com/2016/12/303b0-img-20161226-wa0002.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/303b0-img-20161226-wa0002.jpg?w=169" alt="" /></a></p>
<p>Nokia 3310 is usually the phone people refer as the most durable phone ever, jokingly or otherwise. To be honest, it really IS very durable phone. I took great care while using my phones, so I never had cracked screens or anything like that. My classmates though... I remember one of them talking how he threw the phone at wall when he got really angry at his parents and of course instantly regretted it. Luckily, the phone still worked just fine. So it definitely could take a beating.</p>
<p>This phone also had two more games instead of Snake. Some kind of puzzle game and a space shooter sidescroller game. I remember spending lots of time playing those games, they were actually really fun.</p>
<h3 id="-5"><a class="zola-anchor" href="#-5" aria-label="Anchor link for: -5"></a></h3>
<h3 id="nokia-3510i"><a class="zola-anchor" href="#nokia-3510i" aria-label="Anchor link for: nokia-3510i">Nokia 3510i</a></h3>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://upload.wikimedia.org/wikipedia/commons/8/8f/Nokia3510i.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Photo from [Wikipedia](https://fi.wikipedia.org/wiki/Nokia_3510i#/media/File:Nokia3510i.jpg), I unfortunately don't have this phone anymore
</td>
</tr>
</tbody>
</table>
<p>I used 3310 for a long time. It was a great phone. But then, color screens for phones became a thing and games for phones got more complex, so of course I wanted a new one! I remember saving money for this for months. I helped my grandparents do yardwork in order to get some cash, and eventually I had the money to get 3510i. I also got this "gaming case" for it: <a href="https://www.esato.com/gfx/phones/nokia3510i.jpg">https://www.esato.com/gfx/phones/nokia3510i.jpg</a> It was cool back then, but nowadays it just looks silly.</p>
<p>I really liked this phone though, probably one of the better ones I ever used. The buttons started shortly to lose the number markings though, since they were made of rubber. I bought some weird games on it that were advertised in back of magazines back then. I got some game that they advertised as "The Sims for your phone!" (I had gotten the first Sims game recently and I loved it so I wanted to play it on the go too.) Well, it was some really ridiculous game where you only move a woman in a night club and tried to hit on men or something. I never understood how you were supposed to play it. It was far from Sims though and I was very disappointed for spending 5€ for that game. Lesson learned though: Those advertisements were shady as hell, and the final product was never what you expected it to be.</p>
<h3 id="-6"><a class="zola-anchor" href="#-6" aria-label="Anchor link for: -6"></a></h3>
<h3 id="nokia-7210"><a class="zola-anchor" href="#nokia-7210" aria-label="Anchor link for: nokia-7210">Nokia 7210</a></h3>
<p><a href="https://bitkselblog.files.wordpress.com/2016/12/c6878-img_20161224_223006.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/c6878-img_20161224_223006.jpg?w=225" alt="" /></a><a href="https://bitkselblog.files.wordpress.com/2016/12/ce502-img_20161224_223020.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/ce502-img_20161224_223020.jpg?w=225" alt="" /></a></p>
<p>The reason why I wanted this phone was simple: It just looked cool to me. I liked my 3510i, but I wanted something a bit smaller and my 3510i had had some problems working, for example it cut in middle of calls sometimes. Luckily my uncle was getting a new phone, so I got his old 7210 I had drooled after for some time.</p>
<p>I don't remember much about this phone, except that it was very light and small. It had no crazy features or anything, pretty much the same as 3510i. It had colored screen too.</p>
<h3 id="-7"><a class="zola-anchor" href="#-7" aria-label="Anchor link for: -7"></a></h3>
<h3 id="nokia-3220"><a class="zola-anchor" href="#nokia-3220" aria-label="Anchor link for: nokia-3220">Nokia 3220</a></h3>
<p><a href="https://bitkselblog.files.wordpress.com/2016/12/6e55c-img_20161224_222839257e2.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/6e55c-img_20161224_222839257e2.jpg?w=225" alt="" /></a><a href="https://bitkselblog.files.wordpress.com/2016/12/4453e-img_20161224_222851257e2.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/4453e-img_20161224_222851257e2.jpg?w=225" alt="" /></a></p>
<p>Phone technology moved forward rapidly. After color screens, Nokia decided it was time for adding cameras on phones. And of course I wanted to stay on track with technology, and Nokia marketing this phone towards younger people, especially teens and pre-teens worked on me. The phone got the nickname "Teiniledit" as in "Teenage-LED's" since it had flashing LED's on the sides. I think I got this phone back in 2004.</p>
<p>I began to save money again and eventually got it. I was so excited to use photos as my phone wallpaper: I could finally have an image of GTA Vice City or Battlefield 1942 as a wallpaper. It was super cool to me, I could customize the phone the way I wanted. I also remember printing many photos to put inside the back case, so it would be truly be my nerdy phone and <em>look like me</em>.</p>
<p>I used this phone for a very long time. I even bought some games for it, like solitaire and some weird Splinter Cell game that had only four levels, but that game was actually alright for a phone game in those days. I also used the camera a lot, taking stupid photos of friends bouncing on trampoline or something like that.</p>
<h3 id="-8"><a class="zola-anchor" href="#-8" aria-label="Anchor link for: -8"></a></h3>
<h3 id="nokia-6630"><a class="zola-anchor" href="#nokia-6630" aria-label="Anchor link for: nokia-6630">Nokia 6630</a></h3>
<p><a href="https://bitkselblog.files.wordpress.com/2016/12/7d1ea-img_20161224_223147.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/7d1ea-img_20161224_223147.jpg?w=225" alt="" /></a><a href="https://bitkselblog.files.wordpress.com/2016/12/58559-img_20161224_223204.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/58559-img_20161224_223204.jpg?w=225" alt="" /></a></p>
<p>The last Nokia phone I used. I was in junior high-school, 8th grade in Finnish school system, so it was 2008. This was usually called "one of the first smart phones" back then. My 3220 was working fine, albeit it looked rather worn off since the rubbers covering LED's had broken.</p>
<p>My uncle again got a new phone and offered me his old one, in this case he offered me 6630. I never say no to a new phone, so of course I accepted the offer.</p>
<p>Shortly I learned this phone could play music so I finally could replace my shoddy MP3 player. It had a SD card support so I could fit more music in it than in a cheap MP3 player. It also had a good camera for it's time and, best of all... It could run <strong>DOOM</strong>. Hell yeah, I loved it! Back then I was playing a lot of Counter-Strike 1.6, so I downloaded a Counter-Strike mod for DOOM so I could play fake-CS 1.6 on my phone. It was silly, but oh man, so cool. 6630 supported also custom themes, so I got a Windows 98 theme for it. I guess I have always been a bit of a oldschool-PC lover, heh.</p>
<p>I used this phone for few years. When I graduated from jr. high and went to business college to study IT, my classmate told me about ZTE Blade. After that, I never went back to Nokia, but any phone that had Anrdoid running on it.</p>
<p>And thus ends my journey with Nokia phones. If Nokia would ever make a comeback and make Android phones, I would get one in a heartbeat.</p>
<h3 id="-9"><a class="zola-anchor" href="#-9" aria-label="Anchor link for: -9"></a></h3>
<h3 id="so-what-are-logos"><a class="zola-anchor" href="#so-what-are-logos" aria-label="Anchor link for: so-what-are-logos">So, what are logos?</a></h3>
<p>In case you don't know, logos are small images you could use as your phones "wallpaper." Normally, your old Nokia phone would have your operator name on your main screen, but when you bought a logo, it would replace this operator name with an image.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2016/12/b8929-logot.png)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Finnish logos, image from here: [http://logot.mbnet.fi/](http://logot.mbnet.fi/) They reek of early 2000's, ugh.
</td>
</tr>
</tbody>
</table>
It was really cool at first and everyone liked to order them for their phones. However, the logo sellers were really shady in some cases. If you ordered a logo, you would consent into some weird 30€ per month bill. They usually called it as some stupid "gold club" or whatever. They did talk about it, but it was in veeeeery tiny print in bottom of the page, so nobody ever saw it. Same happened also with ordering ringtones and games on your phone.
<p>After my parents getting a random 30€ bill because of this shady bullshit, we never bought any logo's or anything off these advertisements. Eventually, camera phones killed them completely. Good riddance, I say.</p>
<p>I do miss logos themselves though, they're kinda cool and some of them were really creative, considering the tiny amount of room you had for making them. They're basically pixel art. Unfortunately these logo sellers gave them a bad image.</p>
<p>Thank you for reading! I hope you enjoyed this short look into old Nokia phones. If you're curious, right now I have a LG Nexus 5 as my phone. I like it and I'm not in any hurry to replace it. Phone technology isn't as exciting to me anymore, since everything has really been done (for now). Back then, phones getting colored screens and cameras were new, cool features. Nowadays they're expected and people would be weirded out if some phone didn't have a camera. And no, I'm not complaining. It's just fascinating how times change.</p>
Bitksel - Santa Claus in TroubleSat, 17 Dec 2016 00:00:00 +0000Akselipersonalbitkselgame
https://akselmo.dev/posts/santa-claus-in-trouble/
https://akselmo.dev/posts/santa-claus-in-trouble/<p>I am actually one of those weirdos who love christmas.<span id="continue-reading"></span> I don't like how busy people are or any of that, but I like the wait and excitement that I still get, even it's not as prevalent as it was when I was younger. I also love christmas food and I get this very comfy feeling for some reason around christmas. No idea why, but it makes me happy, even if it's just a holiday to for companies to exploit blatant consumerism. ;)</p>
<p>Since christmas is within a week, I decided to reinstall one of my favorite christmas holiday games: Santa Claus in Trouble. This game has always put me in proper christmas mood and it's something I first played long time ago when I was a kid.</p>
<p>There used to be this Finnish computer magazine called Kompuutteri-lehti. It always came with some demo cd's called Kompuutteri-discs with it, and one of them had Santa Claus in Trouble. I should try to find all those discs and write something about them..</p>
<p>Anyway, back then I thought it would be a fun christmas game to play, especially after the disc mentioned it was completely 100% free and not just a demo. The game was made by CDV Software Entertainment and Joymania Development in 2002, and I think I got the disc around the same year. CDV was a publisher with lots of games under their belt, so this game was a free christmas gift to their fans.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2016/12/71d4f-20161217142007_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Main menu
</td>
</tr>
</tbody>
</table>
Santa Claus in Trouble is obviously full of christmas. Even the installer has very cheery christmas music. As far as I know, the story is just "Help Santa collect all the missing presents!" which is fine by me, I didn't expect anything more in-depth than that anyway.
<p>The game is actually a pretty solid platformer, where you jump around rooftops (or whatever they are) and collect presents, dodge trolls and try not to fall in the darkness that looms under the rooftops. Santa is quite nimble too as he can double jump. You use arrow keys to move and turn Santa around and jump with spacebar. Alternatively you can use a joystick or mouse+keyboard, but that didn't work for me because I have dual monitors and the mouse always escaped the game screen, since it isn't locked to the game.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2016/12/895cb-20161217142026_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Hunting those presents
</td>
</tr>
</tbody>
</table>
On modern systems you have to set Windows XP compatibility mode for the game, otherwise it doesn't work at all: The physics calculations will crap themselves and Santa animations spazz out. The game just gets really weird. But compatibility mode solved all the problems.
<p>As far as I know, there's ten levels of content, but I have actually never made that far. When I played this while back, I always either got tired of the game in the middle of it, or never reached the end. My little brother had beaten this game many times though, he used to play nothing else than this during December which was quite amusing. He obviously was way better than me in these type of games anyway.</p>
<p><a href="https://bitkselblog.files.wordpress.com/2016/12/f36cb-20161217142045_1.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/f36cb-20161217142045_1.jpg?w=300" alt="" /></a></p>
<p>One of my favorite memories about this game happened back in December 2007 or 2008. My friend, let's call him Bob for now, visited me and I showed him this game. I thought the game was genuinely good, but he thought it was just silly. I don't blame him, the game looks a bit silly. Still he wanted to install the game to himself and try it out, so I visited his place and we installed it.</p>
<p>Next day I get a phone call from Bob, but on the phone it wasn't him, it was one of his other friends. "Hey I saw that Santa game on Bob's PC, I really wanna try it, it looks amazing. Can I get the disc too? I would love to play it and I mean right now!" he said very excitedly. I chuckled a little, I didn't expect anything like that. It was already rather late, cold and dark because Finnish winter, but I still agreed to deliver the disc. Bob, his friend and I lived like 500 meters from each other, so I didn't mind at all.</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2016/12/527bd-20161217142227_1.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Santa isn't safe from trolls either
</td>
</tr>
</tbody>
</table>
Bob and his friend were waiting outside for me to arrive and I gave the disc to them. I told them I couldn't stay since it was really late, so I went back home. They went together to install the game.
<p>Next day at school Bob's friend approaches me and returns the disc. He goes on and on about how fun game it is. This made me really happy since I had made someone else happy. Spirit of christmas, I guess?</p>
<p>And that's why this game holds a special place in my heart: I had made someone happy with such a simple gesture. It also reminds me of those days when people just borrowed cd's from each other to install games and tried them out. This was more fun though since it was a free game, so I could just share it to anyone who wanted it, and they didn't need to have the disc to play it.</p>
<p>Unfortunately, this game can't be found on CDV's official site anymore, but don't worry, here's a christmas gift: <a href="https://drive.google.com/file/d/0B7-cJK68JK-3WlFIQWRiMjUzNDg/view?pageId=101328944891559246216">Download link!</a>
The link is safe, I used it to download the game too, and it was in the description of <a href="https://www.youtube.com/watch?v=sGvxUexF7ek">LGR's video</a> about the game and I trust this guy 100%.
According to him there's also a sequel, but I never got to try that unfortunately. Maybe one day though.</p>
<p>In conclusion, Santa Claus in Trouble is a very christmas-y platformer that is perfect for those cold winter nights to keep you smiling.</p>
<p>Merry Christmas everyone and happy holidays! Or should I say: Hyvää joulua!</p>
Bitksel - Visiting local arcade!Wed, 14 Dec 2016 00:00:00 +0000Akselipersonalbitkselgame
https://akselmo.dev/posts/visiting-local-arcade/
https://akselmo.dev/posts/visiting-local-arcade/<p>Today I visited the local arcade called "Pelibunkkeri."<span id="continue-reading"></span> My fiancée went to play laser tag with her classmates and that arcade is in the same place so I spent 20 minutes playing some arcade games. I just had to pay 5€ to play all these games as much as I wanted, so the pricing wasn't bad at all. There was also ice hockey tables etc. but those are obviously multiplayer games and I was alone there, so I just settled with the arcade games.</p>
<p>Unfortunately I didn't have much time to get properly into the games so this post will be a bit brief. Also sorry about the image quality, I used my phone camera since that's all I have and the lighting in there was really bad for photos.</p>
<h3 id="the-games"><a class="zola-anchor" href="#the-games" aria-label="Anchor link for: the-games">The games!</a></h3>
<p>First I played Sega Rally! I barely could fit into the racing seat because I'm 191 cm tall and these machines are clearly made for smaller people, but I managed to play it just fine. Really fun game, the steering wheel really fights back when you turn your car. There was something going on with the graphics though, the 2D images like your time and speed dial suddenly broke and were all weird and blocky. Besides that the game worked just fine and it was a blast!</p>
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2016/12/img_20161214_140527.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Sega Rally
</td>
</tr>
</tbody>
</table>
After that I tried some shooter game called Warzaid. It's a game about WW2 soldiers shooting zombies and skeletons or something like that, I didn't really get the plot. But who cares about a plot when you can shoot zombies with light guns! First I just played it in normal single player mode with one gun, but then I decided to try playing as two players, so I went akimbo with the light guns. It was actually easier to play that way since I could just spam both of the guns and zombies kept dying on the screen. Warzaid was the game I enjoyed the most at the arcade.
Next to it was two games, Harley Davidson L.A. Riders and Sky Targets. Sky Targets is a game about flying a fighter jet and shooting down other planes and huge boss planes, so it was really cool looking. I didn't really enjoy playing it though, the joystick was quite stiff (I know what you're thinking) and it was hard to aim at the enemy planes. It just felt.. Floaty and odd. It's not a bad game though, I would probably like it more if I had more time to play and practice.
L.A. Riders was a really fun motorcycle game where you cruise around L.A. trying to reach checkpoints in time, while destroying the city property like a "Bad Boy." Honestly, that's what the game called me after choosing my character. :D The controls felt a bit floaty here too, the bike could turn a bit faster but overall it was really great to play and the music was top notch.
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2016/12/img_20161214_140650.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >L.A. Riders, Sky Targets and Warzaid
</td>
</tr>
</tbody>
</table>
Next to those three there was one more game called Panic Park. I didn't really get to play it since I played it quickly before leaving, but it seemed to be game about running through stages and avoiding obstacles. Controls were really different from others, it was a joystick that you rotated to left and right.
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<p><a href="https://bitkselblog.files.wordpress.com/2016/12/img_20161214_140633.jpg"><img src="https://bitkselblog.files.wordpress.com/2016/12/img_20161214_140633.jpg?w=300" alt="" /></a></p>
<td style="text-align:center;" class="tr-caption" >Panic Park and a game I didn't get to try on the left
</td>
</tr>
</tbody>
</table>
On the other side of the room they had Sega Touring Car and Sega Racer (even the cabinet says "Megalo") just in a bigger screen, probably for taller people like me. Sega Touring Car was a really fun game aswell but I couldn't fit in the chair at all so it was really difficult to play, sadly. It was a lot like Sega Racer but had two different cars and different maps, plus some great eurobeat playing on the background. I would've enjoyed it a lot more if I could've fit in the seat, but #tallpeopleproblems.
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2016/12/img_20161214_140618.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Sega Touring Car and Sega Megalo/Rally
</td>
</tr>
</tbody>
</table>
Last but not least, I played good ol' Speedtester. This was very popular in Finland since there was a TV show called Speden Spelit where famous Finnish people would play different kind of games, including Speedtester. It's a very quick game to play which makes it very addicting. Best score I could do was 60, but with a bit of a practice I'm sure I could get over 100. :) I love how the machine is still talking about MK in the instructions, MK is the old Finnish Markka which we used until we switched to euros in January 2002, so it was quite a blast from the past.
<table cellpadding="0" align="center" style="margin-left:auto;margin-right:auto;text-align:center;" cellspacing="0" class="tr-caption-container" >
<tbody >
<tr >
<td style="text-align:center;" >[](https://bitkselblog.files.wordpress.com/2016/12/img_20161214_143250.jpg)
</td>
</tr>
<tr >
<td style="text-align:center;" class="tr-caption" >Speedtester
</td>
</tr>
</tbody>
</table>
<p>All in all, it was a fun place to visit. Unfortunately these days arcade machines are hard to find anywhere so I rarely get to play them. I'm sure I'll visit the place again and hopefully have more time to play everything.</p>
<p>Thanks for reading!</p>