I Upgraded My Python Discord Bot (Week3)

Good Morning from my Robotics Lab! This is Shadow_8472 and today, the development cycle continues on my Discord dice bot. Be sure to catch the last two weeks’ posts before reading this one. Let’s get started!

The Development Cycle

My bot will never truly be “done.” In the past, once software was released, it was typically tied to physical media. New features and bug fixes were either integrated into fresh copies or sold as expansion packs. In more recent times, your license to run a piece of proprietary software is tracked by an online service like Steam, and updates are usually free of charge. When you’re developing a piece of software internally, versions mean less and less until some deadline is reached or it’s “good enough” to stop work for a while.

When I stopped work last week, I was not “good enough.” It was pointed out to me that challenge dice for Star Trek Adventures, the game I’ll be playing, count their challenge pips as normal pips as well. My dice engine actually already supported multiple pip types on the same side naively, so I adjusted the challenge die definition instead of bodging a solution.

Various other improvements behind the scenes included matching the double space from the engine file over in the bot’s main file, making the challenge dice roll command use an icon picture, and implementing the RegEx OR operator for screening input. And then I went to adding or subtracting constants. I must have spent an hour or two trying to shove it through the engine side of things. I lost count at four places they needed special handling along the way from parsing to tallying. Just as I was about to finish, I had the brilliant, but tardy idea to code constants as single-sided, single-valued dice. Another good chunk of coding time summed up in one critical line of code. I was sure to leave a comment.

As part of my little constant episode, I made several changes to the code in lots of hard-to-remember places. Fortunately for me, most or all of my unrelated work was on the bot side of things. Because I split the file between bot and dice engine, I was able to pull up an old copy of the engine from the “production” branch and make the relatively few needed changes.

Takeaway

At this point, I need to plan on finishing the month with this bot. The engine’s code is messy, and I’d rather put it away clean so I don’t have to start over or feel the need to black box it next time I need dice.

Final Question

RegEx gave me a bit of trouble working on it. I used https://regex101.com/ to design my expression, but some of the statements they used threw exceptions in Python. Have you ever had a version mismatch give you a bit of grief?

I Upgraded My Python Discord Bot (Week2)

Good Morning from my Robotics Lab! This is Shadow_8472 and today, I am adding some features to my Discord dice bot. Be sure to catch last week’s post before reading this one. Let’s get started!

My Golden Standard

Dice come in many forms. Outside of specialty die collecting, the hobby of role play games will tend to land you with the widest variety to determine success/failure of fictional characters as their real-world players throw them into the hands of the equally fictional Random Number God (RNG*). Most people are familiar with cubic dice with faces valued one to six, but both the shape (read: number of sides) and the faces can be changed.

The role play system Gensys and its Star Wars themed ancestors go so far as to use as many as three types of pips on their narrative dice – it’s even possible to get both a “success” and “advantage” from the same face! There exists a dice roller by SkyJedi on GitHub for this system, but I would like a bot I can look at and understand. It serves as my gold standard, but I can settle for bronze.

*(officially RNG means Random Number Generator)

About My Bot

This bot constitutes my first major project where I have a discrete engine I will likely re-use later, so I’ve done my best to keep the engine clean at the expense of no time to redo the main bot’s .py file. The biggest question I had to ask myself over and over again was this: Engine or implementation? Is this feature specific to this function, or does it belong in the engine? I defined my engine’s role to begin after input has been screened, and lasting until it’s returned the structured results. I also included a separate tally function for summing the results.

Part way through testing, one of my friends tried subtracting one term from another. I had to re-write a good chunk of the otherwise mostly working engine, but I came out with a product that can pass common mathematical operators without choking.

I finished this week with a presentable bot. I didn’t get all the features I was after, but it will work for my upcoming Star Trek themed game. My main must-have feature is a set of “challenge dice” with the faces 1, 2, 0, 0, C, C. Multiple pip types was an important feature on this engine

Tricks Learned Along the Way

In no particular order, I taught myself a trick or two.

Space-indented comments:
Debugging is all about wall of text. At one point, I had a function with a triple for-loop to split input strings into tokens another function could evaluate one at a time. Six hours I bickered with it until success. That victory is in part thanks to my idea to indent debug messages based on how many nested loops each one was in. On my way to a break, inspiration hit and within five minutes, I had replaced the whole thing with only three lines of code.

When to Spaghetti Code:
Programming is an art form. Just as sketch work is drawn/painted over, so too are new features written quickly and sloppily, made to work, added to, tweaked, extended, and eventually depreciated as early code is replaced by a more elegant solution. Messy code is hard to develop, but a little more isn’t going to ruin your day if it’s that little bit more to round off a major version before a deadline. As you code, you will pick up better ways to do things, and you will want to go over your old code as you are able.

Clean Your Code Regularly:
I don’t know why I need to remind myself this, but I have a hard time deleting massive code blocks once a functional replacement has been coded. It feels good being able to revert quickly, but I’m working over SSH in a terminal window, and scrolling through uncollapsible blocks of code all the time isn’t fun. My advice is to comment out the old code being removed and make sure your program still works before removing it all together and verifying that it still works. The same goes for massive chunks of debug code built up over a long debugging session. If a whole file needs a major quality bump, I found it helpful to make a big block of comment I can move functions above as I perfect them.

Git Is a Tool to Practice:
I am using Git locally on this project. Right now, my skill level is git add and git commit. Meaningful comments will come with time as will checking out a previous version will come with time. I’m not working with an online repository, so I don’t need to worry about push or pull, though I am aware of them. In the meantime, I keep a special place for my most recent stable version.

The Development Cycle Loops:
The development cycle doesn’t end with release. Early versions will be flawed. Even now, I’m considering using those picture icons to the dice output. Always a new feature. Support code can take even longer to wrestle into existence if the clean implementation re-writes half the engine.

Takeaway

I would like to stress that I’m finding it difficult to write about writing code. Tangible progress is often non-linear. There are a lot more options than when you’re working with someone else’s program. In some ways, writing a program is more like writing a story than wrestling a Windows game into working on Linux. Once you’ve figured out the interface to set up your canvass, you are in full command of the ideas you express.

Final Question

What do you think of this “Lessons Learned” format?

I Upgraded My Python Discord Bot

Good Morning from my Robotics Lab! This is Shadow_8472 and today, I am tailoring my simple Discord dice bot for an upcoming role play. Let’s get started!

Project History

A while back, I built a very simple dice bot for Discord [1]. In its current form, it can be used for rolling an integer number of dice with another integer number of sides (3d6, for example) provided at runtime. A lot of effort also went into learning the Buildah/Podman OCI container implementation so I could clean up afterwords if something got messy. In the end, I managed a container with a mounted volume I could reprogram on the fly without entering the container.

Containerization with Podman/Cockpit has been treating me very kindly. This week, I was able to add environment variables on container creation, allowing me to work a bot token and branch label into the container itself. I also created separate development/production branches for short-term testing and long-term operation respectively, though in effect, I’ll also be keeping an old version around to act as a “stable” branch which will have its code integrated into the container itself instead of relying on an attached volume.

During this week’s work, I figured out how to test code segments directly in the interpreter. I also played around with separating core functions out of the main .py program file, and found they imported cleanly into the live interpreter. As a result, my debugging efficiency improved quite a bit.

Total Rewrite

There is a meme out there where a programmer can write a program such that only he and God know how it works – after a time, only God will know. A good programmer will return to such a problem with ideas for a more elegant solution, though it usually means rewriting from scratch. The core dice rolling functions for my first dice bot were hacked together and barely able to roll an arbitrary set of XdN dice where X in the number of dice and N is the number of sides.

This time, however, I’m programming for a game with non-standard dice faces. No way was I going to shove that into my old bot core. Instead, I spent around eight to ten hours crafting a new monstrosity I can reuse for other bots in the future and handles multiple types of die pips on a side at once. I focused on hacking it into my existing bot code (which I have yet to fully decipher), but it wasn’t so bad. What I do know is that I obsoleted several bits of code and about half as many comments intended for future work on that ugly line of development.

My new functions begin with the assumption that N can be defined as a list of sides, which in-turn list their respective kinds/counts of pips. For when N is int type (integer), I have some code to build a die face-by-face in that format. All the dice are loaded into a list, and that list is passed off to another function to actually roll the dice and tally up the results.

Worth noting is that I’m starting to make git commits to savestate my progress. I’m not worrying about proper form right now, but I’m counting on improving over time.

Settings Files

The ability to save/load data –while not strictly needed for a simple dice bot– is an important skill to develop. My brief research showed that while there’s any number of ways a Python programmer may implement settings, a somewhat standardized and end-user friendly method is using .ini files. While I may not use them this week in this project, I will want to remember this side goal. I’ve invented my own scheme before, and it wasn’t fun.

Takeaway

It’s really difficult to communicate all the little challenges that come up without looking/feeling like an idiot half the time because I missed something and another half because of the jargon. I’d have to say most of the time I spend coding is trying to understand what I just wrote. I still haven’t completed all the features I need, so the plan is to cover the rest of this revamp in next week’s post.

Final Question

What were you working on the first time you successfully extracted a part of your program into a separate document?

Works Cited

[1] Shadow_8472, “My Discord Bot Understands Strange Dice,” Feb. 28, 2022. letsbuildroboticswithshadow8472, [Online]. Available: https://letsbuildroboticswithshadow8472.com/index.php/2022/02/28/my-discord-bot-understands-strange-dice/ [Accessed Aug. 29, 2022].

I Archived Two Old Hard Disks

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

Who doesn’t have a few hard drives from previous computers laying around? Not my family anyway. The first one I dealt with is a Quantum Fireball KX with my father’s name written on it. More importantly: it uses a legacy PATA connection for data, and with the transition away from SATA to M.2 well underway, the time for preservation is now.

My early attempts revolved around a PCI card for a PATA adapter. Long story short: I was never able to boot with the Fireball hooked into my system. I tried different combinations on the jumper pins along with position on the cable. I was never able to access the BIOS. All I got was a freeze mid-power-on-beep or a failed attempt to boot to the hard disk after hearing it spinning up. I verified the card and cable by testing them with CD/DVD reader/burners also from the PATA era.

Aware that the Fireball might be burned out, we ordered a multi-adapter so I could connect it over USB – without having to fight for the BIOS. It mounted right up. I used rsync to dump the contents to GoldenOakLibry, my family’s network storage. Along the way, I came across devhints.io [1]. It looks like an amazing resource. It helped me out wrangling rsync quickly. It has one of the highly exclusive places in my bookmarks list. My only complaint is how interesting Mr. Cruz made his site to cite. Most importantly, I wrote out a sticky note about when and where I dumped the drive.

The second drive (branded Deskstar, SATA connector) took way too long. I was the fool for putting it over Wi-Fi, and I paid for it. Several times, rsync would appear to stall as it got to a larger file. A couple such times, I figured the drive was overheating due to no circulation so I stopped rsync, powered it off, and let it cool down. The breakthrough was pulling up a utility to show my network data.

There was a rather important incident I feel inclined to report before wrapping up. At one point, I accidentally caught a cord connected to the adapter. The drive tumbled off my desk, but I barely managed to catch it after a fumble or two. My worst fear was that of a “head crash,” where the read-write head contacts the spinning platter, leaving a scratch and destroying the data on it. If anything, the slow Wi-Fi speed worked in my favor, because the head was off where it won’t do any harm during an impact.

Takeaway

Data preservation is a chore. In retrospect, I should have performed this procedure exclusively over a wired connection – I should have investigated the possibility of mounting it to GoldenOakLibry directly.

Final Question

What kinds of “digital chores” turned out more memorable than you’d have cared for?

I look forward hearing your answers on in the comments below or on my Discord server.

Work Cited

[1] R. Cruz “Rsync cheatsheet”devhints.io, [Online]. Available:https://devhints.io/rsync [Accessed: Aug 22, 2022].

I’m Incompatible Because Policy?!

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

I’ve been interested in having the basics of a smartphone again for a while now. I was planning on diving into Android Debug Bridge for this month’s large project, but my PinePhone showed up again after a couple years. For the unaware, the PinePhone is basically a Linux computer in the profile of a smartphone.

My PinePhone is the second edition released: it understandably has early adopter issues like slow load times and needing to about live on a charger when not in use. It came preloaded with Ubuntu Touch; while I could see myself using it (should it actually work), I’m not particularly impressed. I need text, call, and picture capabilities. It’s not able to do any of those right now.

I installed my current SIM card. Now, this SIM was sold locked to an LG Stylo 5 smartphone for the duration of the initial contract (now expired). My PinePhone sees the name of my provider, but anything involving data over the cellular network escapes me for the time being. I will need to contact my mobile service provider.

Aside from mobile data, something is off with my camera app. Pair that with my mediocre response to Ubuntu Touch, and now I want to try a different OS. I’m a fan of KDE, so I went to the Pine64 PinePhone OS index [1] and downloaded/flashed one marked KDE to a microSD card (one of my good ones; rest in peace abandoned project PiCore – I’ll do better next time). I totally missed that the image was a factory test, but at least I was able to verify that both my cameras work but cellular data is still a bust.

Take 2: postmarketOS is a mobile distribution with an option for Plasma Mobile. I was tossed between multiple websites before locating the actual download link. Dolphin file viewer calculates Shasums, flashing SD cards has almost become second nature at this point, and then it’s a matter of booting for the first time.

Plasma Mobile imitates Android about as well as KDE imitates Windows. It felt almost like coming home. Response time was improved, the camera worked, and the layout felt more familiar than not. The system time zone settings were a little harder to find. Overall, it offers a bit less stability than Ubuntu Touch, but the upsides more than make up for it.

I spent a day or so with tech support. Phones these days come with multiple locks and they can often be confused for each other. There is the lock that binds the phone to its original carrier. There is the lock screen to authenticate the user. There is also the lock binding the SIM to the phone body. My phone was locked, but the SIM must have noticed it was in a strange host and blown some sort of digital fuse. I can’t say I wasn’t warned.

Takeaway

I’m mad. My phone should be technologically compatible with their network. I have the skills to self-support my local hardware, but tech support won’t work with me on the equipment beyond my control. I’m hoping it’s the fuse hypothesis and that someone in-store can service the SIM without dumping me for the sake of the phone.

Final Question

What tech support disaster have you experienced or observed?

Works Cited

“PinePhone Software Releases,”wiki.pine64.org, July 24, 2022. [Online]. Available:https://wiki.pine64.org/index.php/PinePhone_Software_Releases [Accessed Aug. 15, 2022].

I Printed A Filament Duster

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

My 3D printer has been stubborn at finishing prints since I was finishing up a Chess set for a kid spending his summer in the hospital. Just as it finishes up, it stops extruding material. Since then, I have tried a few times to print a combined filament guide and duster from Thingiverse [1]. It’s time to take another crack at it.

When last I lost patience with my printer, I left its corner adjustments fully tightened down. Needless to say, filament doesn’t stick the best when this happens. I also had a .gcode file loaded with a few changes: the part was in another spot in the bed because of visible wear on the bed, a little cap was omitted as I already have a couple good ones, there is a rectangular structure inspired by a purge block used by multi-filament printers because maybe it’s getting lazy toward the end of the job or something (good luck if nothing else). And as if that weren’t enough, I installed one of my defective filament guides and tied a microfiber to the filament using strings of filament from previous bed level tests.

One more thing –and this is probably the one that actually did it– the print head apart and gave the e-step motor as good of a cleaning as I could get with another microfiber cloth, the long end of an Allen wrench, and a bit of creativity. Once I was convinced I was well past the point of diminishing returns, I put the printer back together and it came out first try.

Weary of a lame sendoff to a project I’ve had multiple weeks ending in failure, I did a bit more background research on 3D printing:

Additive manufacturing caught popular attention in the early 2010’s. Advice shared among 3D printing hobbyists from this period should be followed with caution as widely spread advice, like oiling your filament for lubrication, may have come out as a bad idea in more recent years (for example: oil burning in extruder, making bed adhesion more difficult, and soaking into/destroying filaments). It is for this reason that I am using a dry sponge to dust my filament.

Takeaway

This part took way too long to fabricate. It is my hope that it will silently do its work in preventing so many jams in the long run. I may never know if it is actually of any use. I’d need to alternate between using two identical machines in the same room. That’s not likely to happen unless the one I have is already constantly busy, which would give less time for dust to settle on open spools of filament to begin with. I’m just glad the device is finally in place.

Final Question

What projects have you completed where you may never know how beneficial or useless they are in the end?

I look forward hearing your answers on in the comments below or on my Discord server.

Work Cited

For my initial post, I was been unable to locate a link to the part I used.

[1] Sleven67, “Dust filter plus filament guide monoprice maker select plus,” Thingiverse.com, Oct. 23, 2020. [Online]. Available: https://www.thingiverse.com/thing:4632282. [Accessed Aug. 11, 2022].

I Made Copies of Archived Floppies

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

The process of archival maintenance can be tedious and repetitive. As disk formats change, it becomes harder to locate adapters for disks with old connection standards. For today’s project, I worked with a USB floppy reader.

It all started when my mother’s Designer Ruby embroidery machine wasn’t as broken as she thought. The machine is quite old by this point, and while discussing what thumb drives we might have that aren’t too big for it to see, my father and I were quickly able to trial an SD card over an adapter (didn’t work) and an external 3¼ floppy disk reader. It wasn’t long before we were pouring over a stash of floppies from a previous embroidery machine and rediscovering old patterns.

My mother spent an afternoon copying the archive to a thumb drive, but a few files were appearently corrupt. I tried to access them on Linux, but the floppy drive was making an unusual pattern of sounds as it accessed the first trouble file. Instead, I very carefully crafted a dd command to dump the contents to an image in my Downloads directory. I repeated the process for each floppy, then mounted it into my file system for extraction.

Out of curiosity, I looked up how it was possible for a user to mount a USB stick if Linux is running mount, a privileged command, underneath the graphics. Long story short, I saw it before while researching an open source driver for our uninterruptible power supplies. Daemons are a type of privileged program that can act on behalf of an underprivileged program without giving it wide, open access to root level permissions. Udisksctl is one such command line utility.

Mounting the disk images proved problematic, producing several errors. Assuming they were permissions related, I tried using udiskctl to mount them as myself instead of root, but instead renamed them with .img and mounted them with Dolphin, a graphical file manager. Turns out the errors really were badly corrupted files, and they still refused to copy out of the disk images, even with the correct permissions. At least it was cleaner this way.

I originally thought I had saved around three of the nine missing files, but one or two of the recovered ones turned upon inspection. I am happy to report that I was able recover the one pattern my mother wanted most. The entire archive will soon end up on GoldenOakLibry, my family’s network storage.

Takeaway

The possibility remains that further attempts at recovery may be viable. Given that the bulk of the collection was archived successfully before I got involved, I will have to ask her if the last few patterns are worth it. In any case, it was nice seeing some of those patterns I remember being stitched out by machine all those years ago. It reminds me of 3D printing in the present day.

Final Question

Have you ever dealt with aging technology to move an archive forward in terms of technological time?

I look forward hearing your answers on in the comments below or on my Discord server.

My Phone is Sadly Not ROM-Flashable (Stylo 5)

Good Morning from my Robotics Lab! This is Shadow_8472, and today I am exploring my options when it comes to making good on Degoogling my LG Stylo 5 smartphone. Let’s get started!

Not a Feasible Project?

I tried. I really tried. The plight of someone awakened to Big Tech’s abuses of power is near-hopeless in the face of Android and iOS. Google and Apple’s duopoly is thanks to their extensive walled gardens. Google’s open gates admit smartphone manufacturers the world over who all but worship the search giant for money. Users who wish for an existence free from the oppressive “quality control” rules of these gardens are left to brave a harsh, digital wilderness.

Unlike the more traditional desktop platform, the smartphone wilderness is still in its pioneer days. Special preparation must be undertaken before embarkation. Like the wagon trains of old, safe passage is limited to groups. There simply aren’t enough people interested in a free (as in freedom) smartphone experience for groups with technical experience to blaze trails for every model. Few people are talking about the Stylo 5.

I may have enough experience to produce a working custom ROM, but it’s been an exhausting topic to research. Even if I did produce a working ROM, keeping it updated would monopolize the rest of my time. This project direction is not for me. For the experience I really want, I need to pick a ROM and buy hardware based on that.

Just because I’ve abandoned hopes of ROM flashing the Stylo 5 doesn’t mean I can’t re-evaluate my short and medium term plans. Whatever I do, I will need a tool called Android Debug Bridge (ADB) for administrative access to the unit.

I teased an update issue last week on my Manjaro workstation. It looks like there were some significant changes to package names. I had to uninstall a conflicting package to proceed [1], but I lost Prusa Slic3r in the process and had to reinstall it from another source. Afterwords, I found the packages for ADB had already been installed. I played with them a little, but nothing conclusive has come of it yet.

What Do I Actually Want?

I took my project to Reddit’s r/degoogle and got a reality check [2]. User Bubba1601 confirmed my researched suspicion that the Stylo 5 cannot be flashed. Between users Lisse2000 and cd109876, I learned that updates are secure against custom ROM’s for security reasons. Others recommended a Google Pixel as a way to get away from Google because it’s the only line GrapheneOS supports – again for a good reason: the Pixel is one of the few phones that lets you re-lock your boot loader, reducing the possible attack surface.

I was additionally cautioned against thinking too much of the Librem 5, an open-hardware/software Linux phone with an American-made option. Follow-up research showed that while it’s well on the way to being a viable alternative, it’s only enthusiast grade at best so far as I can tell. The premium $2,000 price tag is a bit above what I can afford with pocket change, so this is one project for the long-term dream board once I finalize monetization without compromising my values.

Given that I have to work with the Stylo 5, what CAN I do? User qUxUp was the only one to actually stay on the original topic – and I quote:

1. Use as many as possible FOSS apps instead of google play apps (you can get most from fdroid).
2. Disable what you don't need with adb.
3. Use nextdns to block the services that you don't want to interact with your phone.

I have heard of all of these in one shape or another. ADB is a bit more invasive than I want to wield on a system I care about, but the DuckDuckGo Privacy App (not sponsored) has a VPN to stop unwanted trackers from leaving the device. I’ve been fairly careful since growing sour towards Google, but DuckDuckGo’s app has helped me identify and remove an innocent-looking app or two when they phoned home despite me not interacting with them anymore.

r/degoogle moderator BlueJayMordecai gave the following advice in a pinned post:

“It's okay to change [how you want to DeGoogle] at a later time if you feel you want to go further into repalcements [sic] or go lighter if you realize there's that one tool that can't yet be replaced. [3]”

My threat model is shaped by my understanding of how Biblical end-time prophecy is playing out. I see large companies developing schemes to mistreat their positions for profit. Left unchecked, I can see these being used to more efficiently persecute Christians who disobey future civil laws requiring worship contrary to what the Bible plainly teaches. That and the 2020 political ads on YouTube were aggressive enough to move me to action. In short: I am wary Big Tech intrusion in the short term, but I expect government abuse of the same or similar technologies to slowly grow in the coming decades.

I also know that technology shifts can be disruptive. If I focus primarily on new hardware and software before relying on it, my preexisting technology becomes an already deployed backup when the new stuff breaks. If I do not understand something and it’s my only copy, I leave it as status quo. This has led to the awkward situation of using a tablet I know has junk left deep in its OS, while being downright paranoid of a phone over the same exact junk with maybe only minor differences.

My main focus has been on restricting Google from my desktop experience because that is what I have had the resources to experiment with enough to understand. I am rapidly approaching the point where I will need to accept those bitter terms of service before further study will be of benefit to me. It’s just a matter of time before I’m out of excuses.

Takeaway

While researching big or important topics, I sometimes find myself with topics that stall, take sharp turns, or any one of an array of surprises that result in an unsatisfactory state when it comes time for my writeup. I took my phone to the carrier’s store, and while they are more than willing to unlock a phone so it can go to a different carrier, they either don’t have the tools or aren’t allowed to unlock the boot loader or assist in enabling Developer Mode (needed for ADB) without consenting to Google Services’ terms. At least the store was mostly empty, because I had to try.

There is much to be said about having hardware sitting on your desk, staring you in the face every day. The Stylo 5 has driven me to at least think about custom Android every couple months or so. Perhaps one of these times, I will finally allow this project to rest in deployment.

Final Question

What are your choices when it comes to reducing Big Tech’s influence on your life?

I look forward hearing your answers on in the comments below or on my Discord server.

Works Cited

[1] A. Rojas, “wxWidgets 3.2 update may need manual intervention,”archlinux.org, July 14, 2022. [Online]. Available:https://archlinux.org/news/wxwidgets-32-update-may-need-manual-intervention/ [Accessed: July 25, 2022].

[2] u/Shadow_8472 and others, “No known degoogled ROM for my phone and I’m not ready to maintain one. What CAN I do? (LG Stylo 5),” reddit.com, July 22, 2022. [Online]. Available:https://www.reddit.com/r/degoogle/comments/w5hmq2/no_known_degoogled_rom_for_my_phone_and_im_not/ [Accessed: July 25, 2022].

[3] u/BlueJayMordecai, “Why You Should DeGoolge & Intro DeGoogleing Techniques,” reddit.com, July 20, 2020. [Online]. Available:https://www.reddit.com/r/degoogle/comments/huk4rp/why_you_should_degoogle_intro_degoogling/

My Manjaro Melted Down

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

Surprise! Bad Manjaro update. I seem to be getting them once a year. I rebooted some time last Wednesday, seemingly to a black screen. My first thought this time wasn’t, “Oh, no! What am I going to do?” so much as, “Ugg, I need to refresh my memory on chroot and manual updating with pacman, skills I’ve only used once or twice before.”

No need to go through all the trouble if it’s not actually necessary. Manjaro has a feature where you can boot from one of an installed list of kernels, and I was seeing that list. Every option failed though – the most I ever got was an emergency shell that didn’t aknowledge the keyboard enough to toggle number or caps locks. This install wasn’t going to fix itself.

My first thought was to grab the Debian drive from ButtonMash, but I’d rather not mess up the only known working drive for scanning pictures. Instead, I riffled through my thumb drive collection and located one with Debian 11 install media. I got on Derpy Chips, my other daily driver workstation, and installed balenaEtcher special to safely make a new Manjaro live USB/install media.

During this time, I was researching the problem. Other people were talking about it within the past month, but I didn’t pick up the actual reason – just something about most Linux kernel 5.x versions being incompatible with a change. Do not cite me on this. I also learned a bit about the command:

manjaro-chroot -a

This command came in handy. The actual repair consisted of me booting to the live media, mounting my main Manjaro drive (graphically, even), going over to it in terminal, changing root directory per the above command, and updating with

pacman -Syyu

If it actually did anything, I didn’t discern anything. I rebooted to confirm it was still broken to find things seemingly repaired. Was it ever broken? Did I actually fix it? I may never know. In either case, I installed a 4.x kernel listed under KDE’s system settings program on the off chance my successful reboot was a fluke. A further reboot held true.

Takeaway

This fix was only done within 24 hours and no interactive help because I’ve already knew all of the needed skills already. Unfortunately, as I finish writing this post, more update shenanigans appear to be inbound. It appears a new package conflicts with one called wxgtk-common but doesn’t satisfy wxgtk2’s requirements for it.

Final Question

Were you affected by these or a similar Manjaro update?

I look forward hearing your answers on in the comments below or on my Discord server.

I Installed Android (Again, Pi 400)

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

Free, but not Free

Mobile computers are decades to years behind desktops, and usable free (as in freedom) and open source experiences lag behind accordingly. Android may be branded as open source, but Google did not build their Play Store into the platform’s primary draw by allowing a “free” experience. OEM’s (Original Equipment Manufacturers) making Android devices must play by the search giant’s rules or be prepared to start from scratch.

That iron grip on Android –tight as it may be– still affords room for hobbyist level projects. LineageOS will get compatible devices booted to Android without the need to compile AOSP (Android Open Source Project) yourself. Another project, the difficult-to-search-for /e/, takes the concept farther by removing many of the lingering hooks back to Google infrastructure and making an attempt at a cohesive end-user experience.

Raspberry Pi 400 (Tablet Edition)

A while back, I installed an unofficial build of LineageOS on my Raspberry Pi 400 as a precursor to installing a custom AOSP ROM on a phone. This first attempt was accidentally AndroidTV edition, leading to confusion and sadness. I re-installed it for last week’s blog, but even seeing it ask more phone/tablet-type questions than before didn’t feel like enough to base even a short blog on.

I hesitated when sideloading the F-Droid appstore last week. I couldn’t find their GPG keys to verify the download against, but I learned something in the process. Additional research this week still hasn’t yielded their keys, but I’ve learned that it might involve adding a key repository – sort of like how I couldn’t just start downloading images when I installed Podman on my laptop. However, I want to end up with /e/ instead, so I don’t feel the need to be as careful learning how to add a trusted key repository. Instead, I’ll just keep it offline.

About the only large challenge I solved was getting F-Droid’s install file onto LineageOS. Normally, I would just mount it and drop a file where it needs to go. That wasn’t an option here because I didn’t know where it belonged and the directories above it had locked down permissions. The simplest solution was to just move it over with a USB drive. It installed cleanly from there, and I ran out of time from working on long-term projects and shorter projects bloating beyond this week’s scope.

Takeaway

If you ever hit a road block learning to a safety measure, listen to it. Take reasonable alternate actions to remain safe and try to learn a bit about how to pass it correctly each time.

Final Question

What subjects have you had to conquer a chip at a time?