We're live!
Course livestream: Basic Linux System Administration | !linuxcourse / !q
#owncast #streaming #linux #ruby #sysadmin #systemadministration #unix #devops #development #livecoding #codestream #tech
We're live!
Course livestream: Basic Linux System Administration | !linuxcourse / !q
#owncast #streaming #linux #ruby #sysadmin #systemadministration #unix #devops #development #livecoding #codestream #tech
As mentioned earlier, Mario (my colleague) and I will be presenting TRMNL e-ink devices running on Terminus (https://github.com/usetrmnl/byos_hanami) which is our self hosted solution at Boulder New Tech (https://www.meetup.com/bdnewtech/)
We only have ~10 minutes (including questions).
What's fun about all this is that the slides (plus smooth transitions, etc.) is all done in Terminus via a playlist. The same playlist you can render on your TRMNL device. 🎉
All of this is live and you do this at home too!
🎉 alchemy-sentry v2.0.0 has been released!
https://github.com/AlchemyCMS/alchemy-sentry/releases/tag/v2.0.0
I'm a tad bit nervous to be presenting an Introductory talk about #DuckDB at the RubySG Dec meetup today (9 Dec)! But I have a good 11million record synthetic dataset to show some of the features!
Register: https://luma.com/0em8ixuy
I found this great post https://dev.to/daviducolo/a-comprehensive-guide-to-multithreading-in-ruby-3f04
About how to handle #threads in #ruby
#coding #programming #softwareengineering #rails #rubyOnRails
🎉 alchemy-bugsnag v1.2.0 has been released!
https://github.com/AlchemyCMS/alchemy-bugsnag/releases/tag/v1.2.0
🎉 alchemy_cms v8.0.0 has been released!
https://github.com/AlchemyCMS/alchemy_cms/releases/tag/v8.0.0
🧵 2/2
```
r: reload-code # reload current file, or given file; only works in .rb files (not ERB), and doesn't reload the currently-executing method
q: exit
```
In .pryrc, these are specified as `Pry.commands.alias_command "c", "continue"` and so on.
Also: ~/.irbrc works similarly for binding.irb!
I got tired of typing out full Pry commands in the Rails app at work, so created a ~/.pryrc file with aliases.
Along the way I discovered more Pry commands!
My aliases:
```
c: continue
n: next # execute next line
s: step # step into next method call
f: finish # finish current frame (e.g. method)
v: ls -l # show local vars
i: ls -i # show ivars
w: whereami
t: backtrace
u: up # move up call stack
d: down # move down call stack
```
Continued in 🧵
I just completed "Movie Theater" - Day 9 - Advent of Code 2025 #AdventOfCode https://adventofcode.com/2025/day/9
--
Got stuck on a sluggish version and had to look for a better approach, but finally, both parts sub-second in #ruby https://gitlab.com/oinak/advent-of-code-2025/-/tree/main/day09
Open Build Service experienced a short outage after a deployment on Dec. 1. The #root cause was a #Ruby gem version mismatch involving #Webrick. #OBS was restored at after updating the #gem. Full transparency & next steps shared in the following report. https://openbuildservice.org/2025/12/10/post-mortem/
On MacOS with Ruby v3.4 and openssl v3.6 if you're seeing an OpenSSL::SSL::SSLError exception with a message like "certificate verify failed (unable to get certificate CRL)", you can workaround/fix it by reinstalling Ruby against an earlier version of openssl, e.g. v3.5.
https://github.com/rails/rails/issues/55886#issuecomment-3411919148
RubyGems 4.0.1 Released
Solved today's #adventofcode part 2 non-discretely. Took me four hours, maybe more. Memory requirements are minimal and my running time is slightly above two seconds (#Ruby with #YJIT).
The code is here: https://codeberg.org/der-scheme/adventofcode.rb/src/branch/main/2025/09
The repo also contains a visualization in case somebody needs it.
Approach in content warning below:
I went kinda nuts on yesterday's #adventofcode trying to optimize my #Ruby implementation. The resulting code is nothing special, but here it is, for reference: https://codeberg.org/der-scheme/adventofcode.rb/src/branch/main/2025/08
I consistently achieve sub 2.5 seconds with #YJIT for all four (both parts on both input and test input) runs, including I/O and all the process spawning stuff, measured by `time ./test`. No JIT is about 25–30% slower. I have no idea how fast this is, but I'm stating it for transparency.
I consider myself a smooth-brain, but here's what I believe to have learned (some very obvious, others not so much):
- Even if you don't care about your return values (discarding them), YJIT does. So if the return value is irrelevant, return a predictable value; self is a good choice. This is consistent with YJIT's documented behavior.
- There's a tiny overhead in splatting, so it's faster to be explicit.
- There seems to be some overhead in the creation of local variables. Sometimes it's faster calling a reader method multiple times.
- While structs (Struct, not Data, although they share most of the implementation) can be slightly slower than trivial wrapper classes, I found a case where a struct with a single field resulted in a 15% overall runtime boost compared to the equivalent class. It's no longer in the code base, though, because:
- Oftentimes, shoving everything into an array to deal with later is faster than dealing with it early.
- There seems to be no performance gain in freezing. I attempted freezing an object in the constructor hoping YJIT would maybe inline instance variable access, but this resulted in an overall 10% performance drop through this single line change. However, the necessary code changes resulted in speedups in other places, so the work was still worth it.
- Sometimes arrays are faster, sometimes enumerators are faster, for the exact same functionality.
- `def some_size = some&.size || 0` seems faster than the verbose alternative. Maybe YJIT can optimize operators better than branches?
- There's a bunch of stuff I didn't try, like the C-like implementations you can find published all over the internet. If I wanted to write fast but unreadable code, I'd use FFI and C.
- Git commit makes your code run slower. I assume there's some FS weirdness going on which is triggered by committing, like maybe a cache reset.
Doing the #adventofcode in #crystallang this year again, it reminds me how much I liked #ruby syntax for a lot of things, but I'm particularly fond of the inline conditionals, early returns and guard clauses ❤️❤️❤️