書籍「Functional Web Development with Elixir, OTP, and Phoenix」の読書進捗管理用リポジトリ
演習の解答などを置いてく.
Elixir と,その Web フレームワーク Phoenix を用いて関数型プログラミング的な Web 開発を行うことをテーマにした書籍(OTP とは,乱暴な言い方をすれば, Erlang のライブラリ群のようなもの).
まだ Beta 版で,下記ホームページにて電子書籍でしか販売されてない.
Docker を使ってる
$ docker run -v /c/Users/hoge/functional-web-development-with-elixir:/root/islands p 4000:4000 -it --n
ame islands_engine elixir:1.6 /bin/bash
# cd ~/islands/islands_engine
# iex -S mix
Phoenix (と Node.js)がいる
$ mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez
$ curl -sL https://deb.nodesource.com/setup_6.x | bash -
$ apt-get install -y nodejs
$ cd islands_interface
$ cd assets && npm install --no-bin-links
公式サイトのは少し古いのかな? ちょっと違う.
中身を全部ちゃんと読んだわけではないので間違いがあるかも.
(version B5.0)
本書の構成について書いてある. この章だけは無料で読めるようになっている.
全体としては,Elixir や Phoneix を Web 開発に用いる優位性について感じるために, Island という名前のゲームを作成していく. Part I では,純粋に Elixir のみでゲームを作る. ただし,(おそらく) Part I では関数型プログラミングの話に重点があって, Elixir の醍醐味である並行性(Concurrency)は出てこない. 並行性については Part II の OTP の話で導入するそうだ. Part III では,Phoenix を使ったもので作り直す(直すかどうかは分からない). ただし,Ectoは使わないらしい.
あと,Island の説明と,本書のタイトルにもある Functional Web Development について書いてあった. これ良いこと書いてあります. 無料で読めるので引用して翻訳(意訳)しとく.
関数型プログラミングの最も特徴的なパターンのひとつは(関数)合成です. 関数合成では,大きく複雑な仕事を機能に焦点を当てて小さく切り離し,これらの関数を連鎖(合成)させて完全な振る舞いを再現する. こうすることで,それぞれの関数が小ささが振る舞いの理解を助け,保守を簡単にする.
本書では,この関数プログラミングの考え方を Elixir を用いて Web 開発に適用するそうだ.
前述したとおり,第一部ではまず,純粋に Elixir のみを使ってゲームを作成する(Phoenixを使わない). アプリケーション(ゲーム)の本質を,data と behavior を用いて定義する(data と behavior が Elixir の機能を指しているのか,値や型のデータと振る舞いという一般用語を指してるのかは,まだよくわからない...). また,モジュールと関数のみを使って,逐次的 (Sequential) な Elixir でアプリケーションの作成を行う(Sequential とは 並行 Concurrency の対義語を意味していて,並行に関する機能は使わないという意図だと思う).
本章ですること
- Elixir のデータ型としてドメインの要素をモデル化する
- データ変換として(アプリケーションの)振る舞いを定義する
(この段落は個人的な主張で少し脱線です) ○○プログラミングとは結局のところ,プログラムやアプリケーションをどのようにモデル化するかという考え方で,関数型プログラミング(スタイル)は,数学的な関数としてモデル化する. 数学的な関数には入力の集合と出力の集合があり,プログラミングではその集合をデータ型として表現する. また,複雑な関数は,より小規模でシンプルな関数(データ変換)へ分割し,その関数を合成して複雑な振る舞いを表現する.
本章では,それを Elixir でどう行うかを説明してくれる(らしい).
本章ですること
- 一時的なプロセスの生成(spawn)
- 長寿命で状態を持つようなプロセスの生成
- 状態を保持し変更できるようなエージェントを作成
- 状態を保持し変更できるような GenServer を作成
第1部では,並行に関する機能は出てこないと思ったが....??? でも,この章はまだ未完成(“Content to be supplied later.” とのこと) なのでよくわかりません.
ちなみに,本書(もとい Elixir 関連のドキュメント)での プロセス(process) という単語は,OS 由来のプロセスでなく,ErlangVM のプロセスを指してると思われる.
本章ですること
- ステートマシンの仕組みの概要を知る
- 状態とトランジションとしてアプリケーションの規則をモデル化する
- 規則を具体化するためにステートマシンを構築する
今日の Web 開発において,イベントハンドリングや状態の変化は非常に重要なトピックで,これらを Elixir (もとい関数型プログラミング)でどのように表現するか. その方法のひとつ(?)がステートマシン,という話っぽいです(読んでみないとよくわからない).
ちなみに,Elixir ではプロセスで保持するデータのことを state と呼ぶらしいが,本章では一般的な意味合いで state という単語を用いているらしい.
第一部でアプリケーションのコアとなる部分を完成させた. そのため,第二部ではいよいよ, 並行性(concurrency) と 並列性(parallelism) の世界へと足を踏み入れる. OTPは,並行処理のために GenSrever を構築し,フォールトトレランスとリカバリーのために Supervisor を追加することで,その道へ導く.
本章ですること
- ゲームロジックの GenServer を実装する
- ゲームサーバーのプロセスのパブリックなインターフェースを定義する
- OTP Behaviour における共通パターンを実践する
- GenServer を正しい状態で初期化する
- 個々のゲームに名前を付けるためにプロセスの登録を使用する
本章ですること
- プロセスを開始する様々な方法をより深く見てみる
- プロセスを監査するための様々な戦略を検討する
- 粒度のための Supervisor のツリーを構築する
ただし,まだ中身は書かれていない(“Content to be supplied later” だそうです).
第一部,第二部でゲームエンジンが完成した. そのため,ここからはロジックと Web を介してやり取りをするインターフェースを提供しよう. Phoenix はこの要件に対して素晴らしい役割を果たす. 新しく Phoenix アプリケーションを作成し,ゲームエンジンを依存関係として追加する. 私たちのゲームエンジンは状態を持つため,Phoenix Channels が提供する永続的な多重接続を利用するのが理想的である.
Phoenix Channels は Phoenix が提供する WebSocket のようなステートフルなリアルタイム通信を簡単に扱う機能です(単純な WebSocket ラッパーではなく,それ以上の機能を持ち,WebSocket を使う必要もな無いらしい). Phoenix の目玉機能の一つだそうだ.
本章ですること
- 新しい Phoenix アプリケーションの作成(ただし Ecto は抜きで)
- 依存関係として作成したゲームエンジンを持ち込む
- Web インターフェイスの監視ツリーにゲームエンジンを組み込む
Ecto 抜きの理由は分からない(読めばわかる?)
本章ですること
- GenSrver と直接通信する Channel を作成する
- ひとつの GenServer に通信を集中させるために “topic:subtopic” 規約を使用する
- 各ゲームコマンドごとに別々の
handle_in
イベントを定義する —new game
,join game
,fire shot
, などなど - コンソールで私たちの Channel とやり取りして動作するようにする
まだ何も書かれていない(“Content to be supplied later” だそうです).
まだ何も書かれていない(“Content to be supplied later” だそうです).