てすと

たかろぐ

自分のログを刻みます。

1ヶ月の振り返り

こんばんは、日に日に近所の桜が散ってきていますね。

私、満開の桜を見るのも好きなんですが、この散っていく桜を見るのも好きなんですよね。

言葉にするのが難しいんですけど、散っていく桜はまさに盛者必衰という言葉がぴったりで、その儚さと繊細さに"美しい"って感じます。

あと、桜じゃなくても、何かモノが壊れる瞬間に芸術を感じますね。 でも、生き物が衰弱していく様は、芸術云々の前に"可哀想"が先行するんですけどね...。(サイコパスじゃないよ!)

...っと、こんなこと書く記事じゃ無かった😅

さて、実はこのブログも始めてもうすぐ1ヶ月になります。(最近書けてなかったんですけどね)

なので、ここいらで1ヶ月を振り返りを軽くまとめておこうと思います。

オセロAI

この1ヶ月で一番力を入れたのは、オセロAIの開発でしょうか。

手法とかも大方確立されてきているとはいえ、その中でも採用する手法に選択の余地はありますし、 アルゴリズム的にも決して簡単というわけではないと思うので、やりがいもあって楽しかったです。

実装としては、

  • 盤面のビットボード実装(置き場所の列挙、反転処理等をビット演算で行う)
  • 中盤探索(NegaMax法)
  • 終盤探索(NegaScout法、終盤1手最適化、終盤n手全探索、空所表、ハッシュによる置換表)

辺りでしょうか。 特に、終盤に関しては最初NegaMax法による探索のみで動かしていた時と比べて、約1,800倍くらいになりました。

まだまだ改良したい点はあるんですけど、優先順位的に一旦AI作成は中断して、アプリ側の方に取り掛かっています。

Nim言語

今回、オセロAIを作るに当たってNim言語を採用しています。

Nimは「効率的で表現豊かで優雅」に設計されていて、マルチパラダイムだけどメタプログラミングの要素が強いみたいです。(メタプログラミング使えない顔)

自分が良いと思った点は、

  • C並みに速い(ワンチャン抜かしそうな勢いの)実行速度
  • Python並みに分かりやすい記法
  • コンパイルされたバイナリファイルのサイズが小さい

辺りですね。書いていて楽しい言語です。

ただ、あまりにもマイナー言語過ぎて、日・英共に記事が参考記事が少な過ぎるのが難点で、 実際Nim言語のクロスコンパイルがずっと分からなくて辛いです、他言語に移植するまで考えているレベルです😢

まぁ、辛いことはありますけど、こういう未知の領域に足を踏み入れるのは、なんか時代の先端にいる感じがして楽しいですし、 Nimが発展してもしなくても、その理由を探ることでこれから時代の流れを読むための学びが得られるんじゃないかなと期待しています。

Nimはいいぞ。

その他

その他やったことは、

  • ブロックチェーン(+開発合宿でチーム開発)
  • Rust(1日やってみて、学習コストの高さに気付いてそれっきり)
  • 少し競プロ(AtCoder)

とかです。

反省点

Nimのクロスコンパイルをするために時間がかなり取られて、結局できていない」、これに尽きるかなぁと思います。

粘り強く、辛抱強く取り組むのは、それはそれで大事だと思っていますけど、それだけじゃダメだなって強く感じました。

自分にとって未知の領域に踏み込む時、限られた時間の中で成果をあげるために、ある程度テクニカルリスクを考慮して 実現できるか事前検証したり、 代替案を用意しておいたり、 代替案に切り替える期限を設けたり する事も大事なんじゃないかなと思いました。(周囲に聞ける人がいない環境では特に!)

この1ヶ月は、その辺が甘かったと思いました。

これから1ヶ月やりたいこと

この1ヶ月で、オセロのコアロジック部分の実装はざっくり終わりました。(クロスコンパイルだけが鬼門)

前節で述べた通り、Nimのクロスコンパイルができていなくて、多分このまま闇雲にやり続けていても厳しいと判断したので、 Rustに移植しそれを組み込む方針で考えたいと思います。(Rustのクロスコンパイルについては検証済み)

最初は、この1ヶ月で通信関連を先にやろうと思ったんですけど、よく考えたら端末側のオセロのコアロジックを組むのが先だと感じた軌道修正してました。

なので、次の1ヶ月はサーバを立てて、端末と端末の間で情報のやり取りが行えるようにしたいと思います。 そして、もし余裕があればフロント側の機能も整えていこうと思います。

サーバ側の技術は、AWS+Docker+Scala+PlayFrameworkでやってみたいと思います。

お、なんか書いていたらテンション上がってきた。がんばろ〜😆