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
Action Cableで簡易チャットを作ってみた
Search
Kazuhiro NISHIYAMA
July 13, 2019
Programming
0
350
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
30
riscv64.rubyci.org internal
znz
0
28
Rubyの日本語リファレンスマニュアルの現在と未来
znz
0
70
devise-two-factorを4.xから5.xに上げた話
znz
0
340
docs.ruby-lang.org/ja/ の生成方法を変えた
znz
0
86
Ubuntuのriscv64版をqemuで動かした
znz
0
100
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
Eloquentを使ってどこまでコードの治安を保てるのか?を新人が考察してみた
itokoh0405
0
3.1k
퇴근 후 1억이 거래되는 서비스 만들기 | 내가 AI를 사용하는 방법
maryang
2
560
なぜ強調表示できず ** が表示されるのか — Perlで始まったMarkdownの歴史と日本語文書における課題
kwahiro
11
5.5k
HTTPじゃ遅すぎる! SwitchBotを自作ハブで動かして学ぶBLE通信
occhi
0
240
開発生産性が組織文化になるまでの軌跡
tonegawa07
0
150
Blazing Fast UI Development with Compose Hot Reload (droidcon London 2025)
zsmb
0
500
モデル駆動設計をやってみよう Modeling Forum2025ワークショップ/Let’s Try Model-Driven Design
haru860
0
110
AIエージェントでのJava開発がはかどるMCPをAIを使って開発してみた / java mcp for jjug
kishida
4
490
ノーコードからの脱出 -地獄のデスロード- / Escape from Base44
keisuke69
0
690
CloudflareのSandbox SDKを試してみた
syumai
0
140
JEP 496 と JEP 497 から学ぶ耐量子計算機暗号入門 / Learning Post-Quantum Crypto Basics from JEP 496 & 497
mackey0225
2
220
Core MIDI を勉強して作曲用の電子ピアノ作ってみた!
hypebeans
0
110
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Site-Speed That Sticks
csswizardry
13
960
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
The Pragmatic Product Professional
lauravandoore
36
7k
We Have a Design System, Now What?
morganepeng
54
7.9k
Done Done
chrislema
186
16k
A designer walks into a library…
pauljervisheath
210
24k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
660
Building Applications with DynamoDB
mza
96
6.7k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8k
Mobile First: as difficult as doing things right
swwweet
225
10k
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