github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: d7afa745f32d0482c0e8f3da2c041d92a9b5f636 https://github.com/dreamwidth/dreamwidth/commit/d7afa745f32d0482c0e8f3da2c041d92a9b5f636 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-06 (Fri, 06 Feb 2026)

Changed paths: M etc/docker/base/Dockerfile A etc/docker/base/build-static-legacy.sh

Log Message:


Preserve legacy build-static.sh for Ubuntu 18.04 base image

The 18.04 image still uses Compass/YUI which the new build-static.sh no longer supports. COPY a frozen copy of the old script into the image and overwrite the repo version before running the build. Can be removed when the 18.04 images are retired.

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

Commit: b6ef69d4b76f3f3846f49fb62a81d3afc41bc598 https://github.com/dreamwidth/dreamwidth/commit/b6ef69d4b76f3f3846f49fb62a81d3afc41bc598 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-06 (Fri, 06 Feb 2026)

Changed paths: M CLAUDE.md

Log Message:


Add never-amend rule to CLAUDE.md git workflow instructions

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

Compare: https://github.com/dreamwidth/dreamwidth/compare/8f82b8be8ff5...b6ef69d4b76f

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: e26767b2e3f02ba7ff72fb279dcdf34cb894906a https://github.com/dreamwidth/dreamwidth/commit/e26767b2e3f02ba7ff72fb279dcdf34cb894906a Author: Mark Smith mark@dreamwidth.org Date: 2026-02-06 (Fri, 06 Feb 2026)

Changed paths: M t/bin/initialize-db

Log Message:


Make initialize-db idempotent to avoid errors on rerun

Consolidate individual mysql calls into a single statement using CREATE USER/DATABASE IF NOT EXISTS, so the script can be run repeatedly without throwing errors on an already-initialized database.

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

Commit: 8f82b8be8ff5db0e7e7b0ff8678a4680e7f394b7 https://github.com/dreamwidth/dreamwidth/commit/8f82b8be8ff5db0e7e7b0ff8678a4680e7f394b7 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-06 (Fri, 06 Feb 2026)

Changed paths: M .devcontainer/Dockerfile M .devcontainer/setup.sh M bin/build-static.sh R config.rb M doc/dependencies-system M etc/docker/base22/Dockerfile R ext/dw-nonfree/config.rb

Log Message:


Replace Compass/YUI with Dart Sass/esbuild for static asset builds

  • Switch SCSS compilation from deprecated Ruby Compass to Dart Sass (installed via npm), with proper --load-path for import resolution
  • Replace YUI Compressor (Java) with esbuild (Node.js) for JS minification; CSS skips minification since Dart Sass already outputs compressed CSS
  • Add --sass and --compress flags to build-static.sh for selective builds; asset sync (rsync) always runs
  • Install Node.js 20 LTS via nodesource in devcontainer and base22 Dockerfiles; remove Ruby, Compass, default-jre, and YUI
  • Symlink pre-built static assets in devcontainer setup instead of copying them
  • Delete config.rb (Compass configuration) from both repos
  • Leave Ubuntu 18.04 base image unchanged (being deprecated)

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

Compare: https://github.com/dreamwidth/dreamwidth/compare/4d2a30581c19...8f82b8be8ff5

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 4d2a30581c19aa0bbed317e1d87d05fa887026c5 https://github.com/dreamwidth/dreamwidth/commit/4d2a30581c19aa0bbed317e1d87d05fa887026c5 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-06 (Fri, 06 Feb 2026)

Changed paths: M .devcontainer/Dockerfile M .devcontainer/setup.sh A .dockerignore

Log Message:


Pre-bake schema population and static build into devcontainer image

Move database schema setup, YUI compressor download, and static asset compilation from container creation time (setup.sh) into the Dockerfile so they're baked into the image. This makes container startup much faster since setup.sh now only runs idempotent catchup steps.

Static assets are built to /opt/dreamwidth-static/ in the image (since /workspaces/dreamwidth is overlaid by a bind mount at runtime) and fast-copied into place by setup.sh. Also fixes PERL5LIB to point to /opt/dreamwidth-extlib/lib/perl5 where cpm actually installs modules.

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 3cd3d09906e985b511fcdfa0b98d2cc959e66424 https://github.com/dreamwidth/dreamwidth/commit/3cd3d09906e985b511fcdfa0b98d2cc959e66424 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-06 (Fri, 06 Feb 2026)

Changed paths: M .devcontainer/devcontainer.json A .github/workflows/devcontainer-build.yml

Log Message:


Add CI workflow to pre-build devcontainer image on GHCR

Developers now pull ghcr.io/dreamwidth/devcontainer:latest instead of building the image from scratch. The workflow triggers on dependency file changes, nightly, and manual dispatch.

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 58e398d69d2464e2f8fc5786c2312b1c2dac4d7b https://github.com/dreamwidth/dreamwidth/commit/58e398d69d2464e2f8fc5786c2312b1c2dac4d7b Author: Mark Smith mark@dreamwidth.org Date: 2026-02-06 (Fri, 06 Feb 2026)

Changed paths: M .devcontainer/devcontainer.json

Log Message:


Remove redundant forwardPorts from devcontainer config

runArgs -p flags already handle port publishing for both VS Code and the devcontainer CLI, so forwardPorts is unnecessary.

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 26cb4633dc9643410c171a560bbf82656c144252 https://github.com/dreamwidth/dreamwidth/commit/26cb4633dc9643410c171a560bbf82656c144252 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-06 (Fri, 06 Feb 2026)

Changed paths: M .devcontainer/devcontainer.json

Log Message:


Add explicit port mappings for devcontainer CLI

forwardPorts only works in VS Code; the devcontainer CLI needs -p flags in runArgs to actually publish ports to the host.

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 08af0eec17bd6bcabff328014253c09d3f8ddc1b https://github.com/dreamwidth/dreamwidth/commit/08af0eec17bd6bcabff328014253c09d3f8ddc1b Author: Mark Smith mark@dreamwidth.org Date: 2026-02-06 (Fri, 06 Feb 2026)

Changed paths: M .github/workflows/tasks/worker-birthday-notify-service.json M .github/workflows/tasks/worker-change-poster-id-service.json M .github/workflows/tasks/worker-codebuild-notifier-service.json M .github/workflows/tasks/worker-content-importer-lite-service.json M .github/workflows/tasks/worker-content-importer-service.json M .github/workflows/tasks/worker-content-importer-verify-service.json M .github/workflows/tasks/worker-directory-meta-service.json M .github/workflows/tasks/worker-distribute-invites-service.json M .github/workflows/tasks/worker-dw-esn-cluster-subs-service.json M .github/workflows/tasks/worker-dw-esn-filter-subs-service.json M .github/workflows/tasks/worker-dw-esn-fired-event-service.json M .github/workflows/tasks/worker-dw-esn-process-sub-service.json M .github/workflows/tasks/worker-dw-send-email-service.json M .github/workflows/tasks/worker-dw-sphinx-copier-service.json M .github/workflows/tasks/worker-embeds-service.json M .github/workflows/tasks/worker-esn-cluster-subs-service.json M .github/workflows/tasks/worker-esn-filter-subs-service.json M .github/workflows/tasks/worker-esn-fired-event-service.json M .github/workflows/tasks/worker-esn-process-sub-service.json M .github/workflows/tasks/worker-expunge-users-service.json M .github/workflows/tasks/worker-import-eraser-service.json M .github/workflows/tasks/worker-import-scheduler-service.json M .github/workflows/tasks/worker-incoming-email-service.json M .github/workflows/tasks/worker-latest-feed-service.json M .github/workflows/tasks/worker-lazy-cleanup-service.json M .github/workflows/tasks/worker-paidstatus-service.json M .github/workflows/tasks/worker-process-privacy-service.json M .github/workflows/tasks/worker-resolve-extacct-service.json M .github/workflows/tasks/worker-schedule-synsuck-service.json M .github/workflows/tasks/worker-send-email-ses-service.json M .github/workflows/tasks/worker-shop-creditcard-charge-service.json M .github/workflows/tasks/worker-spellcheck-gm-service.json M .github/workflows/tasks/worker-sphinx-copier-service.json M .github/workflows/tasks/worker-sphinx-search-gm-service.json M .github/workflows/tasks/worker-support-notify-service.json M .github/workflows/tasks/worker-synsuck-service.json A .github/workflows/worker22-build.yml A .github/workflows/worker22-deploy.yml M config/update-workflows.py A etc/docker/worker22/Dockerfile A etc/docker/worker22/scripts/setup.sh A etc/docker/worker22/scripts/startup-dev.sh A etc/docker/worker22/scripts/startup-prod.sh

Log Message:


Add worker22 container for Ubuntu 22.04 worker migration

Create etc/docker/worker22/ (FROM base22), with parallel build and deploy workflows so workers can be migrated independently. Both worker and worker22 deploys share the same task definitions and log to the same per-worker CloudWatch log groups (/dreamwidth/worker/NAME), matching the Terraform configuration.

Also updates update-workflows.py to generate both worker-deploy.yml and worker22-deploy.yml, and fixes task definitions to use per-worker log groups instead of the shared /dreamwidth/worker group.

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 6ed7244d8b66a8d3807bbac22ec1baffcc566158 https://github.com/dreamwidth/dreamwidth/commit/6ed7244d8b66a8d3807bbac22ec1baffcc566158 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-06 (Fri, 06 Feb 2026)

Changed paths: M etc/docker/proxy/Dockerfile A src/proxy/go.mod

Log Message:


Move proxy container from Ubuntu 18.04 to 24.04

Add go.mod for the proxy since Go 1.22 (shipped with 24.04) requires module mode. The proxy uses only stdlib so no dependencies needed.

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 8d37ec5d2b62954d591b7ce02bbcf43e2fa497fd https://github.com/dreamwidth/dreamwidth/commit/8d37ec5d2b62954d591b7ce02bbcf43e2fa497fd Author: Mark Smith mark@dreamwidth.org Date: 2026-02-06 (Fri, 06 Feb 2026)

Changed paths: M .devcontainer/devcontainer.json M .devcontainer/start.sh

Log Message:


Use port 8080 for Starman in devcontainer, forward both server ports

Move Starman from port 80 to 8080 (matching its default) and add forwardPorts for both 8080 (Starman) and 8081 (Apache) so they're accessible at predictable ports on the host.

Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

Data Wrangling and Advanced Projects

2026-Feb-07, Saturday 10:08
tcpip: (Default)
[personal profile] tcpip
Ten years ago, when the Spartan HPC system was launched at the University, it was small, innovative, and experimental, its very name a laconic reference to the funding provided (i.e., not much). But the tricky combination of traditional HPC flexibly supplemented by cloud VMs for single-node jobs worked, and over the years, it would become one of the world's most powerful supercomputers, supporting thousands of researchers with the computational power required in engineering, astronomy, mathematics, economics, climate science, and especially the various medical and life sciences. One of the decisions we made at the time was that Spartan would be open and collaborative; researchers could come from anywhere in the world, as long as the project's principal investigator was from the University of Melbourne. It was an openness that has allowed hundreds of researchers to access the supercomputer resources.

There has been, however, a change in policy and not one to my liking. Now each project requires a university supervisor, and each external collaborator requires a University email address, with the supervisor making a separate application for each individual. This is an overly bureaucratic procedure, in my opinion, and if there's anything IT workers hate doing, it's wrangling systems to meet unnecessary bureaucratic requirements. It's wasted work and time that provides no change in outcome; mathematicians would describe it as "inelegant", engineers would call it "suboptimal", economists would call it "damaged goods", you get the idea. My unfortunate role this week has been to get a list of active non-University researcher accounts and craft individual emails to each of them and their university supervisor, informing them of their need to apply for new email addresses. Due to nuances that I won't go into (such as one user many projects) it was not a matter of just making a single SQL database extraction, but rather required several steps of data wrangling.

The procedure was a bit of an annoyance, an interesting technical challenge, but the real moment of joy was achieved by going through the various projects: ecosystem population connections in tropical oceans, molecular modelling of novel antivirals against SARS-CoV-2 proteins, cosmic birefringence from the South Pole telescope, subterranean dark matter studies - and so it goes on. It is the range, diversity, and importance of these projects that inspire me, a quest for objective knowledge without partisanship, in a world where universal norms are betrayed by the influences of power and wealth, and aesthetic expressions are either trite or manipulative rather than sincere expressions of the imagination. As I tell researchers in my introductory class, you are the people who will make the discoveries and inventions that hopefully will make the world a better place. I'm just going to show you how to harness the resources of a supercomputer to make this easier for you. So even when I'm deeply engaged in a project I find grossly and even offensively unnecessary, there are still some parts that bring joy and hope.

Follow Friday 2-6-26

2026-Feb-06, Friday 00:40
ysabetwordsmith: Cartoon of me in Wordsmith persona (Default)
[personal profile] ysabetwordsmith posting in [community profile] followfriday
Got any Follow Friday-related posts to share this week? Comment here with the link(s).

Here's the plan: every Friday, let's recommend some people and/or communities to follow on Dreamwidth. That's it. No complicated rules, no "pass this on to 7.328 friends or your cat will die".

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: ba0d37394abf33d74665d3583cbf76bf7230e566 https://github.com/dreamwidth/dreamwidth/commit/ba0d37394abf33d74665d3583cbf76bf7230e566 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-05 (Thu, 05 Feb 2026)

Changed paths: M bin/ecs-shell M cgi-bin/DBI/Role.pm

Log Message:


Fix DBD::mysql binary data corruption on Ubuntu 22.04

  • DBI/Role.pm: Add mysql_enable_utf8 => 0 to preserve binary gzip data stored in TEXT columns. DBD::mysql 4.050+ on Ubuntu 22.04 auto-enables UTF-8 handling, which corrupts compressed data. This option is safe on older versions where it was already the default.

  • bin/ecs-shell: Prefer 'web' container over 'cloudwatch-agent' sidecar when connecting to ECS tasks. Fixes "no such file or directory" error for /bin/bash since the cloudwatch-agent container uses a minimal image.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 0c56d95cb6eee98db461ea2ac573c4c005441e2b https://github.com/dreamwidth/dreamwidth/commit/0c56d95cb6eee98db461ea2ac573c4c005441e2b Author: Mark Smith mark@dreamwidth.org Date: 2026-02-04 (Wed, 04 Feb 2026)

Changed paths: M terraform/load-balancing.tf M terraform/locals.tf M terraform/web.tf

Log Message:


Configure Starman (port 8080) target groups for canary and shop

  • Update ECS services to register with -2 target groups on port 8080 (Starman) instead of 6081 (Varnish) for canary and shop
  • Enable traffic to -2 target groups by setting weights to 100
  • Refactor target group references to use resource refs instead of hardcoded ARNs, allowing proper dependency tracking
  • Remove ignore_changes from shop and canary listener rules to allow Terraform to manage weights
  • Fix canary listener rule condition to match AWS (cookie-based routing)

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 74c1d9d89f13516a90c1feda8564e18a27111d6b https://github.com/dreamwidth/dreamwidth/commit/74c1d9d89f13516a90c1feda8564e18a27111d6b Author: Mark Smith mark@dreamwidth.org Date: 2026-02-04 (Wed, 04 Feb 2026)

Changed paths: M .github/workflows/tasks/web-canary-service.json A .github/workflows/web22-build.yml A .github/workflows/web22-deploy.yml A etc/docker/web22/Dockerfile A etc/docker/web22/config/.dir_scope A etc/docker/web22/config/dreamwidth-dev.conf A etc/docker/web22/config/dreamwidth-prod.conf A etc/docker/web22/config/etc/apache2/apache2.conf A etc/docker/web22/config/etc/apache2/conf-available/charset.conf A etc/docker/web22/config/etc/apache2/conf-available/localized-error-pages.conf A etc/docker/web22/config/etc/apache2/conf-available/other-vhosts-access-log.conf A etc/docker/web22/config/etc/apache2/conf-available/security.conf A etc/docker/web22/config/etc/apache2/conf-available/serve-cgi-bin.conf A etc/docker/web22/config/etc/apache2/conf-enabled/security.conf A etc/docker/web22/config/etc/apache2/envvars A etc/docker/web22/config/etc/apache2/magic A etc/docker/web22/config/etc/apache2/mods-available/access_compat.load A etc/docker/web22/config/etc/apache2/mods-available/actions.conf A etc/docker/web22/config/etc/apache2/mods-available/actions.load A etc/docker/web22/config/etc/apache2/mods-available/alias.conf A etc/docker/web22/config/etc/apache2/mods-available/alias.load A etc/docker/web22/config/etc/apache2/mods-available/allowmethods.load A etc/docker/web22/config/etc/apache2/mods-available/apreq2.load A etc/docker/web22/config/etc/apache2/mods-available/asis.load A etc/docker/web22/config/etc/apache2/mods-available/auth_basic.load A etc/docker/web22/config/etc/apache2/mods-available/auth_digest.load A etc/docker/web22/config/etc/apache2/mods-available/auth_form.load A etc/docker/web22/config/etc/apache2/mods-available/authn_anon.load A etc/docker/web22/config/etc/apache2/mods-available/authn_core.load A etc/docker/web22/config/etc/apache2/mods-available/authn_dbd.load A etc/docker/web22/config/etc/apache2/mods-available/authn_dbm.load A etc/docker/web22/config/etc/apache2/mods-available/authn_file.load A etc/docker/web22/config/etc/apache2/mods-available/authn_socache.load A etc/docker/web22/config/etc/apache2/mods-available/authnz_fcgi.load A etc/docker/web22/config/etc/apache2/mods-available/authnz_ldap.load A etc/docker/web22/config/etc/apache2/mods-available/authz_core.load A etc/docker/web22/config/etc/apache2/mods-available/authz_dbd.load A etc/docker/web22/config/etc/apache2/mods-available/authz_dbm.load A etc/docker/web22/config/etc/apache2/mods-available/authz_groupfile.load A etc/docker/web22/config/etc/apache2/mods-available/authz_host.load A etc/docker/web22/config/etc/apache2/mods-available/authz_owner.load A etc/docker/web22/config/etc/apache2/mods-available/authz_user.load A etc/docker/web22/config/etc/apache2/mods-available/autoindex.conf A etc/docker/web22/config/etc/apache2/mods-available/autoindex.load A etc/docker/web22/config/etc/apache2/mods-available/buffer.load A etc/docker/web22/config/etc/apache2/mods-available/cache.load A etc/docker/web22/config/etc/apache2/mods-available/cache_disk.conf A etc/docker/web22/config/etc/apache2/mods-available/cache_disk.load A etc/docker/web22/config/etc/apache2/mods-available/cache_socache.load A etc/docker/web22/config/etc/apache2/mods-available/cern_meta.load A etc/docker/web22/config/etc/apache2/mods-available/cgi.load A etc/docker/web22/config/etc/apache2/mods-available/cgid.conf A etc/docker/web22/config/etc/apache2/mods-available/cgid.load A etc/docker/web22/config/etc/apache2/mods-available/charset_lite.load A etc/docker/web22/config/etc/apache2/mods-available/data.load A etc/docker/web22/config/etc/apache2/mods-available/dav.load A etc/docker/web22/config/etc/apache2/mods-available/dav_fs.conf A etc/docker/web22/config/etc/apache2/mods-available/dav_fs.load A etc/docker/web22/config/etc/apache2/mods-available/dav_lock.load A etc/docker/web22/config/etc/apache2/mods-available/dbd.load A etc/docker/web22/config/etc/apache2/mods-available/deflate.conf A etc/docker/web22/config/etc/apache2/mods-available/deflate.load A etc/docker/web22/config/etc/apache2/mods-available/dialup.load A etc/docker/web22/config/etc/apache2/mods-available/dir.conf A etc/docker/web22/config/etc/apache2/mods-available/dir.load A etc/docker/web22/config/etc/apache2/mods-available/dump_io.load A etc/docker/web22/config/etc/apache2/mods-available/echo.load A etc/docker/web22/config/etc/apache2/mods-available/env.load A etc/docker/web22/config/etc/apache2/mods-available/expires.load A etc/docker/web22/config/etc/apache2/mods-available/ext_filter.load A etc/docker/web22/config/etc/apache2/mods-available/file_cache.load A etc/docker/web22/config/etc/apache2/mods-available/filter.load A etc/docker/web22/config/etc/apache2/mods-available/headers.load A etc/docker/web22/config/etc/apache2/mods-available/heartbeat.load A etc/docker/web22/config/etc/apache2/mods-available/heartmonitor.load A etc/docker/web22/config/etc/apache2/mods-available/http2.load A etc/docker/web22/config/etc/apache2/mods-available/ident.load A etc/docker/web22/config/etc/apache2/mods-available/imagemap.load A etc/docker/web22/config/etc/apache2/mods-available/include.load A etc/docker/web22/config/etc/apache2/mods-available/info.conf A etc/docker/web22/config/etc/apache2/mods-available/info.load A etc/docker/web22/config/etc/apache2/mods-available/lbmethod_bybusyness.load A etc/docker/web22/config/etc/apache2/mods-available/lbmethod_byrequests.load A etc/docker/web22/config/etc/apache2/mods-available/lbmethod_bytraffic.load A etc/docker/web22/config/etc/apache2/mods-available/lbmethod_heartbeat.load A etc/docker/web22/config/etc/apache2/mods-available/ldap.conf A etc/docker/web22/config/etc/apache2/mods-available/ldap.load A etc/docker/web22/config/etc/apache2/mods-available/log_debug.load A etc/docker/web22/config/etc/apache2/mods-available/log_forensic.load A etc/docker/web22/config/etc/apache2/mods-available/lua.load A etc/docker/web22/config/etc/apache2/mods-available/macro.load A etc/docker/web22/config/etc/apache2/mods-available/mime.conf A etc/docker/web22/config/etc/apache2/mods-available/mime.load A etc/docker/web22/config/etc/apache2/mods-available/mime_magic.conf A etc/docker/web22/config/etc/apache2/mods-available/mime_magic.load A etc/docker/web22/config/etc/apache2/mods-available/mpm_event.conf A etc/docker/web22/config/etc/apache2/mods-available/mpm_event.load A etc/docker/web22/config/etc/apache2/mods-available/mpm_prefork.conf A etc/docker/web22/config/etc/apache2/mods-available/mpm_prefork.load A etc/docker/web22/config/etc/apache2/mods-available/mpm_worker.conf A etc/docker/web22/config/etc/apache2/mods-available/mpm_worker.load A etc/docker/web22/config/etc/apache2/mods-available/negotiation.conf A etc/docker/web22/config/etc/apache2/mods-available/negotiation.load A etc/docker/web22/config/etc/apache2/mods-available/perl.load A etc/docker/web22/config/etc/apache2/mods-available/proxy.conf A etc/docker/web22/config/etc/apache2/mods-available/proxy.load A etc/docker/web22/config/etc/apache2/mods-available/proxy_ajp.load A etc/docker/web22/config/etc/apache2/mods-available/proxy_balancer.conf A etc/docker/web22/config/etc/apache2/mods-available/proxy_balancer.load A etc/docker/web22/config/etc/apache2/mods-available/proxy_connect.load A etc/docker/web22/config/etc/apache2/mods-available/proxy_express.load A etc/docker/web22/config/etc/apache2/mods-available/proxy_fcgi.load A etc/docker/web22/config/etc/apache2/mods-available/proxy_fdpass.load A etc/docker/web22/config/etc/apache2/mods-available/proxy_ftp.conf A etc/docker/web22/config/etc/apache2/mods-available/proxy_ftp.load A etc/docker/web22/config/etc/apache2/mods-available/proxy_hcheck.load A etc/docker/web22/config/etc/apache2/mods-available/proxy_html.conf A etc/docker/web22/config/etc/apache2/mods-available/proxy_html.load A etc/docker/web22/config/etc/apache2/mods-available/proxy_http.load A etc/docker/web22/config/etc/apache2/mods-available/proxy_http2.load A etc/docker/web22/config/etc/apache2/mods-available/proxy_scgi.load A etc/docker/web22/config/etc/apache2/mods-available/proxy_wstunnel.load A etc/docker/web22/config/etc/apache2/mods-available/ratelimit.load A etc/docker/web22/config/etc/apache2/mods-available/reflector.load A etc/docker/web22/config/etc/apache2/mods-available/remoteip.load A etc/docker/web22/config/etc/apache2/mods-available/reqtimeout.conf A etc/docker/web22/config/etc/apache2/mods-available/reqtimeout.load A etc/docker/web22/config/etc/apache2/mods-available/request.load A etc/docker/web22/config/etc/apache2/mods-available/rewrite.load A etc/docker/web22/config/etc/apache2/mods-available/sed.load A etc/docker/web22/config/etc/apache2/mods-available/session.load A etc/docker/web22/config/etc/apache2/mods-available/session_cookie.load A etc/docker/web22/config/etc/apache2/mods-available/session_crypto.load A etc/docker/web22/config/etc/apache2/mods-available/session_dbd.load A etc/docker/web22/config/etc/apache2/mods-available/setenvif.conf A etc/docker/web22/config/etc/apache2/mods-available/setenvif.load A etc/docker/web22/config/etc/apache2/mods-available/slotmem_plain.load A etc/docker/web22/config/etc/apache2/mods-available/slotmem_shm.load A etc/docker/web22/config/etc/apache2/mods-available/socache_dbm.load A etc/docker/web22/config/etc/apache2/mods-available/socache_memcache.load A etc/docker/web22/config/etc/apache2/mods-available/socache_shmcb.load A etc/docker/web22/config/etc/apache2/mods-available/speling.load A etc/docker/web22/config/etc/apache2/mods-available/ssl.conf A etc/docker/web22/config/etc/apache2/mods-available/ssl.load A etc/docker/web22/config/etc/apache2/mods-available/status.conf A etc/docker/web22/config/etc/apache2/mods-available/status.load A etc/docker/web22/config/etc/apache2/mods-available/substitute.load A etc/docker/web22/config/etc/apache2/mods-available/suexec.load A etc/docker/web22/config/etc/apache2/mods-available/unique_id.load A etc/docker/web22/config/etc/apache2/mods-available/userdir.conf A etc/docker/web22/config/etc/apache2/mods-available/userdir.load A etc/docker/web22/config/etc/apache2/mods-available/usertrack.load A etc/docker/web22/config/etc/apache2/mods-available/vhost_alias.load A etc/docker/web22/config/etc/apache2/mods-available/xml2enc.load A etc/docker/web22/config/etc/apache2/mods-enabled/access_compat.load A etc/docker/web22/config/etc/apache2/mods-enabled/alias.conf A etc/docker/web22/config/etc/apache2/mods-enabled/alias.load A etc/docker/web22/config/etc/apache2/mods-enabled/apreq2.load A etc/docker/web22/config/etc/apache2/mods-enabled/auth_basic.load A etc/docker/web22/config/etc/apache2/mods-enabled/authn_core.load A etc/docker/web22/config/etc/apache2/mods-enabled/authn_file.load A etc/docker/web22/config/etc/apache2/mods-enabled/authz_core.load A etc/docker/web22/config/etc/apache2/mods-enabled/authz_host.load A etc/docker/web22/config/etc/apache2/mods-enabled/authz_user.load A etc/docker/web22/config/etc/apache2/mods-enabled/autoindex.conf A etc/docker/web22/config/etc/apache2/mods-enabled/autoindex.load A etc/docker/web22/config/etc/apache2/mods-enabled/deflate.conf A etc/docker/web22/config/etc/apache2/mods-enabled/deflate.load A etc/docker/web22/config/etc/apache2/mods-enabled/dir.conf A etc/docker/web22/config/etc/apache2/mods-enabled/dir.load A etc/docker/web22/config/etc/apache2/mods-enabled/env.load A etc/docker/web22/config/etc/apache2/mods-enabled/filter.load A etc/docker/web22/config/etc/apache2/mods-enabled/mime.conf A etc/docker/web22/config/etc/apache2/mods-enabled/mime.load A etc/docker/web22/config/etc/apache2/mods-enabled/mpm_prefork.conf A etc/docker/web22/config/etc/apache2/mods-enabled/mpm_prefork.load A etc/docker/web22/config/etc/apache2/mods-enabled/negotiation.conf A etc/docker/web22/config/etc/apache2/mods-enabled/negotiation.load A etc/docker/web22/config/etc/apache2/mods-enabled/perl.load A etc/docker/web22/config/etc/apache2/mods-enabled/reqtimeout.conf A etc/docker/web22/config/etc/apache2/mods-enabled/reqtimeout.load A etc/docker/web22/config/etc/apache2/mods-enabled/setenvif.conf A etc/docker/web22/config/etc/apache2/mods-enabled/setenvif.load A etc/docker/web22/config/etc/apache2/mods-enabled/status.conf A etc/docker/web22/config/etc/apache2/mods-enabled/status.load A etc/docker/web22/config/etc/apache2/ports.conf A etc/docker/web22/config/etc/apache2/sites-available/000-default.conf A etc/docker/web22/config/etc/apache2/sites-available/default-ssl.conf A etc/docker/web22/config/etc/apache2/sites-enabled/dreamwidth.conf A etc/docker/web22/config/etc/varnish/dreamwidth.vcl A etc/docker/web22/scripts/setup.sh A etc/docker/web22/scripts/startup-dev.sh A etc/docker/web22/scripts/startup-prod.sh

Log Message:


Move canary to ubuntu 22.04

This builds canary (ONLY) on the base22 image, which we use for shop, so we can start testing and make sure that Ubuntu 22.04 works with the main service.

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

"repeat" -- a C program written by KimiAI

2026-Feb-05, Thursday 09:56
miriam_e: from my drawing MoonGirl (Default)
[personal profile] miriam_e
I asked KimiAI if it could write a C program to repeat a string n times. I am a crappy C programmer. (I need to fix that shortcoming.) This program is optimised for just this task and beats all the hacks from my previous post, by a big margin.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>

int main(int argc, char *argv[]) {
    if (argc != 3) {
        fprintf(stderr, "Usage: %s <string> <count>\n", argv[0]);
        fprintf(stderr, "Example: %s \"hello world\" 5\n", argv[0]);
        return 1;
    }
    
    const char *str = argv[1];
    int n = atoi(argv[2]);
    size_t len = strlen(str);
    
    if (n <= 0) return 0;
    
    // Use write() directly with a large buffer
    size_t unit = len + 1;
    size_t total = unit * n;
    char *buf = malloc(total);
    
    for (int i = 0; i < n; i++) {
        memcpy(buf + i*unit, str, len);
        buf[i*unit + len] = (i == n-1) ? '\n' : ' ';
    }
    
    // Single syscall, no stdio overhead
    write(STDOUT_FILENO, buf, total);
    
    free(buf);
    return 0;
}
And compile with optimisations:
gcc -O3 -o repeat repeat.c

2025 Diamine Inkvent Teal - Day 21-25

2026-Feb-04, Wednesday 15:00
terriko: (Default)
[personal profile] terriko
This is crossposted from Curiousity.ca, my personal maker blog. If you want to link to this post, please use the original link since the formatting there is usually better.


At the time that I’m preparing this post (a week in advance), we’re still waiting on moving company nonsense, my internet keeps cutting out while I’m trying to do stuff, the furnace still doesn’t work, and the work training I took today got glitched somehow so I can’t finish it and I’m stuck re-listening to an hour of video. But hopefully by the time this posts, everything will be great and this frustrating day will be a distant memory. In the meantime, I have pretty inks and a nice crisp apple to eat.





A view of the "green" space by the power lines, with trees and ground covered in snow and with the sun breaking through the clouds near the horizon.
A view of the “green” space by the power lines, with trees and ground covered in snow and with the sun breaking through the clouds near the horizon.





Let’s talk inks:





A set of 5 ink swatches from the last of the Diamine Inkvent Teal calendar.  Day 21: Chaos, deep burgundy with grene sheen.  Day 22: Pineapple Spritz, two-toned yellow with yellow sparkles.  Day 21: Let It Snow, bright light blue with blue shimmer.  Day 24: Antler, light brown with a bit of a pink tone.  Day 25: Myrrh the Merrier, rich medium blue with blue shimmer and red sheen.
A set of 5 ink swatches from the last of the Diamine Inkvent Teal calendar. Day 21: Chaos, deep burgundy with grene sheen. Day 22: Pineapple Spritz, two-toned yellow with yellow sparkles. Day 21: Let It Snow, bright light blue with blue shimmer. Day 24: Antler, light brown with a bit of a pink tone. Day 25: Myrrh the Merrier, rich medium blue with blue shimmer and red sheen.





Showing 5 samples to finish out the calendar!





An ink swatch of Diamine Chaos, a dark burgundy ink with green sheen (although it looks more red and less purple in this image)
An ink swatch of Diamine Chaos, a dark burgundy ink with green sheen (although it looks more red and less purple in this image)





Day 21: Chaos. Deep burgundy with green sheen. I think this ink is considerably more attractive than last year’s Sleigh Ride, so it might actually get used. Not in love with it, though.





A swatch of Diamine Pineapple Spritz showing the yellow shimmer in the yellow ink.  It isn't very legible, though.
A swatch of Diamine Pineapple Spritz showing the yellow shimmer in the yellow ink. It isn’t very legible, though.





Day 22: Pineapple Spritz. Yellow with yellow iridescent sparkle. This ink is very pretty but only barely legible in my journal even with a dip pen so it may get relegated to decorative status because I doubt it’s going to be better in a regular pen. It’s really pretty with all that shimmer so I’ve got some hope that it might be fun for painting or filling in tracking squares or something.





A swatch of Diamine Let it Snow fountain pen ink.  It's bright blue with blue shimmer.
A swatch of Diamine Let it Snow fountain pen ink. It’s bright blue with blue shimmer.





Day 23: Let It Snow. Bright blue with blue iridescent shimmer. Absolutely the kind of fancy holiday ink that I wanted out of this calendar. Love it. Describing it makes it sound similar to Brrr! but it’s not a pigment ink so it should be a bit less of a hassle in a pen. And it is a very different bright blue instead of the more moody Brrr! blue.





Day 24: Antler. Light brown. Fairly similar to Smoky Tobacco from day 4 but with less yellow and more of a pink feel to the brown. Also, it doesn’t stink. Basically better in every way than Smoky Tobacco thanks to the lack of scent. I’ll use this one and possibly never open Smoky Tobacco again.





A swatch of Diamine Myrrh the Merrier fountain pen ink, a jewel toned blue with blue sparkle and red sheen.
A swatch of Diamine Myrrh the Merrier fountain pen ink, a jewel toned blue with blue sparkle and red sheen.





Day 25: Myrrh the Merrier. Blue with red sheen and blue sparkles. This is the 30ml bottle and it’s completely over the top holiday ink. I expected something more green-leaning for Inkvent Teal and this really reads as blue to me especially with the blue shimmer, so I would have swapped this with day 1’s Celestial Skies if I were Diamine. But it’s a really lovely ink and I’m excited to use it.





 





Overall: I had fun with this year’s calendar despite how busy my December was! Most of these inks are good additions to my collection: I’m glad to try some pigment inks, I’m excited about a lot of the colours, and there were only a few disappointments. If I’m honest with myself about what inks I reach for most, I’ve got to admit that I don’t really need more shimmer or sheening inks so maybe I shouldn’t get an inkvent calendar next year. If I’m talking purely about inks I use most, I should focus on getting a few more “standard” inks. But if I treat it as an experience, it’s definitely been fun! It expanded my ink collection in a few ways I might not have done otherwise: I was curious about pigment inks but hadn’t worked up the nerve to buy any and now they’re right there — I’m especially excited to try them in art. Some of this year’s colours wouldn’t have been on my radar if I was shopping but they’re going to work so well in my monthly palettes. So I’m absolutely not sad to have done it again this year, and I’m excited to play with these more in 2026!





 

miriam_e: from my drawing MoonGirl (Default)
[personal profile] miriam_e
This was an interesting diversion today. I needed a way to construct a long string from a smaller one repeated many times, so I tried a few ways of my own devising and found many more on the net. There were some surprising ways to do this, but the really big surprises came when I decided to time them so as to work out which is the fastest. The winner is yes. That really surprised me. (Another big surprise was perl -- it ties for fastest.) The next two fastest are sed -E (extended regex) and plain sed.

NOTE: The time values I give below are the times to make a string repeating "test" 100,000 times, and I've added the times when sent to /dev/null instead of printing the string to the terminal.

EDIT: I have a late addition that uses perl. It surprisingly runs as fast as the yes/head/tr pipeline. I've added it at the bottom.

EDIT 2: I've found a way to use awk without the overhead of looping. It is much faster. I've added it to the other awk versions. I also asked KimiAI to help me write a C program to do the simple job of repeating a string n times. It absolutely blows all the others away, making it the fastest of all. I've added it at the bottom.

Here is my list of solutions:

yes is a command that endlessly prints out a string
yes "test" | head -n 100000 | tr "\n" " " ; echo
0.044 seconds
0.018 seconds (sent to /dev/null)

A tricky way to use printf
printf 'test %.0s' {1..100000} ; echo
0.190 seconds
0.164 seconds (sent to /dev/null)

printf to a variable
printf -v testvar 'test %.0s' {1..100000}
0.169 seconds
0.165 seconds (sent to /dev/null)

A slightly different way to printf to a variable
printf -v testvar '%s ' test$_{1..100000}
0.194 seconds
0. seconds (sent to /dev/null)

An echo {} hack.
It requires that $nothing1 $nothing2 $nothing3 ... be non-existent variables.
echo test$nothing{1..100000}
0.208 seconds
0.196 seconds (sent to /dev/null)

simple {} sequence loop
for i in {1..100000} ; do echo -n "test " ; done ; echo
1.482 seconds
2.890 seconds (sent to /dev/null) Slower!!!

two simple seq loops
for i in $(seq 100000) ; do echo -n "test " ; done ; echo
1.617 seconds
2.852 seconds (sent to /dev/null) Slower!!!
for i in `seq 100000` ; do echo -n "test " ; done ; echo
1.367 seconds
2.850 seconds (sent to /dev/null) Slower!!!

simple c-style loop
n=100000 ; for (( c=1; c<=n; c++)) ; do echo -n "test " ; done ; echo
2.130 seconds
3.205 seconds (sent to /dev/null) Slower!!!

a weird one
This is impractical to use for large numbers of repeats.
echo 'test'{,,,,,,,,,}


awk and seq
seq 100000 | awk '{printf "test "}'; echo
0.769 seconds
0.055 seconds (sent to /dev/null)

awk for loop
awk 'BEGIN{for (n=0; n<100000; n++) printf "test "; print ""}'
0.880 seconds
0.045 seconds (sent to /dev/null)

awk while loop
awk -v n="100000" -v s="test " 'BEGIN { while (i++ < n) printf s}'
0.580 seconds
0.040 seconds (sent to /dev/null) Big difference!

awk (non-looping)
awk 'BEGIN {OFS="test "; NF=10000+1; print}'
0.055 seconds
0.030 seconds (sent to /dev/null)

sed and seq
seq 100000 | sed -E 's/.+/test/' | tr '\n' ' ' ; echo
0.089 seconds
0.079 seconds (sent to /dev/null)

or
seq 100000 | sed 's/.*/test/' | tr '\n' ' ' ; echo
0.096 seconds
0.089 seconds (sent to /dev/null)

or
seq 100000 | sed -z 's/[^\n]*\n/test/g' ; echo
0.173 seconds
0.154 seconds (sent to /dev/null)

sed and /dev/zero
head -c 100000 < /dev/zero | sed 's/\x0/test /g'; echo
0.058 seconds
0.035 seconds (sent to /dev/null)

perl
perl -e 'print "test " x 100000; print "\n"'
0.038 seconds
0.011 seconds (sent to /dev/null)

repeat (C program written by Kimi AI)
repeat "test" 100000
0.032 seconds
0.006 seconds (sent to /dev/null) Wow!!!
github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 30ad62a36b99f0c922fe1790a40d9547d254a77c https://github.com/dreamwidth/dreamwidth/commit/30ad62a36b99f0c922fe1790a40d9547d254a77c Author: Mark Smith mark@dreamwidth.org Date: 2026-02-03 (Tue, 03 Feb 2026)

Changed paths: A .github/workflows/tasks/worker-send-email-ses-service.json R .github/workflows/tasks/worker-service.tt R .github/workflows/update-workflows.pl R .github/workflows/worker-deploy.tt M .github/workflows/worker-deploy.yml M .gitignore A bin/ecs-shell A config/update-workflows.py A config/workers.json A terraform/cluster.tf A terraform/iam.tf A terraform/load-balancing.tf A terraform/locals.tf A terraform/providers.tf A terraform/proxy.tf A terraform/security-groups.tf A terraform/web.tf A terraform/workers.tf

Log Message:


Add Terraform for ECS infrastructure with single source of truth for workers

  • Add terraform/ directory managing ECS cluster, services, task definitions, load balancers, security groups, and IAM roles
  • Create config/workers.json as single source of truth for worker definitions, shared by Terraform (via jsondecode) and GitHub Actions workflow generator
  • Replace Perl Template Toolkit workflow generator with pure Python script (config/update-workflows.py) - no external dependencies needed
  • Add bin/ecs-shell helper script for listing services and connecting to tasks
  • Add send-email-ses worker that was missing from workflow definitions
  • Update .gitignore to exclude Terraform state files and lock file

The workers.json file defines all worker properties (cpu, memory, category, spot, min/max counts) in one place. To add a new worker: 1. Add entry to config/workers.json 2. Run: terraform apply 3. Run: python3 config/update-workflows.py

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

mark: A photo of Mark kneeling on top of the Taal Volcano in the Philippines. It was a long hike. (Default)
[staff profile] mark posting in [site community profile] dw_maintenance

Hi all!

I'm doing some minor operational work tonight. It should be transparent, but there's always a chance that something goes wrong. The main thing I'm touching is testing a replacement for Apache2 (our web server software) in one area of the site.

Thank you!

terriko: (Default)
[personal profile] terriko
This is crossposted from Curiousity.ca, my personal maker blog. If you want to link to this post, please use the original link since the formatting there is usually better.


As of this writing (happening on Monday), I’ve gotten the paperwork done at customs and in theory we get the rest of our stuff tomorrow. We left Oregon on December 29th and had theoretically paid for the truck to get packed and our stuff delivered ASAP, and instead this is more like the time I moved the other way where, among other chaos, my work visa claimed that I was an 11 year old with a PhD and understandably that wasn’t going to fly at the border but without a valid work visa I couldn’t do import paperwork. Le sigh. So now we have a move that has been both extremely expensive, slow, and caused huge amounts of stress and labour that we didn’t expect. But it’s nearly done so I guess that’s something? I’m excited to finally set up my office maybe later this week, though!





 





Stickers and Inks and fountain pens for Febrary 2025. They are described in more detail in the text of the post.

Stickers



  • dinos with shiny hearts (stickii, no artist listed)

  • doggies with sweaters (stickii, no artist listed)

  • valentines objects (Neko Mori Arts via stickii)

  • Katrinkles (from an advent calendar)


Using up some unfinished valentines sheets from last year!


Fountain Pens and Inks



  • Pilot E95S <m> – Diamine Blush (Inkvent 2025)

  • Kaweco Liliput <b> – Van Dieman’s Underflow

  • Pelikan Pura <b> – Diamine Ruby Taffeta (Inkvent 2025)

  • Pelikan Pina Colada <m> – Diamine Celestial Skies (Inkvent 2025)


Leaning into the new inks for this month: three from the Inkvent calendar I just opened and one new ink from Fountain Pen Day (November 2025).  Celestial Skies is continuing from last month.


Commuter Stationary


My "Commuter Notebook" setup with two foutain pens, described in more detail in the post.



  • TWSBI Eco T <m> – Organics Studio Nitrogen

  • Pilot Kakuno <m> – Robert Oster Rose Gold Antiqua

  • Lochby TN-sized dot grid refill

  • Traveler’s Notebook zipper pouch (used as a cover)


The new part of this is the Kakuno — I was finding that I really missed swapping in colours day to day to make it really obvious where yesterdays’ stuff started.  I’d bought the Kakuno to be my purse pen (cheap, light, easy to write with) but it hasn’t gotten used in a while because I was rotating other pens in and out.  I’m not sure I’m going to love Rose Gold Antiqua in this pen (I’ve had trouble with it clogging in other pens) but I’ll give it a shot since I’m trying to use up some samples and it is a pretty ink when it works. 


The Eco has been working beautifully, and I love Nitrogen’s shine on the Lochby paper.  The notebook itself has worked out nicely for commuting — I mostly write with it at work and it’s a mix of work notes, todo lists for home, journal-style entries, and creative writing.  I may eventually get a second TN-sized refill to be just a work notebook, but for now the everything notebook format is working well.  It’s a little bit less weight, I can get by with the zip case as cover, and I’ll use up the refill faster this way.


In the same vein: the plan is to write these pens dry unless I run into clogging problems, so you likely won’t see these next month!


And In Unrelated News…


I finally went and found a plugin that replaces WordPress’s Block Mode editor.  I’ve never been a huge fan, but lately it’s been… hanging?  Not switching blocks?  Whatever is happening, it’s actually been getting in the way of writing a lot lately.  So far this is the first thing I’ve written with the new old-style editor and it’s really helped.

A Return to Scholarship

2026-Feb-02, Monday 18:58
tcpip: (Default)
[personal profile] tcpip
Walter Benjamin, with his usual brilliance, observed, "Scholarship, far from leading inexorably to a profession, may in fact preclude it. For it does not permit you to abandon it." The first part suggests that a scholar never ceases learning and, as a result, does not settle into a single profession. The second part indicates the difference between a student (who does lead to a profession) and a scholar (for whom learning is a lifetime, evolving, and intrinsic behaviour). Well, after over a month of international travel and then followed by a few excellent celebratory gatherings, it is well about time that I return to the matter of scholarship. In these parts of my life, there are three current vectors.

The first is my doctoral studies at the University of Euclid. This week I have have completed the first part of a course on "Global Energy and Climate Policy", which is shared between the University of London and with the major project with Euclid University. The content was quite good, looking at the necessity of moving away from GHG energy sources, alternative energy sources (including nuclear), the Paris Agreement itself, and energy security and sovereignty. For the major paper, I'll be looking at "Optimal Energy Choices for Pacific Island Nations Under the Paris Agreement". I am especially interested in looking at the expected climate changes, the likely demographic changes, technology options, and the application of NDCs of other countries.

In addition, in a completely different vector, I have taken up studies for a Cert IV in Teaching English as a Foreign Language (TEFL). Now, this may seem a bit strange for someone who already has a Master's degree in Higher Education, but in my profession, my teaching is normally more than 50% of students from non-English-speaking backgrounds. It is extremely helpful for me to modify my presentation so it is more easily understood, even when the technical content is quite advanced. The course itself, through the Sydney Higher Education Institute, is thankfully very attentive to not just language learning, but also cultural differences. Whilst the course is designed to be taken over a year, because it's self-paced I'm hoping to get it done in a few months.

The third part is quite out of leftfield. About fifteen years ago, I ran a lengthy RuneQuest Prax campaign. As I often do, I kept extensive notes and even constructed a series of letters from one of the characters, Praxilites, as he developed from a young initiate of the sun god to reaching apotheosis. How is such fantasy storytelling scholarly? Well, apart from delving deeply into what can only be described as the deeply mythological metaphysics of Glorantha, our main character's story is very much in the style of Marcus Aurelius' "Meditations", a subject that I have written about in the past. Of course, it will not be just Marcus whom I'll be drawing from, but also Diogenes, Zeno, Seneca, Epictetus and even a dash of Laozi. Anyway, with more than 35000 words already written, it is proving to be quite a joy to delve down a path of scholarship that is also entertaining.
github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: e2b3b0b6ee48b93944c0ae60508a57f9df2be34d https://github.com/dreamwidth/dreamwidth/commit/e2b3b0b6ee48b93944c0ae60508a57f9df2be34d Author: Mark Smith mark@dreamwidth.org Date: 2026-02-01 (Sun, 01 Feb 2026)

Changed paths: M app.psgi A cgi-bin/DW/Controller/PalImg.pm A cgi-bin/DW/Controller/VGift.pm A cgi-bin/Plack/Middleware/DW/SecurityHeaders.pm M cgi-bin/Plack/Middleware/DW/SubdomainFunction.pm A t/plack-media.t M t/plack-subdomain.t

Log Message:


Close high-priority Plack gaps: security headers, media controllers, journal subdomains

Add SecurityHeaders middleware (X-Content-Type-Options, HSTS), extract userpic/vgift/palimg serving into DW::Controller modules, add journal subdomain routing and RPC URI handling to app.psgi, and expand subdomain middleware to cover all SUBDOMAIN_FUNCTION types. Includes 48 new/updated integration tests.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: d9d5d5787dec9abc065bafbdd67b6809ae059928 https://github.com/dreamwidth/dreamwidth/commit/d9d5d5787dec9abc065bafbdd67b6809ae059928 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-01 (Sun, 01 Feb 2026)

Changed paths: M app.psgi A cgi-bin/Plack/Middleware/DW/SubdomainFunction.pm A t/plack-subdomain.t

Log Message:


Add subdomain function middleware for Plack

Plack had no equivalent of the Apache::LiveJournal::trans subdomain routing logic, so requests to shop.dreamwidth.org/randomgift would 404 instead of redirecting to www.dreamwidth.org/shop/randomgift.

New middleware handles functional subdomains (shop, support, mobile) by checking %LJ::SUBDOMAIN_FUNCTION and redirecting or rewriting the URI, matching Apache behavior.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: df35b32bd905c67321964aee138d2ddecf5ee559 https://github.com/dreamwidth/dreamwidth/commit/df35b32bd905c67321964aee138d2ddecf5ee559 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-01 (Sun, 01 Feb 2026)

Changed paths: M bin/starman

Log Message:


Add extlib to [personal profile] inc in bin/starman for production use

Production containers don't set PERL5LIB, so Plack::Runner wasn't found. Add use lib to include extlib before loading Plack modules.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 1dba291b136e2650d4770ccb59b89588e09ffdc4 https://github.com/dreamwidth/dreamwidth/commit/1dba291b136e2650d4770ccb59b89588e09ffdc4 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-01 (Sun, 01 Feb 2026)

Changed paths: M .github/workflows/tasks/web-shop-service.json M bin/starman M etc/docker/shop/Dockerfile M etc/docker/shop/scripts/startup-prod.sh

Log Message:


Add Starman to production web-shop container

Run Starman alongside Apache+Varnish in the shop container on port 8080, exposed directly without Varnish. The load balancer can route traffic to either 6081 (Varnish→Apache) or 8080 (Starman) for gradual migration.

Remove hardcoded LJ_IS_DEV_SERVER from bin/starman so it no longer forces dev mode in production — the devcontainer sets this via containerEnv.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: dbe48689a185806364203cdd1757692b54141ec0 https://github.com/dreamwidth/dreamwidth/commit/dbe48689a185806364203cdd1757692b54141ec0 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-01 (Sun, 01 Feb 2026)

Changed paths: M cgi-bin/modperl_subs.pl

Log Message:


Fix Apache2::Connection XS bootstrap for client_ip method

The Plack merge removed use Apache2::Const qw/ :common / from LJ/S2.pm, which had been bootstrapping Apache2::Connection XS methods as a side effect. Without it, $conn->client_ip fails at runtime. Explicitly load Apache2::Connection in modperl_subs.pl.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 22120106eb6013b4857e3d8f233d0b34dfaad9bd https://github.com/dreamwidth/dreamwidth/commit/22120106eb6013b4857e3d8f233d0b34dfaad9bd Author: Mark Smith mark@dreamwidth.org Date: 2026-02-01 (Sun, 01 Feb 2026)

Changed paths: M .devcontainer/config/etc/apache2/ports.conf M .devcontainer/devcontainer.json A .devcontainer/plack/Dockerfile A .devcontainer/plack/devcontainer.json A .devcontainer/setup.sh M .devcontainer/start.sh M .gitignore R Build.PL M CLAUDE.md A app.psgi M bin/checkconfig.pl A bin/starman M cgi-bin/Apache/BML.pm M cgi-bin/Apache/LiveJournal.pm M cgi-bin/DBI/Role.pm A cgi-bin/DW/BML.pm M cgi-bin/DW/Controller/Create.pm A cgi-bin/DW/Controller/Journal.pm M cgi-bin/DW/Controller/Login.pm A cgi-bin/DW/Controller/Userpic.pm M cgi-bin/DW/Request.pm M cgi-bin/DW/Request/Apache2.pm M cgi-bin/DW/Request/Base.pm A cgi-bin/DW/Request/Plack.pm M cgi-bin/DW/Request/Standard.pm M cgi-bin/DW/Widget/AccountStatistics.pm M cgi-bin/LJ/Global/Defaults.pm M cgi-bin/LJ/S2.pm M cgi-bin/LJ/User/Account.pm M cgi-bin/LJ/Web.pm A cgi-bin/Plack/Middleware/DW/Auth.pm A cgi-bin/Plack/Middleware/DW/ConcatRes.pm A cgi-bin/Plack/Middleware/DW/Dev.pm A cgi-bin/Plack/Middleware/DW/Redirects.pm A cgi-bin/Plack/Middleware/DW/RequestWrapper.pm A cgi-bin/Plack/Middleware/DW/Sysban.pm A cgi-bin/Plack/Middleware/DW/UniqCookie.pm A cgi-bin/Plack/Middleware/DW/XForwardedFor.pm M cgi-bin/ljlib.pl M cgi-bin/modperl_subs.pl A doc/PLACK.md M doc/dependencies-cpanm M doc/dependencies-system M src/s2/S2.pm A t/plack-app.t A t/plack-auth.t A t/plack-bml.t A t/plack-controller.t A t/plack-integration.t A t/plack-middleware.t A t/plack-static.t A t/plack-sysban.t M views/login.tt

Log Message:


Plack/Starman Support (#3512)

  • Add missing use LJ::Memories in AccountStatistics widget

The widget calls LJ::Memories::count() but relied on modperl_subs.pl to load the module at startup rather than declaring its own dependency.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Use path-based journal URLs in dev container

Override $SUBDOMAIN_RULES for dev containers to use path-based format (/~username) instead of subdomain-based format (username.domain). Fix journal_base() to construct URLs from the request host when the rule has an empty domain.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Plack testing with devcontainer

  • Fix Plack request lifecycle and integration tests

DW::Request->get now always creates a fresh request when plack_env is provided, fixing the issue where LJ::start_request's internal reset/get cycle would leave DW::Request in a stale state. Also fixes DW::Request::Plack->status to work as a getter, adds a default 404 for unmatched routes in app.psgi, and rewrites the integration test to properly monkey-patch after module loading. Includes tidyall formatting.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Plack: render Login controller through full stack, remove dead Procnotify call

Add missing methods to DW::Request::Plack (pnote, note, content, content_type getter/setter, no_cache, get_remote_ip) so controllers can render through the Plack stack. Route all requests through DW::Routing in app.psgi instead of only /api/ paths, and use the routing return value to set HTTP 200 status for handled requests.

Remove the dead LJ::Procnotify::check() call from RequestWrapper middleware — the module was deleted but the call was left behind.

New test t/plack-controller.t validates GET /login renders through the real routing + controller + template pipeline via Plack::Test.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Add UniqCookie middleware and fix is_web_context for Plack

Add Plack::Middleware::DW::UniqCookie that calls LJ::UniqCookie->ensure_cookie_value to generate and set the unique tracking cookie on every request, matching Apache behavior.

This required two supporting changes:

  • LJ::is_web_context() now returns true when a DW::Request is active, not just under mod_perl. Many modules gate web-only behavior on this check, so Plack requests were silently skipping cookie, auth, and other web-context logic.

  • DW::Request::Plack now implements err_header_out, header_out_add, and err_header_out_add so that add_cookie (which appends Set-Cookie headers) works correctly.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Add static content serving middleware for Plack

Add DW::ConcatRes middleware to handle concatenated CSS/JS requests (??file1.css,file2.css URLs), ported from Apache::LiveJournal. Wire in Plack::Middleware::Static for plain static files from $LJ::HTDOCS, matching Apache's DocumentRoot behavior.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Implement redirect.dat support in Plack redirects middleware

Load redirect.dat and redirect-local.dat at startup and return 301 for matching paths, preserving query strings. Matches the existing Apache behavior in Apache::LiveJournal::trans().

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Add Sysban middleware for Plack and clean up app.psgi TODOs

Port sysban blocking from Apache::LiveJournal::trans() to a Plack middleware: IP bans, uniq cookie bans, tempbans, and noanon_ip bans for anonymous users. Also remove stale TODOs from app.psgi (srand preforking is a non-issue in modern Perl, BML language setup is irrelevant to Plack but noted in RequestWrapper for future BML port).

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Implement Auth middleware for Plack

Resolve authenticated user from session cookies via LJ::Session->session_from_cookies() and set the remote user for the request. Bypasses LJ::get_remote() directly since it depends on BML::get_request(), but subsequent get_remote() calls hit the cache. Supports dev server ?as=username impersonation.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Route embed module domain requests to embedcontent handler

When the request host matches $LJ::EMBED_MODULE_DOMAIN, force routing to /journal/embedcontent regardless of path, matching the Apache trans() behavior. Removes the last placeholder comment from app.psgi.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Implement BML rendering under Plack via DW::BML

Add DW::BML module that renders .bml pages using DW::Request instead of Apache APIs, allowing BML pages to work under Plack. The module reuses the core BML engine (bml_decode, bml_block, config loading, scheme/look system) from Apache::BML and only replaces the handler and request adapter layers.

Includes a RequestAdapter that makes DW::Request look like an Apache request object for BML's public API functions (BML::get_request(), etc.), BML fallback routing in app.psgi after DW::Routing, and tests.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Add homepage integration tests verifying tropo-red site scheme

Tests that GET /index returns 200, renders with the tropo-red body class, includes tropo-red.css, and has text/html content type. Restructured integration tests so real-routing tests run before the monkey-patch.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Add Starman dependency and dev server startup script

Add Starman to dependencies-cpanm and create bin/dev-plack-server for running Dreamwidth under Plack/Starman with a single worker in dev mode. Listens on 0.0.0.0:8080 by default, configurable via --port and --host.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Fix static file serving to search all htdocs directories

Static middleware now iterates over LJ::get_all_directories('htdocs') so files from extensions (e.g. dw-nonfree) are served alongside base htdocs. Uses pass_through so each layer falls through to the next when a file isn't found in that directory.

Fixes 404s for nonfree static assets like /img/tropo-red/dw_logo.png.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Provide BML package functions for Plack and initialize language getter

DW::BML now defines all BML::* package functions (ml, set_language, ehtml, get_request, cookies, etc.) and Apache::BML::* stubs at load time so they're available in any Plack web context. Previously these were only defined by Apache::BML which can't be loaded without Apache2::* modules.

RequestWrapper now calls BML::set_language with LJ::Lang::get_text on every request so translation strings resolve correctly for all pages.

Also fixes infinite recursion in the request adapter's overloaded hash classes by using array-based objects to avoid re-triggering %{} overload.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Fix login error display, URL doubling, and BML scope bridging

  • Display login errors in login.tt using Foundation alert-box pattern

  • Set ml_scope early in Login controller so LJ::Lang::ml resolves relative string codes before template rendering
  • Bridge BML and TT scope mechanisms: BML::ml falls back to $r->note('ml_scope') when $BML::ML_SCOPE is empty
  • Fix DW::Request::Plack::uri to return path only (matching Apache behavior) instead of full URL, which caused doubled URLs in every LJ::create_url call

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Fix cookie domain issues for dev container under Plack

The Redirects middleware used local $LJ::DOMAIN_WEB = "www.$LJ::DOMAIN" which leaked "www." into downstream cookie-setting code when $DOMAIN is empty (dev container). Changed to a lexical variable scoped to the redirect checks only.

Also set $COOKIE_DOMAIN to empty string in dev container defaults to prevent it defaulting to "." (just a dot), which browsers reject.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Update CLAUDE.md with Plack dev server and workflow notes

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Preserve cookies on Plack redirects and handle controller redirect responses

DW::Request::Plack::redirect was creating a new Plack::Response, discarding any cookies/headers already set on the request (e.g. login session cookies). Now builds the redirect from the existing response object. Also handle controller redirect responses (arrayrefs) in app.psgi dispatch.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Load real Apache::BML engine under Plack, fix BML strings and dev server usability

  • Load Apache::BML by stubbing Apache2/APR modules so the BML engine functions (bml_decode, load_conffile, parsein, etc.) are available under Plack without duplicating them. Fake Apache2::Const provides the constants Apache::BML needs.

  • Remove no-op stubs for BML::register_hook, set_config, register_language, etc. that were preventing BML config files (like BMLInit.pm) from registering the ml_getter hook. This fixes missing translation strings on BML pages.

  • Keep .bml in the language scope so LJ::Lang::get_text can match scope to .bml.text files, fixing [missing string] on BML pages.

  • Fix undef warnings in BML::decide_language.

  • Fix check_referer for dev servers with empty $LJ::DOMAIN by comparing referer host against the request Host header.

  • Auto-validate email on account creation in dev servers so new accounts can post immediately without email confirmation.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Fix grants

This supports both localhost (domain socket) and 127.0.0.1 (TCP socket) connections, which get triggered depending on how you access the database.

  • Fix missing standard CSS/JS resources and LJ::Memories under Plack

Under Plack, start_request called DW::Request->reset before the request was created, so the resource registration block (lj_base.css, esn.css, jquery UI, etc.) was skipped. Extract registration into LJ::register_standard_resources() and call it from the Plack middleware after the DW::Request is created.

Also add explicit use LJ::Memories in AccountStatistics widget, which was previously only loaded via modperl_subs.pl.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Add DW::Controller::Userpic to serve userpics via DW::Routing

Replaces the Apache::LiveJournal userpic_trans/userpic_content handlers with a proper controller that works under both Plack and mod_perl.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Add DW::Controller::Journal for journal rendering under Plack

Extract journal viewing pipeline from Apache::LiveJournal into a shared DW::Controller::Journal module. Journals are now accessible under Plack via path-based URLs (/~username/ and /users/username/).

  • Create DW::Controller::Journal with determine_view() and render() methods
  • Add journal path-based routing in app.psgi before BML fallback
  • Override $SUBDOMAIN_RULES for dev container to use path-based URLs
  • Fix LJ::User::journal_base to construct /~user URLs in dev container
  • Add OK/NOT_FOUND/DECLINED/status_line stubs to DW::BML::RequestAdapter
  • Load Apache2::Response in modperl_subs.pl for headers_out in trans phase
  • Fix S2 check_depth undef warnings by guarding before hash interpolation

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Load DW::Request::Apache2 at startup to bootstrap mod_perl XS methods

DW::Request no longer loads DW::Request::Apache2 at compile time (to support Plack), so Apache2::RequestRec XS methods like headers_out were never bootstrapped. Load DW::Request::Apache2 explicitly in modperl_subs.pl so all Apache2 XS methods are available during the PerlInitHandler/PerlTransHandler phases.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Fix redirect loop for path-based journal URLs under Apache

When SUBDOMAIN_RULES uses path-based URLs in the dev container, journal_base returns http://host/~user which matches the incoming /~user/ path, causing an infinite redirect. Detect this case and dispatch directly via $determine_view instead of redirecting.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Fix S2 stylesheet loading and warnings under Plack path-based URLs

The HTMLCleaner was stripping S2 stylesheet tags because valid_stylesheet_url didn't recognize /~user/res/N/stylesheet paths. Also adds set_last_modified/meets_conditions to DW::Request::Plack and fixes various uninitialized value warnings in the journal controller.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Update web runner name

Default to 3 workers and call it Starman! Because it is!

  • Fix shop links in dev container by setting SHOPROOT to /shop

When SHOPROOT was empty string, links like "$SHOPROOT/account" lost their /shop prefix and resolved to just /account, which doesn't route to the shop controllers.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Fix Auth middleware to always mark auth resolution and add safety docs

Always call set_remote(undef) when no authenticated user is found, so LJ::get_remote() won't re-enter session resolution via Login.pm (which crashes on null owner). Add safety comments to LJ_IS_DEV_SERVER env var and ?as= impersonation block. Fix plack-auth.t mocks to properly isolate test state.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Update Plack docs, fix CLAUDE.md startup command, remove Build.PL

Rewrite doc/PLACK.md to reflect current implementation: full middleware stack, routing pipeline, test suite, and security notes. Update CLAUDE.md to reference doc/PLACK.md and fix bin/starman command. Remove unused Build.PL.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Switch devcontainer to Starman on port 80, Apache available on 8081

Starman is now the primary web server in the devcontainer. Apache config is kept on port 8081 but not started by default (run apache2ctl start manually if needed). Added --log option to bin/starman for access and error logs. Removed spammy debug logging from app.psgi.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Add libgd-dev

Need this to build GD... sometimes? Docker caching memes.

  • Split devcontainer into setup.sh (one-time) and start.sh (every restart)

postCreateCommand runs setup.sh for DB init, schema loading, and static compilation. postStartCommand runs start.sh for mysql, memcached, and Starman on every container start. Added --daemonize flag to bin/starman so the process survives the parent shell exiting.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

  • Remove macos/brew

This was a brief experiment, but no longer needed now that devcontainer is working!

  • Extraneous, was part of a spurious misfire

  • Revert unnecessary changes to Utils.pm, Auth.pm; remove DBIx::Class dep

Revert LJ::Utils namespace refactor and LJ::Auth irand import — both were interim experiments that aren't needed. Remove unused DBIx::Class from dependencies-cpanm.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: c6da53efa6c8618b11c94c79599446465d48639c https://github.com/dreamwidth/dreamwidth/commit/c6da53efa6c8618b11c94c79599446465d48639c Author: Mark Smith mark@dreamwidth.org Date: 2026-02-01 (Sun, 01 Feb 2026)

Changed paths: M .github/workflows/update-workflows.pl M bin/upgrading/update-db.pl M cgi-bin/DW/Controller/Login.pm

Log Message:


Tidy, ignore.

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: e9d9de85043730ef93413465a3fbba4417b4015b https://github.com/dreamwidth/dreamwidth/commit/e9d9de85043730ef93413465a3fbba4417b4015b Author: Mark Smith mark@dreamwidth.org Date: 2026-02-01 (Sun, 01 Feb 2026)

Changed paths: M cgi-bin/DW/Controller/Create.pm

Log Message:


Update Create controller to use current translation string keys

The gender and error strings referenced legacy BML keys (/manage/profile/index.bml.) that no longer exist. Updated to use the equivalent keys from the Template Toolkit text file (/manage/profile.tt.).

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 3c2bcb44eabfdcf8893173f5ca57076915b391d2 https://github.com/dreamwidth/dreamwidth/commit/3c2bcb44eabfdcf8893173f5ca57076915b391d2 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-01 (Sun, 01 Feb 2026)

Changed paths: M .devcontainer/Dockerfile M doc/dependencies-cpanm M etc/docker/base/Dockerfile M etc/docker/base22/Dockerfile M etc/docker/dev/Dockerfile

Log Message:


Unpin CGI and use metadb resolver for CPAN dependency fetching

CGI was pinned at 4.50 (for SameSite cookie support) but that version is no longer reliably available on CPAN mirrors. All later versions include SameSite support, so the pin is unnecessary. Also remove redundant CGI::Cookie entry since it's part of the CGI distribution.

Switch cpm to --resolver metadb to resolve download failures from default CPAN mirrors (backpan.perl.org, www.cpan.org).

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 6519898408b5ed5106023a78af12de3ab3d0b334 https://github.com/dreamwidth/dreamwidth/commit/6519898408b5ed5106023a78af12de3ab3d0b334 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-01 (Sun, 01 Feb 2026)

Changed paths: M bin/upgrading/update-db-general.pl M bin/upgrading/update-db.pl

Log Message:


Fix update-db.pl to not require running twice on fresh databases

Re-check for dbnotes table after table creation so alters can run in the same pass. Also fix MySQL 8.0+ compatibility in acctcode timegenerate column_type check, which dropped integer display widths causing the alter to run repeatedly.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: d4ab52f8e778d18367e5630e6d9f7ab8e31513e1 https://github.com/dreamwidth/dreamwidth/commit/d4ab52f8e778d18367e5630e6d9f7ab8e31513e1 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-01 (Sun, 01 Feb 2026)

Changed paths: M cgi-bin/DW/Controller/Login.pm M cgi-bin/DW/Request/Base.pm

Log Message:


Fix uninitialized value warnings in login controller and cookie handling

Guard against undef post values when comparing expire/bindip checkbox fields that may not be present in the form submission. Also guard against undef domain in add_cookie's dot-domain check.

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

[community profile] fandomocweekly and [community profile] fanmix_monthly

2026-Feb-01, Sunday 16:20
matsushima: won't you swing down low? (cherry blossoms)
[personal profile] matsushima posting in [site community profile] dw_community_promo

[community profile] fandomocweekly is a low commitment challenge community for sharing your fandom-based original characters. Every week, there is a gen prompt and a relationship prompt. You can post fills in any format/medium (fic, icons, art, etc.). OC x canon, yume, self-shipping, Mary Sues, etc. all welcome! ✨ This week's prompts are ideal & consideration.


Despite the name, [community profile] fanmix_monthly is not only for fanmixes and the monthly prompts are optional. You're invited to share any mixtapes you've made any time! This month's theme is relationships.
github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 8f455b757a8b81e68e696b54c0c33d61b8cf5b35 https://github.com/dreamwidth/dreamwidth/commit/8f455b757a8b81e68e696b54c0c33d61b8cf5b35 Author: Mark Smith mark@dreamwidth.org Date: 2026-01-31 (Sat, 31 Jan 2026)

Changed paths: M cgi-bin/DW/Controller/Login.pm

Log Message:


Move POST-only logic inside did_post guard in Login controller (#3511)

The username suffix parsing, credential extraction, and form auth check were running unconditionally on every request, causing uninitialized value warnings on GET. Move them inside the existing did_post block where they belong.

Co-authored-by: Claude Opus 4.5 noreply@anthropic.com

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

Review: Paladin's Faith

2026-Jan-31, Saturday 20:54
[syndicated profile] eaglespath_feed

Review: Paladin's Faith, by T. Kingfisher

Series: The Saint of Steel #4
Publisher: Red Wombat Studio
Copyright: 2023
ISBN: 1-61450-614-0
Format: Kindle
Pages: 515

Paladin's Faith is the fourth book in T. Kingfisher's loosely connected series of fantasy novels about the berserker former paladins of the Saint of Steel. You could read this as a standalone, but there are numerous (spoilery) references to the previous books in the series.

Marguerite, who was central to the plot of the first book in the series, Paladin's Grace, is a spy with a problem. An internal power struggle in the Red Sail, the organization that she's been working for, has left her a target. She has a plan for how to break their power sufficiently that they will hopefully leave her alone, but to pull it off she's going to need help. As the story opens, she is working to acquire that help in a very Marguerite sort of way: breaking into the office of Bishop Beartongue of the Temple of the White Rat.

The Red Sail, the powerful merchant organization Marguerite worked for, makes their money in the salt trade. Marguerite has learned that someone invented a cheap and reproducible way to extract salt from sea water, thus making the salt trade irrelevant. The Red Sail wants to ensure that invention never sees the light of day, and has forced the artificer into hiding. Marguerite doesn't know where they are, but she knows where she can find out: the Court of Smoke, where the artificer has a patron.

Having grown up in Anuket City, Marguerite was familiar with many clockwork creations, not to mention all the ways that they could go horribly wrong. (Ninety-nine times out of a hundred, it was an explosion. The hundredth time, it ran amok and stabbed innocent bystanders, and the artificer would be left standing there saying, "But I had to put blades on it, or how would it rake the leaves?" while the gutters filled up with blood.)

All Marguerite needs to put her plan into motion is some bodyguards so that she's not constantly distracted and anxious about being assassinated. Readers of this series will be unsurprised to learn that the bodyguards she asks Beartongue for are paladins, including a large broody male one with serious self-esteem problems.

This is, like the other books in this series, a slow-burn romance with infuriating communication problems and a male protagonist who would do well to seek out a sack of hammers as a mentor. However, it has two things going for it that most books in this series do not: a long and complex plot to which the romance takes a back seat, and Marguerite, who is not particularly interested in playing along with the expected romance developments. There are also two main paladins in this story, not just one, and the other is one of the two female paladins of the Saint of Steel and rather more entertaining than Shane.

I generally like court intrigue stories, which is what fills most of this book. Marguerite is an experienced operative, so the reader gets some solid competence porn, and the paladins are fish out of water but are also unexpectedly dangerous, which adds both comedy and satisfying table-turning. I thoroughly enjoyed the maneuvering and the culture clashes. Marguerite is very good at what she does, knows it, and is entirely uninterested in other people's opinions about that, which short-circuits a lot of Shane's most annoying behavior and keeps the story from devolving into mopey angst like some of the books in this series have done.

The end of this book takes the plot in a different direction that adds significantly to the world-building, but also has a (thankfully short) depths of despair segment that I endured rather than enjoyed. I am not really in the mood for bleak hopelessness in my fiction at the moment, even if the reader is fairly sure it will be temporary. But apart from that, I thoroughly enjoyed this book from beginning to end. When we finally meet the artificer, they are an absolute delight in that way that Kingfisher is so good at. The whole story is infused with the sense of determined and competent people refusing to stop trying to fix problems. As usual, the romance was not for me and I think the book would have been better without it, but it's less central to the plot and therefore annoyed me less than any of the books in this series so far.

My one major complaint is the lack of gnoles, but we get some new and intriguing world-building to make up for it, along with a setup for a fifth book that I am now extremely curious about.

By this point in the series, you probably know if you like the general formula. Compared to the previous book, Paladin's Hope, I thought Paladin's Faith was much stronger and more interesting, but it's clearly of the same type. If, like me, you like the plots but not the romance, the plot here is more substantial. You will have to decide if that makes up for a romance in the typical T. Kingfisher configuration.

Personally, I enjoyed this quite a bit, except for the short bleak part, and I'm back to eagerly awaiting the next book in the series.

Rating: 8 out of 10

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github posting in [site community profile] changelog

Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: f3ad4a9b098ca50b87ff6b78a739fa7b6b7d8145 https://github.com/dreamwidth/dreamwidth/commit/f3ad4a9b098ca50b87ff6b78a739fa7b6b7d8145 Author: Mark Smith mark@qq.is Date: 2026-01-31 (Sat, 31 Jan 2026)

Changed paths: M .devcontainer/devcontainer.json M .devcontainer/start.sh R .travis.yml A CLAUDE.md A package-lock.json A package.json

Log Message:


Slight fixes to devcontainer setup, and basic CLAUDE instructions

To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications

Newcomers

2026-Jan-31, Saturday 03:58
ysabetwordsmith: Text says Dreamwidth above a yay emoticon. (Dreamwidth Yay)
[personal profile] ysabetwordsmith posting in [site community profile] dw_community_promo
[community profile] newcomers is a community for people who are just getting started on Dreamwidth, in the tradition of [community profile] twitter_refugees and [community profile] reddit_refugees. This community supports former users of other platforms who are moving to Dreamwidth because their previous platform has become untenable or has closed. As such, it will increase activity with each wave of new users, in hopes of helping them get settled in Dreamwidth so they want to stick around. It also serves previous users returning after a long hiatus, people who want to do more with a Dreamwidth blog that was only intermittent, or anyone else who wants help connecting and figuring out how to use this venue.

Read more... )

New Year's Resolutions and Other Goals

2026-Jan-31, Saturday 03:52
ysabetwordsmith: Text says New Year Resolutions on notebook (resolutions)
[personal profile] ysabetwordsmith posting in [site community profile] dw_community_promo
[community profile] goals_on_dw is a community for people who like goals and goal setting. A key focus is New Year's resolutions, that being among the most popular contexts for such activities. Although the most common time is January 1, "new year" can also refer to other calendars or cultures, whatever works for you. Alternatively, just pick a time that works for you and go for it. You can introduce yourself or make new friends here.

We talk about different goal systems, pros and cons of resolutions, arts and crafts for tracking goals, human psychology, and more. You can share your resolutions or other goals. There are weekly check-in posts in January, and monthly ones in the rest of the year, for folks to talk about their accomplishments. December-January is the most active period, and it starts ramping up in November as lots of people begin thinking about their goals for the next year.

2026 Free Printable Calendars, Planners, and More is the guide post for this years goal-setting activities. For more details on relevant topics, see "Things You Can Talk About Here."

Read more... )

Review: Dragon Pearl

2026-Jan-30, Friday 21:26
[syndicated profile] eaglespath_feed

Review: Dragon Pearl, by Yoon Ha Lee

Series: Thousand Worlds #1
Publisher: Rick Riordan Presents
Copyright: 2019
ISBN: 1-368-01519-0
Format: Kindle
Pages: 315

Dragon Pearl is a middle-grade space fantasy based on Korean mythology and the first book of a series.

Min is a fourteen-year-old girl living on the barely-terraformed world of Jinju with her extended family. Her older brother Jun passed the entrance exams for the Academy and left to join the Thousand Worlds Space Forces, and Min is counting the years until she can do the same. Those plans are thrown into turmoil when an official investigator appears at their door claiming that Jun deserted to search for the Dragon Pearl. A series of impulsive fourteen-year-old decisions lead to Min heading for a spaceport alone, determined to find her brother and prove his innocence.

This would be a rather improbable quest for a young girl, but Min is a gumiho, one of the supernaturals who live in the Thousand Worlds alongside non-magical humans. Unlike the more respectable dragons, tigers, goblins, and shamans, gumiho are viewed with suspicion and distrust because their powers are useful for deception. They are natural shapeshifters who can copy the shapes of others, and their Charm ability lets them influence people's thoughts and create temporary illusions of objects such as ID cards. It will take all of Min's powers, and some rather lucky coincidences, to infiltrate the Space Forces and determine what happened to her brother.

It's common for reviews of this book to open with a caution that this is a middle-grade adventure novel and you should not expect a story like Ninefox Gambit. I will be boring and repeat that caution. Dragon Pearl has a single first-person viewpoint and a very linear and straightforward plot. Adult readers are unlikely to be surprised by plot twists; the fun is the world-building and seeing how Min manages to work around plot obstacles.

The world-building is enjoyable but not very rigorous. Min uses and abuses Charm with the creative intensity of a Dungeons & Dragons min-maxer. Each individual event makes sense given the implication that Min is unusually powerful, but I'm dubious about the surrounding society and lack of protections against Charm given what Min is able to do. Min does say that gumiho are rare and many people think they're extinct, which is a bit of a fig leaf, but you'll need to bring your urban fantasy suspension of disbelief skills to this one.

I did like that the world-building conceit went more than skin deep and influenced every part of the world. There are ghosts who are critical to the plot. Terraforming is done through magic, hence the quest for the Dragon Pearl and the miserable state of Min's home planet due to its loss. Medical treatment involves the body's meridians, as does engineering: The starships have meridians similar to those of humans, and engineers partly merge with those meridians to adjust them. This is not the sort of book that tries to build rigorous scientific theories or explain them to the reader, and I'm not sure everything would hang together if you poked at it too hard, but Min isn't interested in doing that poking and the story doesn't try to justify itself. It's mostly a vibe, but it's a vibe that I enjoyed and that is rather different than other space fantasy I've read.

The characters were okay but never quite clicked for me, in part because proper character exploration would have required Min take a detour from her quest to find her brother and that was not going to happen. The reader gets occasional glimpses of a military SF cadet story and a friendship on false premises story, but neither have time to breathe because Min drops any entanglement that gets in the way of her quest. She's almost amoral in a way that I found believable but not quite aligned with my reading mood. I also felt a bit wrong-footed by how her friendships developed; saying too much more would be a spoiler, but I was expecting more human connection than I got.

I think my primary disappointment with this book was something I knew going in, not in any way its fault, and part of the reason why I'd put off reading it: This is pitched at young teenagers and didn't have quite enough plot and characterization complexity to satisfy me. It's a linear, somewhat episodic adventure story with some neat world-building, and it therefore glides over the spots where an adult novel would have added political and factional complexity. That is exactly as advertised, so it's up to you whether that's the book you're in the mood for.

One warning: The text of this book opens with an introduction by Rick Riordan that is just fluff marketing and that spoils the first few chapters of the book. It is unmarked as such at the beginning and tricked me into thinking it was the start of the book proper, and then deeply annoyed me. If you do read this book, I recommend skipping the utterly pointless introduction and going straight to chapter one.

Followed by Tiger Honor.

Rating: 6 out of 10

Follow Friday 1-30-26

2026-Jan-30, Friday 01:13
ysabetwordsmith: Cartoon of me in Wordsmith persona (Default)
[personal profile] ysabetwordsmith posting in [community profile] followfriday
Got any Follow Friday-related posts to share this week? Comment here with the link(s).

Here's the plan: every Friday, let's recommend some people and/or communities to follow on Dreamwidth. That's it. No complicated rules, no "pass this on to 7.328 friends or your cat will die".

2025 Diamine Inkvent Teal - Day 17-20

2026-Jan-28, Wednesday 15:00
terriko: (Default)
[personal profile] terriko
This is crossposted from Curiousity.ca, my personal maker blog. If you want to link to this post, please use the original link since the formatting there is usually better.


Still settling in to the new house. We’ve prepped a couple of rooms for painting but then the furnace decided it would just sometimes not turn on in the middle of a cold snap, and cold rooms are hard to paint. New thermostat is supposedly coming today and we really hope that’s the problem. It looks like the former owners had some weird zwave kickstarter thermostat that was not great even when it seemed to be working, but it may well be an issue with the furnace itself. Thank goodness for good insulation so we didn’t freeze when it turned off overnight.





Painting continues, so here’s a photo of Hatch who looked at the cardboard I put on the floor and thought “must be a dog bed.”





Hatch, a black lab mix dog, is sprawled across a cardboard wardrobe box that has been flattened and placed on the floor to protect it during painting. He's got his face in the sunbeam and is looking towards the window with his head over his paws, while his hind end is sprawled at a "draw me like one of your French girls" pinup pose with his legs stretched out.
Caption: Hatch, a black lab mix dog, is sprawled across a cardboard wardrobe box that has been flattened and placed on the floor to protect it during painting. He’s got his face in the sunbeam and is looking towards the window with his head over his paws, while his hind end is sprawled at a “draw me like one of your French girls” pinup pose with his legs stretched out.




And then, immediately, “don’t take my picture!”





Hatch, a black lab mix dog, sitting on some cardboard with his front half in a sunbeam.  He's sitting up compared to the previous photo and you can see that his front paws are crossed.  He's looking vaguely in my direction with his ears back like he's not very impressed.
Caption: Hatch, a black lab mix dog, sitting on some cardboard with his front half in a sunbeam. He’s sitting up compared to the previous photo and you can see that his front paws are crossed. He’s looking vaguely in my direction with his ears back like he’s not very impressed.




Anyhow, let’s talk inks.





A set of four ink swatches from the Diamine Inkvent Teal (2025) calendar.  Day 17 Gala is a bright purple, Day 18 Laurel is deep green with so much red sheen that the green is often completely invisible, Day 19 Overcast is a light blue with pinkish tones, and Day 20 Ambiance is orange with pink sparkles.
A set of four ink swatches from the Diamine Inkvent Teal (2025) calendar. Day 17 Gala is a bright purple, Day 18 Laurel is deep green with so much red sheen that the green is often completely invisible, Day 19 Overcast is a light blue with pinkish tones, and Day 20 Ambiance is orange with pink sparkles.




Day 17: Gala. A nice shading purple. I really like this one! It’s a little more pink than J Herbin Violette Pensée, which is the closest thing in my collection. I’m pretty much always going to have the My Little Pony song “At the Gala” stuck in my head when I use this, especially since it’s a very twilight sparkle kind of purple.





Day 18: Laurel. Dark teal-leaning green base with so much red sheen that it’s more of a red ink than a green one. I like this one but I do wish it had a little less sheen so you could get more of the base colour, and it is very similar to Vibe from last year so it’s kind of boring in context. Still, viewed on its own it’s a fun ink and I appreciate that it’s a lot more green than all the other pink sheen inks I have. I wonder why I never see a deep red with the pink sheen? Something chemical or it just doesn’t look as cool in product photos?





A pair of ink swatches for comparison: on top is Van Dieman's Underflow which is a similar two-toned ink with a slightly brighter and more green base, on teh bottom is Diamine Overcast which is a bit more grey with a similar pink tone.




Day 19: Overcast. A dual-tone ink that’s grey-blue with a pink tone. This one is really lovely, but unfortunately very close to my Fountain Pen Day purchase of Van Dieman’s Underflow. Underflow is a bit brighter and more green so they’re not exactly duplicates just very similar. I’ll use both!





A swatch of Diamine Inkvent Teal day 20: Ambiance held at an angle to show the pink sparkle in the orange/peach ink.




Day 20: Ambiance. A peachy orange with pink sparkles. This one is unique in my collection — the closest ink I have has gold shimmer and despite the photo above making it look more gold, this one is definitely more of a pink shimmer when viewed head-on. I like it!





These are all lovely and will get used, though I feel like Laurel could have been more interesting with less sheen. I think Ambiance is the one I’m most excited to ink up and use in my journal, but probably Overcast and Gala will see more use over time due to the lack of shimmer.





The Age of Aguardiente

2026-Jan-28, Wednesday 23:02
tcpip: (Default)
[personal profile] tcpip
The Invasion Day long weekend (really, just change the date and adopt something less gross for the national holiday) featured three events of note in my life. The first included a short-notice visit from Adam and Lara from Darwin; we went to Balloon Story, which had some amusing moments, but really was something for the kids. It was nevertheless marvellous to catch up, albeit for a shorter time than usual, and I am sure there will be a next time. Afterwards, I ventured out to the Thornbuy Bowls Club, where my friend of almost forty years, Simon S., was celebrating his birthday party. With a collection of over a score of migrant friends from Perth, the cycling and motorcycle community, and various nerdish characters of various stripes (which much crossover), Simon's plan to hold a relatively low-key gathering was stymied by his friendship circle, who came out in spades.

The following day was my own gathering of the same sort (and yes, it included several people from the day before), with the additional theme of South America and Latin America from the recent trip. With over 30 people visiting my apartment throughout the day, I provided a wide variety of dishes from the different countries I visited (plus a couple from Ecuador, which I did not), various favourite beverages, and music. All along with a slideshow of photos from the trip. I actually didn't end up making everything, but have endeavoured to do so in the following days because, as usual, I overcatered. Blessed with an incredible variety of often brilliant friends, the gathering was really quite lively, and I am rather overwhelmed by the support and enthusiasm that everyone contributed to the day. Photos will be forthcoming, but for now, "Lev's Solar Orbit, South America and Antarctica Voyage" included the following food, drinks, and music:

Los Platos
- Fainá (Uruguay): Chickpea flatbread with parmesan and mixed herbs
- Aji Amarillo Salsa (Peru): Yellow capsicum with milk, vinegar, lime juice, jalapeño, mustard, garlic
- Llapingachos (Ecuador): Potato cake, cheese and spring onion
- Salsa de maní (Ecuador): Peanuts, milk, onion, cumin, coriander, red chilli
- Torrejas De Espinaca (Peru): Fried tortillas with spinach, spring onion
- Ensalada Negra Inca (Peru): Apichu (golden sweet potato), avocado, black beans, quinoa, and chard (silverbeet)
- Salsa Criolla (Argentina): Capsicum with tomato, onion, garlic
- Pastel de choclo con carne (Chile): Maize with beef, tomato, onion, milk, basil, paprika
- Pastel de choclo sin carne (Chile): Maize with soy TVP, tomato, onion, milk, basil, paprika
- Ceviche (Peru): Ocean fish with red onions, tomato, cucumber, capsicum, lime, coriander, jalapeño
- Empanadas (Argentina): Pastry with gorgonzola cheese and puerro (leek)
- Tortillas fritas con Dulce de Leche (Uruguay): Tortillas, ice cream, milk, sugar, cream, chocolate

Las bebidas
- Café de Galeano (Uruguay): Coffee, dulce de leche, cream, amaretto
- Caipiroska (Uruguay): Vodka, lime, sugar
- Piscola Eléctrica (Chile): Brandy and Pepsi blue
- Pisco Sour (Peru): Brandy, lime juice, egg white, sugar, bitters
- Terremoto (Chile): Pineapple ice cream, red wine, pomegranate juice
- Tierra del Fuego (Argentina): Tequila, Campari, spiced vodka

La Musica
- Jorge Morel (Argentine classical guitar)
- Astor Piazzolla (Argentine founder of nuevo tango)
- Los Prisioneros (Chilean post-punk)
- Los Buenos Muchachos (Uruguayan alt-rock)
- Dengue Dengue Dengue (Peruvian electronic-industrial)
- Föllakzoid (Chilean electronica)
- Vangelis, Antarctica movie soundtrack

ImageMagick for drawing

2026-Jan-28, Wednesday 15:47
miriam_e: from my drawing MoonGirl (Default)
[personal profile] miriam_e
If anybody is interested here are the ImageMagick commands I used for my most recent l-systems experiments.

To create a blank, white canvas:
magick -size 512x512 xc:white canvas.pngmagick -size 512x512 xc:white canvas.png


To draw a black line:
magick canvas.png -stroke "$col" -strokewidth $w -draw "line $xp,$yp $xnp,$ynp" -quality 0 canvas.png


canvas.png is the input image to be written on.

-stroke sets the color of the line (I used the variable $col, which I set to "green")

-strokewidth sets the thickness of the line (in this case $w, set to 1)

-draw and the command "line" sets the start and endpoints of the line.

-quality was ChatGPT's excellent suggestion to force an uncompressed png image. It suggested a different, incorrect command, but the idea was spon-on.

canvas.png is specified again as the output image.

L-systems in bash

2026-Jan-28, Wednesday 08:05
miriam_e: from my drawing MoonGirl (Default)
[personal profile] miriam_e
Once again, I'm fiddling around with l-systems. The eventual aim is to develop a simple way to populate virtual worlds with plants. It has been many decades since I experimented with l-systems. This time I've begun with recreating the simple plant described in the Wikipedia l-systems page.

To give myself a baseline I wrote it in bash script. But bash doesn't have graphical output, so I used ImageMagick to draw the lines on a canvas, and displayed the result using the small, fast, image viewer feh. One nice thing about feh is that it can receive notification when the image it is displaying changes, and update its display. This let me watch the plant grow as the program proceeded.



It turns out that while bash is quite fast at generating the strings that define the shape, ImageMagick clogs things up somewhat. I asked ChatGPT about this and it surprised me by giving some great advice: ensure the canvas (which was in .png format) is not compressed and this will relieve a lot of the load. My computer still staggered under the weight, but it didn't do so badly. It took just over an hour to render the image below. My ancient CoCo computer from about 1983 took less than half that time. It had a 6809 microprocessor that ran at a feeble 0.89 MHz, whereas my current computer runs at an underwhelming 1.1 GHz (1,100 MHz) on each of 2 cores -- more than a thousand times faster. And if I run it on the XRoar CoCo emulator on my computer, but at full speed instead of the original speed, then it takes about 2 minutes.


L-system plant traced to the same level
of complexity on my old CoCo,


My next experiment (if I'm not distracted by some other shiny thing) will be to rewrite the program using awk, which will run much, much faster. For display I'll use the same technique as when I made Wolfram 1D cellular automata a while back. That is, write to the old ASCII .pbm image format. Since awk is primarily a text processing language, getting it to write image data to an image format that is intrinsically text is a marriage made in heaven. Also, I've already developed simple line-drawing, and other routines for awk. I'll still use feh to asynchronously display the image as it updates. This will be interesting.

It strikes me as weird that we have a great flowering of computer languages at the moment -- more than a thousand, last time I looked -- yet almost none of these can display or manipulate images or sound. It sometimes feels like we've gone backwards. We do have some specialised languages to manipulate images and sound, but they can do little else, and interfacing standard languages with those specialised ones can often be messy (like using ImageMagick to output graphics from other languages, such as bash).

It surprises me that with all the computing power we have today, progress feels like it is splintering. I can process images and sound and text in complex ways that once upon a time I could have only dreamed of, but in other ways it feels like we've hardly progressed. I used to be able to quickly whip up simple programs to process text and output graphics and sound... but no more, it seems. We have an amazing world that seems weirdly lopsided.

Additional: I just recompiled xRoar, the CoCo emulator, and got that warm feeling of being able to do those old experiments again, relatively easily and simply... though the CoCo's line editor is even worse than Linux/Unix's ancient ed line editor. The solution is to edit on linux and load the program into XRoar's CoCo.

New blog post

2026-Jan-24, Saturday 21:12
sweh: (Vroomba)
[personal profile] sweh
New blog post in which I pontificate about AI systems; where I'm not a fan, and where I think they might be useful. You probably won't agree with me. https://www.sweharris.org/post/2026-01-24-no-ai/

April 2015

S M T W T F S
   1234
567891011
12131415 161718
19202122232425
2627282930  

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags