SpeeeのOSS Daysに参加した
Speee 社のラウンジに行って活動してきたという話です。
Speee OSS Days
Speee では毎週火曜に OSS Days という活動をやっているという噂を聞いており、Public に参加できると聞いて少し気になっていたので参加してきました。これらについては以下の記事が詳しいです。
やったこと
スーパーマリオブラザーズ™ がターミナル上で動くところまでつくった r7kamura/rnes という NES エミュレータの実装があり、これは Ruby で書いたのですが、別言語での書き味や速度をゆるく比較したいなと思っていたので、TypeScript への移植作業を進めました。以下の Pull Request にその作業内容が含まれています。
https://github.com/r7kamura/nes8/pull/6
元々 CPU までは実装できていたので、その日は GPU の実装を進めました。語弊を恐れずめちゃくちゃざっくり言うと、NES では 256 × 240 px の映像を出力することになるので、CPU が VRAM に入れてくれた情報を読み取りながら、基本的には1サイクルごとに1ピクセルのデータを用意していくような部分の処理を、TypeScript で実装していきました。
図で言うとこういう感じで、このタイプの絵は2枚あるレイヤーの内の背景レイヤーに描画しているんですが、背景は 8 × 8 px のタイルから構成されていて、それを左から右へ、上から下へと描画していくような処理を実装していきました。
あと https://www.patreon.com/posts/typescriptnoshen-23135935 で言っていた Microsoft/TypeScript に出した Pull Request を少し手直しする作業も進めました。ごはん食べて走って帰って一眠りしている間に merge されていました。
Ruby から TypeScript への移植についての雑感
他言語に移植しやすいよう、Ruby で書いたときから素朴な実装を意識して書いていましたが、数値の表現方法、ビットや配列操作用の機能、演算子の優先順位、その他文法的なところは細かく異なってきますし、その言語ならではの表現力を活かしたコードを書きたいという気持ちもあるので、別言語からの移植と言えど一筋縄では行かないものだなと感じました。
特に自分が Ruby で書いていたときは、「もし静的型検査があればこう書いた方が良いかもしれない」という可能性を探索するコストをすべて枝刈りすることで、不具合が発生する確率が上がることを犠牲にしながら思考回路を単純化している節があったため、今回 TypeScript で実装するにあたって、後回しにされていたその分の探索コストを回収していっているような感覚があります。
Ruby で実装したときは「メソッド呼び出しコストを無視できると仮定して実装を行う」という方針で書いていましたが、これによって移植時にコードの意図がかなり分かりやすくなっているなと感じたので、この段階ではこの方針で書いておいて良かったなと思います。
余談
振り返ってみると、Speee 社のラウンジに行くのは3回目でした。
- 2017年5月 Speee Cafe Meetup #7
- 2017年5月 Tokyo Server Side Swift #7
- 2018年12月 Speee OSS Days #NaN
2017年5月頃はまだ京都に住んでいましたが、たしか出張で1週間ほど東京に来ていたので、それでミートアップでも行こうと参加していたような記憶があります。Speee Cafe Meetup に参加していたことについては Medium に記録していたので、思い出すことに成功しました。このときも TypeScript の話をしていて、Flow と TypeScript の比較みたいなことを話題にしていますね。
最近は健康のために毎日なんらかの運動をしようとしていて、ウォーキングあるいはジョギングをしていることが多いのですが、Speee 社はいま住んでいるところから 4km 程度なので十分走っていける距離で、ふらっと行って雑談しながら OSS 関係で進捗できたのでとても良い会でした。また機を見つけて参加できればと思っています。