$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Action Cableで簡易チャットを作ってみた
Search
Kazuhiro NISHIYAMA
July 13, 2019
Programming
0
360
Action Cableで簡易チャットを作ってみた
第87回 Ruby関西 勉強会での発表資料です。
Kazuhiro NISHIYAMA
July 13, 2019
Tweet
Share
More Decks by Kazuhiro NISHIYAMA
See All by Kazuhiro NISHIYAMA
Ruby on Rails と私
znz
0
35
riscv64.rubyci.org internal
znz
0
32
Rubyの日本語リファレンスマニュアルの現在と未来
znz
0
72
devise-two-factorを4.xから5.xに上げた話
znz
0
360
docs.ruby-lang.org/ja/ の生成方法を変えた
znz
0
88
Ubuntuのriscv64版をqemuで動かした
znz
0
110
lilo.linux.or.jpをbusterからbullseyeに上げた
znz
0
110
小規模個人アプリをRails 7.xにバージョンアップした話
znz
0
100
Ruby リファレンスマニュアル改善計画 2022 進捗報告
znz
0
160
Other Decks in Programming
See All in Programming
STYLE
koic
0
100
俺流レスポンシブコーディング 2025
tak_dcxi
13
8.2k
手が足りない!兼業データエンジニアに必要だったアーキテクチャと立ち回り
zinkosuke
0
520
20251127_ぼっちのための懇親会対策会議
kokamoto01_metaps
2
420
全員アーキテクトで挑む、 巨大で高密度なドメインの紐解き方
agatan
8
19k
バックエンドエンジニアによる Amebaブログ K8s 基盤への CronJobの導入・運用経験
sunabig
0
140
Why Kotlin? 電子カルテを Kotlin で開発する理由 / Why Kotlin? at Henry
agatan
2
6.7k
ゲームの物理 剛体編
fadis
0
280
dotfiles 式年遷宮 令和最新版
masawada
1
700
AIコーディングエージェント(Gemini)
kondai24
0
180
LLM Çağında Backend Olmak: 10 Milyon Prompt'u Milisaniyede Sorgulamak
selcukusta
0
110
リリース時」テストから「デイリー実行」へ!開発マネージャが取り組んだ、レガシー自動テストのモダン化戦略
goataka
0
110
Featured
See All Featured
Thoughts on Productivity
jonyablonski
73
5k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Designing for humans not robots
tammielis
254
26k
A Modern Web Designer's Workflow
chriscoyier
697
190k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.8k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
700
Building Adaptive Systems
keathley
44
2.9k
Designing for Performance
lara
610
69k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
How to Think Like a Performance Engineer
csswizardry
28
2.3k
Transcript
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/31 Powered by Rabbit 2.2.1