「Elixir実践入門」の所感（第7章〜第11章まで）

日本国内のElixir界隈で活躍されている方々の共著として出版された「Elixir実践入門」が届いたので、読み進めています。

https://gihyo.jp/book/2024/978-4-297-14014-4

第7章から第11章まで読み進めたので、それぞれの章について所感を書いてみます。
ちなみに、今回の7章から11章は、いわゆる「**ElixirにおけるWebアプリケーションの実践入門**」という位置付けで捉えておけば良いでしょう。

7-11章は、全体的に「Railsで言えばxxx」というパワーワードを利用しないで書かれています。
なので、流し読みした際に、伝わる人／伝わらない人の差が出てくるかな、とは思いました。
一方で、ここを何度も読み返すことで、（Pohenixというよりは）MVCモデルのWebアプリケーションの基礎が、すごく身につくのではないか、とも感じられました。

なお、1章から6章の所感については、先日Qiitaに投稿済みなので、興味があればあわせてお読みください。

https://qiita.com/MzRyuKa/items/11be87a3981eaab4e4e1

また、自分はElixirを取り扱った技術同人誌を書いてたりもするので、自分の書いた内容との比較もしてたりしますが、それは、読者視点の他に（レベルは違えど）"書き手"という観点での考えもあり記載しています。


## 第7章:Phoenixの概要

ElixirのWebアプリケーションフレームワークである「Phoenix」についての概要が書かれています。
Phoenixの基礎知識として、ディレクトリ構成の役割、ルーティングのやリクエストライフサイクルについて触れられているのは、まさにPhoenixを使いこなす上で基本となる部分なので理解しておきたい場所。
MVCモデルであることか、コントローラー／ビュー（とテンプレート）／モデルについても触れており、それぞれの箇所での具体的な実装についても記載がされている。
Ruby on Railsの知識を有している人であれば、さらっと読めてしまうかもしれない。
一方で、初めて触れる人にもわかりやすい内容となっている印象。

認証基盤部分である「phx.gen.auth」やデータベース操作ライブラリである「Ecto」についても概要を軽く触れておいて、詳細を以降の章で説明しているのも、読者に次の章に進めるための工夫がされているのかと思う。

本章で気になった点は3点
- リダイレクトの指定／フラッシュメッセージの表示
- "コンテキスト"の扱い
- スキャフォールドされたファイルの役割の説明

「リダイレクトの指定／フラッシュメッセージの表示」に関しては、実は業務では結構利用しそうな内容だと感じた。
前者は301リダイレクトについてもさらっと書いてあるが、目次や索引からは「リダイレクト」で探さないと見つけられなさそうなので、もうちょっと目立ってもいいのでは？と思った記述。
フラッシュメッセージは、バリデーションや処理完了の際に利用することが多いだろうから、利用頻度も高さそうう。ここはより具体的な実装例が複数個あると嬉しいかなと感じました。
個人的には、自分はやり方を忘れて、ここの記述を何度か見直すと思っています。

「"コンテキスト"の扱い」については、文字通りに"コンテキスト"の割り振りのイメージが掴めなかったです。コンテキストは、データベースの読込／更新などを一つのモジュールにまとめるために利用します。しかし。そのまとめ方は、具体的にどういう単位でまとめていくのか。
8章も読みすすめてみたのですが、いまいち掴めず。カレントデータとヒストリーデータのようなテーブルがある時にコンテキストにまとめる感じになるんですかね。例えば、現在の情報を保持している"posts"と、過去の修正履歴の結果を保持している"post_snapshots"とかなら、コンテキストを"Blogs"、スキーマーに"Post"と"Post_Snapshot"、とか。うーん、気になる。

「スキャフォールドされたファイルの役割の説明」については、edit/index/new/showにつて特に説明がなかったけど伝わるかな？というものでした。ここは、やっぱり読者がRailsに触れているかどうかで、変わりそうに思いました。


## 第8章:Ectoによるデータベース操作

データベース操作ライブラリ「Ecto」で何ができるのか、どのように実施するのかが書かれている。
EctoはRailsにおけるActiveRecordに該当する部分である認識。
単独でも利用可能ではあるが、Phoenixとセットで利用することで便利さはより際立ってくる印象。

本章は、ページ数は少ないがデータベース操作に関してポイントとなるべき点が詰まっている。

Ectoの主要コンポーネント4つを端的に説明し、それぞれの深掘りをしてくれている。

- Ecto.Repo: データベースのラッパー
- Ecto.Query: Elixirの文法で書けるクエリビルダ
- Ecto.Schema: テーブル構造とElixirの構造をマッピング
- Ecto.Changrset: データ変更の管理

スキーマモデル同士の関連付けの記述はさらっと書いてるが、ここは大事。
Railsでいうところの、"**ActiveRecordの関連付け（アソシエーション: association）**"と同様の部分であるので、基本となる`belongs_to/3`と`has_many/3`の関係を理解できようになっていると、今後絶対に役にたつ。
あえて言えば、図8.1の「クラス図とオブジェクト図」はスキーマモデルどうしの関連付けの箇所でもう一度出てくれると関連付けの説明も理解しやすかったかも。

また、Ecto.Changrsetの部分は、日本語で説明されているのは嬉しい。結構読み込みました。
毎回やり方を忘れて英語のマニュアルを読み直してたりするので...。

最後に、ものすごい余談ではありますが、自分はWebアプリケーションのプロジェクトの中に、データベースの作成／削除、マイグレーション、シードデータの投入をする機能を入れておくのは、好きではありません。
これは機能がというよりも、ちょっとしたコマンドミスで検証環境や本番データもぶっ壊しかねないから、なんですが。なので、ローカルやCIで実行される際のMIX_ENV=test時以外には、何かしらの制約を設けて実行できるといいな、とか思ってたりします。（dev.exsやprod.exsで）
Ectoを実務で利用されている方々って、こういう点はどう工夫されているのかな、とかついつい考えてしまいます。rubyにおける[ridgepole](https://github.com/ridgepole/ridgepole)的なものがあると便利そうだなとは思いました。...ありそうだな。


## 第9章:phx.gen.authによる認証

Phoenix 1.6からビルトインされた、認証機能を提供する「phx.gen.auth」についての説明がされている章です。
「phx.gen.auth」の提供機能としては、パスワードのハッシュ化／認証トークン生成／ログイン画面の用意／ログアウト処理／パスワードリセット／メール送信、が一通り備わっています。
複雑、かつバグや脆弱性を絶対に避けたい認証機能ですから、"標準機能"としてライブラリが提供されるのは喜ばしいことですね。

ページ数としては10ページに満たないです。
しかし、実践という意味では、重要なことが書いてあります。

- 全ユーザーの強制ログアウト方法
-  "**認証のスコープ**"よるアクセス可能URLの制限
- パスワードバリデーションの変更方法
- メール送信方法の変更（AmazonSES or SendGrid）

Webシステムの認証方式には、パスワード認証方式以外にも様々な方式があります。
しかし、パスワード認証方式はスタンダードな方法でもあり、この方式を採用しないというのはかなり少ないのではないでしょうか。
すなわち、パスワード認証方式を実装しなければならない、ということになります。
そこを提供してくれる「phx.gen.auth」、是非とも使いこなしていきたいですね。


## 第10章:LiveViewによるフロントエンドの開発

こちらも、14ページ程度ですが、LiveViewの魅力が十分に載っている章となります。
あえて言えば、実際の画面イメージなどがあるともっと伝わりやすかったのかも、とは感じました。自分はバージョンは違えどLiveViewを触っていたのでイメージもしやすかったのですが、初見の方の場合はどうなんだろう？というのは思いました。LiveViewで実現するのはSPAなだけだから、問題ないのかな？

さて、章のタイトルになっているLiveViewですが、SPA（Single Page Application）を開発するためのライブラリです。LiveViewも前章のphx.gen.authと同様に、Phoenixに標準で組み込まれている機能です。
LiveView側で用意されている機能（JavaScriptのコード）を利用することで、"**新規にJavaScriptを記述しない**"でもSPA開発ができる、優れものの機能です。

LiveViewのバージョン自体はまだ1.0とはなっていない（書籍の執筆時点では0.20.1、本記事の執筆時点では0.20.11）ですが、Phoenixのバージョン1.5から標準搭載されていた機能であるので、洗練されてきている、という印象もあります。
一方で、正式バージョンに上がっていないことから、将来的には"破壊的変更"で本章の内容ではうまく動作しなくなる可能性も秘めています。実際、LiveViewのバグフィックスや機能変更はちょこちょこと更新されています。
https://hexdocs.pm/phoenix_live_view/changelog.html#content

ですが、現時点のやり方を身につけておくことで、変更された場合も変更箇所への勘所、みたいなものは身につけれられるでしょう。
個人的には、"**本章も目玉の一つ**""、と思っています。
それほどに、LiveViewは魅力的です。

さて、前置きが長くなってしまいましたが、本章の所感です。

本章は大きく、「LiveViewの基礎知識」と「LiveViewの実践的な使い方」に分かれています。

「LiveViewの基礎知識」では、LiveViewでプロジェクトを作った時にディレクトリ構成の説明、ライフサイクル、状態の管理と更新、UI制御、ルーティング方法が記載されています。
特に、「状態の管理と更新」と「ルーティング方法」は注力して読んで（かつ頭に叩き込んでおきたい）箇所だと思っています。
「状態の管理と更新」に記述されているStreamを利用した部分更新は、公式ドキュメントを読み進めていても、割と後半に記載されているので、序盤に存在だけでも知れるメリットはあると思いました。
https://hexdocs.pm/phoenix_live_view/bindings.html#scroll-events-and-infinite-stream-pagination
また、「ルーティング方法」についても、公式ドキュメントでは序盤の説明でlive/4についてサンプルがサラッと記載してあるだけで、ルーティングの詳細はPhoenix.LiveView.Routerの部分を読む必要があり、そこまでいかないとルーティングの設定にはどんなものがあるかがわからないまま進んでいきます。
しかし、本章ではpush_navigate/2やpush _patch/2にも触れているため、ルーティングにはいくつかの設定ができることが読み取れます。
https://hexdocs.pm/phoenix_live_view/welcome.html#what-is-a-liveview
https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.Router.html

「LiveViewの実践的な使い方」では、著者の方が実際に業務などで利用したと思われる実践的な技術要素について書かれています。
PubSubによるリアルタイム更新や、外部のJavaScriptライブラリを利用する場合のJSHookなどは、自分には知見がなかったので、参考になりました。
また、LiveViewには「**Phoenix.LiveViewTest**」というモジュールが提供されていますが、本章ではこのLiveViewTestについても、軽くですが、触れています。
実務ではテストは必要不可欠です。この点も、実務という点を意識して書かれたのかな、と感じました。


## 第11章:実践的なWebアプリケーションの開発

前述の第7章から第10章の内容を総動員して、"RealWorld"と言われるソーシャルブログサービスのアプリケーションを作成しています。
本章では、実際にクラウド環境にデプロイする部分まで記載されており、ローカル上でのアプリケーション開発に留めていない所には、好感が持てました。
また、記載内容に沿って進めていけば、クラウド（Fly.io）へのデプロイも完了できるので、7章から10章は読まずに本章からとりあえず手を動かして動くものを作り上げる、というのを体験してから7章-10章を読み直すのでもいいのでは、とも思えました。
文中のソースコードに関しても、細かく丁寧な説明がされているため、理解がしやすくもあります。
一通りの開発作業が記載されているので、ページ数は多いです。
ですが、ここを読み切ったら、Phoenixアプリ作るの怖くない、になるんじゃないかなと思っています。

是非とも、**読むだけじゃなく実際に手も動かしてみてほしい**、と感じた章でした。

余談ですが、個人的なお気に入りは、各スキーマ同士の関連付けが丁寧に説明されている点です。
関連付け、割と苦手なので丁寧な説明が嬉しかったです。


## まとめ

今回は、「**ElixirにおけるWebアプリケーションの実践入門**」の位置付けに該当する章を読み進めて所感を書きました。
ページ数的には、そんなにかからずに書けるかな、と思っていたのですが、読んでいるうちに頭の中にアレもコレもと色々なことが思いついたり感想として出てきたりで、予想以上に考えや感想をまとめるのに苦労しました。
それだけ、この7章から11章で触れられているPhoenixは、奥が深いのかなという印象を持ちました。
同時に、ここの章を執筆された著者の方は、まとめるのに苦労されただろうな、という印象も持ちました。LiveViewも含めて、Phienixの情報量は多いので、実践という意味でどこをのせるかとか考えるの大変だったんじゃないかなとか思ったり。
実際、自分が技術同人誌の中でPhoenixやLiveViewに触れた時には、DBやデプロイには（記述量が爆増するから）あえて触れなかったんですよね。
ほんと著者さんすごい！...という小並感。

さて、次は、機械学習寄りのNxとAxonの書かれている章（第12章〜第15章）に挑戦です。
行列演算ライブラリであるNxはドキュメントとかも読んで触ったことがあるんですが、Axonはさっぱりわからん状態。次回も読み進めるのが大変かも。でも、楽しみ。


※ 「Nx + Axon」にあたる章から15章について、所感を書きました。

https://qiita.com/MzRyuKa/items/7e454b35e46a112e60b1