LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

Organization

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 一覧


はじめに

Elixirを楽しんでいますか:bangbang::bangbang::bangbang:

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.
名乗るほどものではございません。

「azure elixir 愛」で検索🔍

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

  • 2022/02/24(木)発売の「WEB+DB PRESS Vol.127:book:」の特集2 Elixirによる高速なWeb開発!
    作って学ぶPhoenix
    の第3章「Ectoによるデータベースアプリケーションの開発」を担当しました
    • Awesome YAMAUCHI名義で書いています
  • Ecto本体にコミットがマージされています

Programming Ecto:book: より

Programming Ecto:book: より、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よく似ているよね。
ここではそれだけ覚えておいてください。

チートシート

Getting Started

EctoGetting 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イベントカレンダーのソースコードの中にあります。

koga1020/elixir_jp_calendar

スクリーンショット 2022-02-23 23.37.18.png

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

このアプリケーションはDBを使っていませんが、Ectoを使っています。

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:book:の中では、CHAPTER4の「Creating Changesets Using External Data」で解説されているものと同じ内容です:rocket:

Ectoにプルリクを出してわかったこと(Elixir)

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

  • ①モジュール名のみ書く
  • {モジュール名, []}とタプルで書く
lib/friends/application.ex
      def start(_type, _args) do
        children = [
          Friends.Repo # {Friends.Repo, []}でも同じことですが、Friends.Repo(①)がオススメのようです
        ]

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

本の紹介

この3冊です。

SQL

冒頭の話をもう一回もってきます。
Programming Ecto:book: より、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 :lgtm::lgtm::lgtm::lgtm::lgtm:

Enjoy Elixir:bangbang::bangbang::bangbang:
$\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で、ElixirPhoenixの特集がでますよ〜

ElixirPhoenixをはじめられたばかりの方も、腕におぼえがある方も、どんなものなのかなあと様子見をきめこんでいる方も、
つまりは
$\huge{全人類のみなみなさま!!!}$
お手にとって、お楽しみください!!!

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のことを知りたい方へオススメの書籍 :books:

コミュニティ

  • elixir.jp Slack workspaceに参加してみてください
    • マヂ、やさしい人ばっかりのコミュニティ
    • あなたの困ったをきっと解決してくれるでしょう
  • NervesJP Slack workspaceでは、NervesやIoTが好きな愉快なfolksたちがあなたの訪れを歓迎します :tada:
  • たくさんのコミュニティがあります
    FCOvBkAUYAE6mL8.jpeg
    (EDI/fukuoka.ex/kokura.exLiveView JP@piacerex さん作 :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:)

Elixirコミュニティに初めて接する方は下記がオススメです

Elixirコミュニティ の歩き方 -国内オンライン編-

https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian
image.png
(piyopiyo.exエリジョ の nakoさん(@kn339264) 作、素敵な資料:clap::clap_tone1::clap_tone2::clap_tone3::clap_tone4::clap_tone5:)

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!


  1. @kaizen_nagoya さんの「「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 1日目 Most Breakthrough Generator」から着想を得て、模倣いたしました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2