kenju's blog

About Programming, Mathematics, Security and Blockchain

"Cookpad Ruby Hack Challenge"に参加してきました

Cookpad Ruby Hack Challenge"に参加してきました。

↓は参加前日に書いた記事です。

itiskj.hatenablog.com

参加して良かったこと

講義・開発・懇親会全てを通して満足度の高い、最高の2日間でした。ある程度の目的を持って臨んだのですが、それを越す学びを得ることができました。

  • RubyVM周り(YARV)の実際の開発者である笹田さんに直接質問できたこと
    • トータルで5,6回ほどしか質問しませんでしたが、いきなりTwitterで質問するには遠慮しがちな小さな質問から、VMのスタックフレームの構造についての詳細な説明まで受けることができた
    • また、Gitterなどイベント後も何かコミット活動で気になることがあればコミッターの方々に聞きやすくなった(意識の話)
  • まさに「Ruby本体のHackをしてみたいが、どこから始めたらいいかとっかかりが掴めずにいた」という自分にぴったりの講義内容
    • すごく簡単なHackを通して、ビルド・デバッグの流れ、開発の流れ、バグ登録のフローを一通り学ぶことができた
    • 特に「ドキュメントには書かれていない」からこそ「直接聞く」か「ソースコードを読むしかない」ことを多く知れたのはよかった

2日間のゴール

まず、イベントに参加する前は

  • PRを1つ以上出す
    • ドキュメントの改善やカバレッジの向上などの小さなPRでも良いので、満足感を得る

という目的を据えていました。

しかし、ある理由から、イベント参加中にゴールを再設定しました。再設定したゴールは

  • VMの実行状況を可視化

です。ゴールを再設定した理由ですが、

  • せっかくイベントに参加しているのだから、一人ではできないことをしたい
    • 一通りのバグチケット登録の方法や開発手法を学べば、小さいバグの修正などのPRは一人でも出せるはず
    • 笹田さんはYARVを作った張本人、細かいことからコアの設計の部分まで直接聞ける滅多にない機会
  • もともとVMの内部実装に興味があった
    • 一つの例としてRubyの内部実装を理解しておけば、今後他言語のVM実装を見るときや自分で実装する時に役に立つはず

という二つの理由がありました。

作ったもの

VMのスタックフレームの状況を可視化するツールを作ることには2つの理由がありました。

  • VM周りのコードを読む機会を作る
  • グラフィカルに状態を表示するツールがあれば、VMへの理解をさらに深めやすくなる
    • できれば、将来的にはコミッターの方々や自分がいずれ開発する時に便利ツールとして使えるレベルにしてみたい

github.com

コントロールフレームのスタックをログ出力

まずは、vm_push_frame()メソッドにdump出力を仕掛けて、↓のようなログを出力します。

Push +
c:0001 p:---- s:0003 e:000002 (none) [FINISH]

Push +
c:0002 p:---- s:0006 e:000005 CFUNC  :inherited
c:0001 p:---- s:0003 e:000002 (none) [FINISH]

Pop  -
c:0002 p:---- s:0006 e:000005 CFUNC  :inherited
c:0001 p:---- s:0003 e:000002 (none) [FINISH]

Push +
c:0002 p:---- s:0006 e:000005 CFUNC  :inherited
c:0001 p:---- s:0003 e:000002 (none) [FINISH]

中間表現としてのJSONに変換

このままだと扱いづらいので、JSONに変換します。 中間表現としていくつか選択肢を考えましたが、Webアプリケーションなどからの扱いやすさを考えて、JSONを選択しました。

[
  {
    "type": "push",
    "stacks": [
      {
        "count": "0001",
        "pc": "----",
        "sp": "0003",
        "ep": "000002",
        "type": "(none)",
        "insns": "[FINISH]"
      }
    ]
  },
  {
    "type": "push",
    "stacks": [
      {
        "count": "0002",
        "pc": "0000",
        "sp": "0006",
        "ep": "000005",
        "type": "EVAL",
        "insns": "../ruby/test.rb:1"
      },
      {
        "count": "0001",
        "pc": "0000",
        "sp": "0003",
        "ep": "0012e0",
        "type": "(none)",
        "insns": "[FINISH]"
      }
    ]
  },
]

この部分はRubyで書いています。

github.com

可視化

最終的にJSONファイルを見やすい形式に出力します。

最後1時間くらいしか時間が残っていなかったので、openFrameworksで実装したかったのですが、手馴れているWebアプリケーションとして表現しました。具体的には、Reactを使いました。

実用にはまだまだのレベルです。今後時間をかけて磨いていきたいです。

f:id:itiskj:20170831225810p:plain

感想

何が一番よかったかというと、「イベントが終わっても次にやりたいことが思い浮かび、かつそれに取り組み続けられそうなモチベーションも環境も手に入れた」ことです。

そもそもどのように開発したら良いかがわかるし、困ったら誰に何を通して質問すれば良いかがわかります。 今のRubyの開発がどのように行われていて、どのような分野が難しくて、どこらへんから着手すれば良いのかがわかります。 これらは、今回のイベントに参加していなかったら分からなかったことです。

笹田さん、Cookpadの方々を始め、コミッターのみなさんには感謝です。 今回のイベント、たったの2日間でしたが、自分のエンジニアキャリアにとって大きな影響があったと、後で振り返ることになると感じています。 また、2日間休みをいただき参加することができました。職場の皆さんには感謝です。