elixirだ 第6回

36
第6回 - Phoenixだ - GMO Pepabo, Inc. Joe Honzawa 2015/6/25 Elixir勉強会 Elixirだ

Upload: joenoh

Post on 31-Jul-2015

2.979 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Elixirだ 第6回

第6回 - Phoenixだ -

GMO Pepabo, Inc. Joe Honzawa

2015/6/25 Elixir勉強会

Elixirだ

Page 2: Elixirだ 第6回

前回やったこと> Mix > ドキュメンテーション > タスクを作ろう > Dialyzerで型チェック

Page 3: Elixirだ 第6回

今回の内容> Phoenixをちょっと飛ばす > インストールとプロジェクト作成 > ファイルを眺める > PhoenixのWebSocket > 実装

v0.13.1 使います

Page 4: Elixirだ 第6回

ゴール

リアルタイム通信できるWebアプリをPhoenixでつくる

Page 5: Elixirだ 第6回

Phoenix

Page 6: Elixirだ 第6回

> Elixirで1番イケてるWAF > Railsに強く影響されてる > もちろんMVC > Plugベース > WebSocket標準装備

作者のChris McCord

Page 7: Elixirだ 第6回

Plug> コネクションの抽象化 > Rubyで言うところのRack > Plug.Conn構造体

RailsでRackを触る頻度よりも、 PhoenixでPlugを触る頻度のほうが高い

Page 8: Elixirだ 第6回

インストール

Page 9: Elixirだ 第6回

まずは公式

www.phoenixframework.org

TOP > GUIDES > Installation

Page 10: Elixirだ 第6回

インストール

$ mix archive.install \ https://…/phoenix_new-0.X.Y.ez

Page 11: Elixirだ 第6回

archive.install> $HOME/.mix/archivesに入る > どこでもタスクが使えるようになる

> どこでもphoenix.newし放題

Page 12: Elixirだ 第6回

New!!$ mix phoenix.new my_app

$ cd ./my_app

$ mix phoenix.server

Page 13: Elixirだ 第6回

ファイルを眺める

Page 14: Elixirだ 第6回

いっぱーい!"" README.md !"" brunch-config.js !"" config !"" deps !"" lib !"" mix.exs !"" mix.lock !"" node_modules !"" package.json !"" priv !"" test #"" web rails new したときの気分だぜ

Page 15: Elixirだ 第6回

大事なディレクトリweb !"" channels ← for WebSocket !"" controllers !"" models !"" router.ex !"" static ← sassやjs(ES6 OK) !"" templates ← .html.eex files !"" views ← templatesをレンダ #"" web.ex ← みんなこれをuseする

Page 16: Elixirだ 第6回

設定config !"" config.exs !"" dev.exs !"" prod.exs !"" prod.secret.exs #"" test.exs

共通設定と各環境設定

.gitignore済

Page 17: Elixirだ 第6回

privpriv !"" repo $   #"" migrations #"" static !"" css !"" images !"" js #"" robots.txt

web/staticから 生成されるので .gitignore済

Page 18: Elixirだ 第6回

フロント周り!"" brunch-config.js !"" node_modules #"" package.json

デフォルトでbrunchが使われる

Page 19: Elixirだ 第6回

PhoenixのWebSocket

Page 20: Elixirだ 第6回

ソ ケ ッ ト

チャンネル

チャンネル

チャンネル

サーバ

ざっくり

クライアント(JavaScript)

Page 21: Elixirだ 第6回

サーバ

ざっくり

クライアント(JavaScript)

handle_out/3handle_in/3

chan.pushで送信 chan.onで受信

broadcast/3 push/3

Page 22: Elixirだ 第6回

実装

Page 23: Elixirだ 第6回

今日のレシピhttps://github.com/Joe-noh/shout

Pull Request #1

コミットを順に見ていきます コードとスライドをキョロキョロしてね

Page 24: Elixirだ 第6回

※1 今回はecto無し

$ mix phoenix.new shout --no-ecto

> Ecto > DBラッパー > 言語組み込みのクエリ言語 > デフォルトは要PostgreSQL

Page 25: Elixirだ 第6回

※2 テスト> 一応書いてありますが > 参考程度に > 「へー」って感じで

Page 26: Elixirだ 第6回

入力フォームを設置> RootRouteのTemplateを編集 > web > templates > page > index.html.eex

Page 27: Elixirだ 第6回

WebSocket接続確立>サーバ側 > channel “topic:*”, … >ワイルドカード

> join/3 >OKなら{:ok, socket}を返す >ダメなら{:error, msg}

Page 28: Elixirだ 第6回

WebSocket接続確立>クライアント側 > socket = new Socket(“/ws”) > socket.connect() > WebSocketに接続

> chan = socket.chan(…) > chan.join >チャンネルに接続

Page 29: Elixirだ 第6回

jQueryを読む>そのまんま > application.html.eexに書いとく

Page 30: Elixirだ 第6回

クライアントの発言を…>クライアント側 > chan.push(id, msg) > C→Sへメッセージを送る

Page 31: Elixirだ 第6回

クライアントの発言を…>サーバ側 > handle_in/3 > C→Sのメッセージを処理 > {:reply, rep, socket} > {:noreply, socket} > {:stop, why, socket} > {:stop, why, rep, socket}

Page 32: Elixirだ 第6回

クライアントの発言を…>サーバ側 > broadcast!/3 > 接続済みの全クライアントに送信 > ここでのIDは ”bc:msg”

Page 33: Elixirだ 第6回

サーバからのbroadcastを…>クライアント側 > chan.on(“bc:msg”, callback) > “bc:msg”受信時に発火

Page 34: Elixirだ 第6回

handle_outで発言に…> handle_out/3 >送信されるメッセージをイジれる >フィルタリングなど > ここでは”bc:msg”を処理 > body末尾に”!!!!”を追加

Page 35: Elixirだ 第6回

サーバ

ざっくり(再)

クライアント(JavaScript)

handle_out/3handle_in/3

chan.pushで送信 chan.onで受信

broadcast/3 push/3

Page 36: Elixirだ 第6回

今回やったこと> Phoenixをちょっと飛ばした > インストールとプロジェクト作成 > ファイルを眺める > PhoenixにおけるWebSocket > 流れを追った