RubyKaigi Takeout 2021に登壇しました
しおいです。
9/9-9/11に開催されたRubyKaigi Takeout 2021 DAY1にて登壇しました。
RubyKaigiはわたしにとって憧れのテックカンファレンスであり、Rubyと出会った当時からいつか登壇したいと願ってきたため、ありがたいことに今年その機会に恵まれてとても感慨深く思っています。
この記事ではプロポーザルを出すに至ったきっかけからRubyKaigi Takeout 2021本編登壇、そして後日開催されたFukuoka.rbでの感想戦参加までを振り返ります。
プロポーザル提出まで
前述の通りRubyKaigiはわたしにとって憧れであり、遠い雲の上のような存在でした。
そのためCFPがオープンされた当初はプロポーザルを出す予定はなく、今年は無理だけどいつかは出せたら良いなあ、などと考えながら、プロポーザルを出そうと準備されている他の人々を応援しながら過ごしていました。
風向きが変わったのは、Twitter上でRubyKaigiのチーフオーガナイザーであるamatsudaさんからこんなリプライを頂いたあたりからです。
RubyKaigiのような最高すぎるイベントが存在してたり存続してたりするのは割と偶然みたいな感じなので、その「いつか将来」の時点でRubyKaigiがまだ奇跡的に続いてる保証はどこにもないのですよ。というか、続いてないだろうと思っといたほうが良いぐらいです。
— Akira Matsuda (@a_matsuda) 2021年6月10日
そんなわけで、いつか将来、何かを作ったけどプロポーザルを未来永劫出しそびれてたことを悟って後悔する可能性は大いにあり得るとして、プロポーザルを早く出しすぎて後悔することってあり得ると思いますか?
— Akira Matsuda (@a_matsuda) 2021年6月10日
いや、ない(反語)。
(※ちなみにこのリプライの元ツイートでわたしが思いを馳せている「プロポーザル」は、もう少し先の日程で開催されるKaigi on Railsに対するものだったのですが、結果的にはRubyKaigiの方に集中することになりKaigi on Railsの方にはプロポーザルを出せずじまいでした…)
この時点では出すネタがまったく思いつかず、色々考え込んで無駄に落ち込んだりしていたのですが、その次に参加したAsakusa.rbのミートアップで人々から熱い熱いエールを頂き、さらにその後参加したFukuoka.rb主催のランチ会Nishitetsu.rbで人々から更にその5倍濃縮くらいの濃い濃いエールを頂き、いよいよ開き直ってプロポーザルを出す覚悟を決めました。
今日の西鉄.rb( #fukuokarb )でうづらさん、 #asakusarb で松田さんからそれぞれ「プロポーザルを出すとステージが変わる」とアドバイスを頂いたので、ネタがまとまるかどうかは一旦置いておいて、今年のRubyKaigiにプロポーザルを出せないかあと一週間案を練ってみようと思います。ひえー。
— しおい (Misaki Shioi) (@coe401_) 2021年6月22日
※余談ですが、同じくNishitetsu.rbに参加されてこの時のすったもんだやりとりを見ていたima1zumiさんはスッとプロポーザルを提出され、ススッと登壇を決めて当日(DAY 3)格好良い発表をされていたのでした。
※そしてNishitetu.rbの主催者であり、RubyKaigi登壇常連であるudzuraさんも圧巻の発表。
※Nishitetu.rbすごいな
プロポーザルの提出期限は6/30、この時すでに6/22、覚悟は決まったもののネタは無いのでまずはネタを絞り出す必要がありました。
自分自身がここしばらく心を寄せているネットワークプロトコル関連で何か喋りたいと思い、いくつか案を出しました。
- HTTP/2クライアントをRubyで自作する(自分自身が知識不足な上、格好良い先行gemが既にたくさんあるのでいまいち)
- TCPの上に自作のアプリケーションプロトコルをRubyで作る(ちょっと小ネタすぎる)
- TCPとHTTPの間に自作のアプリケーションプロトコルを追加できるフレームワーク(???)をRubyで作る(?????)
あまり意味はわからないですが、独創性、実装可能性、あとちょっと楽しそう(自分が)、という観点から3
をやってみることに決めました(6/25)
ざっと動くプロトタイプを作り(6/26)、頭を捻りながらプロポーザルを作文し、英語に直して何とか無事に提出することができました(6/27)。開き直ればやればできる。
RubyKaigiのプロポーザルを提出した!
— しおい (Misaki Shioi) (@coe401_) 2021年6月27日
まだ実装は全然終わっていないのでがんばる!! pic.twitter.com/PALwWmsmdx
Toycolの実装
この「TCPとHTTPの間に自作のアプリケーションプロトコルを追加できるフレームワーク」を使って自作したプロトコルを使うと、次のようにネットワーク通信を行うことができます。
登場人物は
- 自作プロトコル対応クライアント
- 自作プロトコルによるリクエストメッセージ
- 自作プロトコル対応サーバー
- アプリケーションサーバー
- Webアプリケーション
です。
通信の流れは
自作プロトコル対応クライアントから自作プロトコル対応サーバーへ 自作プロトコルによるリクエストメッセージを送る ↓ 自作プロトコル対応サーバーが自作プロトコルによるリクエストメッセージを 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についてお話しする機会があれば良いなあ、などと思っていたのですが、
> Your proposal for RubyKaigi Takeout 2021 has been accepted
— しおい (Misaki Shioi) (@coe401_) 2021年7月14日
!!!!!!??
(※早寝して起きたらすごいメールが届いていた)
何とacceptされてしまいました(7/15)
嬉しさと信じられない気持ちに圧倒されつつ、ここから必死でToycolの実装を進めたおかげで何とかToycolのメジャーバージョンリリースにこぎつけることができました(7/27)
あとは本編に向けて登壇準備を進めるのみ。
今年のRubyKaigiは登壇者自身が登壇形式を「録画」と「ライブ」のどちらか選べるようになっており、わたしの場合はRubyKaigiの大舞台で平常心を保てる自信が無かったために録画登壇を選ぶことにしました。
日本語スピーカーで録画の場合の締め切りは8/23です。
今度は必死に発表資料を作る日々が始まりました。
その間にプログラマになって丸3年を迎えたり、誕生日を迎えたり、ワクチン接種(2回目)をしたりしつつ、気づいたら発表資料の枚数が140枚を超えていました。
【進捗】発表資料をあれこれ修正した結果スライド枚数が140枚まで増えたのだけど、試しに最初の50枚くらいを読み上げながら時間を測ってみたら6分弱くらいだったので(???)、これなら何とか持ち時間25分内に収まるかもしれないという勇気が湧いてきた(????)
— しおい (Misaki Shioi) (@coe401_) 2021年8月9日
最終的に152枚まで増えた発表資料はこちらです。 speakerdeck.com
資料も大体整ったところで、8/19には半日がかりで登壇動画を録画し、資料と合わせて提出することができました。
なお事前にRubyKaigi運営チームから案内されていた録画ガイドが非常に丁寧でわかりやすく、初めての登壇動画でもスムーズに録画することができました。
RubyKaigi Takeout 2021本編参加
あとは本編を楽しむのみ。
ということで、当日3日間は一参加者としてしっかりRubyKaigiを堪能しました。
(以下はしばらく会期中のツイートが続きます)
今朝は8:00から気合を入れて仕事して、ここまでに一応進捗を出すことができたので準備万端🍔💨 #rubyKaigi
— しおい (Misaki Shioi) (@coe401_) 2021年9月9日
は〜 #rubykaigi めちゃめちゃ楽しいけど、オーガナイザーチームの皆さん本当にお疲れ様です…
— しおい (Misaki Shioi) (@coe401_) 2021年9月9日
お昼ごはん(🍔)を買ってこよう。
13:30再開とのことなので、わたしの発表は14:00~(JST)かな? ※もう気絶しそう
いただきます!! pic.twitter.com/UzeTQG4a7C
— しおい (Misaki Shioi) (@coe401_) 2021年9月9日
RubyKaigi Takeout 2021でお話しした「Toycol: Define your own application protocol」の発表資料はこちらです。
— しおい (Misaki Shioi) (@coe401_) 2021年9月9日
This is a slide from my presentation at RubyKaigi Takeout 2021.
Thank you for your attention!https://t.co/iQGSFDIB87 #rubykaigi #rubykaigiB
(わたしの登壇動画はこちらです。) www.youtube.com
#rubykaigi Day 1お疲れ様でした。
— しおい (Misaki Shioi) (@coe401_) 2021年9月9日
無事に(本当???)デビュー戦を終え、錚々たるRubyistたちに名を連ねることができて&沢山の方に発表を聴いて頂けて凄く嬉しいです。
とはいえやっぱり発表内容的には悔しさが残るので、もっともっと格好良い楽しいコードを書けるようにがんばっていくぞ…!!!!!🍔💨
今日の職場Slack
— しおい (Misaki Shioi) (@coe401_) 2021年9月9日
同僚「しおいさんの登壇をみんなで見るチャンネルはあるんですか?」
上司「こういうチャンネルがありますね👉#times_shioi 」
わたし「それわたしの分報チャンネルですね」
三鷹(論理)の辺りで懇親してました。
— しおい (Misaki Shioi) (@coe401_) 2021年9月9日
RubyKaigiの夜は楽しい…🍻
🍔Tシャツを着ました(Day2) #rubykaigi
— しおい (Misaki Shioi) (@coe401_) 2021年9月10日
これはライスバーガー 海鮮かき揚げ🍔 pic.twitter.com/682yWrv02B
— しおい (Misaki Shioi) (@coe401_) 2021年9月10日
#rubykaigi Day 2も楽しかった〜。
— しおい (Misaki Shioi) (@coe401_) 2021年9月10日
最高のトークを次から次へと浴びた後のRuby Committers vs the Worldで気持ちが高まりました💪🦾
あと皆が心置きなく伸び伸びコードを自慢しているのを聴いていて、この世の中にRubyKaigiがあって良かったなって嬉しくなりました。
#エモリハウス (論理)で懇親してました。
— しおい (Misaki Shioi) (@coe401_) 2021年9月10日
RubyKaigiで沸き立ったRubyistたちが日本全国から集ってわいわいしているの本当良すぎる🍶
※一旦締まりましたがまだやってます
Day 3も楽しむぞ〜🍔💨 #rubykaigi
— しおい (Misaki Shioi) (@coe401_) 2021年9月11日
(干してます) pic.twitter.com/Vv00Jx4x9M
— しおい (Misaki Shioi) (@coe401_) 2021年9月11日
#rubykaigi Takeout 2021、最高だった。
— しおい (Misaki Shioi) (@coe401_) 2021年9月11日
運営チームの皆さん、本当にありがとうございました。
また来年!!!!👋
#rubykaigi 感想戦にのんびり耳を傾けていたら名前を呼んで頂いてあわあわしてしまった。
— しおい (Misaki Shioi) (@coe401_) 2021年9月11日
ありがとうございました🙏
3日目の夜が終わってしまった…(寂しい)
— しおい (Misaki Shioi) (@coe401_) 2021年9月11日
冒頭から心が沸き立つような数々の発表を聴き、チャットとTwitterで人々の熱狂を感じ、🍔に舌鼓を打ち、運営チームの人々に感謝し、懇親会でくだを巻き、あっという間の3日間でした。
緊張しているうちに自分の発表は終わってしまったのですが、チャットやTwitterで沢山の反応を頂いて本当に嬉しかったです。
また、どの発表もとても難し楽しかったのですが、個人的に特に心に残っているのは
- mameさんのTypeProf for IDE: Enrich Dev-Experience without Annotations
- hasumikinさんのPRK Firmware: Keyboard is Essentially Ruby
- tagomorisさんのRactor's speed is not light-speed
- Ruby Committers vs the World
- unasukeさんのRuby, Ractor, QUIC
- MatzさんのKeynote
です。
特にうなすけさんのRuby, Ractor, QUIC
は、自分にとっての「こういうのをやってみたかった…!!(けど色々不足していてできなかった)」を体現したかのようなお話で、しびれました。
そうしてRubyKaigiの3日間が終わった後には、RubyKaigiがあって良かったなあ、と強く強く感じました。
Fukuoka.rb #226 RubyKaigi感想戦参加
かくしてお祭りは終わったかと思いきや、まだ終わっていませんでした。
わたしをRubyKaigiに送り出してくれたFukuoka.rbにて、9/15 RubyKaigi感想戦が開催されました。
わたし自身は途中参加につき、非常に悲しいことに他の人々のトークをあまり聴くことができなかったのですが、Fukuoka.rbのアットホームな空気の中で錚々たるRubyKaigi登壇者メンバーが集い、大変盛り上がっていたようで嬉しいです。
わたしは最後の登壇枠で、主にToycolの技術的な振り返りを発表をした他、最後の締めに 「エクストリームプログラミング」 第二版 の出版記念イベント「 角 征典×角谷 信太郎 XPは何を伝えたかったんだと思う?」から引用しつつ、自分なりに理解した「RubyKaigiとはどんな場所か」についてお話ししました。
(自分の発表者ノートより)
「エクストリームプログラミング」の原著者であるケント・ベックが純粋にプログラミングの可能性そのものを探究する人であるのと同様に、RubyKaigiに集う人々もまた(少なくともRubyKaigiの3日間ばかりは)純粋にRubyの可能性そのものを探究する人々なのではないか。
そして純粋に何かの可能性を探求するというのはやっぱり最高に楽しいし、要するにRubyKaigiは最高である。
#fukuokarb RubyKaigi感想戦お疲れ様でした🍜
— しおい (Misaki Shioi) (@coe401_) 2021年9月15日
終盤近くに参加したので他の登壇者の人々のお話があまり聞けず悲しい…とはいえいつものFukuoka.rbのリラックスした空気で楽しい時間を過ごしました。
あと自分の発表の最後に、一番言いたかった「RubyKaigiは最高」というお話ができたので満足です!!!!
終わりに
RubyKaigi Takeout 2021に登壇できて良かったです。
自分のこれまでの人生の中で一番の大舞台であり、Rubyプログラマとして一つの夢が叶った時間でした。
また、プロポーザルを出すために必死になった結果、松田さんとうづらさんから頂いたアドバイスのごとく「ステージが変わ」ったかどうかはわからないのですが、少なくとも開き直りの精神を身につけることはできたように思います。
今の自分の実力ではまだまだ到底手の届かないような格好良いソフトウェアを作れる日が来るのを待つのではなく、今持っているものの中で最高のソフトウェアを作るのだ、という気概を持つことができました。
一方で、もっと自分に経験と知識があれば、もっともっと格好良い楽しいソフトウェアを書けたかもしれないのに、という心残りもあります。
こうした心残りと、まだ知らないRubyとコンピュータの世界へのわくわくを来年以降への糧としていきたいです。
最後に、プロポーザルの提出に背中を押してくれたAsakusa.rbの人々とFukuoka.rbの人々(特にいつも力強く鼓舞して下さるうづらさんとjimlockさん)、
プロポーザルの英文添削に加えて技術的なアドバイスを下さったokuramasafumiさん、
いつも見守り、応援してくれる上司(そして職場の人々)、
最高のRubyKaigiを作ってくれたRubyKaigi運営チームの人々と他の登壇者の人々に感謝しています。
あと実装中や発表準備中、そしてRubyKaigi本編が終わってからも、自信がなくなりそうになった時Fukuoka.rbのebiflyyyyyyyyさんからかけてもらった言葉には何度も励まされました。
明日のしおいさんは今日のしおいさんよりも強いですし、明後日のしおいさんはもっと強いですよ
— 性格がおだやか (@ebiflyyyyyyyy) 2021年6月27日
2022年もプロポーザルを出せるように頑張るぞ!
おまけ
#kaigieffect ①
わたしの(現時点での) #kaigieffect はこれです(???) pic.twitter.com/8kdVv89Ayg
— しおい (Misaki Shioi) (@coe401_) 2021年9月12日
#kaigieffect ②
次はわたしの2つ目の #kaigieffect であるところの「dRubyによる分散・Webアプリケーション」をこつこつ読む。 pic.twitter.com/ZsFk0NPH6e
— しおい (Misaki Shioi) (@coe401_) 2021年9月16日
二冊とも絶賛読書中です。楽しい!!