fukuoka.ex#51：Elixirお茶会〜Ectoを学ぼうの会 LT資料 -- Ecto Getting Started, DB無しでEcto!?、childrenにはFriends.Repoだけ、Ecto本の紹介

**あしひきの山鳥の尾のしだり尾のながながし夜をひとりかも寝む**

Advent Calendar 2022 52日目[^1]の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私の[Advent Calendar 2022 一覧](https://docs.google.com/spreadsheets/d/1HQvFjagQLRPjOYAjDVzWp9S4b8dKixxvvaz_TtbZWto/edit#gid=1723448955)。


[^1]: @kaizen_nagoya さんの「[「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 １日目　Most Breakthrough Generator](https://qiita.com/kaizen_nagoya/items/49ebebee3a0377f3b59b)」から着想を得て、模倣いたしました。 

---

# はじめに

[Elixir](https://elixir-lang.org/)を楽しんでいますか:bangbang::bangbang::bangbang:

2022/02/24(木)は

https://fukuokaex.connpass.com/event/238834/

**【増枠しました！】fukuoka.ex#51：Elixirお茶会〜Ectoを学ぼうの会**
が開催されます。

そのLT資料です。

# もくじ

4つ話します。

https://hexdocs.pm/ecto/getting-started.html

https://qiita.com/torifukukaiou/items/aea6409e695f9a29d1b0

https://qiita.com/torifukukaiou/items/bfbe459979172ecab7d9

最後に、本の紹介

**直前の @koga1020 さんの発表内容を聞いて、ボリューム調整します。**
とりあえず4つ話題を用意しました。

# 自己紹介

Although I am not the most important here, my name is Awesome YAMAUCHI.
名乗るほどものではございません。

[「azure elixir 愛」で検索🔍](https://www.youtube.com/watch?v=R3o8vR1A9ao)

Ectoに関連する実績を2つ紹介します。

- 2022/02/24(木)発売の「[WEB+DB PRESS Vol.127](https://gihyo.jp/magazine/wdpress/archive/2022/vol127):book:」の特集2 **Elixirによる高速なWeb開発！
 作って学ぶPhoenix** の第３章「Ectoによるデータベースアプリケーションの開発」を担当しました
    - `Awesome YAMAUCHI`名義で書いています
- [Ecto](https://github.com/elixir-ecto/ecto)本体にコミットがマージされています
    - [プルリク](https://github.com/elixir-ecto/ecto/pull/3826)
    - [Ecto](https://github.com/elixir-ecto/ecto)は、[José Valim](https://twitter.com/josevalim)さんが直々にレビューしています

# [Programming Ecto](https://pragprog.com/titles/wmecto/programming-ecto/):book: より

[Programming Ecto](https://pragprog.com/titles/wmecto/programming-ecto/):book: より、Chapter 2のコード片を抜粋します。

## SQL

```sql
SELECT t.id, t.title, a.title
  FROM tracks t
  JOIN albums a ON t.album_id = a.id,
  WHERE t.duration > 900; 
```

## Ecto

```elixir
query = from t in "tracks",
  join: a in "albums", on: t.album_id == a.id,
  select: [t.id, t.title, a.title]
```

[Ecto](https://github.com/elixir-ecto/ecto)とSQLよく似ているよね。
ここではそれだけ覚えておいてください。

# チートシート

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Ecto&#39;s minimal cheatsheet:<br><br>* Ecto.Schema: what is the data<br>* Ecto.Repo: where is the data<br>* Ecto.Query: how to read the data<br>* Ecto.Changeset: how to change the data<a href="https://twitter.com/hashtag/MyElixirStatus?src=hash&amp;ref_src=twsrc%5Etfw">#MyElixirStatus</a></p>&mdash; José Valim (@josevalim) <a href="https://twitter.com/josevalim/status/1489522409426325504?ref_src=twsrc%5Etfw">February 4, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# [Getting Started](https://hexdocs.pm/ecto/getting-started.html)

[Ecto](https://github.com/elixir-ecto/ecto)の[Getting Started](https://hexdocs.pm/ecto/getting-started.html)を一通りやってみると雰囲気をつかめるとおもいます。
[Phoenix](https://www.phoenixframework.org/)アプリではない、ふつうの[Elixir](https://elixir-lang.org/)アプリが[Ecto](https://github.com/elixir-ecto/ecto)を使うサンプルです。

[Phoenix](https://www.phoenixframework.org/)アプリでは、[Contextモジュール](https://hexdocs.pm/phoenix/contexts.html#content)に実装されている内容に相当します。

PostgreSQLは開発マシンでは以下のようにDockerで動かしておくことがオススメです。

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


https://hexdocs.pm/ecto/getting-started.html#filtering-results
`^`の記号の話は必ずします。
以下、します。

## OK

まずはOKな例です。
文字列リテラルで書くと大丈夫です。

```elixir
Ecto.Query.from(p in Friends.Person, where: p.last_name == "Smith") |> Friends.Repo.all
```

## NG

これは駄目です。
怒られます。
Ecto側で解釈できません。
親切に、`If you are attempting to interpolate a value, use ^var`と言われるので`^`をつけましょう。

```elixir
last_name = "Smith"
Ecto.Query.from(p in Friends.Person, where: p.last_name == last_name) |> Friends.Repo.all
```

## OK

変数に`^`をつけると、EctoのDSLの世界の中に外の変数の値を持ち込めます。

```elixir
last_name = "Smith"
Ecto.Query.from(p in Friends.Person, where: p.last_name == ^last_name) |> Friends.Repo.all
```

極端な話、そういうもんだとおもって、私は一旦忘れてしまっています。
`^`をつけないとどうせ怒られるので、`If you are attempting to interpolate a value, use ^var`と言われたときに、思い出してつけています。


# [驚くべきことですが、リレーショナルデータベースなしにEctoの一部の機能を使うことができます (Elixir)](https://qiita.com/torifukukaiou/items/aea6409e695f9a29d1b0)

https://qiita.com/torifukukaiou/items/aea6409e695f9a29d1b0

@koga1020 さんが作成、運用されている[Elixirイベントカレンダー](https://elixir-jp-calendar.fly.dev/)のソースコードの中にあります。

https://elixir-jp-calendar.fly.dev/

[koga1020/elixir_jp_calendar](https://github.com/koga1020/elixir_jp_calendar)

![スクリーンショット 2022-02-23 23.37.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/d99e85b5-17c0-cd89-51e0-23b415eb9894.png)


とっても重宝しています。
ありがとうございます！

このアプリケーションはDBを使っていませんが、[Ecto](https://github.com/elixir-ecto/ecto)を使っています。


```elixir:lib/elixir_jp_calendar_web/params/event/index_params.ex
defmodule ElixirJpCalendarWeb.Event.IndexParams do
  @default_source "community"
  use Params.Schema, %{
    source: [field: :string, default: @default_source]
  }

  import Ecto.Changeset

  def changeset(ch, params) do
    ch
    |> cast(params, [:source])
    |> ignore_invalid_source()
  end

  def ignore_invalid_source(%Ecto.Changeset{changes: %{source: source}} = ch) do
    case source in ~w(#{@default_source} keyword) do
      true ->
        ch

      false ->
        change(ch, source: @default_source)
    end
  end

  def ignore_invalid_source(ch), do: ch
end
```

外部から与えられるデータソースから`Ecto.Changeset`を使って、必要な要素のみを取り出す実例です。
[Programming Ecto](https://pragprog.com/titles/wmecto/programming-ecto/):book:の中では、CHAPTER4の「Creating Changesets Using External Data」で解説されているものと同じ内容です:rocket:

# [Ectoにプルリクを出してわかったこと（Elixir）](https://qiita.com/torifukukaiou/items/bfbe459979172ecab7d9)

`Xxx.Application.start/2`の`children`にモジュールを追加してアプリケーションの起動と同時に`use GenServer`したモジュールを立ち上げることがよくあります。
[Phoenix](https://www.phoenixframework.org/)アプリではMixタスクの`mix phx.new`でいい感じに設定されます。
このとき、引数を必要としないモジュールを追加する方法は2つあります。

- ①モジュール名のみ書く
- ②`{モジュール名, []}`とタプルで書く

```elixir:lib/friends/application.ex
      def start(_type, _args) do
        children = [
          Friends.Repo # {Friends.Repo, []}でも同じことですが、Friends.Repo(①)がオススメのようです
        ]
```

[José Valim](https://twitter.com/josevalim)さんにレビューしてもらって、そのやりとり(お互いにWDYT = What do you think?をやりとり)を通じてわかったことです。
@mnishiguchi さんにあとから言われて気づいた視点です。ありがとうございます！

# 本の紹介

この3冊です。

- [Programming Ecto](https://pragprog.com/titles/wmecto/programming-ecto/):book:
- [The Little Ecto Cookbook](https://dashbit.co/ebooks/the-little-ecto-cookbook) :free: 
- [WEB+DB PRESS Vol.127](https://gihyo.jp/magazine/wdpress/archive/2022/vol127):book:

## SQL

冒頭の話をもう一回もってきます。
[Programming Ecto](https://pragprog.com/titles/wmecto/programming-ecto/):book: より、Chapter 2のコード片を抜粋します。

### SQL

```sql
SELECT t.id, t.title, a.title
  FROM tracks t
  JOIN albums a ON t.album_id = a.id,
  WHERE t.duration > 900; 
```

### Ecto

```elixir
query = from t in "tracks",
  join: a in "albums", on: t.album_id == a.id,
  select: [t.id, t.title, a.title]
```

[Ecto](https://github.com/elixir-ecto/ecto)とSQLよく似ていますよね。
SQLからやり直したい人には以下の本をススメておきます。

- [スッキリわかるSQL入門 第2版 ドリル222問付き！](https://book.impress.co.jp/books/1118101071):book:
- [達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ](https://www.shoeisha.co.jp/book/detail/9784798157825):book:
- [達人に学ぶDB設計 徹底指南書 ～初級者で終わりたくないあなたへ](https://www.shoeisha.co.jp/book/detail/9784798124704):book:

---

# Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

Enjoy [Elixir](https://elixir-lang.org/):bangbang::bangbang::bangbang:
<font color="purple">$\huge{Enjoy\ Elixir🚀}$</font>
<font color="purple">$\huge{Enjoy\ Ecto🚀}$</font>

この記事は、[【増枠しました！】fukuoka.ex#51：Elixirお茶会〜Ectoを学ぼうの会](https://fukuokaex.connpass.com/event/238834/)のLT資料です。
当日は、記録係（レポート投稿）します。
 

---

# 付録

以下、付録です。





[Elixir](https://elixir-lang.org/)の誕生日は、2012年5月24日です。
そのため、今年の2022年5月24日は10周年を迎えます。

```elixir
iex> Date.diff(~D[2022-05-24], ~D[2022-02-21])
92
```


そうそう！
2月24日発売予定の[WEB+DB PRESS Vol.127](https://gihyo.jp/magazine/wdpress/archive/2022/vol127)で、[Elixir](https://elixir-lang.org/)と[Phoenix](https://www.phoenixframework.org/)の特集がでますよ〜

[Elixir](https://elixir-lang.org/)、[Phoenix](https://www.phoenixframework.org/)をはじめられたばかりの方も、腕におぼえがある方も、どんなものなのかなあと様子見をきめこんでいる方も、
つまりは
<font color="purple">$\huge{全人類のみなみなさま！！！}$</font>
**お手にとって、お楽しみください!!!**


<blockquote class="twitter-tweet"><p lang="en" dir="ltr">We, <a href="https://twitter.com/tamanugi?ref_src=twsrc%5Etfw">@tamanugi</a> <a href="https://twitter.com/torifukukaiou?ref_src=twsrc%5Etfw">@torifukukaiou</a> <a href="https://twitter.com/the_haigo?ref_src=twsrc%5Etfw">@the_haigo</a> <a href="https://twitter.com/mokichi_s12m?ref_src=twsrc%5Etfw">@mokichi_s12m</a> including me, wrote featured articles for WEB+DB PRESS Vol.127 about Elixir and Phoenix! It&#39;s being published on 24, Feb.<a href="https://t.co/UPNiVU1zG9">https://t.co/UPNiVU1zG9</a></p>&mdash; 栗林健太郎 (@kentaro) <a href="https://twitter.com/kentaro/status/1489441847130746880?ref_src=twsrc%5Etfw">February 4, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## [fukuoka.ex特別編:WEB+DB PRESS vol127 Phoenix特集こたつで座談会](https://fukuokaex.connpass.com/event/239094/)

https://fukuokaex.connpass.com/event/239094/

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

出版記念イベントが開催されます。
ぜひご参加ください。

**2022/03/08(火) 19:30 〜 21:00**
**この本を多くの方に知っていただき、出版という ”おめでたい” イベントを、執筆陣全員と皆さまで、ぜひ同じこたつに入ってのんびり座談会するかのように楽しんでいただきたいと思います。**


---


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

最後の最後に、[Elixir](https://elixir-lang.org/)について紹介します。

- [|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)でスイスイ、プログラミングしていくことができる素敵なプログラミング言語です
- さっそくプログラムの例を示します
- [Qiita API](https://qiita.com/api/v2/docs)を使わせていただいて、`Elixir`タグがついた最新の記事を20件取得しています
- ここでは雰囲気をつかんでいただければ大丈夫です

```elixir
Mix.install [{:req, "~> 0.2.1"}]

"https://qiita.com/api/v2/items?query=tag:Elixir"
|> URI.encode()
|> Req.get!(finch_options: [pool_timeout: 50000, receive_timeout: 50000])
|> Map.get(:body)
|> Enum.map(& Map.take(&1, ["title", "url"]))

```

## Webアプリケーションを楽しむなら
- [Phoenix](https://www.phoenixframework.org/)

## IoTを楽しむなら
- [Nerves](https://www.nerves-project.org/)

## AIを楽しむなら
- [Nx](https://github.com/elixir-nx/nx) + [Livebook](https://github.com/livebook-dev/livebook)

## もっと[Elixir](https://elixir-lang.org/)のことを知りたい方へオススメの書籍 :books: 
- [プログラミングElixir（第2版）](https://www.ohmsha.co.jp/book/9784274226373/) -- オーム社
- [Elixir実践ガイド](https://book.impress.co.jp/books/1120101021) -- インプレス
- [アルケミスト − 夢を旅した少年](https://www.kadokawa.co.jp/product/199999275001/) -- KADOKAWA

## コミュニティ
- [elixir.jp](https://join.slack.com/t/elixirjp/shared_invite/zt-ae8m5bad-WW69GH1w4iuafm1tKNgd~w) Slack workspaceに参加してみてください
    - マヂ、やさしい人ばっかりのコミュニティ
    - あなたの**困った**をきっと解決してくれるでしょう
- [NervesJP Slack](https://join.slack.com/t/nerves-jp/shared_invite/zt-9vteokip-iVAqi8TkT0ID_uK9dSqVHA) workspaceでは、NervesやIoTが好きな愉快なfolksたちがあなたの訪れを歓迎します :tada:
- たくさんのコミュニティがあります
![FCOvBkAUYAE6mL8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/a277d0ea-2780-d9a3-4062-66d38b175125.jpeg)
([EDI／fukuoka.ex／kokura.ex](https://fukuokaex.connpass.com/) ＆ [LiveView JP](https://liveviewjp.connpass.com/) の @piacerex さん作 :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:)



# <u><b>Elixirコミュニティに初めて接する方は下記がオススメです</b></u>

**Elixirコミュニティ の歩き方 －国内オンライン編－**<br>
https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/f891b7ad-d2c4-3303-915b-f831069e28a4.png)](https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian)
([piyopiyo.ex](https://piyopiyoex.connpass.com/) ＆ [エリジョ](https://elijo.connpass.com/) の nakoさん(@kn339264) 作、素敵な資料:clap::clap_tone1::clap_tone2::clap_tone3::clap_tone4::clap_tone5:)

# [Elixir](https://elixir-lang.org/)のイベント情報

@koga1020 さんが作成されたイベントカレンダーがあります。
[https://elixir-jp-calendar.fly.dev/](https://elixir-jp-calendar.fly.dev/)

https://elixir-jp-calendar.fly.dev/

気になるイベントにはぜひ参加してみましょう!!!

上記サイトの解説記事は[こちら](https://zenn.dev/koga1020/articles/6e67765cc53539)です。

https://zenn.dev/koga1020/articles/6e67765cc53539


---

I organize [autoracex](https://autoracex.connpass.com/).
And I take part in [NervesJP](https://nerves-jp.connpass.com/), [fukuoka.ex](https://fukuokaex.connpass.com/), [EDI](https://fukuokaex.connpass.com/), [tokyo.ex](https://beam-lang.connpass.com/), [Pelemay](https://pelemay.connpass.com/).
I hope someday you'll join us.

[We Are The Alchemists, my friends!](https://www.youtube.com/watch?v=04854XqcfCY)


---