Kirsle.net logo Kirsle.net

Welcome to Kirsle.net!

This is the personal homepage of Noah Petherbridge, and it's where I keep my web blog and various creative projects.

I blog about anything I find interesting, and since I have a lot of varied interests, my blog entries are kind of all over the place. You can browse my tags to sort them by topic and see which ones I frequently write about, or the archive has a complete history of my posts, dating back to 2008!

Besides my blog, I have pages for my creative projects, which are linked to on the navigation bar.

I write a lot about Linux and Android, Minecraft, and I like to rant about stuff. Generally anything that makes me curious. Also check out my Bookmarks for all sorts of cool websites about various topics I'm interested in.

For the geeks: this website respects your privacy and doesn't run any third party ads or analytics. This site speaks HTTP and doesn't require any JavaScript to work.

Pinephone vs. De-googled Android
October 23, 2020 (updated January 15, 2021) by Noah

The Pinephone is a new smartphone in the works that will run mainline Linux as its operating system instead of Android, and already has a lot of Linux distributions that run on it. The idea is it would run all the same Linux software you get on desktops, servers or Raspberry Pi's and give you a private alternative to Android devices which send a lot of data up to Google.

They've already released some phones, and I have one that came installed with Ubuntu Touch, and I've been testing the operating systems as they progress. Linux on Mobile is still very early, most graphical apps don't fit on the tiny screen size of a smartphone, battery life can still be improved, camera quality can be improved. But progress is advancing rapidly and there's a growing number of apps that work and provide basic "smart phone" functions: calls, texts, email, calculator, calendar, maps, password manager (KeePass), web browsers.

My dream is to use a Pinephone as my daily driver, but it's still got a long ways to go, and I got impatient and instead installed a de-googled Android ROM onto my existing Pixel phone.

And having used both Linux and Android on mobile, I've determined that a de-googled Android ROM is a very solid alternative to a Linux phone while you wait for Linux phones to get better:

  • The F-Droid app store has a lot of free and open source apps for all your "smart phone" functionality and larger number of mobile-friendly apps compared to Linux.
  • Termux for Android is a very cool terminal emulator with a package manager! You can install Linux software like git, ssh, python and run a full Linux environment.
  • You're reasonably private at the operating system level: without Google Play Services installed on Android, Google Location Services and other features aren't there and so aren't spying on you.
  • Android apps are more secure than Linux with their sandbox and permissions.
  • You can run some Play Store apps, but not apps that rely on Google services. Still, on Pinephone you can have none of the Android apps (very well) anyway.

Details below:

Read more...

Tags: 1 comment | Permalink
Project: Doodle v0.3.0
September 19, 2020 (updated September 19, 2020) by Noah

Here's another alpha release of the game I've been working on, codenamed Project: Doodle. This time, it has new sprites for the player character.

A direction for the Player Character's look.

The new player character is larger in size (33x54 pixels) than the previous 32x32 placeholder was, so the three example levels that came with v0.2.0 no longer worked: the character would get stuck in the narrow hallways. However, this release comes with two new example levels that look better than the older ones anyway.

I may scale up the size of Doors and things to accommodate the larger character as doorways now feel a little tight to draw.

Read more...

Tags: 0 comments | Permalink
The little things they don't tell you about Linux
September 15, 2020 (updated January 15, 2021) by Noah

When we're talking about "Linux" the operating system, we really mean one of the thousands of Linux distributions that exist out there. Linux itself is just the kernel -- the lowest level part of the operating system that deals with hardware, drivers, process and memory management. A distribution is all the stuff on top: the software, the desktop environments and so on.

Most Linux distributions can be called "GNU/Linux" because they include the Linux kernel and a suite of software tools from the GNU project. These are mostly command-line programs like grep and less as well as deeper system components like the GNU C Library (glibc) which is used by basically every program on the system.

When you're new to Linux you may look at this enormous list of distributions and be paralyzed as to which one you should pick. Fedora, or Ubuntu? Or Debian or Arch?

People will often tell you: it doesn't really matter, all these distributions are running more-or-less the same software and the biggest differences between them is their package manager and what format their software is shipped in. On Fedora you might dnf install firefox or dnf update thunderbird whereas on Debian you would apt install firefox or on Alpine you'll apk add firefox. Just learn the set of commands for your distro of choice and you're good. Software on Fedora-like distros come in .rpm packages, Debian-likes come in .deb, but mainly you'll install software through the official repositories of your distro.

But there's more differences between the distros that they don't tell you about:

Read more...

Tags: 1 comment | Permalink
Docker Crash Course
July 21, 2020 (updated January 8, 2021) by Noah

Docker is a commonly used tool in modern software development to deploy applications to web servers in a consistent, reproducible manner. It's been described as basically a "light-weight virtual machine" and it makes use of a Linux kernel feature known as containers.

How does it work?

In this post I'll try and briefly sum up what Linux containers do and what problem they solve for developers.

This blog post is non-technical: I won't be showing docker commands or any such details, there is plenty of better documentation on the Internet for that, but instead a high level overview of how we got here and what containers do for us today.

Read more...

Tags: 3 comments | Permalink
Pinephone: First Impressions
June 25, 2020 (updated January 15, 2021) by Noah

The Pinephone is "an open source smart phone supported by all major Linux phone projects." I'd been keeping my eye on these things for a few years now and finally got the Pinephone in my hands earlier this week to try it out.

The idea with devices like this (as well as the Librem 5 phone) is that it's a smartphone that runs standard mainline GNU/Linux software instead of Android. This means root passwords (or sudo), SSH servers, full admin control of the device, and ability to run all the familiar Linux software that you get on a desktop PC, server, or Raspberry Pi type of device.

Importantly this means no Google Play Services or built-in spyware and the user is in control of their device. More privacy, but not necessarily more security.

There are many Linux operating systems available for the device already and I've tested out Ubuntu Touch UBports, postmarketOS and Mobian/Phosh and here are some of my impressions so far.

tl;dr.:

  • The phone is not "daily driver" status yet.
  • Most graphical Linux apps don't fit on a small screen yet.
  • The phone otherwise works as well as any Linux device such as a raspberry pi.

See also: I'm maintaining a Linux on Phones page on my site's wiki to collect notes, config tweaks, software I found that works and so on.

Read more...

Tags: 2 comments | Permalink
Project: Doodle v0.2.0
June 7, 2020 by Noah

Here is another alpha release of the videogame I've been working on, codenamed Project: Doodle.

It's a drawing-based maze game where you can design your own levels freehand and play it as a 2D platformer game.

Changes

This release brings Sound Effects and Menus to the game.

New features:

  • Added some User Documentation to ship with the game which teaches you how to create your own custom Doodads and program them with JavaScript. More documentation to come with time.
  • Sound effects! Several doodads have a first pass at sound effects using some free sounds I found online. More doodads still need sounds and the existing sounds are by no means final. Buttons, switches, doors and keys have sound effects so far.
  • The game now has a Menu Bar with pull-down menus in the Editor Mode instead of just a top panel with New/Save/Open buttons.

Guidebook

The Guidebook contains some help and documentation on the game. In particular, it teaches you how you can create custom doodads and program them with JavaScript. Future releases of the game will include more fleshed-out versions of the guidebook.

Download

Mac users: let me know if the performance is horrible or if sound effects aren't working. I only tested the game briefly in a virtual machine that I use to build the game, and it only ran at ~30 FPS and my VM had no audio drivers. Press the F3 key to open the debug menu and see the frames per second.

Tags: 4 comments | Permalink
Ask Kirsle: Self-learning RiveScript Bot?
May 9, 2020 (updated May 9, 2020) by Noah

Oliver asks:

Hello,

I'm looking for a way to solve the following scenario using Rivescript and Python. The chatbot has no answer to a question, in this case it asks the user for the correct answer and records it in the rivescript file.

Do you have an idea? Does it even work in Rivescript?

Thanks

Best wishes Oliver

Hey Oliver

This can be done with a little bit of creativity. Self-learning bots aren't an officially supported feature in RiveScript, but you can get something to work using object macros that write new replies out to .rive files to grow the bot's brain over time.

There's an example for this in the JavaScript edition of RiveScript, but its logic could be ported over to Python easily enough: https://github.com/aichaos/rivescript-js/tree/master/eg/learning

RiveScript Playground example you can test in your web browser: https://play.rivescript.com/s/0r4ZYvklR9

The basic ideas are:

  1. A RiveScript trigger of + when i say * you say * allows the user to teach the bot a new reply.
    • e.g.: "when I say hello bot you say Hello human!"
  2. To preserve punctuation and formatting, the Python script running the RiveScript module can store the user's raw, original message into a user variable which the object macro can access:
    • rs.set_uservar(username, "origMessage", message)
  3. The object macro behind the when i say * you say * trigger re-parses the user's message to get the original punctuation and formatting they used.
  4. The object macro appends the new trigger/reply into a learned.rive file and also calls stream() to load the new reply for immediate use by the bot "right now."

The JavaScript example linked above works whether or not the program set the origMessage variable: if the program did not set the variable, the learned reply is just somewhat limited to only include simple text with very few punctuation symbols preserved.

Tags: 3 comments | Permalink
Breath of the Wild: Save Hacking
May 8, 2020 (updated February 27, 2022) by Noah

Updated (Feb 27 2022): I found a way to not activate the Great Plateau Tower but still have time-of-day pass as normal, so you can have a "no towers, no shrines" run but still have regular time/weather related events.

I've played the everloving heck out of The Legend of Zelda: Breath of the Wild on Nintendo Switch. Played through the game to 100% completion (not always with the Korok Seeds) on Normal and Master Mode, and played dozens of "challenge runs" where I self-impose various restrictions to make the game more interesting.

Things like: "no activating towers, no armor upgrades, no korok seeds, etc." -- lots of variations you can find online. Eventually, I decided to try playing the game on my PC using the "CEMU" emulator of the WiiU. There's a whole modding community out there, but I wanted to keep the game relatively vanilla but just play around with some of the game's built-in features and apply some "light" cheat codes, such as removing weapon durability or giving infinite stamina.

Anyway, I made a couple of modded save game files for the CEMU emulator for Breath of the Wild which can give you a kind of "New Game++" and changes a few things around.

Pictured: the Great Plateau Tower is still buried in the ground, and I have the Bow of Light, Tunic of the Wild and the Motorcycle Rune at the start of a "New Game++"

Read more...

Tags: 1 comment | Permalink
Go UI Toolkit and Other Libraries
May 1, 2020 by Noah

As I've been working on my videogame (codenamed Project: Doodle), I created a few Go libraries that I'm releasing as open source software that can be used to create other, unrelated applications (other games, other kinds of graphical programs, etc.)

These libraries are still in "early development" (meaning I may change their API around a bit as I refactor and add new features) but they are generally stable and I'm good about documenting changes in the code, if you wanna play around with these and aren't afraid of occasional breakages.

This is just a quick blog post letting people know about these libraries. I'll probably post again when these libraries reach a stable "1.0" state, where their API won't change and they'll have a degree of stability guaranteed to them.

I'm generally using GitHub as a mirror for these libraries and will accept issues and pull requests filed on GitHub (I wouldn't expect or want anybody to sign up an account on my local Gitea instance).

render: A Rendering Engine (SDL2, HTML Canvas)

render example screenshot

I decided early on for my game that I would be using libSDL for my game's graphics, audio, controller inputs and so on -- at least to start out with. I didn't want my game to rely on SDL though: I needed the flexibility to swap it out for OpenGL or Vulkan or Metal or any other back-end driver as needed to expand my game to future platforms.

So I created go/render as a "rendering engine library" for 2D graphics in Go. It presents an API interface for drawing pixels to the screen which can be implemented by various back-end "drivers" that do the real work.

Currently it supports SDL2 for desktop applications (Linux, macOS and Windows) as well as a WebAssembly driver that uses the HTML Canvas API. (I have a build of my game to WebAssembly, but WASM performance is not great yet.) Examples are included in the git repo for both desktop and WASM applications.

ui: A User Interface Toolkit (SDL2, HTML Canvas)

ui toolkit screenshot

My game also required a UI toolkit for easily adding buttons, panels, windows and basic user interface controls to the game.

There were a handful of options I could've gone with: desktop UI toolkits like Gtk+ or Qt could've wrapped around my SDL surface and provided menu bars and button toolbars, but I wanted to minimize my inclusion of C or C++ libraries with my Go application. I was fortunate that go-sdl2 provided clear documentation how to cross-compile my program for Windows, and I didn't wanna push my luck bringing in yet more C libraries that might've made my game harder to ship. This also ruled out some potential SDL2-based C libraries for UI controls as well.

So I created my own UI toolkit in Go, and it uses my go/render library as its graphics back-end: meaning my UI toolkit can work for SDL2 desktop applications and as WebAssembly applets.

The library's API is inspired by the Tk GUI toolkit which I had prior experience with in Perl and Python (see my Tk blog posts).

It currently supports widgets such as Labels, Buttons, Checkboxes, Tooltips and (virtual) Windows (with title bars that can be dragged around and closed). The Frame widget allows easy arrangement of child widgets using Tk-style Pack and Place controls.

Future planned widgets include: menus and menu bars, tabbed frames, text input boxes, scrollbars and sliders (in roughly that order).

audio: A Simple Audio Engine

The newest library implements a simple audio engine for playing music and sound effects. My game needed these, and doesn't have any fancy requirements yet, so this library provides the basics for loading music (.mp3 and .ogg) and sounds (.wav) and playing, pausing and stopping them.

Currently it only supports the SDL2 (Mixer) driver. This module is independent from go/render and you can mix and match (or not) that library.

Future planned features include: adding WebAssembly support (Web Audio API), maybe branch out to other back-end drivers as needed.

Tags: 0 comments | Permalink
Project: Doodle v0.1.0
April 13, 2020 by Noah

Here is another alpha release of the game I've been working on, codenamed Project: Doodle.

Doodle v0.1.0 Screenshot

About Project: Doodle

Doodle is a "drawing-based maze game" where you can draw your own levels freehand and then play them as a 2D platformer game. You can drag premade "doodads" such as buttons, doors and keys into your level to add some interaction to it.

The game is being designed to be very friendly for custom content: you can create your own doodads and program their behavior in JavaScript, and eventually, when you share your levels with others you can bundle the custom doodads, wallpapers and other assets with the level file to enable others to easily play your custom map without needing to go hunt down all the custom assets you used.

The game comes with the "doodad.exe" command-line program which helps in creating custom doodads; it's the tool I used to create the default ones that come with the game.

Downloads

The game is free to download in its alpha versioned form.

Note: the program isn't signed yet for Windows and Mac so you may need to click through some warning dialogs. This is an early alpha release and I'll get the signatures sorted out eventually in future releases.

Mac users: let me know if the performance is okay. I only tested running it in the QEMU virtual machine I built it in, and it got < 30 frames per second there (hit F3 key in-game to see the FPS). Linux binaries and Windows (in Wine) ran at full 60 FPS for me.

Changes

New doodads:

  • Start Flag: drag this into your level to set where the player character will spawn. There should only be one per level.
  • Crumbly Floor: a rocky floor that breaks and falls away after a couple seconds when the player (or other mobile doodad) walks onto it.
  • State Blocks: blue and orange blocks that toggle between solid and passable when the corresponding ON/OFF button is touched.

New features:

  • An inventory overlay now appears in Play Mode when the player character picks up one of the colored keys.
  • While editing a level, you can click the new "Options" button in the top menu to open the level settings window (like the one you see when creating a new level): to change the wallpaper image or the page type.

Other changes:

  • Added better platforming physics to the player character: acceleration and friction when walking.
  • The colored Locked Door doodads have been re-designed to be shown in a side-view perspective and have an open and closed state in either direction.
  • Tooltips added to various buttons in the Editor to show names of doodads and functions of various buttons.

Cheat Codes

In case you happen to clip out of bounds in the game and fall to the bottom of the map, press the Enter key to open the in-game developer console and type in cheats like these:

  • import antigravity turns off gravity for the player character; arrow keys freely move you in any direction.
  • ghost mode turns off collision detection for the player, allowing you to pass through walls, floors and solid doodads.

The README.md contains more.

Tags: 0 comments | Permalink