RubyKaigi Takeout 2021に登壇しました

しおいです。
9/9-9/11に開催されたRubyKaigi Takeout 2021 DAY1にて登壇しました。

rubykaigi.org

RubyKaigiはわたしにとって憧れのテックカンファレンスであり、Rubyと出会った当時からいつか登壇したいと願ってきたため、ありがたいことに今年その機会に恵まれてとても感慨深く思っています。

この記事ではプロポーザルを出すに至ったきっかけからRubyKaigi Takeout 2021本編登壇、そして後日開催されたFukuoka.rbでの感想戦参加までを振り返ります。

プロポーザル提出まで

前述の通りRubyKaigiはわたしにとって憧れであり、遠い雲の上のような存在でした。
そのためCFPがオープンされた当初はプロポーザルを出す予定はなく、今年は無理だけどいつかは出せたら良いなあ、などと考えながら、プロポーザルを出そうと準備されている他の人々を応援しながら過ごしていました。

風向きが変わったのは、Twitter上でRubyKaigiのチーフオーガナイザーであるamatsudaさんからこんなリプライを頂いたあたりからです。

(※ちなみにこのリプライの元ツイートでわたしが思いを馳せている「プロポーザル」は、もう少し先の日程で開催されるKaigi on Railsに対するものだったのですが、結果的にはRubyKaigiの方に集中することになりKaigi on Railsの方にはプロポーザルを出せずじまいでした…)

この時点では出すネタがまったく思いつかず、色々考え込んで無駄に落ち込んだりしていたのですが、その次に参加したAsakusa.rbのミートアップで人々から熱い熱いエールを頂き、さらにその後参加したFukuoka.rb主催のランチ会Nishitetsu.rbで人々から更にその5倍濃縮くらいの濃い濃いエールを頂き、いよいよ開き直ってプロポーザルを出す覚悟を決めました。

※余談ですが、同じくNishitetsu.rbに参加されてこの時のすったもんだやりとりを見ていたima1zumiさんはスッとプロポーザルを提出され、ススッと登壇を決めて当日(DAY 3)格好良い発表をされていたのでした。

rubykaigi.org

※そしてNishitetu.rbの主催者であり、RubyKaigi登壇常連であるudzuraさんも圧巻の発表。

rubykaigi.org

※Nishitetu.rbすごいな


プロポーザルの提出期限は6/30、この時すでに6/22、覚悟は決まったもののネタは無いのでまずはネタを絞り出す必要がありました。
自分自身がここしばらく心を寄せているネットワークプロトコル関連で何か喋りたいと思い、いくつか案を出しました。

  1. HTTP/2クライアントをRubyで自作する(自分自身が知識不足な上、格好良い先行gemが既にたくさんあるのでいまいち)
  2. TCPの上に自作のアプリケーションプロトコルRubyで作る(ちょっと小ネタすぎる)
  3. TCPとHTTPの間に自作のアプリケーションプロトコルを追加できるフレームワーク(???)をRubyで作る(?????)

あまり意味はわからないですが、独創性、実装可能性、あとちょっと楽しそう(自分が)、という観点から3をやってみることに決めました(6/25)

ざっと動くプロトタイプを作り(6/26)、頭を捻りながらプロポーザルを作文し、英語に直して何とか無事に提出することができました(6/27)。開き直ればやればできる。

Toycolの実装

この「TCPとHTTPの間に自作のアプリケーションプロトコルを追加できるフレームワーク」を使って自作したプロトコルを使うと、次のようにネットワーク通信を行うことができます。

登場人物は

です。

通信の流れは

自作プロトコル対応クライアントから自作プロトコル対応サーバーへ
自作プロトコルによるリクエストメッセージを送る
    ↓
自作プロトコル対応サーバーが自作プロトコルによるリクエストメッセージを
HTTPフォーマットのリクエストメッセージへ変換する
    ↓
自作プロトコル対応サーバーがアプリケーションサーバーへ
HTTPフォーマットのリクエストメッセージを送る
    ↓
アプリケーションサーバーがWebアプリケーションを実行する
    ↓
アプリケーションサーバーから自作プロトコル対応サーバーへ
HTTPフォーマットのレスポンスを送る
    ↓
自作プロトコル対応サーバーが自作プロトコル対応クライアントへ
HTTPフォーマットのレスポンスを送る

のようになります。


例えば、「あひるの鳴き声によって動作するDuckプロトコル」はこんな感じです。

1.まずはサーバーを立ち上げます
 (config_duck.ruという名前のアプリケーションファイルを用意しています)

サーバー側

$ toycol server config_duck.ru
[Toycol] Start proxy server on duck protocol, listening on localhost:9292
=> Use Ctrl-C to stop
[Toycol] Start built-in server, listening on unix:///tmp/toycol.socket

2.クライアントが自作のプロトコルでリクエストメッセージを送ります
 (このメッセージは"GET /posts?user_id=1 HTTP/1.1\r\nContent-Length: 0\r\n\r\n"を意味します)

クライアント側

$ toycol client "quack, quack /posts<3user_id=1" 
[Toycol] Sent request message: quack, quack /posts<3user_id=1

3.サーバーがメッセージを受け取り、
 HTTPフォーマットに変換してアプリケーションサーバーに送り、
 そのレスポンスをクライアントに返します

サーバー側

[Toycol] Received message: "quack, quack /posts<3user_id=1"
[Toycol] Message has been translated to HTTP request message: "GET /posts?user_id=1 HTTP/1.1\r\nContent-Length: 0\r\n\r\n"
[Toycol] Successed to Send HTTP request message to server
[Toycol] Received response message from server: HTTP/1.1 200 OK
[Toycol] Finished to response to client

4.クライアントはサーバーからのレスポンスを受け取ります

クライアント側

---
[Toycol] Received response message:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 32

quack quack, I am the No.1 duck

(Duckプロトコルの実装はこちら→toycol/examples/duck at main · shioimm/toycol · GitHub)


ユーザーは自作プロトコルを定義することで、自作プロトコルに則ったリクエストメッセージを用いてWebアプリケーションを実行できる(ように見える)のです。

こうした「おもちゃのようなプロトコルを定義できるフレームワーク」ということで、このフレームワークにはToycol(Toy + Protocol)という名前をつけました。

Toycolの実装はこちらです。 github.com

Toycolはシンプルなフレームワークですが、二つの技術的要素を持っています。
ひとつはソケットに対してメッセージの読み書きを伴うネットワークプログラミングの要素。もう一つは、ユーザーが記述するRubyスクリプトを読み込み、解釈して後で実行するメタプログラミングの要素です。

Toycol自体の仕組みはシンプルでトリッキーな要素はありませんが、自分自身にとってはToycolの実装を通じて初めて取り組むことが沢山ありました。

発表準備 & 録画登壇

そうこうしているうちに、提出したプロポーザルの当落案内の時期がやってきました。

わたしはというとその頃にはプロポーザルを提出できて、動くソフトウェアを作っているというだけでとりあえず満足しており、これで落ちたとしても後悔は無いし、その場合はどこかの地域Ruby会議でToycolについてお話しする機会があれば良いなあ、などと思っていたのですが、

何とacceptされてしまいました(7/15)

嬉しさと信じられない気持ちに圧倒されつつ、ここから必死でToycolの実装を進めたおかげで何とかToycolのメジャーバージョンリリースにこぎつけることができました(7/27)

あとは本編に向けて登壇準備を進めるのみ。
今年のRubyKaigiは登壇者自身が登壇形式を「録画」と「ライブ」のどちらか選べるようになっており、わたしの場合はRubyKaigiの大舞台で平常心を保てる自信が無かったために録画登壇を選ぶことにしました。
日本語スピーカーで録画の場合の締め切りは8/23です。 今度は必死に発表資料を作る日々が始まりました。

その間にプログラマになって丸3年を迎えたり誕生日を迎えたりワクチン接種(2回目)をしたりしつつ、気づいたら発表資料の枚数が140枚を超えていました。

最終的に152枚まで増えた発表資料はこちらです。 speakerdeck.com

資料も大体整ったところで、8/19には半日がかりで登壇動画を録画し、資料と合わせて提出することができました。
なお事前にRubyKaigi運営チームから案内されていた録画ガイドが非常に丁寧でわかりやすく、初めての登壇動画でもスムーズに録画することができました。

RubyKaigi Takeout 2021本編参加

あとは本編を楽しむのみ。
ということで、当日3日間は一参加者としてしっかりRubyKaigiを堪能しました。
(以下はしばらく会期中のツイートが続きます)

(わたしの登壇動画はこちらです。) www.youtube.com

冒頭から心が沸き立つような数々の発表を聴き、チャットとTwitterで人々の熱狂を感じ、🍔に舌鼓を打ち、運営チームの人々に感謝し、懇親会でくだを巻き、あっという間の3日間でした。

緊張しているうちに自分の発表は終わってしまったのですが、チャットやTwitterで沢山の反応を頂いて本当に嬉しかったです。

また、どの発表もとても難し楽しかったのですが、個人的に特に心に残っているのは

です。

特にうなすけさんのRuby, Ractor, QUICは、自分にとっての「こういうのをやってみたかった…!!(けど色々不足していてできなかった)」を体現したかのようなお話で、しびれました。

そうしてRubyKaigiの3日間が終わった後には、RubyKaigiがあって良かったなあ、と強く強く感じました。

Fukuoka.rb #226 RubyKaigi感想戦参加

かくしてお祭りは終わったかと思いきや、まだ終わっていませんでした。

わたしをRubyKaigiに送り出してくれたFukuoka.rbにて、9/15 RubyKaigi感想戦が開催されました。

わたし自身は途中参加につき、非常に悲しいことに他の人々のトークをあまり聴くことができなかったのですが、Fukuoka.rbのアットホームな空気の中で錚々たるRubyKaigi登壇者メンバーが集い、大変盛り上がっていたようで嬉しいです。

わたしは最後の登壇枠で、主にToycolの技術的な振り返りを発表をした他、最後の締めに 「エクストリームプログラミング」 第二版 の出版記念イベント「 角 征典×角谷 信太郎 XPは何を伝えたかったんだと思う?」から引用しつつ、自分なりに理解した「RubyKaigiとはどんな場所か」についてお話ししました。

f:id:shioimm:20210918141901p:plain

(自分の発表者ノートより)

エクストリームプログラミング」の原著者であるケント・ベックが純粋にプログラミングの可能性そのものを探究する人であるのと同様に、RubyKaigiに集う人々もまた(少なくともRubyKaigiの3日間ばかりは)純粋にRubyの可能性そのものを探究する人々なのではないか。

そして純粋に何かの可能性を探求するというのはやっぱり最高に楽しいし、要するにRubyKaigiは最高である。

終わりに

RubyKaigi Takeout 2021に登壇できて良かったです。
自分のこれまでの人生の中で一番の大舞台であり、Rubyプログラマとして一つの夢が叶った時間でした。
また、プロポーザルを出すために必死になった結果、松田さんとうづらさんから頂いたアドバイスのごとく「ステージが変わ」ったかどうかはわからないのですが、少なくとも開き直りの精神を身につけることはできたように思います。
今の自分の実力ではまだまだ到底手の届かないような格好良いソフトウェアを作れる日が来るのを待つのではなく、今持っているものの中で最高のソフトウェアを作るのだ、という気概を持つことができました。

一方で、もっと自分に経験と知識があれば、もっともっと格好良い楽しいソフトウェアを書けたかもしれないのに、という心残りもあります。
こうした心残りと、まだ知らないRubyとコンピュータの世界へのわくわくを来年以降への糧としていきたいです。

最後に、プロポーザルの提出に背中を押してくれたAsakusa.rbの人々とFukuoka.rbの人々(特にいつも力強く鼓舞して下さるうづらさんとjimlockさん)、
プロポーザルの英文添削に加えて技術的なアドバイスを下さったokuramasafumiさん、
いつも見守り、応援してくれる上司(そして職場の人々)、
最高のRubyKaigiを作ってくれたRubyKaigi運営チームの人々と他の登壇者の人々に感謝しています。

あと実装中や発表準備中、そしてRubyKaigi本編が終わってからも、自信がなくなりそうになった時Fukuoka.rbのebiflyyyyyyyyさんからかけてもらった言葉には何度も励まされました。

2022年もプロポーザルを出せるように頑張るぞ!

おまけ

#kaigieffect ①

#kaigieffect ②

二冊とも絶賛読書中です。楽しい!!