Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
A Tour of Elixir
Search
ponday
August 17, 2018
Programming
1
470
A Tour of Elixir
VEGA Tech Meetup #2(2018/08/17)発表資料です。
ponday
August 17, 2018
Tweet
Share
More Decks by ponday
See All by ponday
関数型でGoFのデザインパターンやってみる
honda
1
1.1k
TypeScriptの型表現
honda
10
2.9k
Web Componentsの今
honda
1
380
これまでのReact、これからのReact
honda
0
280
Gatsbyお試し
honda
0
110
styled-components or emotion?
honda
0
630
Web ComponentsとAngular
honda
0
130
Atomic Design周りについての私見
honda
1
620
え、まだWeb Componentsを未来の技術だと思ってるの?
honda
2
730
Other Decks in Programming
See All in Programming
外部システム連携先が10を超えるシステムでのアーキテクチャ設計・実装事例
kiwasaki
1
230
飲食業界向けマルチプロダクトを実現させる開発体制とリアルな現状
hiroya0601
1
390
offers_20241022_imakiire.pdf
imakurusu
2
360
推し活としてのrails new/oshikatsu_ha_iizo
sakahukamaki
3
1.7k
macOS でできる リアルタイム動画像処理
biacco42
7
1.9k
Server Driven Compose With Firebase
skydoves
0
400
RailsのPull requestsのレビューの時に私が考えていること
yahonda
5
1.7k
カスタムしながら理解するGraphQL Connection
yanagii
1
1.2k
GitHub Actionsのキャッシュと手を挙げることの大切さとそれに必要なこと
satoshi256kbyte
5
390
色々なIaCツールを実際に触って比較してみる
iriikeita
0
270
破壊せよ!データ破壊駆動で考えるドメインモデリング / data-destroy-driven
minodriven
16
4.1k
Pinia Colada が実現するスマートな非同期処理
naokihaba
2
160
Featured
See All Featured
Optimizing for Happiness
mojombo
376
69k
Why You Should Never Use an ORM
jnunemaker
PRO
53
9k
Code Review Best Practice
trishagee
64
17k
Measuring & Analyzing Core Web Vitals
bluesmoon
1
40
How STYLIGHT went responsive
nonsquared
95
5.2k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.2k
Six Lessons from altMBA
skipperchong
26
3.5k
The World Runs on Bad Software
bkeepers
PRO
65
11k
Scaling GitHub
holman
458
140k
Happy Clients
brianwarren
97
6.7k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
Transcript
A Tour of Elixir VEGA Tech Meetup #2 / Aug
17th, 2018 ponday (@ponday_dev)
Profile - ponday (Honda, Yusuke) - 株式会社ベガコーポレーション エンジニア - Like
: TypeScript / Elixir / Python etc...
あらすじ Elixir採用に向けて技術検証中 新プロダクト作るぞ! Elixir試してみよう 負荷試験の成績がものすごい!! みんなもやろう! ← イマココ 前回Meetupより
今回は触ってみよう!編
・ 雰囲気を伝えるための超圧縮版です 詳しい内容は公式ドキュメントを参照願います ・ Elixirの機能を紹介するものでPhoenixの内容は 含みません ご注意
None
の前に
・ Prologライクな関数型言語 ・ 極めて高い信頼性(付属ライブラリ:99.9999999%) ・ 通信分野やゲームサーバでの採用実績 ・ Call of
Duty ・ League of Legends ・ WhatsApp Erlang
・ 軽量プロセス ・ 極めて小さなメモリ消費(300ワード) ・ μ秒レベルのプロセス起動時間 ・
2000万プロセスが実行できたというベンチマークもあるらしい ・ 優れた耐障害性 ・ エラーが起こればプロセスごとやり直す Erlang VM(BEAM)
・ 強い動的型付けの関数型言語 ・ Erlang VM上で動作(Erlangの利点がそのまま活かせる) ・ Rubyに影響を受けた柔軟な構文 ・ Railsに影響を受けたWAF(Phoenix)がある ・
他の言語出身者でも馴染みやすい(※個人的な意見です) Elixir
実行環境
・ ローカルにインストールする ・ Wandbox(https://wandbox.org/)を使う ・ Dockerイメージを利用する 実行環境 オススメ
Elixirのイメージが提供されているのでそれを使う Dockerによる環境構築 ↑は容量が大きいので小さいほうが良ければ以下
Elixir + Phoenix用リポジトリ https://github.com/ponday-dev/elixir-on-docker ・ MariaDBとつなげるdocker-compose.ymlまで ・ 使い方はREADMEを参照
Hello, World
Hello, World シンプル版 ・ 標準出力はIO.puts関数 ・ 文字列はダブルクォートで囲む (シングルクォートは意味が異なる)
Hello, World シンプル版 関数版(無名関数) ・ fn (引数) -> endで無名関数が作れる ・
無名関数の呼び出しは (関数名).(引数)
Hello, World モジュール版 ・ defmoduleでモジュールを定義 ・ クラスではない ・ モジュール内に関数を定義するときは
fnではなくdef ・ モジュールに属する関数呼び出しは (関数名)(引数)の形式で可
データ構造
・ 整数 / 浮動少数 ・ 真偽値(true / false) ・ 文字列(バイナリ)
・ アトム(Rubyでいうシンボル) ・ nil(※データ型ではない) 基本データ型
・ リスト ・ タプル ・ キーワード付きリスト ・ マップ コレクション
・ 普通の配列 ・ 順序は保証されている リスト
・ メモリ上に連続して格納される ・ サイズ取得は高速、修正は低速 タプル
・ アトムと値のタプルで構成されたリスト ・ 順序は保証されている キーワード付きリスト
・ いわゆる連想配列 マップ
パターンマッチ
・ 値やデータ構造をマッチング(≠ 正規表現) ・ = は代入ではなくパターンマッチ演算子 ・ 制御構文、関数呼び出しなど色々な場面で使える パターンマッチ
・ 左辺に変数が来る場合は代入操作 ・ 再代入も可能 パターンマッチ(基本)
・ コレクションの構造に対してもマッチ可能 パターンマッチ(コレクション)
・ コレクションの構造に対してもマッチ可能 パターンマッチ(マップ)
制御構造
・ 条件が一つだけの条件分岐(else ifがない) ・ 三項演算子のような使い方も if
・ 複数の条件がある場合に利用 ・ いずれかの条件に一致しないとエラーになる cond
・ パターンマッチで条件分岐 ・ いずれかの条件に一致しないとエラーになる case
・ パターンマッチが成功する場合に実行 with
パイプライン演算子
・ Elixirのコードで頻出 ・ 連続した関数呼び出しを”|>”でつなげて記述 ・ 左辺のデータが右辺の関数の第一引数に適用 ・ コード上の記述と実際の処理の順序が同じになる パイプライン演算子
・ コードの記述と実際の処理順序が異なる ・ どこがどの関数の引数なのか分かりづらい 例:JavaScriptの場合 ※ 多くの言語で起こることでJSを貶める意図はありません
例:Elixirの場合 ・ コードの記述と実際の処理順序が同じ ・ 引数と関数の対応が明確 ・ ワンライナーも可
モジュール
・ 関数をまとめて名前空間を定義 ・ EnumやKeyword、Mapは標準提供のモジュール モジュール
・ モジュール内に定義される特殊なマップ ・ マップとパターンマッチが可能 構造体
・ モジュールは他言語で言うクラスではない ・ 構造体でデータ構造が定義できるものの、 これはインスタンスではない ・ インスタンスメソッドのような呼び出しはできない モジュール ≠
クラス
モジュール ≠ クラス
・ 関数呼び出し時、引数にもパターンマッチが適用 ・ パターンマッチの条件が異なれば、 同名の関数が複数定義できる 関数呼び出しとパターンマッチ
関数呼び出しとパターンマッチ ・ case do ~ endのマッチは関数呼び出し時点で可
関数呼び出しとパターンマッチ ・ 引数でパターンマッチ ・ 関数のワンライナー向け記法で行数を圧縮
サンプル
FizzBuzz
まとめ
・ ElixirはErlang VM上で動作する関数型言語 ・ 耐障害性がすごい ・ Dockerで簡単に試せる ・ パターンマッチとパイプラインが特徴的 まとめ
Elixirは良いぞ
Thank you !!