RubyKaigi 2023に参加しました & 登壇しました
皆さんRubyKaigi 2023お疲れ様でした! あっという間で本当にたのしい3日間でしたね。わたしは一週間が経ってもいまだにわくわくした気持ちで日々を過ごしています。
今年もありがたいことにDAY2に登壇の機会をいただいたので、この記事では今回作ったものや会期中のあれこれを振り返ってみたいと思います。
今回の発表テーマを選んだきっかけ
今回はImplementing "++" operator, stepping into parse.yというタイトルにて「"MRIにインクリメント演算子を追加する"という取り組みを題材に、MRIの字句解析器(スキャナ)と構文解析器(パーサ)に親しむ」というテーマでプロポーザルを提出しました。
(今年のRubyKaigiはパーサ関連の発表が豊作だったので、思いがけず空前のパーサブームに加わることができて幸運でした)
自分自身の個人的な技術的興味はネットワークの分野にあるのですが、昨年のRubyKaigiに参加して、もう少しMRIの内部実装に対して自分の解像度を上げたいという気持ちが湧いた、というのがパーサに興味を持つことになったきっかけです。
発表の中で一番伝えたかったことは(発表中にうまいこと言えていなかった気がしますが)、プロポーザルのpitchに書きました。
The Ruby parser is very mature and there is an ambitious project underway to rewrite it.
(注: プロポーザルを書いた時点では金子さんの開発されているパーサジェネレータであるLramaの進捗をちゃんと把握していなかったので何かふわっとした表現になっています)
It made me feel as if parsers were out of reach for me.
But on the other hand, the fact that I was able to modify it, even though I am not a parser expert, is worth sharing to spark people's interest in the parser of Ruby. I don’t want Ruby internals to be unfamiliar to the rest of us.
わたしはRubyが好きなので、自分も含めてRubyの内部実装に親しんだり身近に感じられるともっとRubyがたのしくなるのではないかな、と思いこのようなPitchを書きました。
(その点でいうと人々が名著Rubyのしくみを読みたいと思うモチベーションももしかするとこの辺りにあるのかも…と勝手に思っております)
Ruby++開発日誌
とはいってもそもそも自分自身がMRI初心者なので、一体何から始めれば…と思っていたところ、Fukuoka.rbメンバーであるいでさんが前述のRubyのしくみや今回とてもお世話になったRubyソースコード完全解説(あるいはRuby Hacking Guide、RHG)を読まれていたのに触発されこれらの本を読み始めました。
(実はRubyのしくみはすでに読んだことがあったのですが、何度読んでも自分には難しく、今回が4回目か5回目の挑戦になりました。RHGのパーサの章も最終的には4回くらい読みました)
(あとは今回の題材に直接関係はないのですが、RubyでつくるRuby ゼロから学びなおすプログラミング言語入門を読んだり、WEB+DB PRESSで連載されていた「Rubyのウラガワ」を読んだり、Go言語でつくるインタプリタを読んでRubyで実装し直したりしていました)
ところで、前述のRHGの第 8 章「Ruby言語の詳細」「自己代入」の節には以下のような記述があります。
+=があるなら++もあるのかな、と思いきや++はない。なぜだろうか。 Rubyでは代入は言語処理系が扱うものである。一方メソッドはライブラリが実 行するものである。この二つ、即ち変数世界とオブジェクト世界、をきっぱり分けるというのはRubyの重要な特徴である。++を導入するとその区別が 壊れてしまいかねない。というのが++のない理由だ。
(Rubyソースコード完全解説 第 8 章「Ruby言語の詳細」「自己代入」)
つまり、Rubyに++
がないのは言語デザイン上の都合であり、実装上は足そうと思えば足せる状態にある、ということです。
この実装に挑戦してみることで当初の目的であった「MRIの内部実装に対して解像度を上げる」が部分的にであっても実現できるのではないか、と思い立ちました。
(RubyKaigi直前のAsakusa.rb Welcome Drinkupにて中田さんが「構文解析は言語実装の心臓部」と仰っていたので、結果的に切り口としてはなかなか良かったのではないかと思います)
ということで、Rubyにインクリメント演算子を足すために色々試行錯誤した結果がこちらです。
発表資料
発表をお聞きの方にはご存知の通り、上記のリポジトリには4パターンの++
演算子の実装があります。
++
をInteger#succ
で置き換える++
を自前のメソッドで置き換える++
をスキャナで+=1
に置き換える++
をパーサで+=1
に置き換える
発表内でご紹介したのは上記の順通りなのですが、発表後に何人かの方から「実際あの発表順通りに実装したわけではないですよね?」と突っ込みをいただきました。
仰る通りで実際には発表と真逆の順番で実装していったのですが、流れを考えた結果発表上は上記の順にご紹介しました。見透かされていてすごいなあ。
最初の実装
++
を実装する…といっても実際には何をすればよいのかさっぱりわからず、しばらくはparse.yやcompile.cやinsns.defあたりを開いては閉じ、宙を眺めるという無為な日々を送りました。
とりあえず思いついた案を並べると、
- 案1. レシーバを破壊的に変更するようなメソッドで
++
を置き換える - 案2. 字句解析時に
++
を読み込んだら+=1
を再現するような処理を行う - 案3. 新しい記号と構文規則を追加し、構文解析時に
++
を表す記号の並びを得たら+=1
を再現するような処理を行う
これらのいずれかに着手する前に、まずは取っ掛かりとして++
に一番挙動が近そうな+=1
を構文解析する際のMRIの挙動を調べようと思い、+=1
の構文解析ログと照らし合わせてparse.yを読むことに着手しました。
その際金子さんさんからいただいたアドバイスを参考にしたりしながら構文解析ログを一行ずつ読んでいるうち、何かだんだんたのしくなってきてしまい「このたのしさを誰かに伝えたい!」と勢い余って鹿児島Ruby会議02で構文解析ログリーディングのたのしみ方についてお話をするに至りました。
構文解析ログを一行ずつ読みながらスタックの状態を一つ一つ整理することによってスキャナとパーサが協調して動作する様子のイメージがつきやすくなるので、これはとてもよい経験でした。
また、この発表資料は発表前、金子さんとそしてRHGの著者である青木峰郎さんに内容の正誤確認をしていただきました。おかげさまでMRIにおける構文解析の様子をざっくり掴むのに便利な資料ができたのではないかと思います。その節は大変ありがとうございました。
(あと鹿児島Ruby会議02もとてもたのしかったです!)
そんなこんなでparse.yの様子が少しずつ掴めてきたのと、+=1
への理解が深まったところで最初に考えた案を再検討しました。
- 案1. レシーバを破壊的に変更するようなメソッドで
++
を置き換える- そもそも
Integer
はイミュータブルなので無理そう (→この案は後で3つ目の実装に引き継がれました)
- そもそも
- 案2. 字句解析時に
++
を読み込んだら+=1
を再現するような処理を行う- 要は字句解析時に
++
を読み込んだら記号tOP_ASGN
とtINTEGER
を返すということ。しかしスキャナは一度に2つの記号を返せないので無理そう (→この案は後で2つ目の実装に引き継がれました)
- 要は字句解析時に
- 案3. 新しい記号と構文規則を追加し、構文解析時に
++
を表す記号の並びを得たら+=1
を再現するような処理を行う- これは構文解析時に
new_op_assign()
を呼ぶだけなので、右辺(整数1
)の値を用意できさえすれば実現できるかも?
- これは構文解析時に
ということで最初に着手した実装は「案3. 新しい記号と構文規則を追加し、構文解析時に++
を表す記号の並びを得たら+=1
を再現するような処理を行う」でした。
このとき、+=
の右辺となる整数1
の値をどうやって作るかについてはちょっと悩みましたが、
- 整数
1
を字句解析する際に呼ばれる関数set_integer_literal()
が呼ばれてからパーサに記号を返すまでの流れを確認する - そのうち整数
1
のRNodeを作成するため必要そうな処理のみを抜き出す - ↑をアクションの中で実行する
と言う手順でこれを実現することができました。
そうして完成したのが最初の実装です(つまり、本発表における完成版のRuby++です)
裏話として、実は今年は当初30分のフルトークではなくLTの方にプロポーザルを出そうと思っていたため(※1)、当初はここまでの実装で一旦完成、という予定でした。
なのですが、その話を上司のmoroさんにしてみたところ「面白そうなので3つの案のうちなぜその実装を選んだのか、という試行錯誤も含めて30分トークの方に提出してみたら」と提案をいただき、また後日Ruby3.2のリリースパーティの席でも金子さんから「パーサに興味を持つ人は希少なので、LTと言わず30分喋ってください」(※2)とお誘いいただき、それならばとこの題材で30分喋ることができないか考え始めたのでした。
moroさん金子さん、その節はありがとうございました🙏
※1 本編での金子さんのLTがあまりに面白すぎたので、今となっては逆にLTだったら落ちていたかもな、と思っています
※2 金子さんご自身のRubyKaigiでの発表によってパーサに興味を持つ人が急増したっぽいので、結果的にこの言葉はfalseになってしまいましたが…
実装2: ++
をスキャナで+=1
に置き換える
さて一つ目の実装は完成したのですが、上述のRuby3.2のリリースパーティにて金子さんから「別の実装方法もあるのではないか」と示唆されたこともあり、「案2. 字句解析時に++
を読み込んだら+=1
を再現するような処理を行う」について実現できないか再検討してみました。
スキャナで+=1
を再現するにはスキャナから記号tOP_ASGN
とtINTEGER
を両方返す必要があります。
++
という文字の並びを凝視しているうち、ここに+
と+
という二つの文字があることを発見し、前方の+
でtOP_ASGN
、後方の+
でtINTEGER
を返すという方法を閃きました。
ということで出来上がったのがこちらです。
この実装では期待するスキャナの挙動を紙に書き起こしながら案を練りました。
実装中にも思いがけず苦労した点があり、それは当初、スキャナのカーソルの位置に対する自分の認識が間違っていたことによるものです。
/* Structure of Lexer Buffer: lex.pbeg lex.ptok lex.pcur lex.pend | | | | |------------+------------+------------| |<---------->| token */
( ruby/parse.y at master · ruby/ruby · GitHub )
問題になったのはここ、現在のカーソルの位置よりも一つ手前の文字を参照する部分です。
if (peekc_n(p, -2) == '+') { // ... }
ruby-plusplus/parse.y at 6b4f944aeaa5ec5d1c2c57d6e4e972aa519e6a64 · shioimm/ruby-plusplus · GitHub
「一つ手前」なのでpeekc_n(p, -1)
かと思いきや、当初思っていた位置よりも一つ先に進んだ場所にカーソルの読み込み位置があり、peekc_n()
の第2引数に-2
を渡す必要がありました。
同様のことをしたいと思われた方には是非お気をつけください、とお伝えしたいところなのですが、この実装については中田さんから後日「Note that peekc_n
does not consider negative offset.」というコメントをいただいています。素人考えって怖いですね。
(とはいえカーソル位置が実際どこなのかについて注意が必要、という点は知見なのではないかなと思います)
なお、この実装が実際にうまくいったかどうかについては発表でご紹介した通りです。
実装3: Binding#local_variable_set
でレシーバを置き換える
ここまで2パターンを実装できてしまった(?)ので、「案1. レシーバを破壊的に変更するようなメソッドで++
を置き換える」にも実装可能性を感じ始めてしまいました。
ということで出来上がったのがこちらです。
Integer#__plusplus__
メソッドの実装にあたりイミュータブルなレシーバの値を更新する方法に考えを巡らせていたのですが、今回のプロポーザルおよび後日発表資料の英語レビューをしてくださった大倉さんとお話ししていた際、大倉さんから「これがRubyのレイヤなら変数の値を更新するのにBinding#local_variable_set
を使うんですけどね」とのヒントをいただいてなるほどと膝を打ち、パーサのレイヤでもそれを実現できないか試してみることにしました。
改めまして大倉さん、ありがとうございました!
しかしいざアクションの実装に入ってみると当該環境を表すBinding
オブジェクトを得る方法がなかなかわからず、結果的には最も苦労した実装になりました。
要するに現在の実行コンテキストでself.binding
を呼び出した結果のRNodeが必要なのですが、この時self
を得るためにNEW_SELF()
を呼び出してしまうとそのself
は今実行しているコンテキストとは無関係の野良のself
(つまりmain
)になってしまうためです。
実行コンテキストとself
を紐づけるべくbinding
を呼んだ際の構文解析フローを追ってみたり、他にも思いついたこと目についたものを片っ端から試してみたのですがいずれもうまくいかず、self
とは一体何なのかすっかりわからなくなってしまいました。
「実行時のコンテキスト」とは一体何なのか…selfとは…🫠
— Misaki Shioi (しおい) (@coe401_) 2023年1月23日
万策尽きて一ヶ月ほど呆然としていたのですが、ふとRubyKaigi 2010でのあんどうやすしさんのLT、parse.yの歩き方 -ワシのRubyは4式まであるぞ-を観ていると、同じようにアクションの中でBinding
オブジェクトを取得しており、そのためにあんどうさんはNEW_VCALL()
を使用されているのを発見しました。
そしてこれを試してみたところ、やりたかったことがあっさりと実現できたのでした。なるほど、必要なRNodeはVCALL
でしたか…
ということであんどうさんとは直接面識がないのですが、おかげさまで実装が完成したのでこの場を借りてお礼を申し上げます。本当にありがとうございます。
なお、ここまで頑張って仕上げたこの実装の顛末は発表中でご紹介した通りです。
実装4: ++
でInteger#succ
を呼ぶ
ここまでの実装でプロポーザルを書き(正確に言うとひとつ前の実装はまだ完成していなかったのですが…)、ありがたいことにapproveをいただきました。
早速発表資料作りに取り掛かろうと思ったものの、上記の三つの実装のうち「案1. レシーバを破壊的に変更するようなメソッドで++
を置き換える」と「案2. 字句解析時に++
を読み込んだら+=1
を再現するような処理を行う」はあまりにもコンテキストが強力すぎて、これをうまいこと説明できる気がまったくしません。
ということで、++
を構文的に有効にするまでの一通りの流れを説明する用のシンプルな実装が必要だと思い、これを追加しました。
ここまで散々苦労してきたので、この実装は10分くらいで終わりました。練度✌️
(ちなみに) 後置演算子++
の話
ところで、今回の発表でご紹介しているi++
のようなスクリプトは後置演算子なので、++
よりも先にi
が評価された結果i++
の返り値自体はi
そのものになるのでは…と言うご指摘を発表後、複数名の方からいただきました。全くもってその通りです。
すみません、そこまでは実装する余裕がありませんでした。i
を先に評価する、というのはもう一段階挑戦が必要そうな気がするので、今回の発表でパーサに興味を持ったどなたかに試してみてほしい…
(ちなみに) 最終的なスライド枚数
ここまでの実装についての解説にスキャナとパーサの一般的な挙動の解説を加えて発表資料を完成させたところ、最終的に今回のスライド枚数は182枚になりました。過去最多!
上述の通り発表資料の英語に自信がなかったため大倉さんにレビューしていただきました。お手数おかけしました…🙏
RubyKaigi 2023 参加日誌
さて、ここからはそうしていよいよ迎えたRubyKaigi 2023の様子です。
(以降、会期中のツイート多め。いくつか他の方のツイートも引用していますので、もし問題がありましたらお手数ですがお知らせください。)
DAY0 (5/10)
遅ればせながら行ってきます🚃
— Misaki Shioi (しおい) (@coe401_) 2023年5月10日
周りにいる人が全員Rubyistな気がしてくる。 pic.twitter.com/8vh5lM2yER
あずさに乗って出発。
到着!お出迎えうれしい!! #rubykaigi pic.twitter.com/Praui5Adw8
— Misaki Shioi (しおい) (@coe401_) 2023年5月10日
松本駅に到着。お出迎えをいただきました。
この日の晩は現地の銭湯、塩井乃湯へお邪魔しました(Twitterでずっっっと「之」とtypoしていてすみません…)
塩井之湯、とっても良い湯でした…♨️ #rubykaigi
— Misaki Shioi (しおい) (@coe401_) 2023年5月10日
(ちなみに名前はミネラル分の多い泉質に由来するものとのこと。塩井さんにゆかりの湯というわけではなかった) pic.twitter.com/G3ri3CATEj
大正時代に建てられたという風情のある建物とミネラル分豊富な泉質で体が芯から温まるお湯をたのしむことができる素敵な銭湯でした。
わたしも塩井と申します、という話題からおかみさんとたくさんお話しできたのもうれしかったです。
公式サイトhttps://www.mcci.or.jp/www/sioinoyu/
DAY1 (5/11)
おはようございます #rubykaigi pic.twitter.com/6oHfpd5Vn0
— Misaki Shioi (しおい) (@coe401_) 2023年5月10日
女鳥羽川。
最高 #rubykaigi pic.twitter.com/5LsTR9yYNF
— Misaki Shioi (しおい) (@coe401_) 2023年5月11日
珈琲茶房かめのやのモーニング。
松本には行ってみたい純喫茶が行き尽くせないほどたくさんありますね。
#rubykaigi 会場に着いた!よろしくお願いします! pic.twitter.com/8xgPdyorhF
— Misaki Shioi (しおい) (@coe401_) 2023年5月11日
#rubykaigi pic.twitter.com/SDt0L7aJP7
— Misaki Shioi (しおい) (@coe401_) 2023年5月11日
会場に到着。たくさんの旗やのぼりが迎えてくれました。まつもと市民芸術館はとても素敵な会場で、特にメインホールは迫力があり、参加者としても気持ちが盛り上がりました。
この日はこんな感じで過ごしました。
- Matz Keynoteを聴く
- Ruby30周年ということで歴史のお話(大好き)
- 先日のRuby30周年記念イベントで高橋さんからもRubyが歩んだ30年を振り返るお話がありましたが、今回はまつもとさんから見たRubyの歴史ということで、プログラミング言語開発にまつわる生きた教訓を交えたお話となりました
- 初日のランチは一緒に参加していた会社の人々のうち、松本出身のメンバーの紹介で美味しいお蕎麦をいただきました。お店の名前を失念…
- 休憩中に五十嵐さんからRubyとRailsの学習ガイド2023を購入。これはWebアプリケーション開発の全体を見渡すいい本なので、特に最近Webアプリケーション開発を学び始めたという方におすすめです。
- ランチ後The future vision of Ruby Parserを聴く
- 自分の発表でも大変お世話になった金子さん。個人的に今年一番好きなトークでした。
- MRIのパーサの現状の課題とこれから先こうなると嬉しい、に対して正面から立ち向かい、次から次へと訪れる困難をばったばったと薙ぎ倒しながらパーサを開発されている様子が伺えて圧巻でした
- Ruby Parser開発日誌を読んで迎えたので、内容の半分くらいはつかめたかな…??という感じ
- 難しいんだけどもトークも面白いのですごい
- パーサジェネレータLramaについては事前にAsakusa.rb Welcome Drinkupでお会いした際に「僕らはエンジニアなので入力(今ある既存のparse.yをどう生かすか)のことも考えないといけない」と仰っていて格好いいなと思いました
- その後UTF-8 is coming to mruby/cを聴く
- その後のおやつ休憩の際、ログ処理について勉強させていただきます、ということでtagomorisさんからFluentd実践入門を購入。当日会場最後の一冊でした!
モリス本完売! #rubykaigi
— joker1007 (アルフォートおじさん) (@joker1007) 2023年5月11日
- 休憩明けにPower up your REPL life with typesを聴く
- みんな大好きTRICK 2022 (Returns) Gold Medalist ぺんさん
- katakata_irbについては以前がFukuoka.rbミートアップにいらしていた際に教わったのですが、その便利さとこれをどうやって実現しているのかさっぱりわからず感動しました。
- 発表を聴いていて、技術的な側面では全然理解できている気がしないのですが、Rubyの柔軟な文法をサポートするために一つずつ丁寧に仕事をこなしていらしてすごいな〜と思いました
- 続いてLightning Talksを聴く
- 初日のセッションはここまで
- 夜はOfficial Partyへ。ここで初めましての方や、なかなかお会いする機会のなかった憧れの方や、ちょいちょい顔は合わせるのだけどじっくりお話しする機会のなかった方とたくさんお話しできました。もっと話したかったな〜
- あと人と人のご縁を取り持つお手伝いができたりした場面もあったのでよかった…
#rubykaigi 一日目、刺激的な一日だった…!
— Misaki Shioi (しおい) (@coe401_) 2023年5月11日
相変わらず発表はわかったりわからなかったりして置いていかれているのだけど、すごいRubyistたちが皆さんたのしそうにお話しされていて嬉しくなってしまった。
廊下でもパーティでも色んな方と沢山お話して気持ちが高まったので、明日の発表がんばります! pic.twitter.com/nue4We4zX9
DAY2 (5/12)
#rubykaigi 二日目!快晴!! pic.twitter.com/CpeeN14CmU
— Misaki Shioi (しおい) (@coe401_) 2023年5月12日
この日は朝一で同時通訳の方々との打ち合わせがあったので喫茶店抜きで直接会場へ。
あの大量のスクリプトを捌いてくださった同時通訳の方々にとても感謝しております🙏
朝一で聴いたセッションは咳さんのLearn Ractorでした。
一緒に観ていたmoroさんが初っ端の「Concurrency is everywhere」というキラーフレーズにやられていたのがすごいよかったです。わたしは「Ractor間をまたぐ値はdeep copyされる」→dRubyっぽい!!「Ractor.make_shareable
された値はfreezeされる」→DRbUndumpedっぽい!!!!というお話に興奮していました。昨年に続きこれぞプログラマ、というトークで痺れました。
自分の出番は咳さんのすぐ後でした。
#rubykaigiC にてこの後10:20よりお話しする「Implementing "++" operator, stepping into parse.y」の発表資料です。
— Misaki Shioi (しおい) (@coe401_) 2023年5月12日
This is a slide from my presentation at RubyKaigi 2023. https://t.co/g0XyKGvVqf
よろしくお願いします! #rubykaigi
前日の金子さんのトークで会場内のパーサ熱が高まりに高まった結果、思いがけず本当にたくさんの方がトークを聴きにきてくださいました。
本当にありがとうございます。部屋に入れなかった、という方もいらしたようなので、もしよければ後日アーカイブなどをご覧いただけるととても嬉しいです。
会場のRubyistたちのあたたかい雰囲気に助けてもらい無事に発表を終えました!!!!
— Misaki Shioi (しおい) (@coe401_) 2023年5月12日
ありがとうございました!!!! #rubykaigi https://t.co/1vZVYSi65X
始まるまでは緊張していたのですが、いざ話し始めてみると会場の雰囲気があたたかかったおかげで、これまでで一番リラックスしてお話しできた発表になりました。
(あとはもしかすると去年の件でちょっとだけ肝が据わったかも…?)
自分の発表の後、この日はこんな感じで過ごしました。
- Yet Another Ruby Parserを聴く
- その後のランチ休憩中にとりいさんからユウと魔法のプログラミング・ノートを購入
- 会場でのちょっとした空き時間に冒頭部分を読み、やさしい語り口に早速ぐいぐい引き込まれてしまいました。帰ってきてからまだばたばたしていて読み進めることができていないのですが、早く続きが読みたい!
- お昼ごはんは何人かの方とご一緒し、この日はお蕎麦ではなく美味しい焼き肉をいただきました。お店の名前を失念…
- 時間の都合上、ランチ直後のトークに間に合わず😂
- ランチ後はとりいさんのReading and improving Pattern Matching in Rubyを聴く
セッションを経て翌日の様子(parse.yとcompile.cは神がかり的所業)
今日はしおいさんと
— やきとりい (@yotii23) 2023年5月13日
「parser.y読むのすごい」
「compile.c読むのすごい」
って言い合ったのがよかったです。
- その後Fitting Rust YJIT into CRubyを聴く
- 2日目の最後、MaximeさんによるKeynote、Optimizing YJIT’s Performance, from Inception to Productionを聴く
- この日のセッションはここまで
- 帰る前に角谷さんに研鑽Rubyプログラミングへサインをいただきました
2日目が終わっての感想。
#rubykaigi 二日目たのしかった!!(自分の出番も終わってひと安心…)
— Misaki Shioi (しおい) (@coe401_) 2023年5月12日
色んな人のお話を会場や廊下で聴いて、どんな偉業も時間をかけた試行錯誤の先に成されるのだな、これがエンジニアリングなのだな、と思ったりしていました。
まだまだお話ししたい人々が沢山いるので、明日もよろしくお願いします! pic.twitter.com/WMxXf32ykG
写真は自分の発表後にmiwaさんからお土産にいただいたhikari no caféさんのおやつです!(自慢)
大切にいただきました。ありがとうございます!
この日はこの後会社の人々と晩ごはんをいただいたのですが、その間にRubyのmasterではLramaがBisonを置き換え(これにより金子さんはいわゆる"The Bison slayer"の異名を得て)、Ruby 3.3.0-preview1がリリースされていました。すごい!!!!
Ruby 3.3.0-preview1 Released https://t.co/2Uwfg2NmOF
— Ruby Programming Language (@rubylangorg) 2023年5月12日
夜、チームの人々と飲んでいる間にRuby 3.3.0-preview1がリリースされていてめでたい㊗️
— Misaki Shioi (しおい) (@coe401_) 2023年5月12日
(この夜は本当はもう少し遊び歩きたかったのですが、ほんのちょっとだけ疲労もあり、体調優先で早寝しました)
DAY3 (5/13)
おはようございます #rubykaigi pic.twitter.com/JQiDSlp0Cp
— Misaki Shioi (しおい) (@coe401_) 2023年5月12日
朝は今回Rubyistたちに大人気だった珈琲美学アベへ。
モカクリームオーレとても美味しかったです。
#rubykaigi 三日目もよろしくお願いします(給水完了アピール) pic.twitter.com/LRrpuVtxAV
— Misaki Shioi (しおい) (@coe401_) 2023年5月13日
「松本市はお水がおいしい」という事前情報を得ていたので毎朝マイ水筒に水を汲んで会場に参じていました。
とうとう最終日、ということで朝一でRuby Committers and The Worldが始まる前にえもりさんとやださんからはじめてつくるWebアプリケーション〜Ruby on Railsでプログラミングへの第一歩を踏み出そうを購入しました。
こちらははじめてプログラミングを学ぶ方向けの書籍ではあるのですが、Webアプリケーション、のWebのところに最初からしっかりフォーカスが当たっていてこれは良書だなと思いました。
自分が誰かに(Web)プログラミングについて伝える際(e.g. Rails Girlsにコーチで参加するときとか)に上述の「ユウと魔法のプログラミングノート」と「はじめてつくるWebアプリケーション」を読んでおくといい効果が期待できそう。
(もうお一人の著者であるcobachieさんにもサインをいただく気満々だったのですが、その日のうちにお話しする機会がなくサインをいただき損ねてしまいました。これは松本にもう一度伺うしか…??)
そうして始まった「Ruby Committers and The World」。
ここまでですでに色々ありすぎて処理しきれない最高たのしい #rubykaigi pic.twitter.com/AZuWdHmQNS
— Misaki Shioi (しおい) (@coe401_) 2023年5月13日
今回も最高でしたがパーサの話題だったり正規表現の話題だったりetc...の重要トピックについて議論が交わされ、Rubyの未来についてちょっとしんみりしているところへAaronさんによるRuby 4へのご提案で会場が笑いに包まれたのでした。ちょっと笑いに貢献できて嬉しい。
この後、この日はこんな感じで過ごしました。
- Build Your Own SQLite3を聴く
- 最終日のランチは流れで何人かの方とご一緒させていただき、美味しい鴨つけそばをいただきました。やっぱりお店の名前を失念…
#rubyfriends pic.twitter.com/VyjFOFNC1V
— anna (@ae__B_) 2023年5月13日
- ランチ後Ruby vs Kickboxer - the state of MRuby, JRuby and CRubyを聴く
- トークの合間に金子さんから一日目のLTの続き(幻のAdvanced編)を披露していただく
- ここから先がまたとてつもなく面白かった
- Rubyの柔軟な文法を叶えようと色んなハックで頑張っているのがわかるのでおすすめです。聴いているうちparse.yの向こうに人がいる…!という気持ちになっていました。
Advanced 説明会が行われてました@spikeolaf @coe401_ #rubykaigi #rubykaigi2023 pic.twitter.com/MJkITdsm97
— えりりん (@suuuuengch) 2023年5月13日
- ここ辺りからちょっと色々ばたばたしていたり、聴きたかったトークが満席だったりして基調講演までホールに戻れず
- その代わりに色んな人とじっくりお話しする時間をとれたのでそれはそれでよかった…
- 最後にSoutaroさんによるClosing Keynote Parsing RBSを聴く
そして、Closing Keynoteの後、とうとう閉会の時間がやってきました。
2017年に始まりコロナ禍を経て松本でRubyKaigiを開催するに至るまでの長い道のりと、とうとうそれを実現したNiceなTeamの皆さんが壇上から手を振る姿に、どれだけ拍手を送っても足りない気持ちでした。
#rubykaigi 三日目、最高のKaigiをありがとうございました!!!!
— Misaki Shioi (しおい) (@coe401_) 2023年5月13日
また来年!!!! pic.twitter.com/WhX4KhNve0
本当にありがとうございました。
RubyKaigi 2023は夢のような奇跡のような、あっという間の3日間でした。
今年は初参加の方もたくさんいらしていたという印象ですが、初めての人々にもこの感じを持って帰ってもらえますように。来年また沖縄で集まることができたら嬉しいなと思います。
この後はSTORESさん主催のAfter Partyに参加したり
このパーサ関係者感さいこう #rubykaigi pic.twitter.com/psCKC4zEFH
— tagomoris (@tagomoris) 2023年5月13日
その後中田さんとゆうぞうさんについていったらその先でこんなことになったり
パーサーを1から教えてください!!
— 😺 (@neko314_) 2023年5月13日
の図#rubykaigi pic.twitter.com/vpUtFqaJIf
最終的に懐かしのTama.rbになったり
偶然に偶然が重なって、三日目の最後にTama.rbのみんなで集まることが出来ました!!コミュニティはコロナ禍で解散してしまったけれど、こうしてまた集まれて、「また来年沖縄で!」なんて約束も出来て、最高の思い出になりました。ありがとうRubyKaigi!!
— けん (@ken3ypa) 2023年5月13日
#rubyfriends pic.twitter.com/xnkLdZPVUP
そして翌朝はこうなる。
RubyKaigiの夢ばかり見て、早く会場に行かないと、あの人ともこの人ともお話ししたいし…と寝ぼけながら目が覚めたけど、今日はもうRubyKaigiはないんだった…寂しい。
— Misaki Shioi (しおい) (@coe401_) 2023年5月13日
実は次の日ものんびり松本観光をしようと街を歩いていると色々とたのしい出来事があったのですが、夕方には無事に帰路につき…
帰宅!お疲れさまでした!! #rubykaigi pic.twitter.com/PSWCguqnYM
— Misaki Shioi (しおい) (@coe401_) 2023年5月14日
終わってみて一つだけ後悔しているのは、会期中もっと気軽にたくさん色んな人々と写真を撮っておくべきだったな、ということです。
せっかく#rubyfriendsというハッシュタグがあるので、これに託けて来年はもっと写真を撮れたらいいな。
ということで、今年も来年以降もわたしの写真は自由にアップロードしてくださって問題ありません(その際にメンションを頂けると嬉しい!)
RubyKaigi 2024
— RubyKaigi (@rubykaigi) 2023年5月13日
Naha, Okinawa
May 15th..17th, 2024#rubykaigi
来年もよろしくお願いします!
その他に書き残しておきたいこと① 「無名の質」、そしてNice Teamのみなさんへ
「無名の質」という言葉を噛みしめる
— Misaki Shioi (しおい) (@coe401_) 2023年5月13日
Kaigiの間、「RubyKaigiとはいかなる場なのか」を表現するため何度か目にしたり耳にしたり自分でも口にした「無名の質」という言葉があります。
この言葉の出典は建築家クリストファー・アレグザンダーによる「時を超えた建設の道」です。わたし自身は「パターン、Wiki、XP」を読んでいて初めて知りました。
RubyKaigiという場は、端的に言葉で表現しようとすると「たのしい」だったり「最高」のような、それは本当にそうなんだけれどもそれだけではとても言い尽くせないよさを持つ場です。
ある種の混沌の中であらゆることがあらゆる場所であらゆる人の身に、魔法のように同時多発的に有機的に発生していて、それが人々を生き生きとさせているのだと思います。このよさをうまいこと言えないのは、それが名前のつけられない「無名の質」だからなのでしょう。
こうした場を作ってくださったオーガナイザーとヘルパーの皆さん、Rubyコミッターと登壇者の皆さん、そして参加者の皆さんにとても感謝しています。また、自分がそのうちの一人であったことを嬉しく思います。
特に2017年から松本でのRubyKaigiを実現しようと奔走されていたオーガナイザーの皆さんにはこの7年間、大変なご苦労があったと思います。本当にお疲れ様でした。
その他に書き残しておきたいこと② 「同じコミュニティの中の人同士になっていく」ということ
RubyKaigiを終えて改めて感じたことのうち一つです。
初めての人と会う時はお互い手探りなので、相手の持っている客観的な情報から相手がどんな人なのかを想像するしかないのだけど、お話しするうち自分にとってその人が「そうした情報を纏った人」ではなくて「その人そのもの」になっていくのがとても嬉しい。RubyKaigiでもそんな場面が何度もあった。
— Misaki Shioi (しおい) (@coe401_) 2023年5月17日
RubyKaigiで人とお話ししていると、そのうちだんだん相手が「こういう客観的情報を持った人」でありかつ「自分がいるのと同じコミュニティの人」でもある、と実感できる瞬間があったりして、そうした瞬間がわたしはとても好きです。
それが「コードの向こうには人がいる」を肌身で感じることができる瞬間であるためです。そしておそらくそれは相手の方にとっても同様なのだろうと思います。
わたしはRubyコミュニティに出会うまでずっと人付き合いに苦手意識を持っていたので何か不思議な感じがしますが、こうして人同士が対話をし、同じ時間を過ごすうち「同じコミュニティの中の人同士」になっていくのだな、という気がしています。
(と思ったら3年前の自分がすでにそれを大江戸Ruby会議08でお話ししていたのでえらい…)
その他に書き残しておきたいこと③ 2024年に向けて
今回は想定外に沢山の人々に発表をたのしんでもらえて本当に嬉しかったのだけど、それと同時に今日、未来への宿題を頂けたのが一番良かったなと思う。
— Misaki Shioi (しおい) (@coe401_) 2023年5月14日
何から始めたら良いかさっぱりわからないので時間はかかるかもしれないけど、自分なりのたのしさに沿ってやっていきたいな。
最終日の翌日に角谷さんから発破を掛けられたのもあり、この後は元々の興味にちょっと方向性を戻して再びネットワーク方面を勉強していこうかなと思っております。
会期中、ゆうぞうさんに「ネットワークの世界は広くて深い沼なので(というかコンピュータの世界全体がそうなのですが)、どこから手をつけたら…」という相談を持ちかけたところいくつかヒントをいただけたので、とりあえず足場からこつこつ固めていきたいです。
まずはそのとっかかりとしてちょうどKaigi直前に公開されていたRubyKaigiとDNS-over-HTTPSとDDRを読んでみたところ、(ちゃんと内容を理解はできている気はしないけど)KaigiのWiFiを支えるNOCの皆さんが自在にネットワークを操っておられる様子に感銘を受け、今の時点では割と苦手意識のあるDNSについてちゃんと勉強してみようと思い立ち、結果こうなりました(※)
わたしの今のところの #kaigieffect は昨日池袋のジュンク堂書店で買った「DNSがよくわかる教科書」と「ピアリング戦記」です(???) pic.twitter.com/2dtnVhq5LM
— Misaki Shioi (しおい) (@coe401_) 2023年5月16日
引き続きがんばります!
(※後日Cookpadさん主催のアフターイベントでこの記事を執筆された花月さんにご挨拶できてよかったです。その際そらはさんから「異常KaigiEffect」と呼ばれました)