SlideShare a Scribd company logo
1 of 32
Download to read offline
Action Cableで簡易チャッ
トを作ってみた
Kazuhiro NISHIYAMA
第87回 Ruby関西 勉強会
2019/07/13
株式会社Ruby開発
Powered by Rabbit 2.2.1
自己紹介
西山 和広
Ruby のコミッター
twitter, github など: @znz
株式会社Ruby開発 www.ruby-dev.jp
1/31
目的
Ruby 関西中継が止まっていた
USTREAM も終了
外部サーバーに保存せずにユーザー登録
などなく視聴可能なライブ配信のみした
い
できればチャットもあると良いかも
→ Ruby 勉強会なので Rails で
2/31
ライブ配信
YouTube Live
必ず保存されそう (公開するかどうかは選べそ
う)
スマホからの配信はチャンネル登録ユーザー数
が増えないとできない
その他のサービス
視聴にアカウントが必要だったり
サービスの主な用途がゲーム配信だったり 3/31
nginx-rtmp-module
自前ライブ配信サーバが作成可能
録画を残すかどうかも設定次第
HLS + video.js で視聴可能
試したブラウザー全てで視聴可能
Windows, macOS, iOS, Android
(Linux は未確認)
4/31
チャット
ライブ配信へのコメント機能
何を使っても良いのなら Firebase が楽そう
だった
Ruby 勉強会なので Action Cable を使って
みることに
5/31
なぜ Rails 6?
6.0.0.rc1 なので正式リリースとあまり変わ
らないはず
サンプル的にできるだけデフォルト構成で
シンプルに作りたい
デフォルトが CoffeeScript ではない
新規で採用する理由はあまりない
6/31
View の選択
使ってみたかったから
React (redux なし)
material-ui 4
7/31
環境構築
gem install rails --pre
yarn も入れておく
8/31
rails new
rails new chat-$(date +%Y%m%d)
--webpack=react
または rails new の後で bin/rails
webpacker:install:react
yarn を入れ忘れていたら、後から
webpacker:install
9/31
埋め込むページ作成
rails g controller pages index
routes 変更:
root to: 'pages#index'
app/views/pages/index.html.erb
に React の呼び出し埋め込み
<%= javascript_pack_tag
'hello_react' %>
10/31
channel 作成
rails g channel chat
ChatChannel クラスができる
rails g controller と同様に
rails g channel chat speak
などでメソッドも生成可能
11/31
送受信テスト準備 (Rails 側)
ChatChannel に def receive(data) を
追加
ActionCable.server.broadcast('ch
at_channel', data)
subscribed で
stream_from 'chat_channel'
12/31
送受信テスト準備 (JS 側)
chat_channel.js の received(data)
に console.log(data);
JavaScript console から send で送信して
確認
13/31
微調整
送信時刻追加
ダミーの id 追加 (あとで Active Record の
id に置き換え)
material-ui で入力欄追加
faker を使ってランダムなデフォルトの名
前を設定
14/31
アイコン表示
gravatar でアイコン表示
サーバー側でしかわからない送信元 IP アド
レスも使って、同じ名前でも同じアイコン
にならないように
15/31
モデルなどを作成
rails g model message name body
sent_at:timestamp
rails g job MessageBroadcast
broadcast を job 経由に
はっきりとした説明を見つけられなかったが、
アプリケーションサーバーが複数台になった時
に received で broadcast せずに job を経由す
る必要がありそう
16/31
最近のメッセージ表示
hidden_field_tag で to_json した文字
列を埋め込み
JSON.parse(document.getElementById(
'recent_messages').value) で取り出し
ちゃんとエスケープされる方法を選択
あまり良い方法ではないが、開発速度重視
17/31
最近の基準
1時間以内
50件まで
リロードするとここまでになる
開きっぱなしなら無制限に追加していく
18/31
送信中メッセージ表示
空欄アイコンで表示
空欄じゃないアイコンに変わったら受信完
了
19/31
微調整
入力欄が空欄の時は送信ボタンを無効化
IP アドレスとリクエスト ID も保存 → アイ
コンに反映
20/31
デプロイ
VPS のサーバーにデプロイ
21/31
production で動かない
Uncaught TypeError: r is not a
function
で動かない
https://github.com/rails/rails/issues/
35501
に同じ現象が書いてあったが未解決
動かすことを優先して development で動
かすことに
22/31
動画埋め込み
単独 HTML ファイルで試していた video.js
埋め込み
23/31
config.hosts 設定
development 環境を localhost 以外で使
うため config.hosts 設定
24/31
nginx 設定
普通の reverse proxy 設定
WebSocket も proxy するように設定
dehydrated で letsencrypt の証明書を発
行して https 設定
本題ではないので詳細は省略
25/31
Cloudflare 設定
Full (Strict)
チャットは完全暗号化
ライブ配信の視聴も完全暗号化
wss (暗号化ありの WebSocket) も問題な
く通る
26/31
trusted_proxies 設定
Cloudflare 経由にすると remote_ip が取
れなくなったので
config.action_dispatch.trusted_p
roxies
を設定
https://www.cloudflare.com/ips/
https://www.cloudflare.com/ips-v4
https://www.cloudflare.com/ips-v6
27/31
微調整
favicon 設定
title 設定
28/31
WireGuard
WireGuard とは
高速軽量な VPN
まだ本番運用には適さない
ライブ配信の送信側を暗号化するのに利用
本題ではないので詳細は省略
29/31
さらに機能追加
接続しているユーザー一覧アイコン表示
reload video ボタン追加
30/31
まとめ
Action Cable で簡単にリアルタイム通信が
作成可能
環境構築はちょっと面倒 (yarn が必須など)
本番環境で使うには WebSocket が必須な
どちょっと制限あり
31/31Powered by Rabbit 2.2.1

More Related Content

What's hot

Introduction of mruby & Webruby script example
Introduction of mruby & Webruby script exampleIntroduction of mruby & Webruby script example
Introduction of mruby & Webruby script examplekishima7
 
Burp Suite Japanユーザグループ紹介
Burp Suite Japanユーザグループ紹介Burp Suite Japanユーザグループ紹介
Burp Suite Japanユーザグループ紹介abend_cve_9999_0001
 
インフラエンジニアのためのUstream入門
インフラエンジニアのためのUstream入門インフラエンジニアのためのUstream入門
インフラエンジニアのためのUstream入門Hiyou Shinnonome
 
Azure appservice で作るwordpress-サイト
Azure appservice で作るwordpress-サイトAzure appservice で作るwordpress-サイト
Azure appservice で作るwordpress-サイト宣之 渡邉
 
Raspberry pi で スマホリモコンでラジコンカーを動かすさっと動かす編
Raspberry pi で スマホリモコンでラジコンカーを動かすさっと動かす編Raspberry pi で スマホリモコンでラジコンカーを動かすさっと動かす編
Raspberry pi で スマホリモコンでラジコンカーを動かすさっと動かす編Kazuhiro Takahashi
 
Raspberry piで動かすロボットアーム
Raspberry piで動かすロボットアームRaspberry piで動かすロボットアーム
Raspberry piで動かすロボットアームMasuda Tomoaki
 
Ansibleの現在とこれから
Ansibleの現在とこれからAnsibleの現在とこれから
Ansibleの現在とこれからTaira Hajime
 
Raspberry pi+mono を使ってlegoを制御
Raspberry pi+mono を使ってlegoを制御Raspberry pi+mono を使ってlegoを制御
Raspberry pi+mono を使ってlegoを制御Masuda Tomoaki
 
Gr sakuraで動く mrubyスマホリモコンカー(タミヤ製ラジコン改造)
Gr sakuraで動く mrubyスマホリモコンカー(タミヤ製ラジコン改造)Gr sakuraで動く mrubyスマホリモコンカー(タミヤ製ラジコン改造)
Gr sakuraで動く mrubyスマホリモコンカー(タミヤ製ラジコン改造)Kazuhiro Takahashi
 
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発Kazuaki Tanaka
 
新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみた
新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみた新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみた
新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみたShuntaro Saiba
 
Pythonでzabbix apiを使ってみる
Pythonでzabbix apiを使ってみるPythonでzabbix apiを使ってみる
Pythonでzabbix apiを使ってみる2bo 2bo
 
サーバ擬人化ユーザ会キックオフ資料 Slideshare ver
サーバ擬人化ユーザ会キックオフ資料 Slideshare verサーバ擬人化ユーザ会キックオフ資料 Slideshare ver
サーバ擬人化ユーザ会キックオフ資料 Slideshare verSeiichiro Ishida
 
rustdef: Rust on jupyter notebook
rustdef: Rust on jupyter notebookrustdef: Rust on jupyter notebook
rustdef: Rust on jupyter notebookemakryo
 

What's hot (15)

Introduction of mruby & Webruby script example
Introduction of mruby & Webruby script exampleIntroduction of mruby & Webruby script example
Introduction of mruby & Webruby script example
 
Burp Suite Japanユーザグループ紹介
Burp Suite Japanユーザグループ紹介Burp Suite Japanユーザグループ紹介
Burp Suite Japanユーザグループ紹介
 
インフラエンジニアのためのUstream入門
インフラエンジニアのためのUstream入門インフラエンジニアのためのUstream入門
インフラエンジニアのためのUstream入門
 
Azure appservice で作るwordpress-サイト
Azure appservice で作るwordpress-サイトAzure appservice で作るwordpress-サイト
Azure appservice で作るwordpress-サイト
 
mrubyOSチラシ
mrubyOSチラシmrubyOSチラシ
mrubyOSチラシ
 
Raspberry pi で スマホリモコンでラジコンカーを動かすさっと動かす編
Raspberry pi で スマホリモコンでラジコンカーを動かすさっと動かす編Raspberry pi で スマホリモコンでラジコンカーを動かすさっと動かす編
Raspberry pi で スマホリモコンでラジコンカーを動かすさっと動かす編
 
Raspberry piで動かすロボットアーム
Raspberry piで動かすロボットアームRaspberry piで動かすロボットアーム
Raspberry piで動かすロボットアーム
 
Ansibleの現在とこれから
Ansibleの現在とこれからAnsibleの現在とこれから
Ansibleの現在とこれから
 
Raspberry pi+mono を使ってlegoを制御
Raspberry pi+mono を使ってlegoを制御Raspberry pi+mono を使ってlegoを制御
Raspberry pi+mono を使ってlegoを制御
 
Gr sakuraで動く mrubyスマホリモコンカー(タミヤ製ラジコン改造)
Gr sakuraで動く mrubyスマホリモコンカー(タミヤ製ラジコン改造)Gr sakuraで動く mrubyスマホリモコンカー(タミヤ製ラジコン改造)
Gr sakuraで動く mrubyスマホリモコンカー(タミヤ製ラジコン改造)
 
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
 
新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみた
新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみた新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみた
新卒3年目のぼくが、でぶおぷす???なインフラおじさん方にAnsibleを導入してみた
 
Pythonでzabbix apiを使ってみる
Pythonでzabbix apiを使ってみるPythonでzabbix apiを使ってみる
Pythonでzabbix apiを使ってみる
 
サーバ擬人化ユーザ会キックオフ資料 Slideshare ver
サーバ擬人化ユーザ会キックオフ資料 Slideshare verサーバ擬人化ユーザ会キックオフ資料 Slideshare ver
サーバ擬人化ユーザ会キックオフ資料 Slideshare ver
 
rustdef: Rust on jupyter notebook
rustdef: Rust on jupyter notebookrustdef: Rust on jupyter notebook
rustdef: Rust on jupyter notebook
 

More from Kazuhiro Nishiyama

lilo.linux.or.jp を buster から bullseye に上げた
lilo.linux.or.jp を buster から bullseye に上げたlilo.linux.or.jp を buster から bullseye に上げた
lilo.linux.or.jp を buster から bullseye に上げたKazuhiro Nishiyama
 
小規模個人アプリをRails 7.xにバージョンアップした話
小規模個人アプリをRails 7.xにバージョンアップした話小規模個人アプリをRails 7.xにバージョンアップした話
小規模個人アプリをRails 7.xにバージョンアップした話Kazuhiro Nishiyama
 
Ruby リファレンスマニュアル改善計画 2022 進捗報告
Ruby リファレンスマニュアル改善計画 2022 進捗報告Ruby リファレンスマニュアル改善計画 2022 進捗報告
Ruby リファレンスマニュアル改善計画 2022 進捗報告Kazuhiro Nishiyama
 
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdffukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdfKazuhiro Nishiyama
 
rubykaigi2022-rurema-history-and-future.pdf
rubykaigi2022-rurema-history-and-future.pdfrubykaigi2022-rurema-history-and-future.pdf
rubykaigi2022-rurema-history-and-future.pdfKazuhiro Nishiyama
 
qemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたqemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたKazuhiro Nishiyama
 
workflow,job,step の使い分けの基準を考える
workflow,job,step の使い分けの基準を考えるworkflow,job,step の使い分けの基準を考える
workflow,job,step の使い分けの基準を考えるKazuhiro Nishiyama
 
あまり知られていないRubyの便利機能
あまり知られていないRubyの便利機能あまり知られていないRubyの便利機能
あまり知られていないRubyの便利機能Kazuhiro Nishiyama
 
Dockerのオフィシャルrubyイメージとは?
Dockerのオフィシャルrubyイメージとは?Dockerのオフィシャルrubyイメージとは?
Dockerのオフィシャルrubyイメージとは?Kazuhiro Nishiyama
 
チャットボットのススメ
チャットボットのススメチャットボットのススメ
チャットボットのススメKazuhiro Nishiyama
 
最近のrubyのインストール方法
最近のrubyのインストール方法最近のrubyのインストール方法
最近のrubyのインストール方法Kazuhiro Nishiyama
 
systemdでよく使うサブコマンド
systemdでよく使うサブコマンドsystemdでよく使うサブコマンド
systemdでよく使うサブコマンドKazuhiro Nishiyama
 

More from Kazuhiro Nishiyama (20)

lilo.linux.or.jp を buster から bullseye に上げた
lilo.linux.or.jp を buster から bullseye に上げたlilo.linux.or.jp を buster から bullseye に上げた
lilo.linux.or.jp を buster から bullseye に上げた
 
小規模個人アプリをRails 7.xにバージョンアップした話
小規模個人アプリをRails 7.xにバージョンアップした話小規模個人アプリをRails 7.xにバージョンアップした話
小規模個人アプリをRails 7.xにバージョンアップした話
 
Ruby リファレンスマニュアル改善計画 2022 進捗報告
Ruby リファレンスマニュアル改善計画 2022 進捗報告Ruby リファレンスマニュアル改善計画 2022 進捗報告
Ruby リファレンスマニュアル改善計画 2022 進捗報告
 
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdffukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
fukuoka03-rubima-reboot-rubyist-magazine-reboot.pdf
 
rubykaigi2022-rurema-history-and-future.pdf
rubykaigi2022-rurema-history-and-future.pdfrubykaigi2022-rurema-history-and-future.pdf
rubykaigi2022-rurema-history-and-future.pdf
 
qemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみたqemuのriscv64にDebianを入れてみた
qemuのriscv64にDebianを入れてみた
 
systemd 再入門
systemd 再入門systemd 再入門
systemd 再入門
 
Ruby 3.0.0 コネタ集
Ruby 3.0.0 コネタ集Ruby 3.0.0 コネタ集
Ruby 3.0.0 コネタ集
 
livedoor天気API終了対応
livedoor天気API終了対応livedoor天気API終了対応
livedoor天気API終了対応
 
Wireguard 実践入門
Wireguard 実践入門Wireguard 実践入門
Wireguard 実践入門
 
workflow,job,step の使い分けの基準を考える
workflow,job,step の使い分けの基準を考えるworkflow,job,step の使い分けの基準を考える
workflow,job,step の使い分けの基準を考える
 
あまり知られていないRubyの便利機能
あまり知られていないRubyの便利機能あまり知られていないRubyの便利機能
あまり知られていないRubyの便利機能
 
Dockerのオフィシャルrubyイメージとは?
Dockerのオフィシャルrubyイメージとは?Dockerのオフィシャルrubyイメージとは?
Dockerのオフィシャルrubyイメージとは?
 
チャットボットのススメ
チャットボットのススメチャットボットのススメ
チャットボットのススメ
 
Dokku の紹介
Dokku の紹介Dokku の紹介
Dokku の紹介
 
Ruby svn to git
Ruby svn to gitRuby svn to git
Ruby svn to git
 
Ruby 2.6 Update
Ruby 2.6 UpdateRuby 2.6 Update
Ruby 2.6 Update
 
最近のrubyのインストール方法
最近のrubyのインストール方法最近のrubyのインストール方法
最近のrubyのインストール方法
 
Language update 2018 - ruby
Language update 2018 - rubyLanguage update 2018 - ruby
Language update 2018 - ruby
 
systemdでよく使うサブコマンド
systemdでよく使うサブコマンドsystemdでよく使うサブコマンド
systemdでよく使うサブコマンド
 

Action Cableで簡易チャットを作ってみた