rabbit-slide-znz-rubykansai87-chat 2019.07.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e3502a838bc6b0fab641a72b2d7a2d5ab4a074f499ab331b5e5b07d7de65bbb6
4
+ data.tar.gz: fa4d4557b748fde5b79e8edcca4dc13984e7c3780caebfe645faf55c948610d6
5
+ SHA512:
6
+ metadata.gz: '0822cc4fd79333d3d25e2806ea78c25c831d6e37d593b7533cf7099d99a479a85523bcdd45289c82cb9f6871359919123e2ad0b0d4ef0d122f3e8237b7a6b24c'
7
+ data.tar.gz: d1a9e4519e5ab20a56815f9ae980e11e459666dfed58fb1beaf148179a18a91094327eef7ffa1621fc519e8b8040aedf6d86f5aacc4527b70b922381a3652728
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ actioncable-chat.md
data/README.md ADDED
@@ -0,0 +1,23 @@
1
+ # Action Cableで簡易チャットを作ってみた
2
+
3
+ 第87回 Ruby関西 勉強会での発表資料です。
4
+
5
+ ## For author
6
+
7
+ ### Show
8
+
9
+ rake
10
+
11
+ ### Publish
12
+
13
+ rake publish
14
+
15
+ ## For viewers
16
+
17
+ ### Install
18
+
19
+ gem install rabbit-slide-znz-rubykansai87-chat
20
+
21
+ ### Show
22
+
23
+ rabbit rabbit-slide-znz-rubykansai87-chat.gem
data/README.md~ ADDED
@@ -0,0 +1,24 @@
1
+ # Action Cableで簡易チャットを作ってみた
2
+
3
+ TODO: SLIDE DESCRIPTION
4
+
5
+ ## For author
6
+
7
+ ### Show
8
+
9
+ rake
10
+
11
+ ### Publish
12
+
13
+ rake publish
14
+
15
+ ## For viewers
16
+
17
+ ### Install
18
+
19
+ gem install rabbit-slide-znz-rubykansai87-chat
20
+
21
+ ### Show
22
+
23
+ rabbit rabbit-slide-znz-rubykansai87-chat.gem
24
+
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ spec = nil
6
+ Rabbit::Task::Slide.new do |task|
7
+ spec = task.spec
8
+ # spec.files += Dir.glob("doc/**/*.*")
9
+ # spec.files -= Dir.glob("private/**/*.*")
10
+ # spec.add_runtime_dependency("YOUR THEME")
11
+ end
12
+
13
+ desc "Tag #{spec.version}"
14
+ task :tag do
15
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
16
+ sh("git", "push", "--tags")
17
+ end
@@ -0,0 +1,222 @@
1
+ # Action Cableで簡易チャットを作ってみた
2
+
3
+ author
4
+ : Kazuhiro NISHIYAMA
5
+
6
+ content-source
7
+ : 第87回 Ruby関西 勉強会
8
+
9
+ date
10
+ : 2019/07/13
11
+
12
+ institution
13
+ : 株式会社Ruby開発
14
+
15
+ allotted-time
16
+ : 30m
17
+
18
+ theme
19
+ : lightning-simple
20
+
21
+ # 自己紹介
22
+
23
+ - 西山 和広
24
+ - Ruby のコミッター
25
+ - twitter, github など: @znz
26
+ - 株式会社Ruby開発 www.ruby-dev.jp
27
+
28
+ # 目的
29
+
30
+ - Ruby 関西中継が止まっていた
31
+ - USTREAM も終了
32
+ - 外部サーバーに保存せずにユーザー登録などなく視聴可能なライブ配信のみしたい
33
+ - できればチャットもあると良いかも
34
+ → Ruby 勉強会なので Rails で
35
+
36
+ # ライブ配信
37
+
38
+ - YouTube Live
39
+ - 必ず保存されそう (公開するかどうかは選べそう)
40
+ - スマホからの配信はチャンネル登録ユーザー数が増えないとできない
41
+ - その他のサービス
42
+ - 視聴にアカウントが必要だったり
43
+ - サービスの主な用途がゲーム配信だったり
44
+
45
+ # nginx-rtmp-module
46
+
47
+ - 自前ライブ配信サーバが作成可能
48
+ - 録画を残すかどうかも設定次第
49
+ - HLS + video.js で視聴可能
50
+ - 試したブラウザー全てで視聴可能
51
+ - Windows, macOS, iOS, Android
52
+ - (Linux は未確認)
53
+
54
+ # チャット
55
+
56
+ - ライブ配信へのコメント機能
57
+ - 何を使っても良いのなら Firebase が楽そうだった
58
+ - Ruby 勉強会なので Action Cable を使ってみることに
59
+
60
+ # なぜ Rails 6?
61
+
62
+ - 6.0.0.rc1 なので正式リリースとあまり変わらないはず
63
+ - サンプル的にできるだけデフォルト構成でシンプルに作りたい
64
+ - デフォルトが CoffeeScript ではない
65
+ - 新規で採用する理由はあまりない
66
+
67
+ # View の選択
68
+
69
+ 使ってみたかったから
70
+
71
+ - React (redux なし)
72
+ - material-ui 4
73
+
74
+ # 環境構築
75
+
76
+ - `gem install rails --pre`
77
+ - `yarn` も入れておく
78
+
79
+ # rails new
80
+
81
+ - `rails new chat-$(date +%Y%m%d) --webpack=react`
82
+ - または `rails new` の後で `bin/rails webpacker:install:react`
83
+ - `yarn` を入れ忘れていたら、後から `webpacker:install`
84
+
85
+ # 埋め込むページ作成
86
+
87
+ - `rails g controller pages index`
88
+ - routes 変更:
89
+ `root to: 'pages#index'`
90
+ - `app/views/pages/index.html.erb`
91
+ に React の呼び出し埋め込み
92
+ `<%= javascript_pack_tag 'hello_react' %>`
93
+
94
+ # channel 作成
95
+
96
+ - `rails g channel chat`
97
+ - `ChatChannel` クラスができる
98
+ - `rails g controller` と同様に
99
+ `rails g channel chat speak`
100
+ などでメソッドも生成可能
101
+
102
+ # 送受信テスト準備 (Rails 側)
103
+
104
+ - `ChatChannel` に `def receive(data)` を追加
105
+ `ActionCable.server.broadcast('chat_channel', data)`
106
+ - `subscribed` で
107
+ `stream_from 'chat_channel'`
108
+
109
+ # 送受信テスト準備 (JS 側)
110
+
111
+ - `chat_channel.js` の `received(data)` に `console.log(data);`
112
+ - JavaScript console から `send` で送信して確認
113
+
114
+ # 微調整
115
+
116
+ - 送信時刻追加
117
+ - ダミーの id 追加 (あとで Active Record の id に置き換え)
118
+ - material-ui で入力欄追加
119
+ - faker を使ってランダムなデフォルトの名前を設定
120
+
121
+ # アイコン表示
122
+
123
+ - gravatar でアイコン表示
124
+ - サーバー側でしかわからない送信元 IP アドレスも使って、同じ名前でも同じアイコンにならないように
125
+
126
+ # モデルなどを作成
127
+
128
+ - `rails g model message name body sent_at:timestamp`
129
+ - `rails g job MessageBroadcast`
130
+ - broadcast を job 経由に
131
+ - はっきりとした説明を見つけられなかったが、アプリケーションサーバーが複数台になった時に received で broadcast せずに job を経由する必要がありそう
132
+
133
+ # 最近のメッセージ表示
134
+
135
+ - `hidden_field_tag` で `to_json` した文字列を埋め込み
136
+ - `JSON.parse(document.getElementById('recent_messages').value)` で取り出し
137
+ - ちゃんとエスケープされる方法を選択
138
+ - あまり良い方法ではないが、開発速度重視
139
+
140
+ # 最近の基準
141
+
142
+ - 1時間以内
143
+ - 50件まで
144
+ - リロードするとここまでになる
145
+ - 開きっぱなしなら無制限に追加していく
146
+
147
+ # 送信中メッセージ表示
148
+
149
+ - 空欄アイコンで表示
150
+ - 空欄じゃないアイコンに変わったら受信完了
151
+
152
+ # 微調整
153
+
154
+ - 入力欄が空欄の時は送信ボタンを無効化
155
+ - IP アドレスとリクエスト ID も保存 → アイコンに反映
156
+
157
+ # デプロイ
158
+
159
+ - VPS のサーバーにデプロイ
160
+
161
+ # production で動かない
162
+
163
+ - `Uncaught TypeError: r is not a function`
164
+ で動かない
165
+ - https://github.com/rails/rails/issues/35501
166
+ に同じ現象が書いてあったが未解決
167
+ - 動かすことを優先して development で動かすことに
168
+
169
+ # 動画埋め込み
170
+
171
+ - 単独 HTML ファイルで試していた video.js 埋め込み
172
+
173
+ # config.hosts 設定
174
+
175
+ - development 環境を localhost 以外で使うため `config.hosts` 設定
176
+
177
+ # nginx 設定
178
+
179
+ - 普通の reverse proxy 設定
180
+ - WebSocket も proxy するように設定
181
+ - dehydrated で letsencrypt の証明書を発行して https 設定
182
+ - 本題ではないので詳細は省略
183
+
184
+ # Cloudflare 設定
185
+
186
+ - Full (Strict)
187
+ - チャットは完全暗号化
188
+ - ライブ配信の視聴も完全暗号化
189
+ - wss (暗号化ありの WebSocket) も問題なく通る
190
+
191
+ # trusted_proxies 設定
192
+
193
+ - Cloudflare 経由にすると `remote_ip` が取れなくなったので
194
+ `config.action_dispatch.trusted_proxies`
195
+ を設定
196
+ - https://www.cloudflare.com/ips/
197
+ - https://www.cloudflare.com/ips-v4
198
+ - https://www.cloudflare.com/ips-v6
199
+
200
+ # 微調整
201
+
202
+ - favicon 設定
203
+ - title 設定
204
+
205
+ # WireGuard
206
+
207
+ - WireGuard とは
208
+ - 高速軽量な VPN
209
+ - まだ本番運用には適さない
210
+ - ライブ配信の送信側を暗号化するのに利用
211
+ - 本題ではないので詳細は省略
212
+
213
+ # さらに機能追加
214
+
215
+ - 接続しているユーザー一覧アイコン表示
216
+ - reload video ボタン追加
217
+
218
+ # まとめ
219
+
220
+ - Action Cable で簡単にリアルタイム通信が作成可能
221
+ - 環境構築はちょっと面倒 (yarn が必須など)
222
+ - 本番環境で使うには WebSocket が必須などちょっと制限あり
data/config.yaml ADDED
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: rubykansai87-chat
3
+ base_name: actioncable-chat
4
+ tags:
5
+ - ruby
6
+ presentation_date: 2019/07/13
7
+ version: 2019.07.13
8
+ licenses: []
9
+ slideshare_id:
10
+ speaker_deck_id:
11
+ ustream_id:
12
+ vimeo_id:
13
+ youtube_id:
14
+ author:
15
+ markup_language: :markdown
16
+ name: Kazuhiro NISHIYAMA
17
+ email: zn@mbf.nifty.com
18
+ rubygems_user: znz
19
+ slideshare_user: znzjp
20
+ speaker_deck_user: znz
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-znz-rubykansai87-chat
3
+ version: !ruby/object:Gem::Version
4
+ version: 2019.07.13
5
+ platform: ruby
6
+ authors:
7
+ - Kazuhiro NISHIYAMA
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-07-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rabbit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ description: 第87回 Ruby関西 勉強会での発表資料です。
28
+ email:
29
+ - zn@mbf.nifty.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".rabbit"
35
+ - README.md
36
+ - README.md~
37
+ - Rakefile
38
+ - actioncable-chat.md
39
+ - config.yaml
40
+ - pdf/rubykansai87-chat-actioncable-chat.pdf
41
+ homepage: http://slide.rabbit-shocker.org/authors/znz/rubykansai87-chat/
42
+ licenses: []
43
+ metadata: {}
44
+ post_install_message:
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ requirements: []
59
+ rubygems_version: 3.0.3
60
+ signing_key:
61
+ specification_version: 4
62
+ summary: Action Cableで簡易チャットを作ってみた
63
+ test_files: []