B-Teck!

お仕事からゲームまで幅広く

【振り返り】2022年3月

前月の振り返り
【振り返り】2022年2月 - B-Teck!

学習

今月やったこと

所感

今月は体調を崩し気味だったり、色々と忙しかったのもあり、本を全然読めませんでした。
読みきれないちょっと開いただけの本はたくさんあるんですが…。今月は読み切りたいですね。
というか元気になっていたい。

ブログにも書きましたが、毎日草を生やすのをやり始めて、無事一年を達成しました。
月イチの振り返りブログとともに、自分の学習を駆動させる上で良い取り組みになったなあと思ってます。
ネタも尽きていないので当面は引き続きやっていきたいところ。

引き続きキャリアについては悩み続けているんですが、ひとまずEM的なロールを目指してみようかなと思い始めました。
めちゃくちゃマネジメントがやりたい!というわけでもないんですが、実際やるやらないに関わらず、これまでマネジメントやリーダー経験のない自分にとって、意識して行動してみるだけでも得るものがありそうという目論見です。 というわけでそれ系の本とかイベント参加とかをちょこちょこやっていく予定です。

技術的な話だと、やっとScalaとだいぶ仲良くなってきた感覚になりました。
まだ距離は感じるんですが、それでもかなり馴染んできたなと。
次の方針的には当面は改めて仕事で扱ってるAngularとか、フロントエンドのアーキテクチャを掘り下げていこうかなと思ってます。
フロントはキャリアの中でも書いてた期間が短くてまだまだわからないことも多いんですが、できることを増やしていきたい。

セールだったのでモンハンライズを買ってしまったんですが、ワールドをやってからかなり経ってたのもあり、いちいち最近のモンハンっぽい要素に驚いてしまいます。
とりあえず養殖で上位までは上がったので、サンブレイクまでにある程度戦える状態を目指します。

【雑記】毎日コミットを(ほぼ)1年間継続した

f:id:beatdjam:20220330234000p:plain

過去の記事

経緯

  • 仕事外で勉強するときまとまった時間を取るのが難しかった
  • まとめて時間を作るのではなく、毎日少しずつ時間を取っていくスタイルにした

レギュレーション

  • 草が生える行動であればOK
    • リポジトリを作る
    • Issueを立てる
    • コミット
  • 最低限毎日数分なにかする
    • 用事がある日は寝る前とかにやっておく

この活動でできたこと

感想

  • まとまって時間を取ろうとしていたときよりも勉強に使う時間が増えた
    f:id:beatdjam:20220330235904p:plain
    毎日コミットをはじめてから
    f:id:beatdjam:20220330235937p:plain
    毎日コミットをはじめるまえ
  • 意志力だけではプライベートの時間に動くのは難しい
    • 仕組み化と低いハードルが大事
    • 最初の軌道に乗るまでが大変
  • プライベートと仕事のGithubアカウントが分かれているので、頑張って手を動かさないと草が生えない
    • 個人でやったことが視覚化できるのでこれは良かった
  • 写経ずっとやってると辛いときは別のことしたほうがよい
  • 最低1コミットまでハードルを下げればネタは意外とある

【Scala】「Go言語でつくるインタプリタ」をScalaで実装した

なんでこの本をScalaでやったのか

7月に転職してからScalaを業務で書き始めたんですが、なかなか手に馴染んだ感がなく、いくつかの本を写経したりしていました。
昨年末あたりからはコップ本を毎日数ページずつ写経しながら読む、ということをやってたんですが、毎日やってると流石に飽きる。
ということで、ちょっと変わったお題として別言語で書かれた本をScalaで実装しながら読むということをやろうと思ったのがきっかけです。
この本は、以前少しGoを触ったときなどに数回挑んでいたんですが、取り組んだときの忙しさなどなどで序盤で挫折しており、数年越しのリベンジでもありました。

実装

github.com

monkeyという言語について

本書は、monkeyというC言語風の架空の言語のインタプリタを実装するものです。
一部引用すると、

  • C言語風の構文
  • 変数束縛
  • 整数と真偽値
  • 算術式
  • 組み込み関数
  • 第一級の高階関数(関数を引数に受け取る関数)
  • クロージャ
  • 文字列データ型
  • 配列データ型
  • ハッシュデータ型

のような特徴を持つ言語です。

完成したインタプリタは、例えばこんな入力を実行できます。

>>let a = [1,2,3,4];
>>let double = fn(x) { x * 2 };
>>let map = fn(arr, f) { let iter = fn(arr, acc) {if (len(arr) == 0) { acc } else {iter(rest(arr), push(acc, f(first(arr))))}}; iter(arr, []); }
>>map(a, double);
[2, 4, 6, 8]

本の内容

本書は主に字句解析器、構文解析器、評価器の3つの章と、言語にマクロシステムを追加する付録の4つに大別されます。
それぞれがどんな機能か、というのを説明するのは難しいんですが、

  • 字句解析器は入力された文字列を解釈可能な単位に分割する部分
  • 構文解析器は字句解析器で分割されたものをプログラミング言語のルールに則って解析する部分
  • 評価器は解析結果を実行し、変数やREPLに渡すための結果を得る部分

といった感じでした。

これらの実装を進める中で、言語の中で型がどのように表現されるか、組み込み関数はどういう動きをするか、が徐々にわかるような作りになっています。
実装を始めるときにはテストケースが提示されるので、どのような動きを目指せばいいのかもわかりやすかったです。
また、かなり序盤の方でREPLを作成し、REPLで実際に動作させながら読みすすめるので、実際に動いていることによる感動もあり、良い構成だなあと思いました。
全体的にかなり砕けた語り口調だったのもあり、著者(あるいは翻訳者?)と伴走しているかのような気分になったのも楽しかったです。

実装にかかった時間など

実装範囲は本編までの状態で手を動かし初めてからはだいたい24時間くらいの実装時間でした。
日付にすると18日間くらい作業していたみたいです。
実装行数は2000行くらいとかなりコンパクト。

感想

Go前提で書かれている書籍をあえてScalaでやったんですが、Goの記法は割と平易なので、読み替えも簡単で進めやすかったです。
言語間の違いによってScalaへの理解も深められたし、単純な写経ではないので文中の意図を理解する必要があり、却って内容も頭に入ってきた気がします。
本書を通して実装することで、言語の処理系って大体こんなことが起きているんだなあと想像できる余地が生まれました。
付録部分も面白そうなので手をつけようかな〜と思いつつ、とにかくグリーンになれば良しで実装を進めてしまったので、ちょっとリファクタしてからやろうかなという感じです。

ツイート