My Best Computer Comeback Ever

Good Morning from my Robotics Lab! This is Shadow_8472 and today I have the story about how I almost lost my main computer. Let’s get started.

The Fall

Thankfully, I rarely need my reset button. Most of the time it gets hit by accident. EndeavourOS has been a good daily driver, but my system recently bombed hard – a crash I have never seen before and hope to never see again. Resetting wasn’t enough.

My main workstation uses systemd-boot, GRUB’s little cousin among boot loaders. Its job is to load an operating system when called, and it wasn’t responding. I poked around. My old, unupdated installation of Manjaro managed to load, but it wasn’t consistent. For some reason, EndeavourOS only appeared bootable in Legacy BIOS mode – even though it would hang at systemd-boot because it is UEFI only. I eventually ran out of combinations to try and loaded an alternate BIOS ROM. You know it’s a bad day when BIOS beeps thrice over a minute and hangs.

Clearing CMOS

At this point, I was outside my repair experience, but when I asked my father for help, he recalled a trick an IT guy pulled at his work to clear an unapproved BIOS lockout password. The motherboard has a jumper for clearing CMOS. Think of it like a factory reset. We found the user’s manual and followed its instructions, restoring the original ROM.

Failed boots eat a ton of time, but at one point I loaded Windows when Manjaro’s GRUB installation apparently failed completely. I searched for my GRUB disk and had to make a new one. When I did, it could only boot Manjaro in any configuration. I tried swapping SATA cables around, but that only made Windows vanish. Last I looked, its drive was zero bits in size.

Repairing my Boot Loaders

Even a jank boot method is better than nothing. Trouble is that Manjaro was horribly out of date, and needed a manual intervention. I installed EndeavourOS to avoid this very mess. A number of package names had changed, and there were a couple sets of mutually dependent packages. I think I had to mark around five to seven for removal before it went through. The longest part was sitting through package verification every time. GRUB was then a standard and easy re-install.

I found a line-by-line systemd-boot reinstall tutorial for my EndeavourOS drive. I sadly don’t have a link because I wasn’t yet planning on this being my topic for the week and I was kind of in panic mode. What I do remember is that I expected to need chroot, but I looked at the documentation (man page / <program> -h / <program> –help) and the command was flexible enough to point it at my broken installation. It was also a pain to find because so many search results were either about GRUB and/or Windows.

The Importance of Cable Management

While I had my computer apart diagnosing SATA cables, I took the opportunity to mount my third solid state drive. Previously, I only had access to cables with L shaped connectors on one end, but I have a package with a bunch of double-straight ones now. I had two free motherboard connections, and the straight ends let me stack my Linux drives in my compatible bracket while my [defunct?] Windows drive now gets a single-SSD bracket.

Alarmingly, my computer started making a bit of noise once I had it all back together in its place and I had started up a game. Turns out a ribbon cable going between the motherboard and front panel was pushed into the fan blades on my GPU, which was simple to fix.

Takeaway

Surprise topics are rarely fun. But solving these problems as they come up is how you learn Linux.

Final Question

What I could not find an answer to was if systemd-boot systems can be booted from a GRUB disk at all. I’m guessing no because systemd-boot is more integral to Linux than GRUB. Do you know how close or far I am? I look forward to hearing from you in the comments below or on my Socials!

Joystick Server Reinstall

Good Morning from my Robotics Lab! This is Shadow8472, and today I am rebuilding Joystick, Button Mash’s twin Rocky Linux server. Let’s get started!

Project Goals

This is a revival of my photo scanning project, first and foremost. I need to get it working, and while I will afford myself some time to experiment with doing it right, it’s more important I get it done. Once I have it working better than Button Mash, I can move my production flag over to Joystick and remodel Button Mash “properly.”

And by “properly,” I mean rootless Podman access to a network attached storage. I have explored NFS (Network File System) extensively, but Podman does things with userspace that NFS doesn’t support. I may need to be open to an alternative or using root. SSHFS lays a file system over SSH, but

Installation

I did my usual stuff when installing Linux. I remembered ahead of time that Joystick doesn’t work with Ventoy, so I flashed a USB (Balena Etcher) large enough for the full 10 GB image I downloaded. I did a clean install over its previous Rocky Linux installation. I also adjusted Joystick’s boot order so Rocky 9.4 loads by default. The system is dual booted with Linux Mint, where I did an apt update/upgrade.

Booted to Rocky, I enabled Cockpit web interface for remote management, a feature I selected for installation with the system. I created a limited user for running Podman, enabled lingering on it, got Cockpit logged into it as a “remote host,” and disabled normal password interactions. I pulled Podman containers for Caddy, Nextcloud, MariaDB, Redis, BusyBox, and Vaultwarden, and gave each a directory with a start.sh and a mountpoint. I excluded Pi-Hole and Unbound from my planned lineup because those functions are now handled by our router and would have required messing with special ports.

Troubleshooting

NFS fought me hard though. It didn’t help that Cockpit’s terminal kept glitching out on me. I noticed this behavior on ButtonMash’s Cockpit as well. Rebooting and refreshing didn’t do anything, but I found a control by navigating my browser away and back. I eventually got to thinking about what other parts it might be, and I came up with a bad version of Firefox, or Wayland. I ran Firefox over SSH on a machine still running Xorg server; it was Wayland.

And at this point, my workstation had a record bad meltdown, which ate my remaining blog time. Be sure to read about it next week!

Takeaway

Projects get interrupted. Something comes up and grand plans wait in the background. I’m tired of server doing just that, but it’s happened again.

Final Question

My longest enemy remains: Rootless Podman vs. Network Storage. How do I do it? I look forward to hearing from you in the comments below or on my Socials!

KDE Wayland: My Second Impressions

Good Morning from my Robotics Lab! This is Shadow_8472 with a side project for the week. Let’s get started!

Riding the bleeding edge with EndeavourOS, my upgrade from KDE 5 to 6 when the default implementation was moved from Xorg to Wayland. The deal breaker for me was Discord not displaying messages properly as I type. I retreated to KDE 6 Xorg.

That was almost a couple months ago. Xorg has worked since then, but it was a little love starved having to share developer time with KDE Wayland. But I understand; there are only so many developers, and their main focus is getting Wayland working. On an update/reboot cycle, I decided to check out their progress. I have to say it’s not bad. The bug from earlier is resolved, at least.

Not all my settings transferred over. In particular, my mouse pointer got stuck when crossing a boundary on my multi-screen display. This setting was found in System Settings/Mouse & Touchpad/Screen Edges/Edge barrier. I set it to 0 pixels, disabling the feature.


OBS (Open Broadcast Software) had trouble seeing the screen due to windows in Wayland not being able to see outside themselves. It now needs some kind of screen caster that shows up in my system tray.

The obvious difference I can’t help is spotty performance from my taskbar window previews. Oftentimes, they don’t even load when I mouseover them. Other than that, there are new interface sounds I’ve already been living with, but haven’t found the way to turn them off.

Takeaway

Technology marches on. Legacy software becomes obsolete. There are bumps along the way, but the KDE Wayland’s are smoothed enough that I can jump over now. In another couple months, I expect the experience will be virtually unnoticeable.

Final Question

Have you ever rode the bleeding edge and had to come back later? I look forward to hearing from you in the comments below or on my Socials!

I’m Sold On StableSwarmUI

Good Morning from my Robotics Lab! This is Shadow_8472 and I’ve made up my mind on StableSwarmUI as a replacement to A1111. Let’s get started!

Generative AI (Artificial Intelligence) is the technology buzz word of the decade so far thanks to open sourced models. Automatic1111 has an extensive community library, but ComfyUI’s flexibility may yet challenge it as the next favorite. While not yet polished to A1111’s visual aesthetic, a total AI noob should find StableSwarmUI navigable while letting him/her peek at Comfy beneath.

Learning ComfyUI Basics

I’m taking that peek… ComfyUI looks like boxes and spaghetti. The correct term is “workflow.” Each node represents some unit of work similar to any other UI. The power of Comfy is the ability to arbitrarily link and re-arrange nodes. Once my first impression –intimidation– wore off, I found grouping familiar options by node and color coding their connections made the basic workflow more intuitive while highlighting my gaps in understanding of the Stable Diffusion process.

Let’s define some terms before continuing. Be warned: I’m still working on my intuition, so don’t quote me on this.

  • Latent Space: data structure for concepts trained by [counter]examples. Related concepts are stored close to each other for interpolation between them.
  • Latent Image: a graphical point in a latent space.
  • Model/Checkpoint: save files for a latent space. From what I can tell: checkpoints can be trained further, but finished models are more flexible.
  • CLIP: (Contrastive Language-Image Pretraining) a part of the model that turns text into concepts.
  • Sampler: explores the model’s latent space for a given number of “steps” with respect to concepts specified in the CLIP conditioning as well as additional sliders.
  • VAE: (Variable AutoEncoder) a model that translates images to and from latent space.

The basic Stable Diffusion workflow starts with an empty Latent Image node defining height, width, and batch size. Alongside this, a model or checkpoint is loaded. CLIP Text Encode nodes are used to enter prompts (typically both positive and negative). A KSampler node does the heavy lifting, combining everything into a low-resolution preview based off the latent image (if enabled). Finally, a VAE decoder node turns your latent image into a normal picture.

While I’m still developing an intuition for how a latent space works, I’m imagining a tent held up by a number of poles defining its shape. You are free to interpolate between these points, but quirks can arise when concepts bleed into each other: like how you’d tend to imagine bald people as male.

ControlNet

The next process I wish to demystify to myself is ControlNet. A second model is loaded to extract information from an existing image. This information is then applied to your positive prompt. (Let me know if you get any interesting results conditioning negative prompts.) Add in a second or more ControlNets, and combining them presents its own artistic opportunity.

For this exercise, I used a picture I made during my first attempt at Stable Diffusion: a buff angel with a glowing sword. As a challenge to myself, I redid it with SDXL (Stable Diffusion eXtra Large). I used matching ControlNet models for Canny and OpenPose. Some attempts came up with details I liked and tried to keep. I added the SDXL refiner model to try fix his sword hand. It didn’t work, but in the end, I had made a generation I liked with a few golden armor pieces and a red, white, and blue “(kilt:1.4).” Happy 4th of July!

Practical Application

A recent event has inspired me to try making a landscape picture with a pair of mason jars –one full of gold coins, and the other empty– both on a wooden table in front of a recognizable background. It’s a bit complex to generate straight out of text, but it shouldn’t be too hard with regional conditioning, right?

Impossible. Even if my background came out true, I’d still want the mason jars to match, which didn’t happen. This would have been end of the line of the if I were limiting myself to A1111 without researching additional plugins for my already confusing-to-manage cocktail. With Comfy, My basic idea is to generate a jar and generate another filled jar based off it, then generate them together in front of my background.

Again: easier said than done. Generating the initial mason jar was simple. I even arranged it into a tidy group. From there, I made a node group for ControlNet Canny and learned about Latent Composite – both of which allowed me to consistently put the same jar into a scene twice (once I figured out my dimensions and offsets), but filling/emptying one jar’s gold proved tricky. “Filling” it only ever gave me a quarter jar of coins (limited by the table visible through the glass), and emptying it left the glass surface horribly deformed. What’s more is that the coins I did get would often morph into something else –such as maple syrup– with too high of a denoise in the KSampler. On the other hand, too low a value, and the halves of the image don’t fuse. I even had coins wind up in the wrong jar with an otherwise clean workflow.

Even though I got a head start on this project, I must lay it down here, incomplete. I have seen backgrounds removed properly with masking, so I’ll be exploring that when I come back.

Takeaway

ComfyUI looks scary, but a clean workflow is its own work of art. Comfy’s path to mastery is clearer than A1111. Even if you stick to basics, StableSwarmUI has simpler interfaces – a simple prompt and an “unpolished A1111-esk” front panel for loaded pre-made workflows.

Final Question

I’m probably being too hard on myself compositing glass in-workflow. Let me know what you think. What tips and tricks might you know for advanced AI composition? I look forward to hearing from you in the comments below or on my Socials!

Can Linux See a GameCube Controller?

Good Morning from my Robotics Lab! This is Shadow_8472 with a side project for the week. Let’s get started!

I’ve had a Nintendo GameCube controller on my desk ever since I got a USB adapter some months ago. I poke at it every so often, trying to confirm it working in Linux, but in late June of this year, things came together.

Computer: Derpy Chips
Distribution: PopOS 22.04
Desktop Environment: KDE Plasma 5.24.7 (Qt 5.15.3)
Product: DragonRise Inc. Controller Adapter

In my research, I read about this product working with Dolphin Emulator on Linux, if not elsewhere. Dolphin sounded like a good first stop, and one day I sat down with enough patience to compile it. It needed a few tries before I read a guide on Dolphin’s GitHub explaining how the project has dropped qt5 support [1]. However, my qt version can use backports.

I installed my compiled Dolphin package. Now for a ROM. Commercial games are illegal to download, but I can either dump my own games (not in my skill set yet) or find a homebrew game. GameCube only has one such title I found worth mentioning: Toy Wars. It’s not even an exclusive – probably because it’s basically a baby Wii/Wii U on the inside.

Long story short: Toy Wars gave me a black screen. I happen to know the Wii has tons of Homebrew, so I found another guide [2] that walked me through performing a system update, netting me the Wii menu, the Homebrew channel, and then a content browser layered on top of that. While significantly hampered navigating this browser using the emulated Wii remote, I found and downloaded a free homebrew game about dogging space junk.

And still nothing from the GameCube controller. It showed up with the command “lsusb,” but Dolphin’s configuration options said it didn’t have permission. There was the missing link. By default, Linux is a lot more locked down to strange USB peripherals than Windows. I had to make a file under “/etc/udev/rules.d” describing my controller adapter and granting these missing permissions.

$ cat /etc/udev/rules.d/51-gcadapter.rules
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="0337", MODE="0666"

The 51 in the name has to do with what order this and similar rules overwrite each other. There are a ton of possible parameters for the file contents, but idVender and idProduct can be found with the “lsusb” command where it says ID vvvv:pppp. Mode is the same as file permissions ([user, group, everybody]x[read*4+write*2+execute*1]).

Takeaway

From further observation, I concluded these changes let Dolphin reach out to find the state of my controller[s]; no events are triggered in Xorg, as happen for the mouse and keyboard. Long term, I have a gag goal of writing a custom driver so I can use my GameCube controller however I like, but I didn’t get that this go-around. Oh well.

Final Question

I couldn’t find out what the leading 0 is supposed to represent. If you know, I look forward to hearing from you in the comments below or on my Socials!

Works Cited

[1] Dolphin Emulator, “Building for Linux,” github.com, May 31, 2024. [Online]. Available: https://github.com/dolphin-emu/dolphin/wiki/Building-for-Linux. [Accessed: June 25, 2024].

[2] Nintendo Homebrew, “Installing Homebrew Channel on Dolphin Emulator,” 2024. [Online] Available: https://wii.hacks.guide/homebrew-dolphin.html. [Accessed: June 25, 2024].