RubyKaigi 2024 キーノートレポート

tomoya ishidaさん「Writing Weird Code」 ~RubyKaigi 2024 1日目キーノート

2024年5月15日から3日間、沖縄県那覇市の那覇文化芸術劇場なはーとにてRubyKaigi 2024が開催されました。

その一日目はtompngさん、あるいはペンさんことtomoya ishidaさんによるWriting Weird Codeと題されたキーノートからスタートしました発表スライド⁠。

tomoya ishida(tompng)さん

TRICKと奇妙なコード

IRBやRelineのメンテナとして活躍されているtompngさんは、TRICK 2022 Gold Medalistという肩書も持っています。

TRICK(Transcendental Ruby Imbroglio Contest for rubyKaigi)とはRubyで書かれた奇妙なプログラムで競い合うコンテストで、RubyKaigiにて不定期に開催されています。tompngさんは直近のRubyKaigi 2022で開催されたTRICK 2022 (Returns)にて、最高位であるGold賞を獲得しています。

まず「奇妙なコード」の例として、TRICK 2022受賞作品でtompngさん自身が作成した「fishbowl」の紹介から始まりました。

fishbowlのコードの実行結果

このプログラミング作品はQuine (自分自身と同じプログラムを出力するプログラム。シンプルな例としては eval( s=%(puts"eval( s=%%(%s))"%s ))) を拡張したもので、プログラムを実行すると水槽で魚が泳ぐアスキーアートのアニメーションが表示され、すべてのフレームで生成されたコードを実行すると、その続きからアニメーションが再開されるというものです。

さらにこの作品は、誤り訂正を行うコードを用いて破損したコードを復元することによって各フレーム間でのコードの変更が最小限なちらつきの少ないアニメーションで表現できるという解説が行われ、会場からは驚きと困惑のどよめきが上がっていました。

短くて奇妙なコードを書く

tompngさんは普段、短いコードを書くことを趣味としています。

短くて奇妙なコード(スライド26ページ)

記号の繰り返し

まず例として%が35文字続くコードについての解説がありました。これは空文字 ("") を返します。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # => ""

このプログラムはRubyの%記法による文字列リテラルと文字列のフォーマットを行うStringクラスのインスタンスメソッドString#%を組み合わせたものです。

%記法はクオートなどを用いずに文字列などを表現する記法であり、例えば%!s!"s"と等価になります。ここで、%に続く文字列を囲む文字(先の例だと!%を含む任意の記号を使えるため、%%s%"s"となり、%を3つ繰り返す%%%は空文字列 ("") となります。

また、String%は任意の引数を受け取って文字列をフォーマットするメソッドなので、結果として%が4n+3個続くコードは空文字を返す有効なRubyプログラムとなります。

%%%
# => ""

%%%%%%%
%%% % %%%
%%%.%(%%%)
# => ""

%%%%%%%%%%%
%%%.%(%%%.%(%%%))
# => ""

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
=> ""

他にも記号を繰り返して有効なプログラムになる例は他にもいくつかあります。例えば、+-などの単項演算子は無制限に繰り返すことが許されます++++++++aが、2つの変数に.が挟まる例a.....bだと、繰り返しの数によって構文上正しい場合とそうではない場合があります。.の数が1、2、3、5、6、8、9などの場合は正しい構文なのですが、例えば.が4つの場合a....b⁠、構文上解釈できる可能性が複数ある(a...).b(a..(..b)(a..)..bなど)ため、このような複数解釈される余地がある入力を構文エラーにするのもパーサの大切な役割であると説明しました。

a....bの例(スライド31ページ)

さらに他の例として%?+-をランダムに並べた文字列は最後に少し書き足すことによって正しい構文のRubyのコードになるというものが示されました。

%+?--+%-?%-+?%?+-%+%-?%-?-?-?%%+-++%+?-?-%?+---?-%-?-%?-??-?-%%-??++++-+?%++%%--?%-+??-??%++?-%-?+-+1:1:1:1 if false

これはそれぞれの記号が複数の役割があることによって実現されています。

tompngさんはこのコードから得られた教訓として、先頭からプログラムを読むのは比較的簡単だが、途中から読むことは困難だということを示し、これを念頭に置くことでIRBが後ろ向きにトークンを読む部分に関連したバグを直すことができたと言います。

様々な奇妙なコードたち

次にtompngさんが持ち出した奇妙なコードの例はヒアドキュメントについてです。

ヒアドキュメントには複数の種類があり構文も複雑なため、これらを組み合わせることで奇妙なコードを書くことができます。

HEREDOCの奇妙なコードの例(スライド38ページ)

このようなヒアドキュメントを用いた複雑なRubyのコードをIRB上で完全に正しくインデントを表記するのは困難です。IRBのメンテナとしてtompngさんはこの課題にも取り組んでおり、その成果の1つとして複数のヒアドキュメントが混在するコードをIRBで正しく表示できるにような修正の例を紹介しました。

IRBでのヒアドキュメントに関わるインデントの改善(スライド40ページ、41ページ)

しかしながら、より複雑で利用頻度が低い表現でIRBのカラーリングに失敗する事例もあり、低いコストで直せる方法を探しているとのことでした。

IRBでカラーリングに失敗するヒアドキュメントの例(スライド43ページと44ページ)

他にもtompngさんは文字エンコーディングや正規表現をテーマにRubyの言語仕様を用いた奇妙なコードを書く様々なテクニックを繰り出していきます。

なかでも、Rubyの正規表現を拡張して連立方程式を解けるようにする技は会場でも驚きの声があがりました。

Rubyの正規表現において、名前付きキャプチャを含む正規表現リテラルを=~で評価したらローカル変数にキャプチャした値を代入する機能/(?<x>.+/ ~= 'foo';x #=> "foo"から着想を得て作ったとのこと。以下のようなインターフェースで連立方程式を解く機能が実現されています。

solve(
  /2(?<x>)+3(?<y>)/ =~~~ 8,
  /5(?<x>)+2(?<y>)/ =~~~ 9
)
p([x, y]) #=> [1.0, 2.0]

この実装について詳しくは次のスライドのコードを読んでいただくとして、この奇妙なコードを実現しているのはRubyのパワフルなDSLとしての側面です。表現力の高いRubyは処理系の構文自体を変更することなく、擬似的な構文のようなものを定義できます。このRubyのDSLにおける高い表現力はRailsやRSpecなどで広く用いられています。

RegEqSolverのコード(スライド57ページ)

奇妙なコードを書くことの効能

ここまで示してきたコードを見てわかるように、ある種類のバグは奇妙なコードを書かなければ見つけることはできず、それらのテストコードもまた奇妙なコードになります。そのため、OSSなどにおいて奇妙なコードがテストコードに存在しており、それをtompngさんは「奇妙なコードが実用化されている」と表現しています。

このパートのまとめとして、奇妙なコードを書くことは楽しいパズルであり頭の体操になるだけではなく、Rubyについて深く理解する、さらにはRubyに貢献するチャンスになるとtompngさんは主張します。tompngさん自身もTRICKで入賞したコードをIRBに入れたらインデントがおかしかったことがIRB/Relineにコントリビューするきっかけになったそうです。

奇妙なコードを書くことによる様々なメリットを示したところで、キーノート前半「日常のパート」が締められました。

Self TRICK 2024

tompngさんは、続いて「非日常のパート」としてSelf TRICK 2024の開催を宣言します。沖縄をテーマにtompngさん自身がつくった6つの‟Most ???⁠なプログラムを次々と紹介していきました。

紹介された作品の簡単な説明は以下のとおりです。

  • Most Floral:Rubyプログラムとして実行可能なビットマップ形式の花の写真の画像ファイル
  • Most Fresh:ruby.wasmを用いてウェブブラウザ上で動くアニメーションを表示するプログラム
  • Most Wavy:揺れる波のanimation quine
  • Most Dangerous:マウスクリックでインタラクトできるクラゲのアスキーアートのアニメーション
  • Most Kaigi-ish: 設置することでRubyKaigi 2024の色合いをモチーフにしたIRB用のカラーテーマ
  • Most Eternalミンサー織りの画像をターミナル上で永遠に生成させるプログラム
Self TRICK 2024の作品群(スライド156ページ)

これらの作品は動きのあるものがほとんどなので、後日公開予定のキーノートの動画を見たり、公開されているプログラムを手元で実行して体験することをお薦めしますが、いくつかの作品について簡単なエッセンスを紹介します。

Most Floral

まず、Most Froralなプログラムとしてテッポウユリの写真が示されました。

Rubyプログラムとして実行可能なビットマップ画像(スライド73ページ)

これはRubyのプログラムとして実行可能なビットマップ(BMP)形式の画像ファイルです。BMP形式では画像データは各ピクセルごとの色を列挙したものであるため、その各ピクセルデータの下位1ビットのみをプログラム実行のためのデータと置き換えることによって、元画像とほぼ同じ見た目のままプログラムを入れ込むことを実現しています。

この画像データをRuby処理系で実行することによって画像と似たアスキーアートが表示され、会場は大きなどよめきに包まれました。

Most Fresh

Most FreshなプログラムはRubyKaigi 2024の会場である那覇文化芸術劇場なはーとのエントランス前に掲示されていました。今回参加したみなさんが目にしたものではないでしょうか。

会場の外のコードの写真

これはruby.wasmとウェブブラウザのCanvas APIを用いてRubyKaigi 2024をイメージしたアニメーションをウェブブラウザで表示する作品です。

Most Freshをウェブブラウザ上で実行すると表示されるアニメーション

これらの画像はすべてプログラムで描かれており、開発もSinatraで作られたコードフォーマッタやスクリーンキャプチャを行なうAPIを用いて行なわれています。また、この作品ではアニメーションの微調整やスクリーンキャプチャを安定して行うためにTime.nowを上書するなどのテクニックを用いており、Rubyのモンキーパッチの簡単さやrefinementsによる安全さが示されていると説明がありました。

Most Kaigi-ish

Most Kaigi-ishなプログラムはIRB(厳密にはそのバックエンドであるReline)のカスタムテーマであり、~/.irbrcに記述することで補完のダイアログがRubyKaigi 2024のカラーのアニメーションになるという作品です。

Most Kaigi-ishなIRBの画面

このテーマはirb-theme-rb2024という名前でRubyGemsに公開されているので、gem install irb-theme-rk2024 した上で~/.irbrcrequire 'irb/theme/rk2024'と記述するだけで手元のIRBで動かすことができます。

Relineにはバージョン0.4.0以降Reline::Faceという色のカスタマイズのためのAPIが作られましたが、この作品はReline.line_editorにモンキーパッチを当てるなどして挙動を劇的に変化させたものです。

Relineはバージョン0.5.0においてリアーキテクチャが行われ、行やダイアログを描画するための方法がReline::LineEditor#rerenderという単一メソッドに統一され、必要な差分のみを描画できるようになっており、このMost Kaigi-ishなプログラムはこのリアーキテクチャの恩恵を受けています。

tompngさんはこの作品のまとめとして、IRB/Relineが改善しつづけている(ので最新版を使ってほしい⁠⁠、RubyはインタラクティブシェルであるIRBのみならずデバッグ、型、ISPなど様々な開発者体験の向上にもフォーカスしていると話しました。

Most Eternal

最後に紹介されたMost Eternalなプログラムは、実行するとターミナル上でミンサー織りの模様を無限に続ける作品です。

ミンサー織りは沖縄の伝統的な織り物であり、そのモチーフである4つの四角形と5つの四角形は今回RubyKaigi 2024のロゴや会場で配られたかりゆしウェアにも登場します。この4つと5つの四角形のモチーフは「いつの世までも(五の四までも⁠⁠」という意味があると言います。

Most Eternalなプログラムが生成するミンサー織りの帯には4つの四角形と5つの四角形のモチーフに加えて五角形のRubyのマークが現われ、この作品に込められた思いを示しています。

ミンサー織りの帯の模様(スライド155ページ)

むすび

最後にtompngさんはスペシャルサンクスとして、RubyのクリエーターであるMatz、そのRubyが毎年良くなっていくこと、多くの場で使える状況になっていること、そしてそれらを実現する人々(== Rubyist)に感謝を述べました。

そのようなRubyistたちの話を聞くことができるRubyKaigi 2024を、そして奇妙なコードを書くことを楽しんでいきましょう、というむすびでRubyKaigi 2024の最初のキーノートは幕を降ろしました。


以上がtompngさんによるRubyKaigi 2024初日のキーノートのレポートです。

折りしも、3日目のYusuke Endohさんの発表の最後にTRICK 2025の開催がアナウンスしました。みなさんもこれから1年で奇妙なコードを書く力をつけてTRICK 2025に挑戦してみてはいかがでしょうか。

おすすめ記事

記事・ニュース一覧