株式会社トイポのメンバーとして、愛媛県県民文化会館で開催された RubyKaigi2025 に初参加してきました!


RubyKaigi2025の会場

期間中は、セッションで新しい知識を吸収したり、企業ブースを回ったり、夜はアフターイベントでRubyコミュニティの方々と親睦を深めたり、とても濃密な3日間でした。

特に印象的だったのは、Rubyの生みの親であるまつもとゆきひろさん(Matz)や著名なRubyコミッターの方にお会いできたことですね(架空の人物ではなくほんとうに存在する人なんだと実感しました!笑)。


Matzとトイポメンバーとの写真


松田明さんとトイポメンバーとの写真

3日間開催だったこともあり、体力的には大変でしたが、色々な刺激を受けられたのでとてもいい経験となりました(RubyKaigiに参加するにあたって、RubyKaigi期間中の対応のために残ってくださったCTOやメンバーの方には感謝です!)

最初は色々吸収していこうと意気込んでいたのですが、徐々に内容の難しさに気づいて意気消沈していました。その場では内容を1割も理解するのが難しかったです…

そのため、少しでも理解しようと帰ってきてから気になるセッションについてNotebookLMを使って自分なりに整理してみました(正確に理解できてない部分も多いため誤りがあるかもしれませんので、その点はご了承ください)。

また、一番気になっていたparserのセッションで「Dissecting and Reconstructing Ruby Syntactic Structures」についても理解したいと思ったのですがどこから理解していけばよいかわからず断念しました…

Ruby Taught Me About Encoding Under the Hood

@ima1zumi さんの発表です。

https://speakerdeck.com/ima1zumi/ruby-taught-me-about-under-the-hood

irb上で 👨‍👩‍👧‍👦 + Backspace + Backspace を実行するとクラッシュするという問題があり、@ima1zumi さんが解決した方法についてのお話でした。文字コードの歴史などの説明があって普段あまり触れる機会がなかったのでとても良い時間でした。

実際にirb上でクラッシュするか試してみたところ、クラッシュしました。

(なぜか、自分の環境では家族絵文字をirbにペーストすると家族絵文字が展開された状態になっていますが気にしないでください)


実際にirbで家族絵文字を入力してクラッシュするか試した

資料にもありますが、家族絵文字は7個のコードポイントによって構成されており、実際に見える文字数と内部的な構成は違っているようです。 U+200DZERO WIDTH JOINER(ZWJ) というもので、複数の絵文字を連結して、1文字として見せる絵文字のようです。

irb(main):004:0> "👨‍👩‍👧‍👦".chars.map { |v| v.ord.to_s(16) }
=> ["1f468", "200d", "1f469", "200d", "1f467", "200d", "1f466"]

このような複数のコードポイントが組み合わさって一つの視覚的な文字として表される文字がirb上では正しく認識していなかったことが原因でクラッシュしており、それを @ima1zumi さんが正しく認識するように修正することでクラッシュの問題は解消されたようです。

その他学びポイント:

  • 文字集合
    • 文字の集まりのこと(アルファベット、数字、句読点、記号、様々な言語で使用される文字)
  • 文字符号化方式
    • 文字集合で定義された文字を、コンピュータが扱える形式に変換する規則のこと
  • 文字コードの歴史の概要
    • 文字コードが登場する以前は、狼煙や光学式電信(セマフォ/腕木通信)などが長距離通信手段として用いられていた
    • 電気の実用化によるモールス信号が18世紀後半から19世紀
    • コンピュータによる文字コードであるASCIIやEBCDIC(1960年代)
    • 1967年〜1987年にかけては様々な文字コードが存在していた
    • 1991年にUnicode 1.0の登場
      • Unicodeは世界標準の文字集合であり、それぞれの文字に固有のコードポイント(U+xxxx)が割り当てられる
      • UTF-8は、Unicodeで定義されたこれらのコードポイントを実際にコンピュータが扱えるバイト列に変換するための「文字符号化方式」の一つ
      • UTF-8は2008年に多くのソフトウェアやウェブサイトで標準的に採用されるようになって普及した

Introducing Type Guard to Steep

@tk0miya さんの発表です。

https://docs.google.com/presentation/d/1VpFDEG0ZOghhvAYlTrthzD9QdlXbCbSn9MUd2FCGGC4/edit?slide=id.p2#slide=id.p2

SteepのType Guardについてのお話でした。Steepは既にRubyの組み込みメソッドを通じて型の絞り込みをサポートしており、今回はSteepの新しい2つのType Guardの機能についてのお話でした。1つはUnion型のType Guard(1.10.0でリリース済み)ともう1つはユーザー定義のType Guard(現在開発中)についてのセッションでした。

最初の方でType narrowingとType Guardという用語が登場しました。

  • Type narrowing:変数の型の絞り込み
  • Type Guard:型を絞り込む条件式の部分

例えば、既にサポートされている is_a? で見てみると、次のように型が絞り込まれるようです。

user = User.find_by(name: "Alice") 
if user.is_a? User 
  puts user.name 
else
  puts "Alice is not found." 
end

今回新しく追加されたリリース済みのUnion型のType Guardについてはせっかくの機会なので実際に触りながら確認してみたいと思います(いい感じの例をClaudeに出力してもらいました!)。

次の式がType Guardとして認識されるようです。

  • メソッド呼び出しである
  • 呼び出しのレシーバが変数または純粋なメソッド呼び出しである
  • レシーバの型がUnion型である

呼び出しの戻り値の型によってレシーバの型が絞り込まれる。

準備:

  • Ruby 3.1.0 以上をインストール(Steep 1.10.0 の要件)
  • Gemfileを作成
source "https://rubygems.org"

gem 'steep', '~> 1.10.0'
gem 'activesupport'
  • bundle install を実行
  • Steepの設定ファイルの Steepfile を作成
target :test do
  signature "sig"
  check "lib"
end
  • Rubyファイルの作成

require 'active_support/core_ext/object/blank'

class User
  attr_reader :name
  
  def initialize(name)
    @name = name
  end
  
  
  
end

class UserFinder
  def find(name)
    name == "Alice" ? User.new(name) : nil
  end
  
  def display_user(name)
    
    user = find(name)
    
    
    if user.present?
      
      
      puts "#{user.name}"
    else
      
      
      puts "#{user}"
    end
  end
end

finder = UserFinder.new
finder.display_user("Alice")
finder.display_user("Bob")
  • RBS型定義ファイルの作成
    • sig/user.rbs
    • sig/user_finder.rbs
    • sig/nil_class.rbs

class User
  attr_reader name: String
  
  def initialize: (String) -> void
  
  
  def present?: () -> true
end


class UserFinder
  def find: (String) -> (User | nil)
  
  def display_user: (String) -> void
end


class NilClass
  def present?: () -> false
end

  • VSCodeとの連携
    • Steep拡張機能をインストール

変数の型が User | nil のような Union型である場合に、 #present? メソッドの戻り値の型定義に基づいて、変数の型が絞り込まれています!


VSCode上でSteep拡張機能を使って型が絞り込まれることを確認

Goodbye fat gem 2025

@ktou さんの発表です。

https://slide.rabbit-shocker.org/authors/kou/rubykaigi-2025/

fat gemとはビルド済みのバイナリを含むgemのことです。

ユーザー視点で見ると、ビルド環境不要で、インストールが簡単であり、インストールも失敗しないとメリットが多くあります。デメリットとしては、最新のRubyのバージョンがリリースされても使用しているfat gemのいずれかが対応していない場合は最新のRubyを利用できないというものがあります。

メンテナ視点で見ると、すぐの最新のRubyのバージョンへの対応・脆弱性対応やクロスコンパイルが必要なgemについてはメンテナンスコストが高いという課題があります。

現状のエコシステムでは、ユーザー側の最新のバージョンが利用できないという課題やメンテナ側も最新のバージョンなどへの追従が大変という課題があり、そこに一石を投じる形でユーザー・メンテナどちらも幸せになるためのアプローチとして、 https://github.com/ruby-gnome/rubygems-requirements-system/ というgemが提案されていました。

メンテナが外部依存情報を指定することで、ユーザーはインストール時に自動で外部依存もインストールするというもののようです。これによっていくつか課題が解決されるものの今度は別の課題もあるようでした。

登壇された @ktou さんがポストされたことを踏まえて改めて読むと難しい問題なんだと思いました。

https://x.com/ktou/status/1914483167555412200

初めてのRubyKaigiで企業ブースを回るのも少し緊張していたのですが実際に行ってみるとクイズがあったり、ノベルティが貰えたり、サービスについてお話を聞けてたりして楽しかったです!


企業ブースの雰囲気

TOKIUMさんのブースでは抽選くじを引いて、ガジェットが当たりました!
2日目のスタンプラリーの1箇所目だったので嬉しかったですね!Ankerの充電器などもあったのですが、前から気になっていたTickTimeというキューブ型のタイマーにしました。早速、普段の作業でも使っていて便利です!


TOKIUMさんのブース

DAY1

DAY1はオフィシャルパーティーがあったのですが、すでに人数制限で申し込めなかったのでメンバーでGORUTO(ゴルト)というお店で初顔合わせもあって楽しくご飯を食べました。

その後は、Xで @yusukebe さんの投稿を見てRubyKaigiの人たちが集まっている居酒屋に飛び入り参加してきました!どんどんRubyistの人たちが集まってきて面白かったです!

https://x.com/yusukebe/status/1912490726669316316

https://x.com/yusukebe/status/1912494551933268173

DAY2

DAY2はnoteさんのDrinkupに参加してきました。noteさん、美味しい料理ありがとうございました!
たまたまですが、お隣がTOKIUMUさんの方でした。野球のキャンプで宮崎に来られたこともあっていろんな話ができて嬉しかったです。また、CAMPFIREの方ともお話ができて良かったです!眼精疲労で悩んでいる話をしたら、ViXion01という自動でピント調節するメガネを教えて貰って気になっています。笑

https://x.com/note_corp/status/1913052548862550404

DAY3

DAY3は、Treasure DataさんのDrinkupに参加してきました。Treasure Dataさん、美味しい料理ありがとうございました!
Make Parsers Compatible Using Automata Learning を発表されたFujinamiさんとお話ができました。発表は別のセッションを聞いていたので聞けていなかったのですが、どういうセッションだったのか概要を教えて頂いてとても貴重な時間でした(RubyKaigiの動画のアーカイブが上がったら視聴します!)。また、Leanerの方ともいろんなお話ができました!その方がデザインされたシールも貰ったのですが、ゆるいキャラクターで可愛かったです。

DAY4

RubyKaigiはDAY3までですが、DAY4は帰りの飛行機までに時間があったので、RubyKaigi 5kというカジュアルなランニングイベントに参加してきました。愛媛の街中を観光しつつ3日間で溜め込んだ脂肪を燃焼して良い時間でした!企画やランニングルートを考えてくださりありがとうございました。

https://x.com/kkd/status/1913426426390544539

https://x.com/yuki3738/status/1913394572178456762

英語はやっぱり難しい…

本編は事前にこれを見ようというスケジュールは立てていましたが、英語のセッションを聞いたときにナンモワカランとなり、そこからは日本語セッションを探して立ち回るようにしました。会場では日→英翻訳はあるのですが、英→日翻訳はないので事前になにか準備をしておかないと厳しい印象でした。

セッションも難しい…

RubyKaigiの心構え的な記事を事前に読んでおいて、Rubyを開発する人向けの高度なセッションなのは理解していたつもりですが、やっぱりその場で何もわからないと悔しかったです…

https://tech.mntsq.co.jp/entry/rubykaigi2024_jessie

事前勉強会などもあるみたいなので次は活用して少しでも持ち帰れるようになりたい…

https://smarthr.connpass.com/event/346323/

リアルイベントなので人に会える

当たり前のことなのですが、普段からフルリモートをしているとなかなか人と会う機会がなく、改めて実際に人に会って話すことは自分のモチベーションのためには大事だなと感じました。

また、Rubyを使う人たちが集まるイベントなので、昔開発支援でお世話になった人たちとも初オフラインで会えて嬉しかったですね!

他のエンジニアのアウトプットが刺激になる

同じ空間にいても人によってはその場でアウトプットしていたり、実際に手を動かしてみたりしていて、それを見て自分もparserのアウトプットをしたいと思っていたのですが中々難しかったです。こういうのは普段から手を動していかないと短時間でのアウトプットは難しいですね。でも、そういう姿を見てとても刺激になりました!

初めてのRubyKaigiでしたが、めっちゃ良かったです!
色んな場所で開催される形式は最近になってからだそうですが、今回は1500人以上の人が参加されており、今までで一番多い参加者数だったそうです。改めてRubyを使っている人や企業がたくさんこんなにいるんだなということと温かいコミュニティなんだと思いました。
本編ではわからないこととも多く悔しい思いをしたので、来年はなにか一つでも持ち帰れるようになりたいなと思いました。

フラッグシティパートナーズ海外不動産投資セミナー 【DMM FX】入金

Source link