GeistHaus
log in · sign up

https://racc.at/blog/feed

atom
22 posts
Polling state
Status active
Last polled May 18, 2026 23:58 UTC
Next poll May 20, 2026 01:06 UTC
Poll interval 86400s

Posts

Am I Just Being A Vegan About It

I've made a realization as I kept wondering why AI is being embraced by software developers.

Show full content
Am I Just Being A Vegan About It

If I'm not killing them myself, I don't need to feel bad about it.

I've been thinking about this for a while now. If you're someone who follows me on social media, you've probably noticed I'm pretty outspoken about my dislike for "AI" as it is developed and presented to us now. I'm also glad that the reception to things like image and video generation has been mostly negative. DLSS 5 caused massive backlash, and even made Nvidia CEO cry about how it's the children who are wrong, actually. Sora recently closed down to widespread cheering.

What you made with Sora mattered, and we know this is disappointing.

Come on, now, we know this isn't true. Nothing was created, nothing was lost.

These things seem to me like the cracks are starting to show, and this industry might crumble before our very eyes, buckling under its own weight. I want this to happen. It has to happen. These companies must go down in flames. Is this too much wishful thinking?

The chat bot era feels worse, more insidious, more destructive than the COVID-19 pandemic at the start of the decade. Much like COVID, these chatbots might be causing permanent damage to us, our capacity to think, to reason, to create, but here, the participants are willing, they're submitting to the disease, accepting it as the future unquestionably. Maybe it's not as good at killing as COVID was, but we know it tries its best.

Well, I still see AI use everywhere around me, despite the AI industry being in a state of "actively imploding" as we speak. A brief scan of my classmates' monitors reveal many browsers open into ChatGPT, too many to inspire confidence any of them have a future. I keep being shown AI generated videos and images against my will by my peers, people I usually trust, and I don't want any of it. Even when I tell them I don't want any of it, I'm still shown the same breed of garbage the very next day.

...Am I the weird one?

If you know me, you know I like computers. I'd say I'm pretty good at using them, and I don't say that about a lot of things! I like helping people use the computer, I like to solve problems, I like to program.

Well, while animosity towards AI seems to have been on an upwards trend when it comes to image and video generation models, and even general-purpose chat bots, as people begin to realize that the outputs are awful, soulless garbage which tries to appeal to everyone and thus appeals to no one, things have been going the opposite way when it comes to programming.

You don't actually need to know anything anymore. Even if you do, the chat bot can make a product faster than you could by hand. Of course, there's no joy or pride to be derived from getting Claude to do everything for you1, but when has any of this been about doing good work? Software development is primarily about coming up with solutions that work, a product, an artefact, something your user can run and have it work. And, well, the chat bot can do that just fine.

People who respect their craft, hone their skills, value the ability to explain how their system works? Those are the weird ones.

Sure, the bot can make mistakes, but humans can too. Why get worked up about it?

Everyone is doing it. Projects older than me, and developers who could be seen as role models and important figures in the space are adopting LLMs into their development workflow more readily than anything I'd ever seen. Vim, VLC, gstreamer, Kitty, the Linux Kernel, these are all already actively integrating the lying machine into their workflows.

Am I just being a vegan about it?

I oppose the use of LLMs on moral grounds. They're not trained responsibly, they devalue labor, they drive people insane, they consume ungodly amounts of power, they are prohibitive to run locally, they are being used to generate propaganda to unprecedented levels, these companies are actively killing the open web with their scrapers, and AI is also being used to generate really ugly ads that I don't like. I think that any one of these reasons should be enough for any reasonable person to give them up, so it's bizarre that these brilliant people don't just go back to doing what they were always doing before LLMs hit the scene, they have the skills, so why not just opt out of being evil?

But... then I started thinking.

People are really bad at making moral choices when there's any amount of indirection to the harm that is being caused. So long as they don't feel like they're actively causing harm themselves, why should they give something up? It feels nice. It helps them. It's not their fault. It's not their fault. It's not their fault. They're not hurting anyone. They have nothing to do with this.

I am not vegan, but I can't argue that their stance is incorrect. It's not. They are right. They're causing less harm than any meat eater by refusing to eat any animal products. They can't take down industrial animal farming by not eating meat, but they can disconnect themselves from the cycle, and they can try to convince their peers to do the same.

"I'm not killing them myself, I don't need to feel bad about it."

This is something I've told myself many times, years ago. It's pretty flimsy, isn't it? It's not a very smart statement. Just because I'm not doing the deed, means I am detached from it? Means I'm not perpetuating the cycle? That's wrong. It's nonsense. It's a coping mechanism. A thought-terminating cliché.

Things are tough for everyone. I am starting to collect myself. The people and projects who have turned to using chat bots are not evil2. They're meat eaters. They might not realize the extent of the moral failings needed to get them their shiny tool that does everything, much as someone might not realize the amount of pain and suffering needed to bring a roast chicken to their table.

I think that the best course of action might be to be gentle and educate our peers, but much like a vegan, you may not be listened to, you may be dismissed, you may be considered crazy for suggesting there's any evil attached to what they're doing. They can't see it's a failing on their part, because they're not doing it themselves.

I'm still holding up hope that this AI industry will crumble onto itself, but the reality is that things have changed forever, and they've changed for the worse. This is not a very hopeful conclusion, unfortunately, but thinking about this made me realize a lot of things, and I hope you can see where I'm coming from and can learn from it too.


  1. Though AI boosters love to talk about how they don't know anything and defer all of their decisions to the chat bot. 

  2. Mostly. I hope. 

https://racc.at/blog/?id=35
Contact update

A small update to my links.

Show full content
Contact update

This is a short one. I updated my links.

This update concerns the "Instant Messaging" section exclusively, it's been really outdated for a while now. I removed a few platforms I'm no longer using, such as Telegram and Escargot, and added Signal, XMPP, and Root in their stead.

In related news, Discord will apparently push their age verification requirement worldwide next month, and I'm not interested in sending them personally identifying information. I'll obviously continue to use Discord because that's where most of my contacts are, but I'll be much happier to talk to you over Signal or XMPP!

That's pretty much it. Besides that, I'm still working on the new version of this website, but I ended up needing to take a break, so despite my initial hopes, I most likely won't be able to finish everything this week. I promise it's all still in the works, though!

https://racc.at/blog/?id=34
Happy New Year

Yap yap yap. What does 2026 hold for us?

Show full content
Happy New Year

This has gone unused for a while, hasn't it?

I don't think there is a single soul who's subscribed to this blog and isn't also following me elsewhere, but if you're in that part of the Venn Diagram, then, well, that's awesome, and Happy New Year to you, too!

2025 was not fun. There were some pretty high highs, but mostly it was a slog and it has had its toll on me, mentally, which I haven't yet completely recovered from. Even still, there was growth throughout the struggle. I can only hope things get better through 2026, for all of us.

I haven't actually made a blog post about it like I have with Murder for Dessert, but I made another game for Ludum Dare back in October, together with Fupi and Brenonerb, Skeledaddler!, also Fupi worked a little more on it afterwards, and a few days ago, he published the post-jam version on Newgrounds, where it's gotten featured and almost 2K views at the time of writing, which is pretty cool and exciting.

To whom it may concern I am. Working on stuff. I have lots on my backlog, and lots to get done. One such project is to completely revamp this site. I've made some good progress, though I started that all the way back in August. I also have quite a few drafts in progress for more posts on this blog.

One of the things I worked on recently which I feel good about, and have actually been making good use out of is my Neovim plugin, interactive.nvim. I've also been letting some ideas stir in my brain, such as an online competitive match-3. I'm actually kind of excited about this concept.

All in all, I've been pretty badly burnt out for the past few months, college has left me reeling, and I'm not sure how I'm going to pick up the pace and get back to doing stuff, and I'm sure I'm not the only one who has been left feeling this way.

Well, it's pretty late now, I should be wrapping this up. Goodnight, and hopefully things start looking up!

💙

https://racc.at/blog/?id=33
Murder for Dessert

The new release from Kett and Fupicat.

Show full content
Murder for Dessert

I just updated the Games page with mine and Fupicat's Ludum Dare 57 entry, Murder for Dessert.

If you haven't checked it out yet, please do! We're quite proud of how it came out. Just note that it is a bit of a time commitment, and may take up to an hour to complete!

Less importantly, I've also updated the other entries in the Games page to include a more intuitive list of links, there are now more obvious "Play now" and "Source code" links for each one of the listed games, this way you don't have to read through my babbling if you really don't want to!

Until next time! ^-^

https://racc.at/blog/?id=32
The COSMOSTRIDE Post-Mortem

I made a game in 2023! Let's talk about it.

Show full content
The COSMOSTRIDE Post-Mortem Preface

As mentioned in an earlier blog post (turns out this is way overdue,) I decided to take part in Ludum Dare 54, and I had decided to go solo, just to see how much I would be able to do all by myself, having to handle all the assets, design, and programming.

The end result of this grind was COSMOSTRIDE, which is now available to play on itch.io, as well as my website.

This blog post has been in the works since shortly after I finished making the game, some time in November 2023. I kind of put it off until I couple days ago, when I decided to finish it up.... uhhhh.. Happy 2025!!!!! Better late than never!!

Theme announcement and brainstorming

For Ludum Dare 54 I wanted to go against a pattern that I noticed on my previous failed attempts at making a game for a jam. As I wrote on my last post on the subject:

For a lot of these jams, especially the failed attempts, I've noticed that I took more of an art-first approach, rather than one focusing on mechanics, or any real gameplay aspect that would be more substantial for a finished product than aesthetics.

For this reason, before I opened Godot, or Blender, or Krita, or Inkscape, or SunVox, I created a new Canvas on Obsidian to organize my thoughts. I wanted to put my ideas down into words that I could later reference, and when I was done with that, I could focus on a goal-oriented approach to implementing the game.

The theme was then announced... "Limited Space"

As is always the case, the theme was controversial, and a lot of people didn't like it. I didn't have any strong feelings towards it myself and started writing out what I thought others would take away from this prompt.

Since I wanted my game to "stick out" in a way, I wanted to avoid using the theme in a way that would be common.

In hindsight, the first thing I thought of, a "close-quarters single-screen action roguelike" was not actually as common of a type of entry, and I could have definitely gone with that.

A crop of an Obsidian Canvas showing initial thoughts on the theme to the left and the idea for the game I wanted to implement on the right

The idea

After about an hour of brainstorming, I decided to settle on something a little like a previous attempt at another Game Jam. This is one I didn't include on my last blog post, since I couldn't find the files for it then, but here it is:

A screenshot of an upgrade menu, it is a 5x5 grid of buttons which are empty, but some are filled in with sprites of modules

I don't remember at all which edition of Ludum Dare this was for, the theme, though, was Growth.

In this game you would be able to build your ship out of modules, and those modules would take up physical space in the world.

I had only implemented three different modules:

  • Health Modules that would increase your HP, they would individually have their own health, and enemy bullets would be able to pass through them and damage modules behind it as well.
  • The more expensive Shield Modules, which would recharge with time and protect modules behind it for as long as they still had power.
  • Weapon Modules which would fire full-auto plasma shots upon clicking the screen, however they could overheat if fired for too long, and enemy fire would be able to heat it up, too. If overheated, it would stop working temporarily to cool down.

Another screenshot of the prototype, this time in game, the player ship has twenty shield modules equipped and four guns, but no health at all. On the bottom, there are three bars, one says "0 Health," the second says "97 Shield," and the last one, "70 Energy"

The scope was broad and motivation was low, I was taking part in this jam while friends were also trying to make a game for the same event, but in the end none of us managed to submit a game.

I still thought the idea had merit, even if I didn't manage to carry through with it.

Now that I take a closer look at this project, I can think of a few ways I could have implemented COSMOSTRIDE that made better use of the jam theme of "Limited Space."

Theme usage

I decided I wanted to go for an on-rails space-shooter, just like StarFox. The module idea had merit, but I went with a safer version of it, where the modules are not physical objects in the world, but rather just objects that modify statistics.

In my original drafts for the implementation, I had a few wild ideas, such as Resident Evil 4 style inventory management for modules (which was not uncommon among other entries, given the theme,) and module damage much like the previous prototype, which would force the player to gauge risks when switching modules out or when choosing new ones.

Those were ideas that I still like, but my main goal for the jam wasn't to "wow," but rather to get anything done at all. I have many failed solo jam projects behind my back, and I didn't want this to be another one of those.

For this reason, I went with a very simple, and very loose usage of the theme. You have a very limited amount of module slots, make the most of them.

Three available slots, for six different types of modules, most of which have three different levels. Most of these modules stack, meaning that you can use the same type of module in more than one slot and get an amplified effect out of it.

Once I had this idea, I set it in stone and did not allow myself to change it.

From there, I made a task list, each task a goal, and I would have to tick all of them off to get the product I wanted.

A task list, featuring many different items organized hierarchically and a set of "Bonus and Optional" items beneath them

A slight bit of anxiety

My jam experience had a strange duality of taking it easy, and putting a lot of pressure on myself. I definitely did take it easy in making my scope very small and realistic within the time frame, and for this reason I put a lot of pressure on myself to actually finish the dang thing. I put myself in a very specific mindset: "If I don't do it now, I'm not doing it at all," forcing myself to get back in the fray with very few breaks.

Getting to work

With the idea set in stone, I was ready to go. I put on cool music, fired up Blender and made myself a cool combat spaceship model, low on the polys, but stylish nonetheless.

A ray-traced Blender render of the spaceship for COSMOSTRIDE

Yes, the ship was the very first thing I made, so much for not taking an "art-first approach" (!!)

Secondly, and probably most importantly, was getting the spaceship movement just right. So I fired up Godot and started working on it.

Initially, I made the spaceship a CharacterBody3D, since that is the node I'm most familiar with, and I'm used to making every single player controller extend this node.

extends CharacterBody3D

const SPEED = 20.0
const JUMP_VELOCITY = 4.5



var display_direction: Vector3 = Vector3.ZERO


func _physics_process(delta):
	var input_dir = Input.get_vector("move_left", "move_right", "move_descend", "move_ascend")
	if input_dir:
		velocity.x += input_dir.x * SPEED * delta
		velocity.y += input_dir.y * SPEED * delta
		velocity.x = clamp(velocity.x, -SPEED, SPEED)
		velocity.y = clamp(velocity.y, -SPEED, SPEED)

	velocity.x = lerp(velocity.x, 0.0, 0.05)
	velocity.y = lerp(velocity.y, 0.0, 0.05)
	
	display_direction.z = lerp(display_direction.z, -(input_dir.x) * 30.0, 0.05)
	display_direction.x = lerp(display_direction.x, (input_dir.y) * 30.0, 0.05)
	
	$ModelPosition.rotation_degrees.z = display_direction.z
	$ModelPosition.rotation_degrees.x = display_direction.x

	move_and_slide()

It is in fact a very simple controller, but it works for what I'm trying to do!

As it was a CharacterBody3D, I used invisible StaticBody3Ds to limit movement range to the screen space I wanted the player to be restricted to.

And so, this was my initial setup for the scene:

A screenshot of the "Scene" tab in Godot, showing the node hierarchy

As you may have noticed, I have a Node3D called PlayerRoot as the root of the scene, instead of the CharacterBody3D PlayerController, this is different from my usual approach, and it was done for several reasons:

  • It's an on-rails shooter I'm working on, so I wanted the whole scene to move, but I didn't want the PlayerController's local coordinates to be modified directly, so it was useful to keep a separate root node around.
  • To make it easier for myself to navigate the code, I decided I wanted the PlayerController to handle movement only, signal handling, data storage and other verbs (read: "aiming and shooting,") would be delegated to other nodes. This was a big plus and what made my code easy to read through even on the later hours of the event.
  • Child nodes inherit the position of their parents, and apply an offset of their own, I wanted PlayerController's siblings to move together, but not follow PlayerController, this is so the spaceship doesn't occupy the same space on-screen from having the camera follow it, and so that the PlayerBounds would actually have any effect at all. (It's hard for a wall to do its job when it's moving along with you!)

PlayerController has a child ModelPosition which is used to apply an offset to the transformation, which I used to tilt the spaceship in the direction the player moved their ship.

Before making the first commit, I had set "W" for move_descend, and "S" for move_ascend, but I quickly noticed that scheme didn't feel very good. The opposite felt more natural, and so I quickly changed them around. Nobody pointed this out when I released the game, so I believe I made the right call.

Enemies

You can't really have a space shooter without things to shoot, so I had to get right on to that. I fired up Blender once again and started making some things. I just put shapes together, I didn't want the enemy models to be as detailed as the player's, I wanted them to feel more like alien constructs, ones that don't even necessarily hint at anyone boarding them, as if they were unfeeling, automated murder machines targeting you.

An in-game screenshot showing the player model and three enemies shooting at it

Their projectiles, too, were simpler, just bright red energy balls, though that was more out of laziness than any kind of artistic intent. That was a bad call though, the lighting and color blending in with the enemies' made it very hard to tell where the bullets were, how close they were, and so dodging became harder.

I implemented two kinds of enemies, a quick, slim and vulnerable "Basic enemy," and a slower and tankier "Armored enemy." It is... quite boring, to be honest, but I was determined to keep my scope in check. Again, my main goal was to get anything done at all, even if I was not too happy with how it looks or feels.

Despite that, I found it really fun to glide around and shoot baddies, I made some very punchy hit and explosion sounds and spent a lot of time "testing," by which I mean I was having fun with the thing I was making.

Modules

Probably the biggest challenge for the game that I wanted to make was adding the Module system, the actual thing that will make the game (at least loosely) follow the theme, other than the somewhat claustrophobic nature of an on-rails space shooter.

I brainstormed a few ideas for modules and designed little icons for them in Inkscape. Starting with the simple, obvious ideas such as a shield module and a regeneration/repair module, then damage increase, fire rate upgrades.

Out of all the icons I came up with, only one ended up unused.

The first version of the module icons for COSMOSTRIDE

I made an on-rails space shooter, so it is almost upsetting that I didn't add a barrel roll, but if you take a look at the icons I designed, you can see I definitely intended to!

In hindsight it would be great if I did add a bullet deflecting barrel roll. It would be quite powerful, but the limited slots meant something else would have to be sacrificed.

The module that made it through, but that I didn't take too seriously or find very useful was the speed module, which increased how quickly you could dart from one side of the screen to another, but a few players noted that that was their favourite one, since it allowed for better and more reliable dodging. Better to not get hit at all than be able to tank hits.

Onto implementation, I had a lot of fun programming a module system, even though it is quite janky! Modules are represented as dictionaries with two fields: the name of the upgrade (SPEED, REGEN, SHOT_SPEED, etc.,) and its level. Most modules have three levels, the exception is the TWIN_FIRE module, which has only one. If I had implemented the Barrel Roll, I would've probably also added multiple levels to it, which would influence the cooldown time between each roll, can't just let you spam it, after all. In practice, there are around 9 levels to all of these levelled upgrades, since multiple upgrades of the same time can be dropped, this was intentional, and the stacking effects are pretty fun.

The modules were all added to an array, in order of what I thought was most basic, to what I thought was most powerful, the modules are then dropped randomly within a range of this list that is affected by the current game level:

An array named module_choices with a list of modules represented by dictionaries as described above

In theory, this is supposed to make it so the player becomes more powerful slowly as the game increases in intensity. Unfortunately, due to the nature of random chance, it is very possible that someone will get the best possible power-up for one level, and then get worse power-ups in subsequent ones, which kind of undoes the cool difficulty curve I had in my mind when making the game. This just brings to light how important it is to keep the RNG on a tight leash.

When I started work on COSMOSTRIDE, I hadn't yet used the full extent of features Godot 4 provides over Godot 3, and for the module menu, I used and abused GDScript's brand new Lambda functions to add the logic of swapping modules around the slots in the menu between each level.

Code for the player's module slot

Lambda functions are pretty great for adding logic to UI components! Rather than declaring some function somewhere else for something only a few buttons will do, I can inject the logic directly on the signal connection, and make use of any local variable inside the current function without the need to add it as an argument: i enumerates and iterates over each button and then adds a relation between the button and the underlying module data.

Difficulty and Progression

I've already had a level system implemented from the moment I added enemies to the game, and then with modules, for each level that passed, the player character would be (on average) more powerful. The enemies, then, had to put up a fight too, so I extended the enemy spawning script I'd implemented to change a few characteristics about enemies as levels progressed.

The first level would only spawn Basic enemies, the second would spawn them at a faster rate, the third would introduce Armored enemies and only spawn them, and from then on, both enemy types would be spawned at progressively faster rates, with a very punishing damage multiplier added to their bullets. Each level is time based, too, and the length increases by 5 seconds with each level, starting from 55.

I set up 13 levels using these properties, and then, after that they're generated programmatically, at which point, in theory, the difficulty plateaus, but nobody got that far to tell the story, so it is fine.

The music

I made every part of COSMOSTRIDE, including the music. That is something I don't have much experience with, but I have all the tools for. I used SunVox, a lightweight and powerful Tracker/DAW hybrid, to create the in-game music, "Wave"

I used a few samples I extracted from Bejeweled 2's "Beyond the Network" to create the music, and a couple of people noticed, which I found funny. Here's a fun fact for you: a lot of early PopCap music has music in tracker formats. You can open the music files in OpenMPT and give them a listen, extract their samples, and even fudge around with the patterns. That inspired a lot of curiosity and creativity in me to want to learn how to use tracker software, so I hope it can spark the same in you, too. :)

<iframe width="560" height="315" src="https://www.youtube.com/embed/05y6HUYfxug?si=h-ROXL4jqJHmhq6b" 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> Playtesting

After doing a lot of development work for a long time, I finally got to a point I was satisfied enough to get a few playtesters on board before publishing it to the Ludum Dare site, so I posted it to my Discord server (RIP,) and after a little bit of anxious waiting, friends returned with positive feedback and shared their scores. That's exactly what I wanted to see, and it made me very happy. My mission was complete, and with a few hours left, I submitted my game to the Jam.

Once the submission window closed, it was time to rate and get rated, and I got plenty of feedback! As I said before, my objective was not to "wow" anyone, but rather get something fun up, and that definitely came to fruition. People liked my game, but since it was a very "safe" entry, there was not much of note to talk about in feedback. The aesthetic and the music were received very positively, but some noted the sound effects were pretty grating after a while. Some others pointed out that the game fits the theme very loosely, if at all, which I agree with.

The ratings I've gotten were pretty middling, from 2.1 to 3.6, with "Fun" being my best category.

Conclusion

I don't know how much it is because of how I strove to keep the scope manageable, but I see COSMOSTRIDE as a great success, I managed to keep my energy up with a mentality of "I NEED to get this done." There might have been points at which I wanted to give up, but I actually managed to not give up. It was pretty... different, for me, because I give up on things very often.

After the Jam was over, I pushed a few more updates to the game, first the Leaderboard, and then some QoL updates, including better looking color-coded icons for the modules, which I think look really good! The game is, as always, available on my site, and the source code is on GitHub.

Ludum Dare is great fun, when I'm motivated enough to take part. Unfortunately, since LD54, life has gotten in the way. Between uni, getting ill, and plenty other factors, I haven't been able to participate in any event in 2024, here's hoping that this year I can-- wait, what? The 2025 events are cancelled? Uh. Alright.

If you can, send Mike, creator of Ludum Dare, some support. Looks like, just like many of us, he's in a bad spot right now.

As for me, I'll try my best to join more jams and try to get more games done, but this is a promise I've made to myself far too many times already, and I'm really bad at keeping promises, it turns out.

If we're friends, you're more than welcome to try and drag me off to work on something with you, too! If I'm not busy or depressed, chances are I'll accept.

https://racc.at/blog/?id=31
New Games Page

I updated the games page.

Show full content
New Games Page

I told myself I wouldn't be doing any more meta posting, but it's not like this blog has seen much activity this year. I've just updated the games page to match the same design as my blog.

I've also taken that opportunity to write a little description for each of the games I have listed over there... There aren't a whole lot of them, but that just made things a little easier for myself.

I'm happy with it, and it looks more presentable than what I had before.

I should probably give the unlisted drawpile page the same treatment, since it is a little bit of an eyesore, but I'll leave it as is for now.

And as far as "things I should do" go, I also should bring back the comments feature this blog originally had before the redesign. I have kinda gotten rid of a significant channel of communication earlier this year, but still crave the attention.

https://racc.at/blog/?id=30
brokenSUSE

I broke my openSUSE Tumbleweed install... It's okay though, it's feeling better now.

Show full content
brokenSUSE

It finally happened: my openSUSE Tumbleweed install broke! I was not ready for it.

Background

I've been using this same Tumbleweed install since 2022, it's a solid distribution, YaST is a handy little tool, it has a nice selection of packages, and I hadn't had any major problems with it... until last week.

It's so over

I had just gotten home from my third day of college, I turned on my PC and went to get changed, then checked my phone to get caught up with messages I'd received. Some ten minutes later, I check the monitor... Blank screen.

"Huh?"

I hit the "Any" key. Wiggle the mouse. Nothing. That's not good.

"Maybe something went wrong during the boot, somehow?"

I hit the reset button. Motherboard logo, alright. GRUB message, okay. Blank screen. Little cursor blinking at the top. I leave it be. A couple minutes later, it restarts on its own. The same thing happens. And then again. It was not going to fix itself.

But that's fine, it was probably just a bad update, by nature of being a rolling distribution, Tumbleweed is very prone to breakage. Thankfully, openSUSE, by default, saves snapshots before and after each update, so there is no breakage without salvation! Let me just get to the GRUB menu and...

Oh... Right.

Some months ago, just to get a quicker boot time, I set the GRUB timeout to zero. The menu does not appear. I only see a brief message and it attempts to boot into the installed system.

...Well, surely there is a way to make it show the menu regardless, right? It would be silly not to! After all, I do still see a GRUB message for a split second before the OS starts. Yeah, right! It says online I can use "Shift" or "Escape" to make it show a boot prompt aaaaaand that does not work.

Well, this is quickly turning out to be an exciting night, which I didn't sign up for at all. Time for a little rescue job.

I always keep a little bootable drive handy in case I need a Linux environment. Recently, it's been KDE Neon, because I was itching to give Plasma 6 a try before it officially came out.

So it was just a matter of plugging in a thumb drive with KDE Neon and I would be able to better assess the situation.

Rescue the chameleon

And so I got to work, once I was in the live environment, the first thing I did was to mount my main drive and chroot into it, everything did seem in order, so at least I could be sure I didn't lose anything.

My main focus right now was to set the boot timeout for GRUB, so that I could roll back, I would be able to find out afterwards what broke the system. Since I was already in a chroot environment anyways, I could simply try and use YaST to set up GRUB, instead of fiddling with the configuration files. First, however, I needed to actually mount some additional partitions under the chroot environment so that:

  • YaST would be able to launch properly
  • The system would be able to actually write the reconfigured GRUB to the EFI parition

I stumbled around a bit for this part, since I hadn't ever needed to mess around with mounting BTRFS subvolumes.

mount /dev/nvme0p2 /mnt # Mount the root fs
mount --bind /dev /mnt/dev   # Mount a few partitions
mount --bind /proc /mnt/proc # required by YaST
mount --bind /sys /mnt/sys
mount /dev/nvme0p1 /boot/efi # Mount the boot partition

# Mount the directories which store GRUB components
# referencing the subvolume names from fstab
mount /dev/nvme0p2 -o subvol=/@/boot/grub2/x86_64-efi /boot/grub2/x86_64-efi
mount /dev/nvme0p2 -o subvol=/@/boot/grub2/i386-pc /boot/grub2/i386-pc

I could have probably modified the grub configuration directly and built a configuration manually, but I always leave that to YaST under openSUSE because then things are less likely to go wrong. YaST actually recognised being under a chroot environment, so I figure it would be able to handle the task of reconfiguring GRUB.

After all of that was setup, I just hopped back into the chroot environment, ran YaST, and set the bootloader timeout to five seconds, and so a few agonizing seconds pass...

...And it was successful!

Well.... That was actually pretty easy. Time to reboot.

We're so back

Booting again, motherboard logo, and then GRUB appears! Nice! I immediately hop into advanced options and pick an older snapshot to boot from. Success, I'm in my desktop. I make sure to make this snapshot the active one with snapper rollback, and then reboot again.

We're all good. I decided to investigate.

Apparently the culprit was some package called virtiofsd, a dependency of qemu-tools, an update had changed a file into a directory, and rpm did not know how to deal with that, causing an error during installation (never a good thing), which I hadn't noticed because I left it updating through the graphical updater at some point.

So in the end, it was just a matter of me not paying attention to what a system update did.

Still, maybe I did need the scare, Tumbleweed had kept me way too comfy for a while, I needed something to get me back into hacking around in my system to fix problems.

https://racc.at/blog/?id=29
Goodbye, DeviantArt

I go over the process of downloading all the artwork I've submit to DeviantArt before closing down my account.

Show full content
Goodbye, DeviantArt!

DeviantArt's "Deactivated Acount" screen distorted

Between AI generated content being presented alongside real artwork, the option of disallowing your artwork from being used as training data being something you need to seek out for submitted works, rather than a global setting, the horrible user interface, and the many bad decisions which somehow made a bad website worse1, I've decided to finally quit DeviantArt once and for all.

I'm already through with dealing with platforms I dislike, and provide no value to me. That is why I've gone as far as deactivating my Twitter account earlier this year, despite having gotten a considerable following over the years. I am no longer interested on keeping myself shackled to these social media websites. I still use Discord because nobody is seriously willing to switch to something like Matrix or Telegram just for me.2

DeviantArt is a little different, however, in that it was the very first platform I've started posting artwork to, and, from there, building bonds in. My first DeviantArt account was created back in 2012, when I was thirteen years old, and I eventually deleted that account, which means I've lost a little bit of history. You see, the only reason I had not deleted my DeviantArt account until now is because I don't want that to happen again, I want to have all my content safe and in my hands before I can dispose of the account. And, honestly, until I started using PostyBirb to submit my artwork to all my galleries at once, I had forgotten completely that I even had a DeviantArt, it was no longer important for me. I just want my old artwork on my drives before nuking it.

Getting my stuff back

Of course, DeviantArt does not provide a simple way to download my entire gallery quickly... That's just the sort of thing that would make deactivation a lot more attractive. Thankfully, it didn't take much searching to find a solution.

I am an avid user of yt-dlp, a fork of youtube-dl. It's probably the one command-line tool that I could probably convince the average Windows user to incorporate into their daily life just because of how simple and how useful it is. It will download videos from a vast selection of video hosting websites, and not just YouTube, as its name would imply, you can also download entire channels or playlists just by passing its URL as an argument to the yt-dlp program. This is made for videos, though, not for downloading galleries from art websites, so surely there must be an equivalent for this purpose?

gallery-dl is a tool that came from the heavens, for people who want to archive galleries of content that is probably not as safe and wholesome as "artwork I did while I was a kid," especially if you take some time to check their supported sites... Well, I appreciate the work that has gone into it regardless, and it'll probably still get a lot of use from me past this initial test run.

To get gallery-dl, I just installed it with pip

pip3 install gallery-dl

From there, I just ran the following command:

gallery-dl https://www.deviantart.com/catusfelony/gallery/all --sleep 10 --write-metadata --no-skip

This started downloading the entirety of my gallery -- 297 images -- from newest to oldest.3 When I got back to my computer, my entire gallery was now under gallery-dl/deviantart/catusfelony, along with some metadata about each submission, such as its title, when it was first submitted, and even the amount of favourites each piece has gotten.

And that's it!

My DeviantArt account was now safe to nuke. Good riddance!4

If you used to watch me, but only on DeviantArt (at which point it is unlikely you'd wind up here,) or if you do not yet follow me on any of the platforms I am actively using, check out my links. I promise you Bluesky isn't that bad.


  1. Fun fact: Did you know you need to have a paid subscription in order to have two-factor authentication? That's good. 

  2. I also have some seven years of direct messages stored there, some with people I have not been in touch for around half that time. Discord is probably the most difficult platform to leave behind just because of the memories that live only there. If archiving all of this content is possible, that'll become much easier for me. 

  3. This method uses the public API key, which means it is heavily rate-limited, but I did this before going to bed and didn't mind leaving it running overnight. You can always set your own keys if you really need it to be quick, but I don't really care. 

  4. And of course, there will be archives of my gallery lying around, like in the Wayback Machine or other such sites. That is not my concern, I simply don't want to be part of a platform which I do not approve of, the solution for that is simple: Leave. And so I did. 

https://racc.at/blog/?id=28
Prior Jams

I have a little bit of history with game jams

Show full content
Prior Jams

Last Friday, Ludum Dare 54 started, and I couldn't just not participate, since I have all the free time in the world now, there's simply no excuse to pass up on a good old game jam to hone my skills. I'm definitely going to write up a little post-mortem to publish some time this week, but for now, I decided to take a look at my other, previous experiences with game jams.

What's in the past Sluggish Grind

My very first participation was in Ludum Dare 45, where I made Sluggish Grind, here's the page for it in the Ludum Dare site. The original Jam version was pretty lacking, it didn't have music, the design was not finalized, there were no such niceties as hit feedback on enemies and there were no prompts to guide the player in the right direction. I fixed most of these issues in the post-jam version that is available to play on my site. Despite the many flaws with the game I submit, the comments I got were generally positive, it was a fun little game, especially if you could figure out the hidden mechanic I snuck in where you could make your little sluggy glide around at warp speeds.

And then... it would take a long time before I actually finished anything for Ludum Dare again.

Keep it alive

That was the theme for Ludum Dare 46, for which I had started on a project, but I had no idea where I wanted it to go. I made a snowscape and a foggy main scene, but it didn't go much further than that. A low-poly snowscape

And this is what player.tscn looks like... A weird low-poly dog-like creature

Cyber Bird

The theme for Ludum Dare 48 was "Deeper and deeper."

This was my first attempt at a Ludum Dare in a team, I got together with Floralope (CW: Twitter), and he did some lovely little sprites for our main character.

A spritesheet containing many sprites of a white robotic bird-like creature with blue holographic wings

I was also very satisfied with the movement for this game...

Unfortunately, we overscoped, and our workflow wasn't efficient enough, so we couldn't have possibly finished the game in time.

The Axolotl Magician

This wasn't for Ludum Dare, but rather for Mini Jam. Regardless, it was another failed project. I had designed a cute little axolotl magician and wanted to incorporate the suits as gameplay significant symbols

A spritesheet for a cute little pink axolotl magician with a top hat, tuxedo and bowtie

I didn't make much progress on this one either. I saw the theme, made a cute character and noticed afterwards I had no idea what sort of game I wanted to make. While that had worked for Sluggish Grind, it is clearly not a very sustainable mindset for this kind of challenge.

If I want to get something done, I need to know what I want to be done. Doing things aimlessly as I had done for all these prior projects was not going to work, and it took several failures to realize that.

These files are dated November 2019, and it was shortly after this that I got a job and found myself unmotivated and unwilling to take part in game jams again for a long time afterwards.

Bunpacking

This was the first time I took part in a jam not as the programmer, but as artist and designer, Chai (CW: Mastodon) and I got together and we had agreed almost instantly on what our game should be and were in sync for the whole duration of the jam.

It was Ludum Dare 53, and the theme was "Delivery," so we went for something simple and cute that very overtly made use of the theme.

We went for a Paper Mario-esque aesthetic, featuring 2D character sprites in a 3D environment, and I did all the art and animations for this project.

Sprite sheet for a white postbunny with a light blue dress and a cap with a circular emblem, player character for the game Bunpacking

Spritesheet for the Nabber, a raccoon with a constant devious grin on its face, the enemy in Bunpacking

I designed those characters to be very easy to draw repeatedly (notice the noodle limbs,) since I was supposed to animate them and there was no way around it, and I believe I pulled it off in a way that doesn't make it seem like I was taking an easy route. It was definitely deliberate in the sense I wanted to make it easier for myself, but it still worked in favor of the game's aesthetic.

I also designed a little house model for the locations the player had to deliver items to. There are 4 different textures for the model that are applied in engine to differentiate the four houses.

A pink-purple house, a very simple model with hand-drawn textures, giving it a childish look

The UV mapping is a complete mess, but nobody is gonna pay attention to that while playing the game.

In short, this was a resounding success and to this day I am very happy with the result. Bunpacking came out a very fun game.

Hindsight

For a lot of these jams, especially the failed attempts, I've noticed that I took more of an art-first approach, rather than one focusing on mechanics, or any real gameplay aspect that would be more substantial for a finished product than aesthetics.

And, in fact, with my newest entry, COSMOSTRIDE, made for Ludum Dare 54, I focused on the game first, I had an idea, I laid it out, and all I had to do was execute it.

I think that was a very important step, and something very important to find out about myself.

Keeping that in mind for the future, I aim to make even more projects soon.

https://racc.at/blog/?id=27
How Minecraft fails to captivate me, specifically

I go over why I keep losing interest in Minecraft, then revisiting it months later.

Show full content
How Minecraft fails to captivate me, specifically

Time and time again.

Not many memories

I can't really say I have much nostalgia for Minecraft. I played it a few times when I was in my early teens, around 14 or 15 years of age, but I didn't even own the game then, either playing offline or hosting a server for my friends, because that was free and I could turn off authentication so I could join them.

I only purchased Minecraft after I'd gotten a job, and had my own money, in 2020.

Cycle of (dis)interest

Ever since then I have been in a cycle of revisiting the game around every three or six months, playing it for a week or two at most, then quitting, for the cycle to repeat again.

I decided to take some time to analyze why Minecraft fails so consistently to captivate me, and keep my attention, when arguably less interesting games can make me hyperfixate for months at a time.

Steps of the cycle

So let's take a closer look at how this cycle goes.

1. Let's play Minecraft!

The cycle begins with an invitation to play, of course. Whether it comes from an outside source, friend groups or recommended YouTube videos, or from myself, being reminded of its existence.

It's at this time I'll boot up trusty ATLauncher, make a new server or instance, and start playing.

Most of the times this happens, I'll actually be asked to host a server for someone else, because for one reason or another they were not able to do it on their own and I'm the one who has done it time and time again for years.

2. How are we going to play it, then?

Spoilers: It's never Vanilla.

Ever since I first started playing Minecraft, I took a liking for the Fabric modloader. It was a time at which the only options were Forge, and Fabric was just taking off. I read up on them and the philosophy behind Fabric caught my attention. So, for the same reasons I use Linux, I decided to stick with Fabric for all my modding needs1.

3. Modpacks!

Since the servers I host are never just for myself, I end up taking mod recommendations from everyone who plays, and it ends up turning into a mess. Sometimes there isn't even any time to play before it becomes a mess, being sent a huge modpack full of incompatible, unnecessary or bloated mods.

In my attempt to please others I end up making a gameplay experience I'm not invested in myself, and my participation and engagement suffers from it.

My own lack of moderation and control over how my server will function is probably a big part of why I don't like playing to start with, but at the same time, I aim to please, for no good reason.

4. Left behind

Everyone with whom I play has already been playing the game for many years more than I have, are more familiar with it than I am, and have intentions that conflict with mine.

Usually, my Minecraft playthroughs involve getting materials, making gear, building a little house, maybe making a Nether portal, and not much else.

After a day in the server, the space surrounding spawn will be full of player buildings, their bases, their statues, the communal chests. Some will, of course, move far away from spawn to setup base in the perfect biome, can't fault that. It's very nice seeing what others come up with. Glass buildings, tree houses, decorated mountain caves, it's a delight.

A few days longer, someone will have a chunk dug out, have farms built and banalize the little bit of progression the game has, and then I lose interest.

5. General disinterest and Death

A few days longer, someone or a group goes to The End, kills the dragon and that marks the end of the server itself. Two or three days longer, nobody is logging in anymore, I quietly shut down the server, and nobody asks me to bring it up again. I keep every world saved, but realistically, none of it will ever be seen again.

Detraction

I already have little interest in the game itself, confusing mods that get in the way of the experience, an imbalance in player experience and progress, and ultimately the general loss of interest just serve to put finality into the cycle. Playing alone isn't fun either and I get no enjoyment out of it.

A matter of taste, or a matter of your head being weird?

I think what it comes down to, though, is that I don't really know how to enjoy Minecraft. After some analysis on the games I actually like, it seems like sandboxes are not in my favorites at all. I like to be guided and given a goal to strive for. If I'm put in a sandbox and given the space to learn, and explore, and interact with it with no guidance, I'll be lost. It seems to me that my ideal experience is a curated one, rather than an emergent one.

Of your head being weird, then

And if I think about it hard enough, it would seem this goes for how I interact with the world around me as a whole. For instance, I try to be careful with my words and guide others to engage with the aspects I want, being misunderstood is paralyzing, thus, I am careful so that I am interpreted exactly as I intend.

That constant policing of my own behavior, the fear of sounding dumb, gave many the impression of me being smarter than I really am, which sounds good on the surface, but also made me unapproachable. I have mostly gotten over that fear in recent years, as it affected my communication negatively2.

It's not all bad though, designing with intent is good, steering an experience is good. As someone who gets lost and confused in games a lot, I end up thinking about design a lot, and give it a lot of value. A bad, or confusingly designed game just won't be finished by anyone like me. And I definitely intend to give a more detailed write-up of that at some later point.

But maybe there's still a way?

I don't think my distaste for Minecraft is irremediable, though. I would just need the sort of guidance I get from games that are designed with intent, externalized. When I set up and play on a server, it really isn't that different from playing alone, most of the time.

I think playing the game with few or no modifications, and engaging constantly with other players would be a very sweet experience. I just have yet to have that experience at all3.

It all comes down to the fact I am a little slow and I require a little bit of patient guidance to be good at anything. The problem is that I don't seem that way to most, I make myself seem like I've got it all figured out4.

Closing

Minecraft is cool, I hate it. Maybe an experience made with intent will make me hate it less. Maybe I should check out custom maps or something.

I think this cycle is common for people other than myself as well, but probably not for the same reasons. If this is true I would like to know what causes that cycle of disinterest for you, hit me up.


  1. I don't necessarily care for all the drama behind modloaders, I don't engage with the Minecraft modding community and honestly, from watching all of the shit-slinging unfold from a distance, I'm not sure if I want to. 

  2. It turns out that thinking a lot about how you say things makes you slower to respond, and with spoken communication especially, makes you stammer and pause. 

  3. And if you want to be part of that, you can hit me up. :) 

  4. I don't. 

https://racc.at/blog/?id=26
New summaries

Changed the blog so you see this text instead of the post body on the main page. More compact!

Show full content
New summaries

Now done right, I hope.

Summarized!

I just updated the blog again to show summaries instead of the entire post body on the main page, with it like this, I don't see myself needing to add pagination any time soon as it's compact enough. Now 100% AI-free, too, because I didn't like doing it that way before.

I kinda don't like the sheer amount of yellow in the main page now, though, with all of the titles being links, so I'll probably change that.

Reading time!

I also added a little estimation of how much time it'll take to read any particular post! I based it off an estimation that on average, a person will read 200 words per minute, and I also based it off the average word being 5 characters long, so it's a really simple function that just divides the number of characters on each post by 1000, rounds it up, and calls it a day. You'll notice that that estimation will often match up with the one on Firefox's reading mode, so I suppose I did good enough a job on that.

Syntax highlighting!

I'm making use of commonmark-highlighter to highlight code blocks on the server side now. Behold, a snippet of C!

void get_ball_click(GameState *game, Vector2 mouse_position) {
    for (int i = 0; i < game->ballc; i++) {
        if (CheckCollisionPointCircle(mouse_position, (Vector2){game->ballv[i].x, game->ballv[i].y}, game->ballv[i].r)) {
            game->ballv[i].yspeed = -20;
            game->ballv[i].xspeed += (game->ballv[i].xspeed > 0) ? 2 : -2;
            game->ballv[i].r -= 3;

            game->score += 1 * game->ballv[i].streak++;
        }
    }

}

I don't know how often I'll post about code in this blog, but a little bit of color goes a long way! :)

Atom feed!

The blog has an Atom feed you can plug into your favourite reader. Here's the address for it.

https://racc.at/blog/?id=25
A Drawpile!

We've finally done a Drawpile session again after a very long hiatus!

Show full content
A Drawpile!

racc.at Drawpile Session 2023-09-03

After a hiatus of over a year, I hosted another Drawpile session on my server. I'm happy to say that... my announcement script still works!

Discord message from a webhook announcing the Drawpile session

In all seriousness, it was very nice to be drawing together with friends in one big canvas again, and it was funny seeing everyone try to adjust to Drawpile's finicky tools after all of us went so long without using it.

I'm planning to do this at least twice a month, tasks marked in order to hold myself accountable. I also intend to host those themed "Scene" Drawpiles often, hope you can be around for those, as long as you're part of my Discord server, you're welcome to drop in.

By the way, the old Drawpile gallery still exists, it's just not listed on the main page. You can look at it and see the gap between yesterday's session and the one before. Oof.

A drawing of Kett at a keyboard, saying: "I have built in programmer socks, so The C Programming Language comes naturally

https://racc.at/blog/?id=24
Game of Life

I wrote Game of Life in GLSL, I go over some details and an embarrassing mistake in my code.

Show full content
Game of Life

As another episode on my C adventures, I've decided to implement Conway's Game of Life in C, using raylib, just like I had done with my bouncy balls a few posts earlier.

Once again, the source code is available on my GitHub, so you can check it out if you'd like. If you're running Linux, just make sure to have the raylib library installed, and run make run to compile and run.

If you're on another platform, idk. Good luck.

(In all seriousness: I'll look into making this and bouncy-ball buildable on Windows if anyone is actually interested, I just don't have the means or the patience for that right now. If you do, you can always send in a pull request ;D)

Implementation details

I am going crazy over raylib right now I'm not gonna lie. It's so easy to use compared with the SDL I was using before for these C experiments, everything is simple. Life is good.

This uses two RenderTexture2Ds that are interchanged each frame, the previous frame is used as input for the next one, and my fragment shader, gol.glsl, takes that input, a visual representation of the grid, and spits out the new, updated one. The bonus of using a shader is that it runs on the GPU, which is very speedy for this kind of math.

The simulation itself is nothing special, it's just Conway's Game of Life... But I have a confession to make.

Deadly mistake

I implemented the rules for the game reading from the Wikipedia article, the following is all I had to go off of for guiding me on my implementation:

At each step in time, the following transitions occur:

  1. Any live cell with fewer than two live neighbours dies, as if by underpopulation.
  2. Any live cell with two or three live neighbours lives on to the next generation.
  3. Any live cell with more than three live neighbours dies, as if by overpopulation.
  4. Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.

These rules, which compare the behaviour of the automaton to real life, can be condensed into the following:

  1. Any live cell with two or three live neighbours survives.
  2. Any dead cell with three live neighbours becomes a live cell.
  3. All other live cells die in the next generation. Similarly, all other dead cells stay dead.

And I made a mistake.

I watched the simulation go wrong so many times, what could it be, what could it be?! Here are the things I checked before I found out where my mistake was:

  • Maybe it could be an off-by-one error on the for loops?
  • Or maybe I misplaced an i and j on the for loops...
  • Maybe the math I did to get the pixel size is wrong
  • Maybe the Wikipedia article is wrong.
  • ...or maybe I made a mistake implementing the rules
  • Maybe it's not getting neighbors because of floating point math weirdness
  • Maybe the floats don't have enough precision...
  • Maybe I shouldn't be using ints?

I tried fixing all these "problems" (except the Wikipedia one that was just me reaching my wit's end,) but the result was the same, and then...

Take a look at line 24 on gol.glsl. And then take a look at what it looked like before.

if (i + j != 0) {
	if (sample_position(fragTexCoord + (vec2(i, -j) * pixelsize)) == 1.0) {
		count++;
	}

I had failed to consider the positions (-1, 1) and (1, -1) in the neighbor check, and that turned a one-hour project into a four-hour one, because that was the last place I went to look for a mistake.

discord messages summing up the mistake

That was pretty embarrassing.

But still,

...

I'm pretty happy with the end result! It runs very snappily, no matter how high I make the resolution, it really impresses me how much parallel math a GPU can evaluate, a 4800x2700 simulation running at 60 frames per second was only using 20% of my Radeon RX 6600's capacity.

Writing things on a lower level like this really makes you appreciate just how powerful modern hardware really is, even if it's not top-of-the-line. I think we've gotten too comfortable with just how much power we have, that we've been wasting it.

I usually advocate for staying comfy, but I think we could do better, y'know? I think we could squeeze more performance out of our math machines.

https://racc.at/blog/?id=23
Dotfiles

I put some of my dotfiles up on GitHub, you can check them out if you want.

Show full content
Dotfiles

I've pushed a repository with few of my Linux dotfiles to my GitHub, check it out.

Currently only has Neovim and ZShell dotfiles, but I'll probably add more, like my i3 config if I decide I want to use that again.

I have a few 'plugins' for ZShell that are added as submodules, so make sure to run git submodule update --init if you plan on making use of my dotfiles for any reason.

https://racc.at/blog/?id=22
Bouncy balls are great entertainment

Little bouncy ball project I wrote in C, for learning how to use raylib.

Show full content
Bouncy balls are great entertainment

A video showed up on my YouTube feed about putting a few tools together to make a pretty and artsy program. What caught my eye, though, was this library I hadn't heard of before: raylib.

Getting it

I was immediately interested in it, from what little I had seen from watching a few minutes of Tsoding's video, it seemed very simple to use, so I wanted to give it a try.

I searched my distibution's repositories, and sure enough, raylib is available for download on openSUSE Tumbleweed, so I fetched raylib-devel and I was ready to go.

Making use of it

The video I was featured at one point a ball bouncing around the screen, just like a DVD screensaver. I can't say I wasn't inspired by that for the project I ended up making.

It's just a simple game where you click bouncing balls, using raylib for graphics.

I was absolutely right on my assumption of it being easy to use. I barely needed to check documentation at all to get something working, the language server autocompletions guided me on finding any functions I needed. It didn't get in the way at all, and required less boilerplate than SDL.

Compiling and stripping results in an executable 15KB in size, which I honestly think is stunning.

I've been getting a certain kind of joy writing C these past couple of weeks. It's simple and it puts me in control. That's pretty much the two factors that made me want to switch to Linux in the first place. Anything that goes wrong is probably my fault, and not due to heavy abstraction or complexity or someone else's mistake. I like that. It feels a little enlightening even. Hehe.

https://racc.at/blog/?id=21
The Language Model Experiment

I made AI summarize my posts and hated it, actually.

Show full content
The Language Model Experiment

And, the immediate regret that followed.

What?

I found a special kind of fondness for language models lately, and the possible productivity enhancing capabilities they can offer. I'm already making use of "AI", namely Codeium, to help me with a few programming projects. It saves me time, writing boring boilerplate in languages like C, and making logical inferences from what I type, kind of like a smarter version of Excel's auto-fill. That's all it is.

I've also started running language models on my own computer, and spent a lot of time tonight tweaking things. Getting llama.cpp set up to work with OpenBLAS , and CLBlast, so I could make use of my GPU for text generation. Setting these things up made LLM text generation speed up by about 8 times the original time they were taking running exclusively on the CPU.

What's the experiment?

Well, I set up a script to summarize my posts on this blog, and I really liked the idea! I thought it was really cool, and I could even say it was a character of mine writing these summaries. Poor Amelia can't be replaced by a robot.

What did you mean by regret?

It was only once I had finally written the code to display the summaries on the blog overview that I was struck with a feeling of self-consciousness.

Looking at the overview, filled with AI generated summaries of the things I've written before, I thought to myself: "This blog is mine, and all about my interests. If I add a language model to the mix, writing in the same place as I do, it will muddy the waters. Maybe the blog posts themselves will be AI generated too. Maybe I'll lose control of my own blog while chasing this down."

Oh.

Yeah, maybe a little too paranoid? Who knows. But it made me reconsider the idea minutes after implementing it.

I've made the decision. Just like my diary, with my blog, too, I will not get AI involved whatsoever. My blog is mine entirely, and I will not delegate it to a machine writing on my behalf. I would sooner punch robots.

I promise everything that's written here is and will always be authored by me.

And I guess it's like that that I lose interest in large language models.

Realized something?

Yeah, this was certainly odd! I don't recall feeling so negatively about something like this after finishing it. I usually realize whether something is the kind of thing I won't enjoy while I'm doing it, or before doing anything at all. I wonder what drove me to see this to the end just to backpedal once I saw the result.

I should probably go draw something. Or *looks at time*... Or go to sleep.

https://racc.at/blog/?id=20
Upcoming Projects

Some little things I got in the works

Show full content
Upcoming Projects

I have some things in the works, but I feel like I need to give the slightest bit of details to hold myself accountable, so this is what this blog post is for.

The Teal Animation Project

This is the project for which I gave myself five rules to work on it effectively, one of those rules was to work on it every day. I did not work on it for more than one day. I plan on resuming progress on that project eventually.

"Atrean Strikers"

This is a rogue like project I want to work on, I have a rough draft document on its design, and I want to work on it. It'll likely be a mobile game, and I plan on publishing it to Google Play if I ever finish it.

talkies

I challenged myself to make a chat client and server in Rust to learn the ins and outs of the language; I don't know if I'm making it overly complex in design in my own head, but I'm having a hard time finding the energy to complete that project. I didn't get very far, but I'll see if I can make more progress.

Something with SDL

I've been having a lot of fun writing C lately, and I'm starting to get the hang of how SDL works, I want to make a game with a little more of a "from scratch" approach to hone my skills, and I think something in C with SDL to handle graphics, audio and input is a great choice for that purpose.

This is a project I actually plan on writing about here in the blog as I work on it. I have a rough idea of what I actually want for it, and it would be nice to start holding myself accountable by making posts about it in a periodical manner, kind of like a progress report.

The Games Page

I've updated nearly all pages of my site to the new 2023 design, except for the Games page, that's still rocking that same original 2021 racc.at theme. I want to change that to make all pages in this site consistent. In addition to that, I really need more items to fill that page in with. It's got a lot of space left.

Edit: Hey, it took a while, but at least I got this one done.

Oops.

So in short I have plenty of projects I want to work on, but I can hardly find the motivation to actually get to work on any of it. I'm sure that'll change with time, as it always has, but I really do wish I could consistently Get To Business with these things. Time is moving fast, but I am not.

https://racc.at/blog/?id=19
More meta talk

Blogging about the blog

Show full content
More meta talk

It just so happens that this blog has taken up a lot of my time today as well, and is about the most interesting thing I've worked on lately.

I've updated the blog once again to now render the Markdown on the server side. The main reason for this is so that it may function properly even if you happen to be browsing my site on something like w3m.

Like so:

racc.at blog on w3m

That also had the effect of making the blog feel way snappier.

Now you can read my blog even if you have your JavaScript disabled! I still have some unfinished business, as I listed by the end of my last meta post. I'm not gonna worry about that for now, though.

Kett, why are you doing this?

That's a fair question, I could be using something like Jekyll or WordPress or GitHub pages or whatever, but I don't really want to! Making my own blog for my own site has been a nice learning experience, and I do recommend you try doing the same, make a little page of your own, and figure out ways to add new content without touching the source files, formatting without manually writing HTML, and things like that. It's really nice building something like this and using it with the same ease as you'd have using social media or established blogging platforms.

I've done all of that. Writing a new blog post, I just write newpost into the command line, Neovim opens up, and I start typing. Do I need to change something? Then I just type editpost, FZF opens up with the list of previous posts, I choose the one I want to edit and then, again, Neovim opens up, and I can make any changes I need. If I need to add an image, I just right-click any image file I want and click Upload to racc.at, the URL is copied to my clipboard, and I just need to type the appropriate Markdown. It's simple, and it's comfortable.

You, too, should design your own little corner of the internet. Make yourself comfortable with your own design built from your own decisions. Then hit me up, so I can link to it from mine. ;)

https://racc.at/blog/?id=18
My time with Debian

Reminiscing about my time using Debian and how it introduced me to Linux

Show full content
My time with Debian Introduction

Debian was the very first Linux distribution I've ever installed and made use of, all the way back in ~2018. It's the distribution I learned Linux in, installing it on our old family computer back when we still shared one machine.

It is probably the most solid distribution out there, favoring stability over constant updates. Critical vulnerability patches are backported but breaking updates are withheld until the next version of Debian, which is great for servers.

Usage

My usage of Debian went many places, its flexibility, light weight and wide support of different architectures made it an excellent candidate to be installed in every last trashy device I've used:

  • The old family computer
  • An almost 20-year-old laptop
  • My Android tablet
  • A Windows 98 computer I salvaged from a classmate

I stil use Debian, on the server VPS that I use to host this website. However, I have not installed it on my current PC, or the laptop that I use. On those devices I use rolling distributions exclusively: openSUSE Tumbleweed and Arch Linux.

Memories Onto bare metal

I used Debian for a while on virtual machines, trying out Steam and seeing what games of mine would run on Linux natively, that was from a time before Steam Play and Proton, so the only games I could play were ones that had Linux builds.

I decided to install Debian onto the family PC. It was a normal install, with the GNOME desktop environment. I followed all the steps correctly, shrinking the Windows partition before starting the installation, setting up the new partition on the installer and all that good stuff. The Debian installer is quite intuitive if you know how to read. When I finally booted into Debian the first time.... the mouse and keyboard were not working. I rebooted multiple times and nothing changed.

That was nice.

I then reinstalled it following the same process, and then it worked.

To this day I am still impressed by the "plug in, and it works immediately" nature of Wacom devices on Linux. To this day I am still impressed that if you plug a Wacom tablet into a Windows computer, it will not work immediately. It felt like magic that I could just plug my tablet in and be able to draw without having to install anything extra.

School Presentation

Debian was part of a presentation I made when I enrolled in an IT course on the local trade school. The presentation was about operating systems, other students explained all about different versions of Windows, while I was the one who talked about Linux and the Debian distribution in conjunction with one another. The presentation went very well, and I awakened interest and even answered questions the people we had to present to had, despite the fact they were not computer people. It was definitely a nice feeling.

Tinkering

I miss doing the amount of tinkering I used to do back then, with machines that had little to no support to any modern operating system and things that it probably shouldn't be installed to.

The old laptop

My dad had an old Itautec laptop with a 32 bit Celeron processor and 1 GB of RAM. It was not fit for any purpose anymore, and it went back and forth between my dad and I because I found it fun to tinker with. I installed Debian Jessie on it many times, but I also tried some other alternative distributions such as antiX.

It would often run hot, and once I left it on overnight, and it did an emergency shutdown because it had reached over 100ºC.

The older desktop

A colleague from when I was in trade school said she had a very, very old computer she no longer had any use for, and I showed interest, so dad and I dropped by her place and brought the machine back home. That one was a toughie! It wouldn't boot via USB, so I had to pull some trick to even get to the installer, I don't even remember what I did to be honest. I did eventually manage to get Debian Jessie running on it, but it wouldn't run very smoothly at all. For that machine I had found the most stable distribution was Slackware.

That was a pretty noisy machine, and probably something that would feel at home running MS-DOS instead of any Linux. It was still fun to get a relatively modern distribution running on it though.

The Android tablet

I had gotten Debian to run on my rooted Samsung SM-T113NU through the proot method, with the Linux bootstrapper. I had it set up with OpenBox for the graphical environment.

I did a lot of server related stuff with that tablet, accessing it via SSH, setting up Apache, port tunneling, the works! I even used SSH X11 forwarding to run graphical applications on the Windows computer, using the Xming X Server. It was very interesting, and I learned a lot about Linux that way.

Dad-proofing

I'd set up Debian for my dad several times, but he is already too used to Windows to want to use it as anything more than an experiment. He'd asked me several times to install it to a machine of his, just to replace it with Windows again under a week later.

In fact, coincidentally, just as I started writing this article, he asked me about Debian again, and I installed to this one machine he had Windows on, but that kept hitting 100% disk usage while idle. So again I installed Debian for him, this time with KDE Plasma since this is a computer that can actually handle it. After some initial setting up it seems like it's a fairly smooth experience. Hopefully he'll stick with it this time.

Conclusion

Debian is, for me, probably the most important distribution out there. It was my first experience with Linux, and my usage of it was the first time it made me question how computers worked whereas Windows had never sparked any curiosity in me after having used it during most of my life. Nowadays I do not daily drive it, but I still appreciate it from a distance.

https://racc.at/blog/?id=17
Writing About Writing

I took on the habit of writing often and I think it's been good for me, I think everyone should do it.

Show full content
Writing About Writing

I took on the habit of writing more frequently exactly a month ago now, ever since then I've been writing what you could consider a diary, as well as keeping notes about my interests, goals, problems, studies, articles, bookmarks, and lots more. I think that has had a positive impact on me overall.

In fact it is something I've wanted to do for a lot longer than I've been doing it, but never actually went ahead and started.

It's probably not useful for everyone, I just know I've been a lot less forgetful ever since I started writing everything down.

"Should I try doing it myself?"

It can't hurt to try. Whether you're using a Google Doc, or your phone's notes app, or a small notepad, or anything else, as long as you can write on it, you can use it to keep track of your thoughts. Personally, I use Obsidian, and I'll vouch for it for the foreseeable future.

"What should I write about?"

Ideally, everything! But if you'd rather take it one step at a time...

Dailies

...Then I recommend starting with a diary. Just write about what happened that day, even if it's not exciting at all. Went to buy groceries? Played a game again after a long time? Tried to draw something but couldn't get yourself to? Found a cute kitty while walking outside? Write it all down, put it on record.

Interests

After you get the hang of that, writing about other things becomes easier, try writing about your interests. Creators you like, games, movies, books, blogs, your hobbies, your aspirations.

"How should I write?"

That really is mostly up to taste, but you should write as if it were for someone else. Because in a way, it is: your future self.

Wrapping up

My cat is currently very needy and I've been having trouble writing down this post with a cat in front of my monitor. But in short: Write! It's good for you.

I plan on starting to write little pieces about my characters, I think that would be fun. I like to believe my writing skills have been getting better ever since I made a habit out of notetaking.

https://racc.at/blog/?id=16
Links

A place with all my links, for your convenience.

Show full content
Links

The main page of my website is starting to get a little crowded with a mix of internal and external links. For this reason, I'm making this blog post to aggregate most of my links, without any space limitations! This is the perfect format for a little link dumping.

The List Social media Art sites Code Instant Messaging

These are in order of how active I am in each platform.

Games Videos and Streams Money

If Monero is to your tastes you may also throw some internet money my way:

88uYevMqUHcECxEXo2RfZi7aavduCCJ5kVchh6jFLJvmG73o2c7pbDTaFDr6hYgDDRjHyUc4NRGVh15Hy8mr8qvt47B43c5
88x31

I have a little 88x31 button you can add to your website:

racc.at 88x31

<a href="https://racc.at/"><img src="https://racc.at/media/uploads/88x31.png" alt="racc.at 88x31"/></a>

I might change the design every now and then, so hotlinking is okay, you can always download this image and host it yourself if you'd prefer it to stay the same, though. :)

I have a collection of these little 88x31 images on the home page, I can add yours if I know you, just let me know! ^^

Notes

This blog post will be periodically updated when relevant. I aim for it to always be an up-to-date resource on where and how to find me.

My username in most platforms is KettLovahr. If you come across someone with that name in some site, it's probably me. I don't think anybody is currently interested in impersonating me, at least.

https://racc.at/blog/?id=14
The New Racc.at Blog

Big update for a small blog!

Show full content
The New Racc.at Blog

I've updated the blog, woohoo! It went ignored for a very long time now and I thought a fresh coat of paint was long overdue.

Theming

I've updated the blog to look more like the rest of the site, the home page and the ask box had already been updated last year, but the blog was left ignored (and even removed from the home page) for a long time.

The Games page still sports that old look, though. I should probably focus on that next, but let's take it one step at a time.

Changes under the hood

The changes I've made are not only visual, let's take a closer look at what exactly I did:

The actual Posting part

I'm still using a little script of mine to upload blog posts, it opens up vim and I write away, but I've made a big change. The blog is now formatted using Markdown! Previously, I was writing each blog post with HTML directly, which was kind of a hassle and made writing longer posts a pain.

I'm now making use of commonmark.js to convert the original Markdown post stored in my server's database to HTML your browser can display.

If I really need to, I can still write HTML directly for some fancy formatting, but in most cases, the Markdown is enough.

The reading part

The previous blog main page was rendered entirely on the server side, but now it's rendered on the client side, with an extra request made to the racc.at public API. The API for my blog posts has been available for a long time already, but it's now being used on the actual site, yay!

Still a work in progress

I've implemented the bare minimum, but there are still some features that were available on the previous blog page and aren't available anymore, and some that I plan on implementing later on.

Here's the current to-do!

  • Comments and comment count
  • Timestamps
  • Individual pages for posts
  • Pagination
  • Preview on Embeds (OpenGraph, for Discord and the like)

I've made some more progress! This'll be on par in functionality to the old blog soon.

What about the old blog?

It's still around, but I've made it unavailable. All the posts from the previous incarnation of the racc.at blog have been marked to not be displayed. I might change my mind about this at some point in the future, or never.

Probably never!

If you really are that interested in looking at the old posts, though, you can probably figure it out, they're still accessible... ;)

https://racc.at/blog/?id=13