2024年5月15日から3日間、沖縄県那覇市の那覇文化芸術劇場なはーとにてRubyKaigi 2024が開催されました。
その一日目はtompngさん、あるいはペンさんことtomoya ishidaさんによる
TRICKと奇妙なコード
IRBやRelineのメンテナとして活躍されているtompngさんは、TRICK 2022 Gold Medalistという肩書も持っています。
TRICK
まず
このプログラミング作品はQuine (自分自身と同じプログラムを出力するプログラム。シンプルな例としては eval( s=%(puts"eval( s=%%(%s))"%s ))
) を拡張したもので、プログラムを実行すると水槽で魚が泳ぐアスキーアートのアニメーションが表示され、すべてのフレームで生成されたコードを実行すると、その続きからアニメーションが再開されるというものです。
さらにこの作品は、誤り訂正を行うコードを用いて破損したコードを復元することによって各フレーム間でのコードの変更が最小限なちらつきの少ないアニメーションで表現できるという解説が行われ、会場からは驚きと困惑のどよめきが上がっていました。
短くて奇妙なコードを書く
tompngさんは普段、短いコードを書くことを趣味としています。
記号の繰り返し
まず例として%
が35文字続くコードについての解説がありました。これは空文字 (""
) を返します。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # => ""
このプログラムはRubyの%記法による文字列リテラルと文字列のフォーマットを行うStringクラスのインスタンスメソッドString#%
を組み合わせたものです。
%記法はクオートなどを用いずに文字列などを表現する記法であり、例えば%!s!
は"s"
と等価になります。ここで、%
に続く文字列を囲む文字!
)%
を含む任意の記号を使えるため、%%s%
は"s"
となり、%
を3つ繰り返す%%%
は空文字列 (""
) となります。
また、String%
は任意の引数を受け取って文字列をフォーマットするメソッドなので、結果として%
が4n+3個続くコードは空文字を返す有効なRubyプログラムとなります。
%%%
# => ""
%%%%%%%
%%% % %%%
%%%.%(%%%)
# => ""
%%%%%%%%%%%
%%%.%(%%%.%(%%%))
# => ""
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
=> ""
他にも記号を繰り返して有効なプログラムになる例は他にもいくつかあります。例えば、+
や-
などの単項演算子は無制限に繰り返すことが許されます++++++++a
).
が挟まる例a.....
).
の数が1、2、3、5、6、8、9などの場合は正しい構文なのですが、例えば.
が4つの場合a....
)、構文上解釈できる可能性が複数ある(a...).b
、(a..(..
、(a..)..
など)
さらに他の例として%?+-
をランダムに並べた文字列は最後に少し書き足すことによって正しい構文のRubyのコードになるというものが示されました。
%+?--+%-?%-+?%?+-%+%-?%-?-?-?%%+-++%+?-?-%?+---?-%-?-%?-??-?-%%-??++++-+?%++%%--?%-+??-??%++?-%-?+-+1:1:1:1 if false
これはそれぞれの記号が複数の役割があることによって実現されています。
tompngさんはこのコードから得られた教訓として、先頭からプログラムを読むのは比較的簡単だが、途中から読むことは困難だということを示し、これを念頭に置くことでIRBが後ろ向きにトークンを読む部分に関連したバグを直すことができたと言います。
様々な奇妙なコードたち
次にtompngさんが持ち出した奇妙なコードの例はヒアドキュメントについてです。
ヒアドキュメントには複数の種類があり構文も複雑なため、これらを組み合わせることで奇妙なコードを書くことができます。
このようなヒアドキュメントを用いた複雑なRubyのコードをIRB上で完全に正しくインデントを表記するのは困難です。IRBのメンテナとしてtompngさんはこの課題にも取り組んでおり、その成果の1つとして複数のヒアドキュメントが混在するコードをIRBで正しく表示できるにような修正の例を紹介しました。
しかしながら、より複雑で利用頻度が低い表現でIRBのカラーリングに失敗する事例もあり、低いコストで直せる方法を探しているとのことでした。
他にも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などで広く用いられています。
奇妙なコードを書くことの効能
ここまで示してきたコードを見てわかるように、ある種類のバグは奇妙なコードを書かなければ見つけることはできず、それらのテストコードもまた奇妙なコードになります。そのため、OSSなどにおいて奇妙なコードがテストコードに存在しており、それをtompngさんは
このパートのまとめとして、奇妙なコードを書くことは楽しいパズルであり頭の体操になるだけではなく、Rubyについて深く理解する、さらにはRubyに貢献するチャンスになるとtompngさんは主張します。tompngさん自身もTRICKで入賞したコードをIRBに入れたらインデントがおかしかったことがIRB/
奇妙なコードを書くことによる様々なメリットを示したところで、キーノート前半
Self TRICK 2024
tompngさんは、続いて
紹介された作品の簡単な説明は以下のとおりです。
- Most Floral:Rubyプログラムとして実行可能なビットマップ形式の花の写真の画像ファイル
- Most Fresh:ruby.
wasmを用いてウェブブラウザ上で動くアニメーションを表示するプログラム - Most Wavy:揺れる波のanimation quine
- Most Dangerous:マウスクリックでインタラクトできるクラゲのアスキーアートのアニメーション
- Most Kaigi-ish: 設置することでRubyKaigi 2024の色合いをモチーフにしたIRB用のカラーテーマ
- Most Eternal:ミンサー織りの画像をターミナル上で永遠に生成させるプログラム
これらの作品は動きのあるものがほとんどなので、後日公開予定のキーノートの動画を見たり、公開されているプログラムを手元で実行して体験することをお薦めしますが、いくつかの作品について簡単なエッセンスを紹介します。
Most Floral
まず、Most Froralなプログラムとしてテッポウユリの写真が示されました。
これはRubyのプログラムとして実行可能なビットマップ
この画像データをRuby処理系で実行することによって画像と似たアスキーアートが表示され、会場は大きなどよめきに包まれました。
Most Fresh
Most FreshなプログラムはRubyKaigi 2024の会場である那覇文化芸術劇場なはーとのエントランス前に掲示されていました。今回参加したみなさんが目にしたものではないでしょうか。
これはruby.
これらの画像はすべてプログラムで描かれており、開発もSinatraで作られたコードフォーマッタやスクリーンキャプチャを行なうAPIを用いて行なわれています。また、この作品ではアニメーションの微調整やスクリーンキャプチャを安定して行うためにTime.
を上書するなどのテクニックを用いており、Rubyのモンキーパッチの簡単さやrefinementsによる安全さが示されていると説明がありました。
Most Kaigi-ish
Most Kaigi-ishなプログラムはIRB~/.irbrc
に記述することで補完のダイアログがRubyKaigi 2024のカラーのアニメーションになるという作品です。
このテーマはirb-theme-rb2024という名前でRubyGemsに公開されているので、gem install irb-theme-rk2024
した上で~/.irbrc
にrequire 'irb/
と記述するだけで手元のIRBで動かすことができます。
Relineにはバージョン0.Reline::
という色のカスタマイズのためのAPIが作られましたが、この作品はReline.
にモンキーパッチを当てるなどして挙動を劇的に変化させたものです。
Relineはバージョン0.Reline::
という単一メソッドに統一され、必要な差分のみを描画できるようになっており、このMost Kaigi-ishなプログラムはこのリアーキテクチャの恩恵を受けています。
tompngさんはこの作品のまとめとして、IRB/
Most Eternal
最後に紹介されたMost Eternalなプログラムは、実行するとターミナル上でミンサー織りの模様を無限に続ける作品です。
ミンサー織りは沖縄の伝統的な織り物であり、そのモチーフである4つの四角形と5つの四角形は今回RubyKaigi 2024のロゴや会場で配られたかりゆしウェアにも登場します。この4つと5つの四角形のモチーフは
Most Eternalなプログラムが生成するミンサー織りの帯には4つの四角形と5つの四角形のモチーフに加えて五角形のRubyのマークが現われ、この作品に込められた思いを示しています。
むすび
最後にtompngさんはスペシャルサンクスとして、RubyのクリエーターであるMatz、そのRubyが毎年良くなっていくこと、多くの場で使える状況になっていること、そしてそれらを実現する人々
そのようなRubyistたちの話を聞くことができるRubyKaigi 2024を、そして奇妙なコードを書くことを楽しんでいきましょう、というむすびでRubyKaigi 2024の最初のキーノートは幕を降ろしました。
以上がtompngさんによるRubyKaigi 2024初日のキーノートのレポートです。
折りしも、3日目のYusuke Endohさんの発表の最後にTRICK 2025の開催がアナウンスしました。みなさんもこれから1年で奇妙なコードを書く力をつけてTRICK 2025に挑戦してみてはいかがでしょうか。