Slide 1

Slide 1 text

A Tour of Elixir VEGA Tech Meetup #2 / Aug 17th, 2018 ponday (@ponday_dev)

Slide 2

Slide 2 text

Profile - ponday (Honda, Yusuke) - 株式会社ベガコーポレーション エンジニア - Like : TypeScript / Elixir / Python etc...

Slide 3

Slide 3 text

あらすじ Elixir採用に向けて技術検証中 新プロダクト作るぞ! Elixir試してみよう 負荷試験の成績がものすごい!! みんなもやろう! ← イマココ 前回Meetupより

Slide 4

Slide 4 text

今回は触ってみよう!編

Slide 5

Slide 5 text

・ 雰囲気を伝えるための超圧縮版です   詳しい内容は公式ドキュメントを参照願います ・ Elixirの機能を紹介するものでPhoenixの内容は   含みません ご注意

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

の前に

Slide 8

Slide 8 text

・ Prologライクな関数型言語 ・ 極めて高い信頼性(付属ライブラリ:99.9999999%) ・ 通信分野やゲームサーバでの採用実績   ・ Call of Duty   ・ League of Legends   ・ WhatsApp Erlang

Slide 9

Slide 9 text

・ 軽量プロセス   ・ 極めて小さなメモリ消費(300ワード)   ・ μ秒レベルのプロセス起動時間   ・ 2000万プロセスが実行できたというベンチマークもあるらしい ・ 優れた耐障害性 ・ エラーが起こればプロセスごとやり直す Erlang VM(BEAM)

Slide 10

Slide 10 text

・ 強い動的型付けの関数型言語 ・ Erlang VM上で動作(Erlangの利点がそのまま活かせる) ・ Rubyに影響を受けた柔軟な構文 ・ Railsに影響を受けたWAF(Phoenix)がある ・ 他の言語出身者でも馴染みやすい(※個人的な意見です) Elixir

Slide 11

Slide 11 text

実行環境

Slide 12

Slide 12 text

・ ローカルにインストールする ・ Wandbox(https://wandbox.org/)を使う ・ Dockerイメージを利用する 実行環境 オススメ

Slide 13

Slide 13 text

Elixirのイメージが提供されているのでそれを使う Dockerによる環境構築 ↑は容量が大きいので小さいほうが良ければ以下

Slide 14

Slide 14 text

Elixir + Phoenix用リポジトリ https://github.com/ponday-dev/elixir-on-docker ・ MariaDBとつなげるdocker-compose.ymlまで ・ 使い方はREADMEを参照

Slide 15

Slide 15 text

Hello, World

Slide 16

Slide 16 text

Hello, World シンプル版 ・ 標準出力はIO.puts関数 ・ 文字列はダブルクォートで囲む  (シングルクォートは意味が異なる)

Slide 17

Slide 17 text

Hello, World シンプル版 関数版(無名関数) ・ fn (引数) -> endで無名関数が作れる ・ 無名関数の呼び出しは (関数名).(引数)

Slide 18

Slide 18 text

Hello, World モジュール版 ・ defmoduleでモジュールを定義 ・ クラスではない ・ モジュール内に関数を定義するときは   fnではなくdef ・ モジュールに属する関数呼び出しは   (関数名)(引数)の形式で可

Slide 19

Slide 19 text

データ構造

Slide 20

Slide 20 text

・ 整数 / 浮動少数 ・ 真偽値(true / false) ・ 文字列(バイナリ) ・ アトム(Rubyでいうシンボル) ・ nil(※データ型ではない) 基本データ型

Slide 21

Slide 21 text

・ リスト ・ タプル ・ キーワード付きリスト ・ マップ コレクション

Slide 22

Slide 22 text

・ 普通の配列 ・ 順序は保証されている リスト

Slide 23

Slide 23 text

・ メモリ上に連続して格納される ・ サイズ取得は高速、修正は低速 タプル

Slide 24

Slide 24 text

・ アトムと値のタプルで構成されたリスト ・ 順序は保証されている キーワード付きリスト

Slide 25

Slide 25 text

・ いわゆる連想配列 マップ

Slide 26

Slide 26 text

パターンマッチ

Slide 27

Slide 27 text

・ 値やデータ構造をマッチング(≠ 正規表現) ・ = は代入ではなくパターンマッチ演算子 ・ 制御構文、関数呼び出しなど色々な場面で使える パターンマッチ

Slide 28

Slide 28 text

・ 左辺に変数が来る場合は代入操作 ・ 再代入も可能 パターンマッチ(基本)

Slide 29

Slide 29 text

・ コレクションの構造に対してもマッチ可能 パターンマッチ(コレクション)

Slide 30

Slide 30 text

・ コレクションの構造に対してもマッチ可能 パターンマッチ(マップ)

Slide 31

Slide 31 text

制御構造

Slide 32

Slide 32 text

・ 条件が一つだけの条件分岐(else ifがない) ・ 三項演算子のような使い方も if

Slide 33

Slide 33 text

・ 複数の条件がある場合に利用 ・ いずれかの条件に一致しないとエラーになる cond

Slide 34

Slide 34 text

・ パターンマッチで条件分岐 ・ いずれかの条件に一致しないとエラーになる case

Slide 35

Slide 35 text

・ パターンマッチが成功する場合に実行 with

Slide 36

Slide 36 text

パイプライン演算子

Slide 37

Slide 37 text

・ Elixirのコードで頻出 ・ 連続した関数呼び出しを”|>”でつなげて記述 ・ 左辺のデータが右辺の関数の第一引数に適用 ・ コード上の記述と実際の処理の順序が同じになる パイプライン演算子

Slide 38

Slide 38 text

・ コードの記述と実際の処理順序が異なる ・ どこがどの関数の引数なのか分かりづらい 例:JavaScriptの場合 ※ 多くの言語で起こることでJSを貶める意図はありません

Slide 39

Slide 39 text

例:Elixirの場合 ・ コードの記述と実際の処理順序が同じ ・ 引数と関数の対応が明確 ・ ワンライナーも可

Slide 40

Slide 40 text

モジュール

Slide 41

Slide 41 text

・ 関数をまとめて名前空間を定義 ・ EnumやKeyword、Mapは標準提供のモジュール モジュール

Slide 42

Slide 42 text

・ モジュール内に定義される特殊なマップ ・ マップとパターンマッチが可能 構造体

Slide 43

Slide 43 text

・ モジュールは他言語で言うクラスではない ・ 構造体でデータ構造が定義できるものの、   これはインスタンスではない ・ インスタンスメソッドのような呼び出しはできない モジュール ≠ クラス

Slide 44

Slide 44 text

モジュール ≠ クラス

Slide 45

Slide 45 text

・ 関数呼び出し時、引数にもパターンマッチが適用 ・ パターンマッチの条件が異なれば、   同名の関数が複数定義できる 関数呼び出しとパターンマッチ

Slide 46

Slide 46 text

関数呼び出しとパターンマッチ ・ case do ~ endのマッチは関数呼び出し時点で可

Slide 47

Slide 47 text

関数呼び出しとパターンマッチ ・ 引数でパターンマッチ ・ 関数のワンライナー向け記法で行数を圧縮

Slide 48

Slide 48 text

サンプル

Slide 49

Slide 49 text

FizzBuzz

Slide 50

Slide 50 text

まとめ

Slide 51

Slide 51 text

・ ElixirはErlang VM上で動作する関数型言語 ・ 耐障害性がすごい ・ Dockerで簡単に試せる ・ パターンマッチとパイプラインが特徴的 まとめ

Slide 52

Slide 52 text

Elixirは良いぞ

Slide 53

Slide 53 text

Thank you !!