今回はXにつぶやいて行きたいと思います。

週明けからRubyトライアスロンに行ってきます。

Rubyトライアスロンとは何かというと、3つのRubyカンファレンスに家に帰らず連続で参加するというものです。

Ruby Triathlon: A Journey of Growth and Inspiration

そのカンファレンスは下記の3つです。

Rubyトライアスロンをやってみようと思ったきっかけはRubyKaigi2025でスポンサーのクックパッドさんがRailsWorldのチケットが当たる抽選をやっていて、それに当たったことです。クックパッドさんありがとうございます😭

RubyKaigi 2025 のクックパッドブースで出来ること - クックパッド開発者ブログ

買おうと思っても買えないチケットをいただけることになり、ポルトガルでやるEurukoも行ってみたいと思ってたところでした。こりゃあRubyトライアスロンやっちゃうかとなりました。

家には猫がいるのでそんなに長く空けられないこともあり、妻とはポルトガルで合流して観光する予定です。

滞在予定としては下記のような感じです。

  • 9/2 東京 ✈️ 9/3 アムステルダム
  • 9/3 アムステルダム ✈️ 9/14 ブカレスト
  • 9/14 ブカレスト ✈️ 9/14 リスボン
  • 9/17 リスボン ✈️ 9/17 ポルト
  • 9/21 ポルト ✈️ 9/22 東京

特にポルトガルまでは1人で、イベントとイベントの間は暇だと思うので、もしこれらカンファレンスに参加される方がいましたらぜひご飯などご一緒できれば嬉しいなと思います。

今回、フィヨルドブートキャンプの方にもカンファレンスがどんな感じか見てもらいたいなと思ったのでなるべく動画を撮ってきたいと思います。

最低限のFeature Flagの機能とWeb UIを備えたgemを作りました。

komagata/switchlet: Minimal feature flag gem

インストール

bundle install
rails generate switchlet:install
rails db:migrate

使い方

if Switchlet.enabled?(:my_feature)
  # my_feature code
end

(まだ存在しないフラグはfalseになります。)

よくあるパターン

# 6月1日以降に有効にする
if Switchlet.enabled?(:my_feature) && Time.current > Time.parse('2025-06-01 00:00:00')

# 4分の1のユーザーに有効にする
if Switchlet.enabled?(:my_feature) && current_user.id % 4 == 0

# スタッフユーザーにだけ有効にする
if Switchlet.enabled?(:my_feature) && current_user.stuff?

Web UI

下記で使えるWeb UIからフラグを作成・ON/OFFできます。

mount Switchlet::Engine => "/switchlet"

ss

本番環境でWeb UIからフラグのON/OFFすることを想定しているので複数の方法でWeb UIへのアクセスを制限できます。

# config/initializers/switchlet.rb
Switchlet.configure do |config|
  # Devise + admin role
  config.authenticate_with do |controller|
    controller.authenticate_user! && controller.current_user.admin?
  end
end

上記はdeviseとの組み合わせ。Basic認証やIPでの制限、それぞれの組み合わせもできます。

作った理由

Feature Flag系のgemを色々試したのですが、僕の用途にとっては複雑でオーバースペックなものが多かったためです。 上記に書いた、どういう条件で有効になるかみたいなものは表現力の高いruby自体で書きたかった。

最近ブログで写真をたくさん使うので書いた。

#!/usr/bin/env ruby

dir = ARGV[0]

Dir.chdir(dir) do
  system "mogrify -format jpg *.HEIC"
  system "rm -f *.HEIC"
  system "mogrify -path '#{dir}' -resize 1920x1920 -quality 90 -auto-level -normalize '#{dir}/*'"
end

bin/resize_blog_pictures at main · komagata/bin

千歳烏山.rb #01 - connpassに参加してきました。

地元に地域rbが出現するなんて嬉しい。

初回になる今回はもくもく会をしてその後飲み会という感じでした。もくもくも、まとまった時間あったらやりたいな〜と思ってたことを持っていったらすごくはかどったので充実度が高かったです。

飲み会も普段ご飯を食べにいってる場所っていうのが不思議な感じ。

Image from Gyazo

家が50mぐらいしか離れてない方がいてご飯屋さんの情報交換で盛り上がったり、いろんな方とお話しできて楽しかったです。 歩いて帰れる飲み会最高!ということで少し飲み過ぎたかもしれません🤭

主催してくださったたわらさんや参加者の皆さんありがとうございました。

2回目も行きたかったですが、RubyConf Taiwanの翌日なので移動中で参加できなさそう。

千歳烏山在住でなくても参加されている方はたくさんいたので、京王線沿線の方などは急行が止まるし、アクセスしやすくていいかもしれません。行ける方はぜひご参加を〜。

千歳烏山.rb #2 ぷちLTと年忘れ忘年会 - connpass

bundle2.2からか対応platformが細かくなった。

arm64-darwin-22
arm64-darwin-23
x86_64-darwin-21
x86_64-darwin-22
x86_64-linux

こんな感じでosのバージョン毎に追加してくのは辛い。みんなどうやってるのかなと思ってSlackのruby-jpのsupportチャンネルで質問させてもらいました。

Image from Gyazo

gohさん、kojix2さんに教えていただきました。ありがとうございます。

結論から言うとこう言う感じで良さそう。

PLATFORMS
  universal-darwin
  x86_64-linux

mac関連は全部universal-darwinでOK。CIや本番環境、WSL2の人用にはx86_64-linuxでOK。

brewでmacのpostgresを14にアップグレードした際にpgを使ってるrailsが立ち上がらなくなった。(M1 Macです)

/Users/komagata/go/src/github.com/fjordllc/bootcamp/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require': dlopen(/Users/komagata/go/src/github.com/fjordllc/bootcamp/vendor/bundle/ruby/3.1.0/gems/pg-1.4.4/lib/pg_ext.bundle, 0x0009): Library not loaded: /opt/homebrew/opt/postgresql/lib/libpq.5.dylib (LoadError)
  Referenced from: /Users/komagata/go/src/github.com/fjordllc/bootcamp/vendor/bundle/ruby/3.1.0/gems/pg-1.4.4/lib/pg_ext.bundle
  Reason: tried: '/opt/homebrew/opt/postgresql/lib/libpq.5.dylib' (no such file), '/usr/local/lib/libpq.5.dylib' (no such file), '/usr/lib/libpq.5.dylib' (no such file), '/opt/homebrew/Cellar/postgresql@14/14.5_5/lib/libpq.5.dylib' (no such file), '/usr/local/lib/libpq.5.dylib' (no such file), '/usr/lib/libpq.5.dylib' (no such file) - /Users/komagata/go/src/github.com/fjordllc/bootcamp/vendor/bundle/ruby/3.1.0/gems/pg-1.4.4/lib/pg_ext.bundle
/
  opt/
    homebrew/
      opt/
        postgresql/
          lib/
            postgresql@14/
              libpq.5.dylib <- 有る
            libpq.5.dylib <- 無い

/opt/homebrew/opt/postgresql/libの中にはlibpq.5.dylibが無くてpostgresql@14ってディレクトリの中にある。なんかシンボリックリンク作成やコピーのミスのような雰囲気がするけど、とにかくライブラリの位置が変わってるっぽい。

とりあえずシンボリックリンクを貼ったら動いた。HomebrewのFormulaのreposを覗いてみたけどちょっとよくわからなかった。

$ ln -s /opt/homebrew/opt/postgresql/lib/postgresql@14/libpq.5.dylib /opt/homebrew/opt/postgresql/lib/libpq.5.dylib

abstract_notifierで通知を実装する - komagataのブログ

ここでminitestでのテストが書きづらいのでPRするって書いてましたが、それがマージされたバージョン0.3.2がリリースされました。

READMEに書いてありますがminitestではこういうふうに書くといい感じです。

require 'abstract_notifier/testing/minitest'

class EventsNotifierTestCase < Minitest::Test
  include AbstractNotifier::TestHelper

  test 'canceled' do
    assert_notifications_sent 1, identify: "123", body: "Alarma!" do
      EventsNotifier.with(profile: profile).canceled(event).notify_now
    end

    assert_notifications_enqueued 1, identify: "123", body: "Alarma!" do
      EventsNotifier.with(profile: profile).canceled(event).notify_later
    end
  end
end

最近のrailsでのパスワード認証gemって何使ってます?

The Ruby Tool BoxのWeb Authentiationカテゴリーを参照。

devise

やってくれることは多いがカスタマイズしづらいので嫌う人も多い。俺はこれ使ってる。 しかし登場から時間が経ち、railsの仕様に追従していくにつれて初期の設計に無理がきてる感。特にrails7からはさらに。

sorcery

やってくれることは少ないが、カスタマイズしやすい。bootcampのアプリはこれを使ってる。(確か @hrysd が入れた) リニューアル版sorcery(sorcery-rework)が別リポジトリで進んでるが、当分完成しそうにな。

authlogic

使ったことないけどちょっと古い感?

clearance

使ったことないけどちょっと古い感2

railsの基本機能を使って自作

これが多いのかも?

個人的には認証などのセキュリティが大きく絡むところはなるべくgemなどみんなが見ている(セキュリティパッチがすぐ入りやすい)ところのを使いたいな〜と思っております。

みなさんのプロジェクトではどんな感じでしょう? 温度感が知りたい感。

railsの6系最新(6.1.4.4)とrubyの最新(3.1.0)にアップグレードするときに対応してないgemにPRを送る作業をやっています。

bootcampのrails 6.1.4.4

https://github.com/fjordllc/bootcamp/pull/4101

pgのwarningが残ってる。(こういうところも粘り強く対応できるようになっていきたい)

bootcampのruby 3.1.0

https://github.com/fjordllc/bootcamp/pull/4108

@ima1zumiさんが3.0.2にアップデートする作業を初めてくれて、そこに乗る形でやりとりさせていただいてました。3.0.3だと起きるけど3.1.0では起きない問題があったので一気に上げちゃう方針に。こういうところも粘り強く(略

おかげでCI通ったようなのであと一歩。

sorcery-jwt

https://github.com/hayfever/sorcery-jwt/pull/14

sorcery-jwtはdependencyの設定を変えないと最新のsorceryで使うことができない。sorcery-jwt自体、リニューアル後(予定)の新sorceryではcore pluginになる予定だそうで、こちらのgemをもうupdateする気はないのかもしれない。とりあえずforkして対応してるけど、メールを送ってみる予定。

ActiveFlag

https://github.com/kenn/active_flag/pull/19

これはbundlerのバージョンによるものだった。

今後

ruby 3.1.0にできたら次はrails 7.0.1に上げる作業をやる予定。こっちも色々PRに必要になるでしょう。