Virtual Keyboard in Sumur

This has been a long time coming. Sumur has up to now not really been playable on mobile using the HTML5/WASM version due to difficulties loggin in. I saw the potential solution for this issue in https://godotengine.org/article/godot-web-progress-report-7 a while back where the Godot team had added an experimental version of an on screen keyboard to Godot.

This was for Godot 3.3 and we are now at 3.5 and there is still quite some work to do on this feature. But it does work!. So from today you can play on your tablet or phone (I still havent made an automatic Android or iOS build so that will have to do for now).

Nice work Godot team.

Building and publishing a Godot websocket server on Dokku

The title is quite specific, but I would have loved to have this article around when I moved my game Sumur from its old hosting at IBM Code Engine and to my own Dokku server. Also, I remember having had some issues packaging the game in a docker to begin with, so here is a short explanation of how that can be done. I am sure there are other ways.

Godot websocket server in a Docker

Lets start with the Dockerfile:

FROM ubuntu:22.04

WORKDIR /app
COPY . .
RUN mkdir logs

EXPOSE 8080
CMD ["./game"]

As you can see, this is not all that impressive. We expose port 8080 (the server code is configured to listen on that port of course) and run the game. But what is this “game” that is being run?

Good question. It is not the executeable that Godot will give you as a result if building for Linux. Its rather the server version of Godot itself (when writing this, its the file found here: https://downloads.tuxfamily.org/godotengine/3.5/Godot_v3.5-stable_linux_server.64.zip) renamed as game.

In the same directory is the game archive, named game.pck (Godot will automatically load the pck file with the same name as the executeable).

Thats basically all there is to it.

Here is the relevant part of my Makefile for reference (the server code is in directory “server”):

build/game.pck: $(shell find server -type f)
        $(godot) --path "server" --export "Linux/X11" ./game.pck --no-window
        mv server/game.pck build

build/game:  
        - mkdir build
        cd build;wget https://downloads.tuxfamily.org/godotengine/3.5/Godot_v3.5-stable_linux_server.64.zip;unzip *.zip;rm *.zip
        mv build/Godot*.64 build/game 

linuxserver: build/game build/game.pck
        cp -R server/data build
        cp server/*.so build
        cd build;docker build -f ../Dockerfile -t sumur_server .
        docker tag sumur_server myrepo/sumur_server:latest

Deploying, running and re-deploying on Dokku

As I explained in Goodbye Heroku (for now) I have set up a Dokku server where I run all my server stuff (its quite amazing how much stuff one can run on one cheap cloud server) and mostly this has been simple. Running Django or Rails applications using Heroku buildpacks is a well documented and simple process. A docker container with godot server running websockets turned out to be less documented..

To start, set up a normal dokku application and hostname, letsencrypt and all that. Basically:

dokku apps:create sumurserver
dokku domains:add sumurserver sumurserver.yourdomain.com
dokku letsencrypt:enable sumurserver

Then you need to add the ports. My dokku defaulted to redirect http and https to port 5000 in the docker. To fix that:

dokku proxy:ports-clear sumurserver
dokku proxy:ports-add sumurserver http:80:8080
dokku proxy:ports-add sumurserver https:443:8080
dokku proxy:ports-add sumurserver wss:443:8080

Since websockets is supported by nginx, this “just works” without any more configuration. Now we’re all set to deploy the docker.

The simplest way is to deploy once and be done with it:

dokku git:from-image sumurserver myrepo/sumur_server:latest

This will work just fine, but I never got it to update the image when I rebuilt it and published a new container to my repository. How to fix that is described in the dokku documentation at https://dokku.com/docs~v0.25.7/deployment/methods/git/#initializing-an-app-repository-from-a-docker-image using the images sha hash instead of its lable. In my case:

dokku git:from-image sumurserver myrepo/sumur_server@sha256:9d187c3025d03c033dcc71e3a284fee53be88cc4c0356a19242758bc80cab673

Again, put into a Makefile:

publish-linuxserver:
        docker push sumurserver myrepo/sumur_server:latest
        TAG=$$(docker inspect --format='{{index .RepoDigests 0}}' sumurserver myrepo/sumur_server:latest) &&  ssh my.dokku.server.com dokku git:from-image sumurserver $$TAG

Goodbye Heroku (for now)

Now the day came. Heroku has decided to stop with its free plans for running small web applications and their free redis and postgres plans as well. I don’t blame them for it, but I am of course a little sad that such a convenient deployment option is going away.

I am a rather recent Heroku user, but I use “server less” a lot in my work (where I mostly prefer using the IBM Code Engine. Its good, try it!) but for my hobby projects I recently found Heroku when playing around a bit with Ruby on Rails and its simplicity and price (free) really fits for small experiments. I don’t mind the cold start time being a bit slow, as if I would be serious with any project, I know I can just pay a small sum and I will get more power. But not anymore.

I can’t say that I think its reasonable to pay for all my dynos that I have. Most are just small things that I am playing with from time to time with one or two users. Each would need a dyno and at least one database. It would quickly add up, and also I don’t like that it should be any resistance to starting a new project. Free is nice in that it removes one obstacle to just starting. But I like the concept of Heroku and I want to continue to use the very convenient way with the Heroku buildpacks to publish and run my software.

The replacement

The discussions on Hackernews suggested all sorts of solutions and services to replace Heroku, but I wanted the same kind of service and similar simplicity. Also, I have a cheap virtual machine on Azure that is just sitting there from some project I have long forgotten about.

It’s important for me that this works the same as before. I want to be able to just publish to Heroku again if one of my projects should take off and be worthy of a small investment. But until then it seems it is quite close to trivial to run all my projects using Dokku on my cheap virtual machine.

I found an excellent tutorial on how to set up Dokku and migrate my dynos and I couldn’t imagine it being simpler to move. My virtual machine is now running 3 apps (1 rails and 2 django), with postgres and redis databases (and Sidekiq and RQ) without any issues and I have for the moment closed down my Heroku account as I don’t need it right now. I think this is so simple that I will be moving a couple of more apps from other services I have used in the past to this machine and collect all my projects here. A couple of more Django applications, a Ruby web server that is back end for a game and a Godot game server are all on their way.

I am looking forward to see how to this setup will cope with these different projects. Perhaps I will write something about it in the future. Until then, happy coding, and I hope Herokus changes will make it even better 🙂

Todour 2.21

It’s been over a year. There hasn’t been much development but there is always some tinkering being done and it was time to release what’s been updated.

  • Added scrollbars in settings dialog
  • Added icons in .deb build
  • Added icon on the window where supported
  • Multi-monitor support (for restoring)
  • Fixed a bug where the check for new version would basically always find a new ver
  • sion
  • Fixed bug introduced in 2.20 with automatically adding due: or t: when using rec:
  • Fixed building issues for older versions of Qt5

Download todour 2.21 from https://nerdur.com/todour-pl/

Removing music from mp3 files

I got an interesting problem to solve the other day. A few friends have a local radio show and we want to put the recordings of it online. Of course, there are very different rules on how music can be played on radio as opposed to how is can be shared in a downloadable/podcast format so we have to remove the music from the recording. I offered to help with that, started up Audacity and got to work.

It was quickly very clear to me though, that at least in theses particular recordings, it was obvious just by looking at the wave forms where the music was. So I thought.. if I can see it, the computer can see it. And then instead of doing the work I was supposed to, I set off to solve the problem in code.

I think the work of removing all the music from all the audio files manually would have taken a couple of hours. But I opted for spending a couple of days rather to solve it.

And this is what came of it

https://podcastur.nerdur.com/

This is a simple website, written in Django, using django-q to distribute the work to workers when there is any real work to do (as it is quite heavy to remove the music from hours of radio and my free Heroku tier would be eaten up pretty fast, the worker is an old mac-mini running Linux. It’s not fast, but it gets the work done. Eventually). The files are stored on IBM Object Storage while being processed.

The algorithm I came up with for removing music is quite simple and works for the radio recordings I had. It may work for others but there has been no extensive testing. Feel free to try it out.

I made a small game – Sumur

I made a small game a while back. I made it in C++, since well, that is how things get done, and all was fine. Until I wanted to change stuff in it and it all just became complicated (my code was a bit of a mess). So I tried out Unity, Unreal and Godot, and in the end settled on using Godot.

So here it is. A small math puzzle I made when thinking of ways to help my daughter with her math.

The game is a bit more complex than it needs to be (implementation wise), but I wanted to test making a networked game. So this game is running in a browser but has a server backend (also written in Godot) that is running on IBM Cloud Engine and that in turn has a database/API written in Django-REST on pythonanywhere. In theory, this should all scale pretty well if that would ever be needed 🙂

If you feel like playing it, just log in with whatever username you want and a password. If the username doesn’t exist a user is created. Else you just get an error so you have to chose another name. Then select a game and play. The highscores are live, so your see how you are doing compared to everyone else that has played.

Note: Since this was written the game has been moved from both IBM Cloud Engine and pythonanywhere.

Todour 2.20

Download todour 2.20 from https://nerdur.com/todour-pl/

 Moved the "Show All" checkbox to a menu
 Added a "Stay on top" menu item
 Fixed github issue 25 - Deleting of creation date
 Added version information in Mac Build / Bundle
 Added ability to change what character is used for "NOT" in search
 Add a due: or t: if using a rec: without any due: or t: