あしひきの山鳥の尾のしだり尾のながながし夜をひとりかも寝む
Advent Calendar 2022 52日目1の記事です。
I'm looking forward to 12/25,2022
私のAdvent Calendar 2022 一覧。
はじめに
Elixirを楽しんでいますか
2022/02/24(木)は
【増枠しました!】fukuoka.ex#51:Elixirお茶会〜Ectoを学ぼうの会
が開催されます。
そのLT資料です。
もくじ
4つ話します。
最後に、本の紹介
直前の @koga1020 さんの発表内容を聞いて、ボリューム調整します。
とりあえず4つ話題を用意しました。
自己紹介
Although I am not the most important here, my name is Awesome YAMAUCHI.
名乗るほどものではございません。
Ectoに関連する実績を2つ紹介します。
- 2022/02/24(木)発売の「WEB+DB PRESS Vol.127
」の特集2 Elixirによる高速なWeb開発!
作って学ぶPhoenix の第3章「Ectoによるデータベースアプリケーションの開発」を担当しました-
Awesome YAMAUCHI
名義で書いています
-
-
Ecto本体にコミットがマージされています
- プルリク
- Ectoは、José Valimさんが直々にレビューしています
Programming Ecto
より
Programming Ecto より、Chapter 2のコード片を抜粋します。
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
query = from t in "tracks",
join: a in "albums", on: t.album_id == a.id,
select: [t.id, t.title, a.title]
EctoとSQLよく似ているよね。
ここではそれだけ覚えておいてください。
チートシート
Ecto's minimal cheatsheet:
— José Valim (@josevalim) February 4, 2022
* Ecto.Schema: what is the data
* Ecto.Repo: where is the data
* Ecto.Query: how to read the data
* Ecto.Changeset: how to change the data#MyElixirStatus
Getting Started
EctoのGetting Startedを一通りやってみると雰囲気をつかめるとおもいます。
Phoenixアプリではない、ふつうのElixirアプリがEctoを使うサンプルです。
Phoenixアプリでは、Contextモジュールに実装されている内容に相当します。
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な例です。
文字列リテラルで書くと大丈夫です。
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
と言われるので^
をつけましょう。
last_name = "Smith"
Ecto.Query.from(p in Friends.Person, where: p.last_name == last_name) |> Friends.Repo.all
OK
変数に^
をつけると、EctoのDSLの世界の中に外の変数の値を持ち込めます。
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)
@koga1020 さんが作成、運用されているElixirイベントカレンダーのソースコードの中にあります。
とっても重宝しています。
ありがとうございます!
このアプリケーションはDBを使っていませんが、Ectoを使っています。
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の中では、CHAPTER4の「Creating Changesets Using External Data」で解説されているものと同じ内容です
Ectoにプルリクを出してわかったこと(Elixir)
Xxx.Application.start/2
のchildren
にモジュールを追加してアプリケーションの起動と同時にuse GenServer
したモジュールを立ち上げることがよくあります。
PhoenixアプリではMixタスクのmix phx.new
でいい感じに設定されます。
このとき、引数を必要としないモジュールを追加する方法は2つあります。
- ①モジュール名のみ書く
- ②
{モジュール名, []}
とタプルで書く
def start(_type, _args) do
children = [
Friends.Repo # {Friends.Repo, []}でも同じことですが、Friends.Repo(①)がオススメのようです
]
José Valimさんにレビューしてもらって、そのやりとり(お互いにWDYT = What do you think?をやりとり)を通じてわかったことです。
@mnishiguchi さんにあとから言われて気づいた視点です。ありがとうございます!
本の紹介
この3冊です。
SQL
冒頭の話をもう一回もってきます。
Programming Ecto より、Chapter 2のコード片を抜粋します。
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
query = from t in "tracks",
join: a in "albums", on: t.album_id == a.id,
select: [t.id, t.title, a.title]
EctoとSQLよく似ていますよね。
SQLからやり直したい人には以下の本をススメておきます。
Wrapping up 



Enjoy Elixir
$\huge{Enjoy\ Elixir🚀}$
$\huge{Enjoy\ Ecto🚀}$
この記事は、【増枠しました!】fukuoka.ex#51:Elixirお茶会〜Ectoを学ぼうの会のLT資料です。
当日は、記録係(レポート投稿)します。
付録
以下、付録です。
Elixirの誕生日は、2012年5月24日です。
そのため、今年の2022年5月24日は10周年を迎えます。
iex> Date.diff(~D[2022-05-24], ~D[2022-02-21])
92
そうそう!
2月24日発売予定のWEB+DB PRESS Vol.127で、ElixirとPhoenixの特集がでますよ〜
Elixir、Phoenixをはじめられたばかりの方も、腕におぼえがある方も、どんなものなのかなあと様子見をきめこんでいる方も、
つまりは
$\huge{全人類のみなみなさま!!!}$
お手にとって、お楽しみください!!!
We, @tamanugi @torifukukaiou @the_haigo @mokichi_s12m including me, wrote featured articles for WEB+DB PRESS Vol.127 about Elixir and Phoenix! It's being published on 24, Feb.https://t.co/UPNiVU1zG9
— 栗林健太郎 (@kentaro) February 4, 2022
fukuoka.ex特別編:WEB+DB PRESS vol127 Phoenix特集こたつで座談会
出版記念イベントが開催されます。
ぜひご参加ください。
2022/03/08(火) 19:30 〜 21:00
この本を多くの方に知っていただき、出版という ”おめでたい” イベントを、執筆陣全員と皆さまで、ぜひ同じこたつに入ってのんびり座談会するかのように楽しんでいただきたいと思います。
Elixir
最後の最後に、Elixirについて紹介します。
- |>でスイスイ、プログラミングしていくことができる素敵なプログラミング言語です
- さっそくプログラムの例を示します
-
Qiita APIを使わせていただいて、
Elixir
タグがついた最新の記事を20件取得しています - ここでは雰囲気をつかんでいただければ大丈夫です
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アプリケーションを楽しむなら
IoTを楽しむなら
AIを楽しむなら
もっとElixirのことを知りたい方へオススメの書籍
- プログラミングElixir(第2版) -- オーム社
- Elixir実践ガイド -- インプレス
- アルケミスト − 夢を旅した少年 -- KADOKAWA
コミュニティ
-
elixir.jp Slack workspaceに参加してみてください
- マヂ、やさしい人ばっかりのコミュニティ
- あなたの困ったをきっと解決してくれるでしょう
-
NervesJP Slack workspaceでは、NervesやIoTが好きな愉快なfolksたちがあなたの訪れを歓迎します
- たくさんのコミュニティがあります
(EDI/fukuoka.ex/kokura.ex & LiveView JP の @piacerex さん作)
Elixirコミュニティに初めて接する方は下記がオススメです
Elixirコミュニティ の歩き方 -国内オンライン編-
https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian
(piyopiyo.ex & エリジョ の nakoさん(@kn339264) 作、素敵な資料)
Elixirのイベント情報
@koga1020 さんが作成されたイベントカレンダーがあります。
https://elixir-jp-calendar.fly.dev/
気になるイベントにはぜひ参加してみましょう!!!
上記サイトの解説記事はこちらです。
I organize autoracex.
And I take part in NervesJP, fukuoka.ex, EDI, tokyo.ex, Pelemay.
I hope someday you'll join us.
We Are The Alchemists, my friends!