Charles Oliver Nutter
headius.bsky.social
Charles Oliver Nutter
@headius.bsky.social
JRuby co-lead, Java champion, Ruby hero, JavaOne Rockstar, international traveler and speaker. Book me for your next event! I depend on your donations and sponsorships! https://github.com/sponsors/headius
The apparent decline in Ruby use in recent years has more to do with the fact that people aren't building as much new stuff than anything about Ruby itself. A malaise has fallen on software dev: few exciting projects, skilled devs out of work. Good time to start something?
November 6, 2025 at 11:11 PM
Looks like there will be no Free Java room at FOSDEM this year (first time in almost 20 years!) so it seems my late January to early February travel schedule has opened up. Anyone have an event they'd like to see me at, talking JVM features and internals or Ruby optimization?
November 6, 2025 at 10:39 PM
Reposted by Charles Oliver Nutter
🚨 Time Sensitive 🚨

#Java peers...the 2026 #JavaOne call for papers closes soon. Get your proposals in by the Nov 11 deadline ➡️
social.ora.cl/6017A7UwL
November 6, 2025 at 7:47 PM
It appears there’s momentum behind a non-forking Solid Queue option in the PR below, but we need help pushing it over the finish line! Even on CRuby, a threaded version can be useful when forked processes are just too heavy.

github.com/rails/solid_...
November 5, 2025 at 9:04 PM
The Solid Queue database-based backend for ActiveJob currently requires `fork` to work, solely because that's the only way to make sure it runs in parallel on CRuby. I want it to work on JRuby, which doesn't support fork, but can run threads in parallel very easily. Help?

buff.ly/18ZW69U
Non-forking implementation · Issue #679 · rails/solid_queue
Hello! I would like to offer my help making modifications to Solid Queue to support executing in-process using threads rather than out-of-process as a fork. There's many issues with using fork: Imp...
github.com
November 4, 2025 at 9:47 PM
What do you call it when you don't ever feel like you really get "in the zone" while coding until you've been at it for 8 hours? It's like I can't really focus until that point. My best days (like today) are the ones where I put in 12-14 hours in a single stretch.
November 4, 2025 at 5:32 AM
I'm making another attempt to get a `deep_freeze` method added to Ruby. Core folks have rejected proposals for years, until Ractor came along and we got basically the same feature in `make_shareable`. But deep freezing should be its own feature.

bugs.ruby-lang.org/issues/21665
Feature #21665: Revisit Object#deep_freeze to support non-Ractor use cases - Ruby - Ruby Issue Tracking System
Redmine
bugs.ruby-lang.org
November 4, 2025 at 12:18 AM
I figured out why I don't like Ruby's new Ractor concept: it forces users to work around CRuby deficiencies. To parallelize code with Ractor, users must make all passed object graphs "shareable" even if those objects would otherwise be safe to parallelize with Threads. It feels un-Ruby to me.
November 3, 2025 at 6:57 PM
It turns out the real Ractors were the Threads we made along the way
Announcing ractor-shim, a new gem that reimplements Ractor on top of Thread & Queue: github.com/eregon/racto...

This gem provides the full Ruby 3.5 Ractor API (Ractor::Port, Ractor#{join,value,monitor}, etc) on TruffleRuby, JRuby, and CRuby 2.7 to 3.4.
GitHub - eregon/ractor-shim: A shim to define Ractor by using Thread, if not already defined
A shim to define Ractor by using Thread, if not already defined - eregon/ractor-shim
github.com
October 30, 2025 at 9:18 PM
Here's one for someone who wants to contribute to JRuby: reimplement UNIXSocket using the JDK support for UNIX sockets:

github.com/jruby/jruby/...

We currently use jnr-unixsocket, part of our native FFI backend, but it has never worked perfectly.
Reimplement UNIXSocket using JDK UNIX socket support · Issue #9040 · jruby/jruby
As of JDK 16, UNIX sockets are natively supported on the JDK. We should migrate our existing UNIXSocket implementation from jnr-unixsocket to the JDK versions. This will provide more complete suppo...
github.com
October 24, 2025 at 9:05 PM
I'm pleasantly surprised at how easy it has been for my kids to funnel allowance into investments using GreenLight. Interesting educational conversations about stocks and funds and what makes a good investment.

Here's some code that gets you $30 back:

share.greenlight.com/91792639
Charles is giving you $30
Teens and parents can earn cash rewards with Greenlight’s referral program when friends sign up and pay their first month’s fee. Save, earn and invest together.
greenlight.com
October 23, 2025 at 9:54 PM
I expected at least a few patches to get JRuby 9.4 green on Java 25, but I was wrong. JRuby 9.4 officially supports Java 25 already, I guess!

github.com/jruby/jruby/...
Official JDK 25 support for JRuby 9.4 by headius · Pull Request #9030 · jruby/jruby
CI reconfig and tweaks as necessary to pass tests on Java 25.
github.com
October 23, 2025 at 9:04 PM
New post: Warbled Sidekiq: Zero-install Executable for JVM

In my previous post, I showed how to use Warbler to package a simple tool as an executable jar. This post will demonstrate how to “warble” a larger project: the Sidekiq background job server!

buff.ly/ZEasNiu
Warbled Sidekiq: Zero-install Executable for JVM
In my previous post, I showed how to use Warbler to package a simple image-processing tool as an executable jar. This post will demonstrate how to “warble” a larger project: the Sidekiq background…
blog.headius.com
October 23, 2025 at 5:01 PM
I just used JRuby and Warbler to package up a well-known Ruby-based background job server as an executable jar and it "just works". Single-file deployment on any platform with a JVM and scaling far better than you can get with regular CRuby. JRuby is the future of enterprise Ruby.
October 22, 2025 at 8:48 PM
That's probably enough of Ractor working for an evening project. I get the idea of the API but the internal details (deep copying and ownership) are going to be really hard for any Ruby to implement efficiently. You could just use threads and frozen objects on JRuby and it would be fast right now. 🤷
October 22, 2025 at 6:33 AM
New post: "Packaging Ruby Apps with Warbler: Executable JAR Files"

Warbler is the JRuby ecosystem’s tool for packaging up Ruby apps with all dependencies in a single deployable file. We’ve just released an update, so let’s use Warbler to create all-in-one packaged Ruby apps!

buff.ly/ZdXcCop
Packaging Ruby Apps with Warbler: Executable JAR Files
Warbler is the JRuby ecosystem’s tool for packaging up Ruby apps with all dependencies in a single deployable file. We’ve just released an update, so let’s explore how to use Warbler to create…
blog.headius.com
October 21, 2025 at 5:42 PM
Reposted by Charles Oliver Nutter
I need to run this again to see what might have changed but there is a guide from earlier that I wrote:
notepad.onghu.com/2021/jruby-w...

But I am delighted that some of the niggling issues might have now been resolved.

#JRuby #Ruby #Programming
October 18, 2025 at 2:32 PM
Turn your Ruby gem into an all-in-one executable jar file with JRuby:

* gem install warbler
* warble
* java -jar mygem.jar ...

I forgot how easy this is. Blog post coming.

gist.github.com/headius/6739...
Two steps to create a redistributable Ruby app in an executable jar
Two steps to create a redistributable Ruby app in an executable jar - console.txt
gist.github.com
October 17, 2025 at 6:02 PM
I'm still waiting for my preorder Pebble Time 2 watch, but meanwhile I'm jealous that the only SDK support they'll ship is for Python and JS. Let's change that! mruby would be a perfect way to add Ruby to the PebbleOS SDK. Help me make it happen!
Ruby SDK using mruby · Issue #281 · pebble-dev/pebble-firmware
Is there an existing issue for this? I have searched the existing issues Proposed feature request mruby provides a tiny, compilable, embeddable implementation of Ruby that would be perfect as part ...
buff.ly
October 10, 2025 at 10:28 PM
New post: Updating Deprecations with Version Information

A short Ruby script and justification for updating all of JRuby's old `@Deprecated` annotations with "since" versions. Easy to run yourself with JBang. Hope it's useful to someone else out there!

blog.headius.com/2025/10/upda...
Updating Deprecations with Version Information
Java 9 added the ability to mark a @Deprecated annotation with a “since” version, so we figured it was worth updating JRuby.
blog.headius.com
October 10, 2025 at 10:12 PM
I posted this response twenty days ago at the beginning of the RubyGems drama. Timeline isn't clear but at least some of these possible theories seem to have been in play. Almost like people should let facts come out first. #RubyGems #security #lawyers

www.reddit.com/r/ruby/s/sC8...
headius's comment on "Ruby Central’s Attack on RubyGems"
Explore this conversation and more from the ruby community
www.reddit.com
October 10, 2025 at 3:26 AM
Ok, someone must have implemented Ruby's "Ractor" API in pure-Ruby on top of threads, right? I want to see what that looks like running with true parallelism on JRuby.

There's little demand for Ractors from JRuby folks because they already have shared-memory concurrency with few restrictions.
October 9, 2025 at 8:09 PM
Any reason why I shouldn't globally replace all bare "@Deprecated" annotations with "@Deprecated(since = 'first release after deprecation')"? Because I really want to do it. It won't be as easy to blame these edited lines, but now the release is right there.
Add "since" to bare Deprecated annotations by headius · Pull Request #9027 · jruby/jruby
The "since" attributes added here reflect the first release after each deprecation was added. We will use this to remove oldest deprecations (by some measure of oldest) in an upcoming rel...
buff.ly
October 9, 2025 at 7:44 PM
Spring Boot restful app in a one-line command? Love that Ruby magic sometimes...

jruby -Ilib -rboing -e 'Boing::Rest.run("HelloApp") do; get_string def hello; "Hello from Boing!"; end; end'
October 8, 2025 at 9:19 PM