闘魂Elixir ── 22. Phoenix

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>

https://qiita.com/advent-calendar/2022

https://qiita.com/advent-calendar/2022/elixir

# はじめに

闘魂と[Elixir](https://elixir-lang.org/)が出会いました。
闘魂 meets [Elixir](https://elixir-lang.org/).です。
[Elixir](https://elixir-lang.org/) meets 闘魂.でもよいです。

本日は、[Phoenix](https://www.phoenixframework.org/)を説明します。

```elixir
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}
```

# What is [Phoenix](https://www.phoenixframework.org/) ?

[Phoenix](https://www.phoenixframework.org/)の説明をします。
ひとことで言うと、[Elixir](https://elixir-lang.org/)で、Webアプリケーション開発を楽しめるフレームワークです。
RubyにおけるRuby on Rails、PythonにおけるDjangoのようなものです。

## Webアプリケーション開発を**楽しめる**フレームワーク

[Elixir](https://elixir-lang.org/)の[Phoenix](https://www.phoenixframework.org/)の特徴は、公式に**fun**と書いてあることです。
[Elixir](https://elixir-lang.org/)は、そしてもちろん[Phoenix](https://www.phoenixframework.org/)は、開発を**楽しめる**のです。


ところで、[Elixir](https://elixir-lang.org/)の作者[José Valim](https://twitter.com/josevalim)さんは、[Elixir](https://elixir-lang.org/)を作る上で影響を受けた言語に[Ruby](https://www.ruby-lang.org/ja/)を挙げられています。

[José Valim - Cognicast Episode 120](https://cognitect.com/cognicast/120)

> The main, the top three influences are Erlang, Ruby, and Clojure.

完全に私見です。
[Elixir](https://elixir-lang.org/)が[Ruby](https://www.ruby-lang.org/ja/)から一番色濃く影響を受けているのは、 **A PROGRAMMER'S BEST FRIEND** だとおもっています。**A PROGRAMMER'S BEST FRIEND** は、[Ruby](https://www.ruby-lang.org/ja/)の公式ページの先頭のところに書いてあります。
[Elixir](https://elixir-lang.org/)にのめり込むと自然と海外の方との交流が増えます。出会う人がみな親切でジェントルマンです。国内のコミュニティもそうです。みなマヂでいい人ばっかりです。

![スクリーンショット 2022-11-14 11.53.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/f7736594-6606-1475-1d9b-d856fbb8664a.png)

[Phoenix](https://www.phoenixframework.org/)は、[Elixir](https://elixir-lang.org/)でWebアプリケーションを開発する際によき友となってくれます。

## [Phoenix](https://www.phoenixframework.org/)はデファクトスタンダード

[Elixir](https://elixir-lang.org/)は書いていて楽しいし、もちろんWebアプリケーション開発も楽しめちゃうというわけです。
[Elixir](https://elixir-lang.org/)のWebアプリケーションフレームワークのデファクトスタンダードが[Phoenix](https://www.phoenixframework.org/)なのです。


感覚的な話はいいから、もっと技術的なことを知りたい！　という方には、「[WEB+DB PRESS Vol.127](https://gihyo.jp/magazine/wdpress/archive/2022/vol127):book:」をオススメします。
一言だけ言っておくと、Webアプリケーション開発に必要なモダンで洗練された要素はすべて入っています。

https://gihyo.jp/magazine/wdpress/archive/2022/vol127

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">現在、FMラジオ番組「Technology Cruising Night」で今年出たElixir特集、下記2本に触れてます💁‍♂️ <a href="https://twitter.com/hashtag/wdpress?src=hash&amp;ref_src=twsrc%5Etfw">#wdpress</a><a href="https://t.co/Tl98qkIvNS">https://t.co/Tl98qkIvNS</a><br><br>・WEB+DB PRESS Vol.127：Phoenix特集<br>・同Vol.131：Elixir入門特集<br><br>下記の通り、盛り上がりまくってるElixir Advent Calendarにも触れてますのでお聴きください🙇‍♂️ <a href="https://t.co/n0bdqXDMll">pic.twitter.com/n0bdqXDMll</a></p>&mdash; piacere (love Elixir, Gravity and VR/AR/Metaverse) (@piacere_ex) <a href="https://twitter.com/piacere_ex/status/1596081492127813632?ref_src=twsrc%5Etfw">November 25, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



## 読み方

カタカナで書いておきます。
「**フィニック(ス)**」です。
最後のスは言っているか言っていないかくらいの小ささです。

この話は、別の記事に書いています。
よろしければご参照くださいませ。

https://qiita.com/torifukukaiou/items/c9671fded10d20bd2f31
 
ちなみに、日本生まれの方は聖闘士星矢の影響なのか「フェニックス」と読んでいる方が多いです。
国内では、「フェニックス」と発音したほうが圧倒的に通じます。

[Elixir](https://elixir-lang.org/)をやっていると海外との距離は近くなります。
海外の方と話すことがありましたら、「**フィニック(ス)**」と言ったほうが通じるでしょう。

昔の人は善いことを言いました。
「[郷に入っては郷に従え](https://ja.wiktionary.org/wiki/%E9%83%B7%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%A6%E3%81%AF%E9%83%B7%E3%81%AB%E5%BE%93%E3%81%88)」です。
相手のよって応対を変える。おもてなしの心です。

以上で、[Phoenix](https://www.phoenixframework.org/)の紹介を終えます。

---

# ハンズオン

それではさっそくハンズオンをおっ始めます。
簡単なBlogを作ってみます。
データベースのCRUDをします。

## 準備（インストール）

楽しむためには準備が必要です。

### [Elixir](https://elixir-lang.org/)

https://qiita.com/torifukukaiou/items/42bc08509fa97fa970ae

をご参照ください。
[Elixir](https://elixir-lang.org/)のバージョンは、1.14以上をインストールしてください。

### [Phoenix](https://www.phoenixframework.org/)

[Phoenix](https://www.phoenixframework.org/)をインストールします。
もうそろそろ[Phoenix](https://www.phoenixframework.org/) 1.7が正式にリリースされます。
おそらく年明け（2023年01月）と街で噂です。
1.6と比べて破壊的変更がされているのでいまから始められる方は、どうせなら1.7からはじめてみることをオススメします。

2022-12-17現在、バージョン`1.7.0-rc.0`を指定すると吉です。

```:CMD
mix local.hex
mix archive.install hex phx_new 1.7.0-rc.0
```


### PostgreSQLの起動

ここでは、Dockerで動かします。
他の方法で起動される場合には、ユーザー名とパスワードを以下コマンドと同じにしておくと吉です。

```:CMD
docker run -d --rm -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres postgres:15
```

## プロジェクトの作成

```:CMD
mix phx.new hello
```

`Fetch and install dependencies? [Yn]`は、`Y`でも`n`でもどちらでもよいです。
私はいつも`n`にしています。


## とりあえず動かす

```:CMD
cd hello
mix setup
```

`Shall I install rebar3? (if running non-interactively, use "mix local.rebar --force") [Yn]`を訊かれたら、`Y`にしましょう。

```:CMD
mix phx.server
```

Visit: http://127.0.0.1:4000

ブラウザで**迷わず**アクセスしてみてください。

![スクリーンショット 2022-12-17 22.27.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/54950343-0328-5e9c-f4a7-6f002375b07b.png)

カッちょいいのが立ち上がったら成功です。

もしここまででうまくいかないところがありましたら、先へは進めませんので、落ち着いて手順を見直してみましょう。
エラーログをよく読んでみましょう。答えはそこに書いてあります。

## ブログ機能を追加

ここでは四の五の言わずにとにかく実行してみましょう。
プロジェクトのルートで以下のコマンドを実行してください。

```:CMD
mix phx.gen.live Blogs Blog blogs title:string body:text
```

上記を実行すると以下のメッセージが実行結果に表示されます。

```
Add the live routes to your browser scope in lib/hello_web/router.ex:

    live "/blogs", BlogLive.Index, :index
    live "/blogs/new", BlogLive.Index, :new
    live "/blogs/:id/edit", BlogLive.Index, :edit

    live "/blogs/:id", BlogLive.Show, :show
    live "/blogs/:id/show/edit", BlogLive.Show, :edit


Remember to update your repository by running migrations:

    $ mix ecto.migrate
```

この通りのことをあとはやればいいです。

少し戻って、`mix phx.gen.live Blogs Blog blogs title:string body:text`コマンドの意味を知りたい方は以下の記事をご参照ください。
https://hexdocs.pm/phoenix/Mix.Tasks.Phx.Gen.Live.html



### lib/hello_web/router.ex の編集

`1.7.0-rc.0`ですと、17行目-21行目に以下があるはずです。
ここを編集します。

**編集前**

```elixir:lib/hello_web/router.ex
  scope "/", HelloWeb do
    pipe_through :browser

    get "/", PageController, :home
  end
```

**編集後**

```elixir:lib/hello_web/router.ex
  scope "/", HelloWeb do
    pipe_through :browser

    get "/", PageController, :home
    live "/blogs", BlogLive.Index, :index
    live "/blogs/new", BlogLive.Index, :new
    live "/blogs/:id/edit", BlogLive.Index, :edit

    live "/blogs/:id", BlogLive.Show, :show
    live "/blogs/:id/show/edit", BlogLive.Show, :edit
  end
```

### データベースのmigrate

データベースをmigrateしましょう。

```:CMD
mix ecto.migrate
```


## ブログ機能を動かす

もし「[とりあえず動かす](https://qiita.com/torifukukaiou/items/b1a89ff52ca9a63e3434#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E5%8B%95%E3%81%8B%E3%81%99)」で動かしているものがありましたら、一度Ctl + Cで止めてください。
再度、[Phoenix](https://www.phoenixframework.org/)アプリを動かします。

```:CMD
mix phx.server
```

Visit: http://127.0.0.1:4000/blogs

ブラウザで迷わずアクセスしてみましょう。

![スクリーンショット 2022-12-17 22.42.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/145a19d7-f7a4-d41c-9d77-ed121139c824.png)

:tada: :tada::tada:

「New Blog」ボタンでブログの作成ができます。
まずはここからはじめて、CRUD(Create Read Update Delete)を楽しみましょう。








# 今日の<font color="#d00080">闘魂</font>

人は生命を賭けて一か八かの大勝負をしないといけないときがあります。

##  豊臣秀吉（太閤殿下）の場合

[金ヶ崎の退き口](https://bushoojapan.com/bushoo/oda/2022/04/25/74879/2)

> まず挙げられるのは、豊臣秀吉たちが務めた殿（しんがり）の功績でしょう。
> 殿とは、撤退戦のときに最後尾を請け負い、敵の追手を食い止めたり振り切ったりする部隊のことです。戦場においては最も危険な任務とも言え、例えば長島一向一揆のときには美濃三人衆の一人である氏家卜全が一揆衆の攻撃を受けて犠牲になっています。
> そんな危険な役割を秀吉自ら願い出るとは――講談などでは秀吉が自ら殿を願い出たという話もあります



## ビル・ゲイツの場合

できてもいないものをできたと売り込み、プレゼンまでに完成させたそうです。

https://twitter.com/chomado/status/990556993323610112

のちに皇帝とまで言われるようになる人物の若いころの有名な逸話です。

## 猪木さん流に言うと

猪木さん流に言うと、「人間は、一生のあいだに何度か闘わなければならないときがある。そのときに、妥協して敗れるのか、必死で闘った結果敗れるのかでは大きな違いがある」ということです。

:book:『[アントニオ猪木　最後の闘魂](https://presidentstore.jp/item/008105.html)』:book:より引用します。


> 年間何百試合と闘っていれば、コンディションがよくない日だってある。だからといって、「今日は調子が悪いから仕方ない」と、勝負を投げることはなかった。闘う前から妥協して自分に負けてしまっていたら、相手に勝つことなんてできない。相手に負けること以上に自分に負けることは絶対に嫌だった。どんなときでもベストを尽くす。必死で闘えば、必ずなにか得られるものがある。

一言で言うと、つまりは **闘魂** です。
「闘魂」とは、 **「己に打ち克つこと、そして闘いを通じて己の魂を磨いていくことだとおもいます」**  と猪木さんはおっしゃられています。

:book:『[アントニオ猪木　最後の闘魂](https://presidentstore.jp/item/008105.html)』:book:
みなさまもぜひこの本をお手にとられて、猪木さんが残されたメッセージを通じて、直接猪木さんから「元氣」をもらってください。

https://www.shinchosha.co.jp/book/129721/

https://presidentstore.jp/item/008105.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/be8933f5-e3e2-d5f4-1561-f65f75abdf38.png)

少し残酷なことを言います。
正確には聞く人にとっては、耳の痛い話をします。

**歴史に名を残す人は、勝っています。**
負けません。勝つまで続けます。

人智を超えた運、天運を持っている方々なのでしょう。
**運をも家来にしている人たちなのでしょう。** その心境に至るには、自分自身でできるあらゆることに最善を尽くすことが前提なのでしょう。

もしあなたがまだ勝てていないのだとしたら、「こんなにがんばっているのに！」と努力を売り物にしているのだとしたら、私自身も含めてそうですけど、まだまだ全然がんばりが足りないのです。
それでは人類は次のステージにいけないのです。
全員が、ビル・ゲイツ氏、イーロン・マスク氏のレベルになる ーー そうなってくると、未来のビル・ゲイツ氏、イーロン・マスク氏に相当する人はもっと先にいるのです。それでこそ世界文化はようやく進展するのです。私達ひとりひとりは人類発展の尊い礎なのです。生命の続く限り闘い抜くべきなのです。

女優の芦田愛菜さんが王貞治会長の言葉を紹介されています。
**「努力は必ず報われる。報われない努力があるとすればそれはまだ努力とは言えない」（王貞治)**

https://hochi.news/articles/20201006-OHT1T50113.html?page=1


将棋では素人でも、いまの藤井先生と同じレベルになる  ーー そんな未来がきて、将棋はますます発展するのです。将棋ウォーズ2級の分際で大それたことを言っています。100年後、1000年後の理想とする世界観、メッセージとしてご容赦ください。

---

# [Phoenix](https://www.phoenixframework.org/) は不死鳥 ーー 闘魂は永遠

2022-10-01 アントニオ猪木さんは、文字通り生命を燃やし続けられました。
**その火は消えていないのです。**

**闘魂**の火は永遠です。いつまでも一人ひとりの胸の中で**闘魂**の火が燃えていることでしょう。
「**闘魂**は連鎖する」のです。

![日本の歴史すなわち闘魂の連鎖.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/37bd4570-e6b3-69d7-ea41-4f7a92a10c37.png)

日本の歴史はすなわち**闘魂**の歴史です。

こちらの[ビデオ](https://njpwworld.com/p/s_series_00151_1_01)の05分40秒あたりからをぜひご覧になってください。
アントニオ猪木さんの引退試合のセレモニーが始まります。
有名な「道」の詩が朗読されたシーンです。
引退セレモニーの冒頭で古舘伊知郎さんのナレーションがあります。
その中で「**闘魂**は連鎖する」の言葉があります。

**闘魂のかけらを携えて今度は我々が旅にでる番だ！　闘魂は連鎖する！**

[Phoenix](https://www.phoenixframework.org/) は不死鳥ですし、「燃える**闘魂**」は永遠なのです。

---

# さいごに

[Phoenix](https://www.phoenixframework.org/)を説明しました。

闘魂の意味は、 **「己に打ち克つこと、そして闘いを通じて己の魂を磨いていくことだとおもいます」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。

<font color="red">$\huge{１、２、３ ぁっダー！}$</font>


<iframe width="910" height="512" src="https://www.youtube.com/embed/AWxwmqzbOaw" title="燃える闘魂 アントニオ猪木  追悼VTR" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

https://www.youtube.com/watch?v=FSz7N5hCltw

---

https://qiita.com/torifukukaiou/items/5e96f4e9f12ec3c4b3f4

---

# Twitter

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Elixir Advent Calendar 3の22日目、まいどお馴染み <a href="https://twitter.com/torifukukaiou?ref_src=twsrc%5Etfw">@torifukukaiou</a> さんで、Elixirビルトインライブラリが一通り終わり、遂にWebFW「Phoenix」の出番です💁‍♂️<a href="https://t.co/p2ml11lHs4">https://t.co/p2ml11lHs4</a><br><br>今年はコミュニティ発の書籍もリリースしており、Webアプリ開発に必要なモダンで洗練された要素、全部入りFWです😆 <a href="https://t.co/S11veT4Evs">pic.twitter.com/S11veT4Evs</a></p>&mdash; piacere (love Elixir, Gravity and VR/AR/Metaverse) (@piacere_ex) <a href="https://twitter.com/piacere_ex/status/1606855335662473219?ref_src=twsrc%5Etfw">December 25, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---


<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>