Ephes Blog

Miscellaneous things. Mostly Weeknotes and links I stumbled upon.


Weeknotes 2025-03-10

, Jochen
On behalf of the United Kingdom, I would like to welcome the United States of America into the select club of countries that have voted to impose economic sanctions on themselves. --David Chisnall

Carnival is finally over and the weather's improving! I just released an update to django-cast where transcript models for the feed are now retrieved through a repository, and the feed is primarily generated from cacheable data. This turned out to be more challenging than I expected.

There are still four queries I haven't been able to eliminate yet: one because caching the site object is difficult, two because podcasts have additional fields compared to blogs that prevent me from using the cached blog object, and one query that fetches a post model for reasons I can't figure out. For now, I'm satisfied with the progress - eliminating those remaining queries isn't worth the effort at this point. I might work on transcript detail pages next week.

Articles

Tools

Videos

Out of Context Images


Weeknotes 2025-03-03

, Jochen
just putting this out there but: the technology has emerged. it is no longer "emerging technology." the technology is now a seeping ooze --allison

I managed to avoid going overboard with carnival festivities. Finally published the podcast episode about Auphonic that had been sitting in the queue for over two months. I'm hoping to prevent such long delays going forward. I had planned to release a new django-cast update with properly cacheable transcript data, but it turned out to be more challenging than anticipated - hopefully I can get to it next week.

Articles

Fediverse

Software

Hardware

  • framework | Nice, but maybe I'm waiting a bit for the new mac studios?

Videos


Weeknotes 2025-02-24

, Jochen
One of the advantages of the downfall of the United States will be eradicating the mm/dd/yyyy date format --Myles Eftos

Spring is finally in the air! 🌼 With the warmer weather rolling in, I found myself inspired to set up a Bedrock Minecraft server and wrote a quick blog post about the process – mostly so I wouldn't forget how to do it again later.

The nice weather also made me feel a bit guilty about my neglected kptncook project, so I pushed out a new release with some bug fixes. While I was in a productive mood, I updated django-cast too. The new version now includes transcript URLs in your podcast feed. I tested it with Castro, and it works great – there's now a neat "Transcript" button at the top of each episode that displays the transcript when tapped. I also created a new HTML view for the transcripts, though I haven't linked to it anywhere yet since it's still pretty bare-bones and needs some proper styling and layout work.

Articles

Software

Fediverse

Videos


Deploying a Minecraft Server

, Jochen

Let's talk about one of life's little annoyances: I'm part of that "lucky" generation stuck between helping our parents with printers and setting up our kids' tech. And now, on top of printer duty, I've somehow inherited the job of deploying Minecraft servers. At least it's slightly less painful than dealing with printers.

I found these articles while researching this task:

Since we're an Apple household with iOS devices everywhere, Bedrock edition was really our only option. I decided to keep things simple and install it directly in a dedicated user account without messing with Docker. Here's the Ansible playbook I use to deploy the Bedrock server:

- name: Install Minecraft Bedrock Server
  hosts: all
  become: true
  vars:
    minecraft_user: "bedrock"
    minecraft_home: "/home/bedrock"
    minecraft_download_url: "https://www.minecraft.net/bedrockdedicatedserver/bin-linux/bedrock-server-1.21.60.10.zip"  # Update to latest version

  tasks:
    - name: Create Minecraft user
      user:
        name: "{{ minecraft_user }}"
        home: "{{ minecraft_home }}"
        create_home: true
        shell: /usr/bin/fish

    - name: Create Minecraft directory
      file:
        path: "{{ minecraft_home }}"
        state: directory
        owner: "{{ minecraft_user }}"
        group: "{{ minecraft_user }}"
        mode: "0755"

    - name: Download Minecraft Bedrock Server
      get_url:
        url: "{{ minecraft_download_url }}"
        dest: "/tmp/bedrock-server.zip"
        mode: "0644"

    - name: Extract Minecraft Bedrock Server
      unarchive:
        src: "/tmp/bedrock-server.zip"
        dest: "{{ minecraft_home }}"
        remote_src: true
        owner: "{{ minecraft_user }}"
        group: "{{ minecraft_user }}"

    - name: Ensure Minecraft server is executable
      file:
        path: "{{ minecraft_home }}/bedrock_server"
        mode: "0755"

    - name: Create a systemd service file for Minecraft Bedrock
      copy:
        dest: "/etc/systemd/system/minecraft_bedrock.service"
        content: |
          [Unit]
          Description=Minecraft Bedrock Server
          After=network.target

          [Service]
          User={{ minecraft_user }}
          WorkingDirectory={{ minecraft_home }}
          ExecStart={{ minecraft_home }}/bedrock_server
          Restart=always
          RestartSec=5
          StandardOutput=journal
          StandardError=journal
          LimitNOFILE=4096

          [Install]
          WantedBy=multi-user.target
      notify: Restart Minecraft Server

    - name: Enable and start Minecraft Bedrock service
      systemd:
        name: minecraft_bedrock
        enabled: true
        state: started

  handlers:
    - name: Restart Minecraft Server
      systemd:
        name: minecraft_bedrock
        state: restarted

Weeknotes 2025-02-17

, Jochen
Pessimist: The glass is half full. Optometrist: That's the letter H --Tess

Managed to accomplish quite a bit outside of my regular work this week.

PySAML2 Updates

A while back, I wrote a tutorial on setting up Django with SSO login using PySAML2's test IdP. Recently, a reader pointed out that the tutorial stopped working with Python 3.13. I filed a bug report with PySAML2 about this issue, and last week I created a pull request to make the test IdP server compatible with Python 3.13.

The main challenges were:

  1. The old cgi module from the standard library was used, but it's been removed in 3.13
  2. The test server uses shelve.open to store data on disk, which now has complications:
    • The dbm module (used by shelve) has switched its default backend from berkeleydb to sqlite in Python 3.13+
    • Cheroot (the HTTP server powering CherryPy) uses threads for concurrency but tries to access the same shelve database from all threads
    • This causes sqlite to complain about reading from a database created in a different thread

My solution is to use dbm.dumb as the backend for Python 3.13+, since performance isn't critical for a test server.

django-cast Progress

I released a new version with support for Wagtail 6.4. I'm happy to report that test coverage is back to 100%! Also made some minor fixes related to uv and tox.

django-resume Improvements

Released a new version with several improvements:

Articles

Fediverse

Software

Videos