見出し画像

#RubyKaigi 2022 0日目〜1日目レポート

RubyKaigi 2022 にヘルパースタッフとして参加しました

今、私は三重県津市で開催中のRubyKaigi 2022にヘルパースタッフとして参加しています。ヘルパースタッフは当日のお手伝いをする役割なのですが、私は主に同通レシーバーの貸し出し周りを担当しています。

0日目:青春18きっぷでカンファレンスを目指すのは疲れる

私は、行きの交通手段に青春18きっぷを選びました。9月10日まではJR屈指の格安きっぷである青春18きっぷが使えますが、この青春18きっぷでは快速列車含む普通列車しか乗ることができません。

始発で出発、そして普通列車グリーン車は快適!

私のKaigiにあわせて九州に旅行に行く両親とともに、私の自宅の最寄り駅を始発で出てきた私は東京駅で駅弁を買って5:40発の沼津行きに乗りました。さて、JR東日本の首都圏路線では自由席グリーン車が連結されており、自由席グリーン車には青春18きっぷでも乗れるのですが、Suicaグリーン券の場合はJR東日本区間内の熱海までしか買えないのです。しかし、降りるのはJR東海区間である終点の沼津までなわけです。そうなると、熱海でグリーン券を買い直さなければいけないと思うでしょうが、そこはグリーンアテンダントさんが車内で変更してくれるので問題ありません。東海道線の静岡県区間にはトイレのない列車も多いのでトイレを済ませた上で、電車は三島駅に無事到着しました。

最初のピンチ:沼津駅で綱渡りの乗り換え

問題は三島駅到着後に発生したのです。そう、東海道線の三島〜沼津間で遮断機が折れたらしいのです。三島駅で電車は足止め、沼津駅での接続時間は階段を使って5分と綱渡りです。早速、旅程崩壊の危機が訪れました。ここを逃してしまうと、津への到着は1時間遅れます。ですが、列車が待っていてくれてくれたので無事乗り換えることができました。

東海道線静岡県区間:浜松まで快適な車内で

かつての東海道線の静岡県区間といえば、だいたい東京の電車のようなロングシートにトイレ無しの電車で熱海から豊橋まで揺られていくのがあるあるだったのですが、沼津駅で乗り換えた電車はなんと後2両がボックスシートの列車だったのです。でも、ボックスシートに先に座られてしまってロングシートに座ることになったのですが。ともあれ、ロングシートに揺られて着いたのは興津駅。なんと、この駅から浜松駅までの列車がある上、その列車の座席は関西の新快速などでお馴染みの転換クロスシートだったのです。元セントラルライナーとして名古屋を走っていた車両なので、座り心地は抜群。というわけであっという間に浜松に着いたのでした。

浜松駅:最初のやらかし

そして向かい側のホームに上がったとき、大変なことに気がつきました。そう、前の列車にスーツケースを忘れてきてしまったのです。あわてて先ほどのホームに戻ると、列車はまだ止まっており、無事荷物を回収することができました。浜松駅では飲み物を買うだけの時間の余裕もあり、列車は豊橋に向かって走って行くことができました。浜松駅から乗った列車はロングシートだったのですが、まあ乗車時間が長くないので何とか耐えられる感じでした。しかし、問題は豊橋駅にあったのです。

豊橋駅:失敗すると津到着が1時間遅れ

豊橋駅では、この旅の正念場とも言える2分乗り換えが待ち受けていました。しかも、階段を上がって隣のホームまでダッシュです。かつてムーンライトながらが走っていたときには大垣駅構内時速10キロ制限なんてものがあったのですが、今回もその制限を破るかの如くあわてて乗り継ぎに成功しました。豊橋駅の2分乗換は正直危険な綱渡りだったわけで……。そこから先は普通に名古屋駅まで新快速だったのですが、ここで深刻な問題が私を悩ませることになるのです。そう、それは……バッテリー切れです!

名古屋駅:大事なこと

名古屋駅に着く頃にはノートPCのバッテリーは尽きかけ、スマホも交換バッテリーをすでに使い果たし、本体のバッテリーも残り少ない状態です。また、名古屋駅では他に2つのすべきことがありました。1つは快速みえの指定席券のキャンセル、もう1つは昼食です。
快速みえは名古屋を16:37に発車する列車を予約していたのですが、予定が早まって13:37発に変更しました。さらに速い列車に乗ることになり2回目の変更が必要になったのですが、JRの規則では変更は1回までです。この時期の快速列車の指定席券は330円ですが、払い戻し手数料は340円。そう、払い戻しをしても戻ってこないのです。でも、払い戻しをすれば間違えて買った列車の席は空席になります。ということで2回目の変更の分の券を事前に買っておいて、名古屋駅で払い戻してもらいました。
さて、問題は昼食です。名古屋駅で余裕のある時間は20分……。当初の予定では名古屋駅で40分以上の待ち時間があり、その間に名古屋駅のホームにあるきしめん屋できしめんを食べるつもりでした。しかし、20分では食べるのが難しいところです。考えた結果、駅弁を買って快速みえの車内で食べることにしました。買った駅弁は名古屋のひつまぶし弁当で、ついでに味噌串カツも付けました。そして、行きに乗る最後の列車である快速みえ9号に乗ることができたのです。

快速みえ9号:これがディーゼルカーなのか?

快速みえ9号はたった2両編成で、しかも自由席はかなり混み合っていたようです。私は指定席を確保していたので普通に座れましたが、指定席券がなければ相当きつかったでしょう。なお、この快速みえに使われる車両は非常に高性能で、最高速度は時速120キロまで出せます。ただ、悲しいことに途中の線路は単線で行き違いが多く、折角の最高速度が途中まではあまり出せなかったように思います。しかし、列車の本数が減った伊勢鉄道線内では本来の性能を活かして快走していました。このスピードとエンジン音は本当にたまりません。なお、この伊勢鉄道線内では青春18きっぷとは別に乗車券が必要になります。しかし、その快走を味わうころにはもう目的地なのです。

津到着:0日目の準備はちょっとだけ

列車は無事津に到着したわけですが、チェックインには早すぎたのです。そのまま会場に行き準備をしましたが、もうバッテリーが限界ということで早めに帰ってきました。宿に帰ってまずしたことはバッテリーの充電だったわけですが、他になぜか持ってきている Meta Quest 2 で VRChat のイベントに参加したりといろいろありました。あとホテルのお風呂にラーメンもありましたね。

1日目:いろいろあったけど楽しかった1日

ヘルパーとして参加しつつ……

なお、私はヘルパーとして RubyKaigi のお手伝いを行っていたのですが、とりわけ同時通訳レシーバーの貸し出しを他のスタッフとともに行っていました。そのため貸し出しブースを離れられずに聞きに行きたいけどいけないセッションもたまにありました。また、最後の TRICK の後には同時通訳レシーバーの回収という任務が控えているため、お願いを書いた紙をTシャツに貼り付け回収用のバッグを持って「同時通訳レシーバー返しておじさん」に鳴りました。そのため、初日のキーノートなどいくつかのセッションは聞くことができませんでしたが、いくつかのセッションについては聞くことができました。それから、そのレポートを紹介します。

Colby Swandale さん「Adding Type Signatures into Ruby Docs」

型情報を記録するRBSファイルからドキュメントに型情報を付与する内容と理解しました。私は普段は .NET Framework で C# をメインに使っているので型情報がコードの中に書かれるというのは当たり前の世界で暮らしているわけですが、 C# の世界ではドキュメントを生成すると当然のように型情報は出力されるわけです。 Python は Ruby 同様動的型付けの言語ですが、 Python でよく使われる Sphinx ではちゃんと型情報を見てくれてたような気がします。 Ruby でもそういった時代が来るのかと思うと胸熱です。

TRICK 2022

そして待ちに待った奇妙な、いや、邪悪なコードのオンパレード、TRICK 2022 。ここで紹介されたコードは C# でも Python でも Rust でも書けないような、 Ruby でしかできない超絶技巧のコードばかりです。そんな危険物の集積場入選したコードのリポジトリは以下のリポジトリになります。

まあ、ここに出てくるコードを普通に読むことは難しいと思います。そして、解説されて初めて「こんな技法を使っているだと……」と気付いて大笑いしたり真っ青な顔になったりするわけです。
とりわけ、びっくりしたのが Tomoya Ishida (tompng) さんによる「最も整然としたコードで賞」に選ばれた次のコードです。

rule = $*[00]&.to_i || 30
h  ||= $*[01]&.to_i || 32
[ % if % TRICK-2022 %% %]
# ] if a /%{(?<a>)/ =~ %} if + %} - %[
# } if b /%<(?<b>)/ =~ %> if - %> + %{
# > if c /%+(?<c>)/ =~ %+ if + %+ - %<
# + if d /%-(?<d>)/ =~ %- if - %- + %+
# - if e f, g, h, / =~ %/ if def e(f, g, h, *) =
# + if d /%-(?<d>)/ =~ %- if g.map! do rule.[] _1.join.to_i 2 end.!
# > if c /%+(?<c>)/ =~ %+ if !(g = *[g[-1], *g, g[0]].each_cons(3))
# } if b /%<(?<b>)/ =~ %> if puts(g.join.tr '01', ' #') || h > 0 &&
# ] if a /%{(?<a>)/ =~ %} if !g ||= [*g = [0] * h, 1] + g if h -= 1
eval(File.read f ||= __FILE__)

正直、「わけがわからないよ!」と叫んだあなた、そんなあなたはきわめて常識人です。なぜなら、このコードは同じコードを評価して実行しているにもかかわらず、変数が定義されているかされていないかで全く挙動が変わってしまう、副作用を悪用しているコードだからです。これが平然とできてしまう Ruby のすごさに戦慄させていただきました。このコードが上位3位以内に入っていないわけですから、上位3位はどんなコードが来るかとわくわくさせられます。
そしてさらにびっくりしたのが第2位に入った「最もインタラクティブなコードで賞」を獲得した、これまた Tomoya Ishida (tompng) さんによるコードです。

           q=->{!sleep                  _1/1e2};p=(
        c=0..2).map{[_1/9r          ,0,5**_1.i/3,1,0]}
     require'socket';puts'op'    "en http://localhost:#{(
   w=TCPServer.new$*[0]||0).addr[1]}";Thread.new{q[2];f=[-1
  ]*s=3;t=Time.now.to_f;p.select!{0<_1[3]=[_1[3]+_1[4]/8.0,1
 ].min};9.times{h=p.map{[2**(_1*t.i)/_4**0.5/(1+Math.sin(2*t-
 9*_1%2)**32/16),_2+_4*(  _3-_2)]};r=[s*3/2,84].min;g=->{x,y=
(s*(1+_1+1i)/2).rect;x<0  ||x>=s-1||y<0||y>=s-1?0:((l=f[y+1])[
x+1]*(a=x%1)+(1-a)*l[x]   )*(b=y%1)+(1-b)*((l=f[y])[x+1]*a+(1-
a)*l[x])};f=(1..r).map     {|y|(1..r).map{|x|z=1.5+1.5i-3.0*(y
.i+x)/r;[h.sum{g[_1.*z     +_2]}*0.9,1].min}};s=r};c=f.flatten
redo};loop{s=w.accept   ;   Thread.new{r=s.gets;h='HTTP/1.1 '+
"200 OK\r\nContent-"   'T'  "ype:text/html\r\n\r\n";r['/ ']?s.
 <<(h+'<style>ifram'  'e{'   'opacity:0;height:0;}input{wid'+
 'th:252px;}</styl'   'e>'   '<form target="i"><input src="'+
  "g#{rand}\" type"  '="im'  'age"><iframe name="i"></ifra'+
   'me></form>'):r   ['/g']   ?(h[/:.+l/]=?:'image/gif';s<<
                    h+'GIF8'  '7a'+[84,
      84,246,0,*(0..383).map   {15*_1.   /(383r)**(3-_1%
       3)*17}].pack('v3c*');   loop{    s<<[67434785,5,
         44,84,84,7,c.map{_1*  127}   .each_slice(126
           ).map{[127,128,*_1   ]    .pack'c*'}*'',
             1,129].pack('V3x'     'v2na*c2x');q[
               5];q.[]1while(r   ==r=c)}):(x,y,
                 z=r.scan(/\d+/).map{_1.to_f/
                   126-1};z&&p<<[rand-0.5,(
                      z=x+y.i)*1.5,z/(z.
                        abs+0.9),0,-p[
                          -3][4]=-1]
                           s.<<h);s
                            .close
                              }}

このコードを実行すると心臓の鼓動のような画像が表示されるのですが、面白いことに JavaScript も canvas も HTML5 も使われていないのです。使われているのは

<input type="image" src="streaming.gif">

という、いわゆるクリッカブルマップに使われていたらしい技術なのです。そう、前近代の遺物です。それを表して、「Async Ruby and GIF」という言葉には大爆笑させていただきました。
それとともに、「最もアクセシビリティがあるで賞」に選ばれた、 Yutaka HARA (yhara) さんのコードがこちらです。といっても、コードが特段アクセシブルというわけではありません。

%;;;;Symbol.define_method(:method_missing){|n|t="#{self}#{n[..-2]}"; n[-1]=="⠠" &&
eval(t.unpack("U*").map{((_1&64)/8+(_1&56)*2+(_1&135)).chr}*""+t)||:"#{self}#{n}"}
:⠥⠥⠥⠐⡝⠐⠒⡬⠽⠚⡘⠚⠘⠒⡂⡦⠐⡝⠐⡘⠙⡂⠴⠵⠶⠐⠶⠼⡐⠻⡑⠐⠓⡕⡞⠐⠫⠼⠺⡱⡶⠷⡂⠼⡝⡫⡭⡂⡴⡝⠻⡖⠳⡰⠱⠺⠻⡂⠶⡔⠺⡝⡴⡫⠘⡔⡦⡕⠙⡭⡔⡴⡫⡦⡕⠙⡖⡖⡭⡂.
⠼⡜⡜⠒⡚⠓⡻⠶⡖⡲⡷⡱⡶⡽⡖⠒⡂⡒⠱⡔⡺⡝⠺⡖⠵⠱⠳⡰⡯⠻⡴⡱⠳⠵⡐⡦⡑⡖⡵⠱⠸⡐⠖⡚⡲⡷⡱⡶⡑⡂⠱⡖⠵⠱⠳⡰⡻⡼⡴⡼⠐⠼⡜⡜⠒⠓⡻⡴⡽⡖⠒⡽⡂⠼⡜⡜⠒⠓⡻⡺⡽.
⠓⡻⠥⠥⠥⡽⠒⡂⠼⡖⡲⡷⡱⡶⡐⠒⡬⡶⠒⡑⡂⠵⡶⠴⡂⡠⠐⡝⠐⠕⠹⡻⠕⡛⡛⡛⡛⠫⡹⡵⠲⡷⡴⡖⠴⠵⠶⡱⡶⠵⡯⡵⠵⠼⡰⡷⠴⡐⡚⡵⠵⠼⡰⡷⠴⡯⡵⡱⠻⠻⡱⡶⠷⡑⡻⡼⡶⡼⠼⡝⠒.
⠓⡻⠻⠵⡴⠶⡽⠓⡻⡶⡫⡖⡖⡕⠚⡭⡽⠒⡛⠐⡶⡫⡕⠙⡭⡝⡝⠒⡬⠽⠚⡘⠚⠘⠒⠐⠖⠖⡂⠵⠾⠱⡴⡐⠼⡖⠽⡶⠸⠱⠳⡳⡐⠒⠭⡒⠒⡑⡖⡵⠱⠸⡻⡐⡐⡯⠙⠖⠞⠜⡑⡗⡘⡓⡐⡯⠙⠖⠝⠞⡑.
⡒⠚⡓⡐⡯⠙⠖⠙⠛⠝⡑⡑⡖⠳⡰⠺⡽⡒⠒⠒⡓⠼⡑⡼⡼⡚⠒⠓⡻⠻⠵⡴⠶⡽⠓⡻⡶⡽⠒⡽⡂⡽⡖⠷⠻⠽⠲⠐⠒⡬⡬⠽⠚⡘⠚⠘⠒⡔⠒⡬⠽⠚⡘⠚⠘⠒⡂⡠⡠⠐⡝⠐⡠⡖⠷⠻⠽⠲⠐⡗⡖.
⡗⡔⠒⠐⠒⡂⠴⠵⠶⠐⠴⠵⠳⡐⠳⡑⡂⠺⠵⠼⠽⠺⡶⠐⠳⠐⡱⠶⠐⠳⡝⡝⠒⡚⠒⡼⡼⠳⡝⡝⠒⡖⠒⡂⠽⠐⡝⠐⠳⡖⠽⡶⠸⠱⠳⡳⡐⠒⠭⡒⠒⡑⡫⠘⡭⡂⡐⠽⠖⠞⠜⡑⡗⡘⡓⡐⠽⠖⠝⠞⡑.
⡒⠚⡓⡐⠽⠖⠙⠛⠝⡑⡂⠵⡶⠴⡂⠴⠵⠶⠐⠺⠴⡐⠸⡸⡔⠐⠿⡔⠐⡰⡑⡂⡐⠘⡖⡖⡖⡰⡗⠜⡑⡖⠵⠱⠳⡰⡻⡼⠾⡼⡂⡐⠘⡖⡖⡖⠿⡗⠚⡑⡖⠵⠱⠳⡰⡻⡼⠽⡼⡂⡸⡝⠽⡒⠚⡛⡹⡝⠾⡒⠜.
⡂⡳⡝⠸⡸⡫⡹⡭⡫⡸⡭⡂⡱⠶⠐⠫⠼⠺⡱⡶⠷⡝⡝⡝⡳⠐⡂⠸⠺⡱⡶⠼⠐⡳⡂⠵⡴⠻⡱⠶⠐⡳⡂⡶⡝⠸⡸⡫⡹⡭⡫⡸⡭⡼⠸⡸⡫⡹⡭⡫⡸⡓⠙⡭⡜⡜⠛⡼⡂⠸⡸⡫⡹⡓⠙⡭⡫⡸⡭⡜⡜.
⠙⡼⠸⡸⡫⡹⡓⠙⡭⡫⡸⡓⠙⡭⡜⡜⠜⡼⡂⠸⡸⡫⡹⡓⠚⡭⡫⡸⡭⡜⡜⠚⡼⠸⡸⡫⡹⡓⠚⡭⡫⡸⡓⠙⡭⡜⡜⠝⡼⡂⠸⡸⡫⡹⡓⠛⡭⡫⡸⡭⡜⡜⠞⡼⠸⡸⡫⡹⡓⠛⡭⡫⡸⡓⠙⡭⡜⡜⠟⡂⠸.
⠺⡱⡶⠼⠐⡫⠘⡸⠚⡘⠘⠘⡓⡶⡭⡖⠸⠱⠳⡳⡐⠒⠭⠒⡑⡂⠵⡶⠴⡂⡽⡂⠸⠽⠼⠻⡂⡽⡂⠵⡶⠴⡂⠴⠵⠶⠐⠺⠽⡶⡐⡸⡑⡂⠸⠺⡱⡶⠼⠐⠒⠕⠕⡬⡶⡬⠵⡫⠚⡢⠒⡂⠳⠳⡝⠶⠼⡐⡸⡖⠼.
⡷⡯⠻⡑⡖⡴⡱⡶⠵⠻⡖⡵⠱⠸⡻⡯⠙⡖⠳⡰⡷⡵⠸⡖⠳⡰⠱⠺⠻⡽⡂⡵⠻⡝⠳⠳⡖⠶⡴⠱⠼⡯⡵⠱⠸⡻⡼⠺⡷⠿⡼⡂⡐⠘⡖⡖⠛⡑⡖⡵⠱⠸⡻⡼⡹⡹⡼⡂⠺⡷⠿⡖⠶⡴⠱⠼⡯⡵⠱⠸⡻.
⡼⠳⡼⡂⡶⡝⠴⠵⠳⡐⠳⡑⡂⡱⠶⠐⡡⡶⠼⠵⠷⠵⠺⡝⡝⡝⡶⡂⡫⡶⡫⡹⡹⡓⠘⡭⡔⡶⡫⡹⡹⡓⠜⡭⡭⡂⠵⡴⠻⡱⠶⠐⡹⡹⡝⡝⠘⡂⡫⡶⡔⠘⡭⡂⠵⡴⠻⠵⡂⡫⠘⡔⠘⡭⡂⠵⡶⠴⡂⡽⡂.
⡽⡂⡽⡂⠳⠺⡝⡵⠻⡖⡵⠱⠸⡻⡯⠙⡖⡵⠱⠸⡻⠘⡽⡽⡂⡰⡝⠳⠺⡖⠻⡱⡺⠵⡂⠿⡝⠳⠺⡫⠘⡭⡖⠻⡱⡺⠵⡂⠾⡝⡐⠘⡖⡖⡖⠿⡑⡖⠶⡴⠱⠼⡯⡵⠱⠸⡻⡼⡸⡼⡐⠘⡖⡖⡖⡰⡑⡖⡵⠱⠸.
⡻⡼⡹⡼⡫⡸⡔⠐⡹⡭⡽⡽⡖⠻⡰⠽⠶⠶⡴⠵⡂⡶⡝⠙⡂⠴⡶⡝⠙⡖⠘⠚⠘⡂⡴⡷⡷⠸⠐⠴⡷⡂⠸⠺⡱⡶⠼⠐⠒⡬⠵⡫⠙⡛⠙⡠⠒⡂⡶⡖⠶⡴⡷⡷⠺⡖⠼⡱⡵⠵⠻⠐⠴⡷⡂⡸⡔⡹⡝⠾⡖.
⠻⡰⡱⠶⠼⡂⠳⡝⡵⠻⡫⡹⡭⡫⡸⡭⡂⠳⠺⡫⡹⡭⡫⡸⡭⡝⠳⠐⡱⠶⠐⠳⡂⠾⡖⠵⡵⠸⠼⡹⡟⠖⠖⠲⠺⠵⠱⡳⡂⠵⡶⠴⡂⡶⡒⡝⠴⡶⡂⠸⠽⠼⠻⠐⡠⡠⡂⠺⠴⠐⠳⠺⡔⠿⡔⡰⡂⠻⡴⠵⠵.
⠸⠐⠘⡖⠘⠙⡂⠲⠺⠵⠱⡳⠐⡱⠶⠐⠾⡖⠵⡵⠸⠼⡹⡟⡂⠵⡶⠴⡂⠸⠺⡱⡶⠼⠐⠒⡬⠵⡫⠙⡛⠙⡠⠒⡂⠸⠽⠼⠻⠐⡠⡂⠸⠽⠼⠻⠐⠳⠳⡖⡵⠱⠸⡐⠖⡚⡲⡷⡱⡶⡑⡂⠵⡶⠴⡂⠺⠽⡶⠐⡚⠠

そう、 Unicode に入っている点字を完全に悪用しているのです。しかも、セミコロンやピリオドを混ぜ込んで、シンボルやメソッドチェーンにしているという驚きの結果です。遊び心のあるRubyプログラマたちによる遊び誤ゴロのあるコードが数多く出てくるRubyの奥深さには、改めて脱帽させられます。
次の TRICK にも心から期待しています。

初日のアフター:こんなところで Kaigi かよ

実のところ、後片付けが終わってさあ他の Rubyist たちと交流するぞと意気込みたかったのですが、私は PyCon JP にもスタッフとして参加しており、津にいっている間になんと PyCon JP 2022 のコンテンツチームの会議も入ってしまったので、津のホテルからリモートで参加する事になりました。なお、 Python に興味のある Rubyist の皆様、今年の PyCon JP 2022 は 10/14(fri) 〜 10/16(sun) で、チケット販売も開始しています。当日スタッフの募集も始まると思いますので、気になる方はどうぞ。そして note の皆様、PyCon JP 2022 にも協賛ありがとうございます。さらにその後に VRChat のイベントに参加しつつ、 RubyKaigi 2022 の1日目は過ぎていったのでした。

明日への意気込み

2日目も楽しめることを心から祈っております。そして、貸し出しした同時通訳レシーバーは全部無事回収できますように……。

いいなと思ったら応援しよう!