procon_bypass_man 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +6 -6
  3. data/.rubocop.yml +4 -0
  4. data/.ruby-version +1 -1
  5. data/CHANGELOG.md +5 -0
  6. data/Gemfile.lock +1 -1
  7. data/README.md +15 -6
  8. data/Steepfile +0 -1
  9. data/docs/getting_started.md +48 -20
  10. data/docs/setup_raspi_by_mitamae.md +44 -2
  11. data/lib/procon_bypass_man/background/job_performer.rb +1 -2
  12. data/lib/procon_bypass_man/background/job_queue.rb +50 -0
  13. data/lib/procon_bypass_man/background/jobs/concerns/has_external_api_setting.rb +2 -2
  14. data/lib/procon_bypass_man/background/jobs/concerns/job_performable.rb +2 -2
  15. data/lib/procon_bypass_man/background/jobs/post_completed_remote_macro_job.rb +1 -1
  16. data/lib/procon_bypass_man/background/jobs/report_boot_job.rb +1 -1
  17. data/lib/procon_bypass_man/background/jobs/report_completed_upgrade_pbm_job.rb +1 -1
  18. data/lib/procon_bypass_man/background/jobs/report_error_job.rb +1 -1
  19. data/lib/procon_bypass_man/background/jobs/report_error_reload_config_job.rb +1 -1
  20. data/lib/procon_bypass_man/background/jobs/report_load_config_job.rb +1 -1
  21. data/lib/procon_bypass_man/background/jobs/report_procon_performance_measurements_job.rb +43 -0
  22. data/lib/procon_bypass_man/background/jobs/report_reload_config_job.rb +1 -1
  23. data/lib/procon_bypass_man/background/jobs/report_start_reboot_job.rb +1 -1
  24. data/lib/procon_bypass_man/background/jobs/sync_device_stats_job.rb +1 -1
  25. data/lib/procon_bypass_man/background.rb +2 -3
  26. data/lib/procon_bypass_man/bypass/bypass_command.rb +6 -15
  27. data/lib/procon_bypass_man/bypass/bypass_value.rb +6 -0
  28. data/lib/procon_bypass_man/bypass/procon_to_switch.rb +107 -0
  29. data/lib/procon_bypass_man/bypass/switch_to_procon.rb +64 -0
  30. data/lib/procon_bypass_man/bypass.rb +5 -110
  31. data/lib/procon_bypass_man/configuration.rb +15 -39
  32. data/lib/procon_bypass_man/device_connection/procon_setting_overrider.rb +12 -3
  33. data/lib/procon_bypass_man/procon/macro.rb +1 -1
  34. data/lib/procon_bypass_man/procon/performance_measurement/last_bypass_at.rb +17 -0
  35. data/lib/procon_bypass_man/procon/performance_measurement/measurement_collection.rb +9 -0
  36. data/lib/procon_bypass_man/procon/performance_measurement/measurements_summarizer.rb +84 -0
  37. data/lib/procon_bypass_man/procon/performance_measurement/procon_performance_span_transfer_job.rb +8 -0
  38. data/lib/procon_bypass_man/procon/performance_measurement/queue_over_process.rb +38 -0
  39. data/lib/procon_bypass_man/procon/performance_measurement/span_queue.rb +42 -0
  40. data/lib/procon_bypass_man/procon/performance_measurement/span_transfer_buffer.rb +39 -0
  41. data/lib/procon_bypass_man/procon/performance_measurement.rb +103 -0
  42. data/lib/procon_bypass_man/procon.rb +2 -1
  43. data/lib/procon_bypass_man/procon_display/bypass_hook.rb +4 -3
  44. data/lib/procon_bypass_man/remote_macro/queue_over_process.rb +26 -44
  45. data/lib/procon_bypass_man/remote_macro/remote_macro_object.rb +22 -24
  46. data/lib/procon_bypass_man/remote_macro/remote_macro_receiver.rb +1 -1
  47. data/lib/procon_bypass_man/remote_macro/remote_macro_sender.rb +1 -1
  48. data/lib/procon_bypass_man/remote_macro/task.rb +1 -5
  49. data/lib/procon_bypass_man/remote_macro/task_queue.rb +6 -10
  50. data/lib/procon_bypass_man/remote_pbm_action/commands/update_remote_pbm_action_status_command.rb +1 -1
  51. data/lib/procon_bypass_man/runner.rb +4 -10
  52. data/lib/procon_bypass_man/scheduler.rb +15 -6
  53. data/lib/procon_bypass_man/support/callbacks.rb +8 -4
  54. data/lib/procon_bypass_man/support/can_over_process.rb +60 -0
  55. data/lib/procon_bypass_man/support/gc.rb +8 -0
  56. data/lib/procon_bypass_man/support/http_client.rb +9 -6
  57. data/lib/procon_bypass_man/support/load_agv.rb +20 -0
  58. data/lib/procon_bypass_man/support/procon_performance_http_client.rb +7 -0
  59. data/lib/procon_bypass_man/support/retryable.rb +16 -0
  60. data/lib/procon_bypass_man/support/signal_handler.rb +1 -1
  61. data/lib/procon_bypass_man/version.rb +1 -1
  62. data/lib/procon_bypass_man/websocket/client.rb +2 -2
  63. data/lib/procon_bypass_man/worker.rb +32 -0
  64. data/lib/procon_bypass_man.rb +40 -10
  65. data/project_template/app.rb +4 -6
  66. data/project_template/app.rb.erb +4 -6
  67. data/sig/main.rbs +10 -52
  68. metadata +21 -8
  69. data/lib/procon_bypass_man/background/job_runner.rb +0 -45
  70. data/lib/procon_bypass_man/background/jobs/concerns/has_internal_api_setting.rb +0 -5
  71. data/lib/procon_bypass_man/background/jobs/report_pressed_buttons_job.rb +0 -15
  72. data/lib/procon_bypass_man/bypass/usb_hid_logger.rb +0 -43
  73. data/lib/procon_bypass_man/io_monitor.rb +0 -108
  74. data/lib/procon_bypass_man/support/server_pool.rb +0 -46
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd4d6700d287ed85a9361e1cf49cfa3a0eaaf64647556fa4eccdf8d7c20a49f5
4
- data.tar.gz: b662feb50dce18c8777631f7164b0524c57cb782c5952fab8d558a6ae753543c
3
+ metadata.gz: dddf32b941507a57c7b2c5656879e132132f51eefcd64f29788567c81566c235
4
+ data.tar.gz: e3649afcdb4877b41c6d05754ed77176d46a1fcc46a3d45751e15b1c91f6a23d
5
5
  SHA512:
6
- metadata.gz: f32bbbf4c03872be73e8bde95c4b42a03c300fb80d4b546e5b17abcc77e98cf9e46fcc4f7c196cc2652b240a520330f58594ed335b8b5fcc7f34c0a1b7e3d166
7
- data.tar.gz: c9152a14f18c0ab48dbccb6b655723db3c23b1520087dc87f788ef06450286a7a6dc0d432a44f058bd49d6e2e5809d907a364d568ef4c402e6871815e5c94272
6
+ metadata.gz: 231bb01ab26c17cdd6d044030a71479dfd1016d05e353de537e3ecd3978f5f4d23b2d8c4058e4f86cadbd555e3762e6124f7cb36920df2544c306e154d568bfe
7
+ data.tar.gz: 8ae5c0a6b510d9b6dc22eb54fbf748e21e9b2b90671f00dc197baad2f90d00473ba4ee64f6ff148e7a200498df8f22edd738281979ab5e1240233a6bbc9e349b
data/.circleci/config.yml CHANGED
@@ -15,7 +15,7 @@ executors:
15
15
  BUNDLE_JOBS: 4
16
16
  working_directory: ~/app
17
17
 
18
- commands: &commands
18
+ commands:
19
19
  bundle_install:
20
20
  parameters:
21
21
  ruby-version:
@@ -117,7 +117,7 @@ build_jobs: &build_jobs
117
117
  - "2.5.5"
118
118
  - "3.0.1"
119
119
  - "3.0.2"
120
- - "3.1.1"
120
+ - "3.1.2"
121
121
  - bundle_install:
122
122
  matrix:
123
123
  parameters:
@@ -125,7 +125,7 @@ build_jobs: &build_jobs
125
125
  - "2.5.5"
126
126
  - "3.0.1"
127
127
  - "3.0.2"
128
- - "3.1.1"
128
+ - "3.1.2"
129
129
  - lint:
130
130
  matrix:
131
131
  parameters:
@@ -133,7 +133,7 @@ build_jobs: &build_jobs
133
133
  - "2.5.5"
134
134
  - "3.0.1"
135
135
  - "3.0.2"
136
- - "3.1.1"
136
+ - "3.1.2"
137
137
  requires:
138
138
  - bundle_install
139
139
  - type_check:
@@ -142,7 +142,7 @@ build_jobs: &build_jobs
142
142
  ruby-version:
143
143
  # - "3.0.1" # たまにSEGVするので
144
144
  - "3.0.2"
145
- - "3.1.1"
145
+ - "3.1.2"
146
146
  requires:
147
147
  - bundle_install
148
148
  - rspec:
@@ -152,7 +152,7 @@ build_jobs: &build_jobs
152
152
  - "2.5.5"
153
153
  - "3.0.1"
154
154
  - "3.0.2"
155
- - "3.1.1"
155
+ - "3.1.2"
156
156
  requires:
157
157
  - bundle_install
158
158
  workflows:
data/.rubocop.yml CHANGED
@@ -26,3 +26,7 @@ Lint/ReturnInVoidContext:
26
26
  Enabled: false
27
27
  Lint/AssignmentInCondition:
28
28
  Enabled: false
29
+ Lint/AmbiguousBlockAssociation:
30
+ Enabled: false
31
+ Security/Eval:
32
+ Enabled: false
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.0.2
1
+ 3.1.2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## [0.2.3] - 2022-8-27
2
+ * プロコンのラグ具合をpbm-cloudに送信し、グラフで見れるようになりました #158
3
+ * 非同期ジョブをmasterプロセス経由で実行するようになりました #191
4
+ * バイパス処理が数秒間固まる現象がおそらく直りました #179
5
+
1
6
  ## [0.2.2] - 2022-07-10
2
7
  * project_template/app.rbを動的に生成する仕組みを追加しました
3
8
  * ドキュメントからpbm_webに関する記述を削除しました
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- procon_bypass_man (0.2.2)
4
+ procon_bypass_man (0.2.3)
5
5
  action_cable_client
6
6
  pbmenv (>= 0.1.9)
7
7
  sorted_set
data/README.md CHANGED
@@ -61,9 +61,6 @@ Switch <-- (PBM): ZR連打
61
61
  * ケーブルでそれらを接続した状態で、Raspberry Pi4にsshして本プログラムを起動することで使用します
62
62
  * ラズベリーパイ4のセットアップ方法は?
63
63
  * https://github.com/splaplapla/procon_bypass_man/tree/master/docs/setup_raspi.md
64
- * モード, マクロの違いは?
65
- * modeはProconの入力をそのまま再現するため機能。レイヤーを切り替えるまで繰り返し続けます
66
- * マクロは特定のキーを順番に入れていく機能。キーの入力が終わったらマクロは終了します
67
64
  * レイヤーとは?
68
65
  * 自作キーボードみたいな感じでレイヤー毎に設定内容を記述して切り替えれます
69
66
  * レイヤーは4つあって、up, down, left, rightです。十字キーに対応しています
@@ -80,6 +77,13 @@ Switch <-- (PBM): ZR連打
80
77
  * sshなしで運用は可能ですか?
81
78
  * https://pbm-cloud.herokuapp.com を使えば、sshを使わずに運用が可能です
82
79
 
80
+ ## 仕様・制約
81
+ * 日を跨ぐ24時ちょうどになった瞬間はLinuxのcronが起動などがするようで、この時間は数秒間バイパスが激しく遅延します
82
+ * ログファイルのローテションが少なくとも走るはずなので、不要なデーモンを停止するなどで影響を小さくすることはできると思いますが、完全に抑制することは難しいと思います
83
+ * コントローラーから読み取ってSwitchに書き込む時間は、少なくとも0.02秒はかかります
84
+ * 動かしているRaspberry Piの負荷に依存するこの限りではありません
85
+
86
+ <!--
83
87
  ## TODO
84
88
  * レコーディング機能(プロコンの入力をマクロとして登録ができる)
85
89
  * ドキュメントを書く(doing)
@@ -103,11 +107,16 @@ sudo kill -USR2 `cat ./pbm_pid`
103
107
  * CHANGELOG.md に日付を書く
104
108
  * be rake release
105
109
  * githubのreleaseを作成する
110
+ -->
106
111
 
107
- ## License
108
-
109
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
112
+ ## 開発を支援してくれる人を募集しています
113
+ * https://jiikko.fanbox.cc/
114
+ * procon_bypassの運営・開発・サーバー費用に充てさせていただきます。また、問い合わせに優先して対応します。
110
115
 
111
116
  ## Links
112
117
  * https://discord.gg/bEcRNKf4ep
113
118
  * 質問などご意見をdiscordでも受け付けています
119
+
120
+ ## License
121
+
122
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Steepfile CHANGED
@@ -38,7 +38,6 @@ target :lib do
38
38
  check 'lib/procon_bypass_man/support/http_client'
39
39
  check 'lib/procon_bypass_man/support/send_device_stats_http_client'
40
40
  check 'lib/procon_bypass_man/support/on_memory_cache'
41
- check 'lib/procon_bypass_man/support/server_pool'
42
41
  check 'lib/procon_bypass_man/support/uptime.rb'
43
42
  check 'lib/procon_bypass_man/support/safe_timeout'
44
43
  check 'lib/procon_bypass_man/support/update_remote_pbm_action_status_http_client'
@@ -10,23 +10,26 @@
10
10
  * [pbmenvを使わない方法](#pbmenvを使わない方法)
11
11
  * [普段使いをするためのセットアップ](#普段使いをするためのセットアップ)
12
12
  * [レイヤー](#レイヤー)
13
- * モード
14
13
  * [マクロ](#マクロ)
15
14
  * [左スティックの感度調整](#左スティックの感度調整)
16
15
  * [入力表示](#入力表示)
17
- * 設定ファイルの書き方
16
+ * [設定ファイルの書き方](#設定ファイルの書き方)
18
17
  * プラグインの書き方
19
18
  * [設定ファイルの書き方がわからない、エラーが起きるとき](#設定ファイルの書き方がわからない、エラーが起きるとき)
20
19
  * [procon_bypass_manのアップグレード方法](#procon_bypass_manのアップグレード方法)
21
20
  * [procon_bypass_man_cloudについて](#procon_bypass_man_cloudについて)
21
+ * [最適化について](#最適化について)
22
22
 
23
23
  ## はじめに
24
24
  ### procon_bypass_manで解決したいこと
25
25
 
26
- 通常、ボタン連射をするには、市販されているサードパーティー製のコントローラーを使う必要があるのですが、ボタンの押した感覚や各種設定方法は各社の独自仕様であるため、それらを手に馴染ませるのがとても大変です。
27
- 特に「説明書を熟読してコントローラーの設定方法を覚えること、設定されている状態を思い出す」がつらい。
28
-
29
- このツールを使うことで、使い慣れたコントローラーを使ってボタン連射ができます。また、設定内容はテキストで管理しているため一目瞭然です。
26
+ サードパーティー製のコントローラーは頑丈で使いやすいですか?
27
+
28
+ 通常、ボタンの連射をするには、サードパーティー製のコントローラーを使う必要があるのですが、ボタンの押した感覚や各種設定方法は各社の独自仕様であるため、それらを手に馴染ませるのがとても大変です。
29
+ 特に「説明書を熟読して、コントローラーの設定方法を理解し適用すること、時間が空いてから設定されている状態を思い出す」がつらいと思っています。
30
+ また、サードパーティー製のコントローラーは非常に壊れやすく、同じ製品が再び購入できるとは限りません。
31
+
32
+ 本ツールを使うと、使い慣れた純正コントローラーを使って、サードパーティー製のコントローラー以上のことができます。設定内容はテキストで管理しているため一目瞭然です。設定内容のコピーも容易です。
30
33
 
31
34
  ### procon_bypass_manでできること
32
35
 
@@ -35,7 +38,6 @@
35
38
  * 連射中は特定のキーの入力を無視したり、複数のキーをトリガーに連射することもできます
36
39
  * マクロ
37
40
  * [活用例](/docs/setting/splatoon2_macro_sokuwari_bubble.md)
38
- * 特定の同じ操作の繰り返し(モード)
39
41
  * 左スティックの感度調整
40
42
  * [設定方法](/docs/setting/left-analogstick-cap.md)
41
43
  * WEBから設定状態の閲覧・反映
@@ -60,6 +62,8 @@ pbmenvを使うと https://pbm-cloud.herokuapp.com と連携ができるので
60
62
  * systemにインストールされているrubyを使う場合(初心者におすすめ)
61
63
  * rbenvでインストールしたrubyを使う場合
62
64
 
65
+ ちなみに、rbenvを使った方がラグは少ないような気がしますが、明確な体験の違いはそこまでないように思います。
66
+
63
67
  #### 1) pbmenvを使う方法
64
68
 
65
69
  https://github.com/splaplapla/pbmenv
@@ -128,12 +132,12 @@ pbmenvを使っていない場合は、 https://github.com/splaplapla/procon_byp
128
132
  ゲームをやめたくなったらSwitchはそのままスリープに入って問題ないです。このときにRaspberry Piも一緒に電源が切れてしまいますが故障することはありません。
129
133
 
130
134
  ## レイヤー
131
- あらかじめレイヤーごとにキーの配置を設定しておき、用途に応じてレイヤーを切り替えることで違うキーが入力できるという機能です。
135
+ レイヤーごとにボタンの設定をすることができ、用途に応じてレイヤーを切り替えることで、違う設定を即座に適用できるという機能です。
132
136
  レイヤーは、up, down, left, rightの4つあります。 設定ファイルの書いている `prefix_keys_for_changing_layer` を押しながら、十字キーのup, down, left, rightのどれかを押すと、レイヤーを変更することができます。
133
137
 
134
- レイヤー毎の定義方法は、 `layer` ブロックで囲って定義します。
138
+ 設定ファイルでのレイヤー毎の定義方法は、 `layer` ブロックで囲って定義します。
135
139
  以下の例は、upレイヤーとleftレイヤーだけに設定が書かれています。ゲーム進行状況によってレイヤーを切り替えてください。
136
- 初期レイヤーは、 up です。
140
+ procon_bypass_manを起動した直後に有効になっているレイヤーは、 up です。
137
141
 
138
142
  ```ruby
139
143
  layer :up do
@@ -151,15 +155,12 @@ layer :down do
151
155
  end
152
156
  ```
153
157
 
154
- ## モード
155
- * 後で書きます
156
-
157
158
  ## マクロ
158
159
 
159
160
  決まった入力を繰り返し実行できる機能を「マクロ」と呼んでいます。
160
- スプラトゥーンであれば、バブル即割の操作や、試合中の味方へのスーパージャンプもマクロ経由で入力できます。
161
+ マクロを使うことで、スプラトゥーンであれば、バブル即割の操作や、試合中の味方へのスーパージャンプもマクロ経由で入力できます。
161
162
 
162
- マクロの実態はただの文字列で`toggle_r_for_0_2sec` や `toggle_r_for_1sec`といった時間指定もできますし、`[:x, :down, :a, :a]` のような1文字のずつの入力も可能です。
163
+ 設定ファイルに記述するマクロは文字列で定義します。
163
164
  マクロを設定ファイルに定義するには、「プラグイン」か設定ファイルへ直接を記述する「open_macro」のどちらかで行えます。
164
165
 
165
166
  「プラグイン」を使用する場合は、マクロの詳細を記述する必要がなく、PBMのバージョンアップとともに改善が入る可能性があります。
@@ -174,10 +175,13 @@ open_macroは、マクロの詳細を設定ファイルに直書きするため
174
175
  y, x, b, a, sl, sr, r, zr, minus, plus, thumbr, thumbl, home, cap, down, up, right, left, l, zl
175
176
  ```
176
177
 
178
+ <!--
177
179
  マクロの形式には、1ボタンずつ入力する「バージョン1」と時間指定のできる「バージョン2」があります。
178
180
  バージョン1は、 `[:x, :y, :up]` と記述すると、x, y, 十字キーの上ボタンを順番に入力します。バージョン1では実行時間を指定することはできません。
181
+ -->
179
182
 
180
- バージョン2では、 複数のボタンを同時に、時間を指定して「連打」「押しっぱなし」「無操作」ができます。
183
+ マクロは、複数のボタンを同時に「連打」「押しっぱなし」または「待機」ができます。
184
+
181
185
  連打はtoggleで、押しっぱなしはpressing, 無操作は、waitというキーワードを使います。
182
186
  複数のボタンを同時押しの場合は、andで繋ぎます。Xボタンを押しっぱなしにして、ZRボタンを連打する場合は `pressing_x_and_toggle_zr` と記述します。
183
187
  これに時間を指定をする場合は、forで繋ぎます。 `pressing_x_and_toggle_zr_for_1sec` となります。
@@ -192,7 +196,7 @@ y, x, b, a, sl, sr, r, zr, minus, plus, thumbr, thumbl, home, cap, down, up, rig
192
196
  * toggle_x_and_toggle_zr_for_0_2sec
193
197
  * XボタンとZRボタンを0.2秒間連打
194
198
 
195
- 上述したマクロ(ステップ)は、open_macroで記述できます。次は実際の記述例です。
199
+ 上述したマクロ(ステップ)は、open_macroという構文でも記述できます。次は実際の記述例です。
196
200
 
197
201
  ```
198
202
  open_macro :sokuwari, steps: [:toggle_r_for_0_2sec, :toggle_thumbr_for_0_14sec, :toggle_thumbr_and_toggle_zr_for_0_34sec, :toggle_r_for_1sec], if_pressed: [:zl, :right]
@@ -204,11 +208,16 @@ open_macro :sokuwari, steps: [:toggle_r_for_0_2sec, :toggle_thumbr_for_0_14sec,
204
208
  [左スティックの感度調整](/docs/setting/left-analogstick-cap.md)
205
209
 
206
210
  ## 入力表示
207
- * https://github.com/splaplapla/switch-procon-input-viewer
208
- * 後で書きます
211
+ * 使い方は https://github.com/splaplapla/switch-procon-input-viewer を参照してください。
212
+ * https://zenn.dev/jiikko/articles/2ef0ccbdfe0fe7 に技術的な解説を書きました
209
213
 
210
214
  ## 設定ファイルの書き方
211
- * 後で書きます
215
+ 設定ファイルは、ymlフォーマットに埋め込まれたRubyスクリプトで記述します。
216
+ Rubyスクリプトな上に独特な構文に対して、アレンジを加えることは難しいと思ったので、マウス操作をするだけで設定ファイルを生成するツールを作りました。
217
+ https://splaplapla.github.io/procon_bypass_man_setting_editor/ です。
218
+ このツールで設定ファイルを生成し、コピペをするだけで大半のことは済みます。
219
+
220
+ TODO 設定ファイルの書き方
212
221
 
213
222
  ## プラグインの書き方
214
223
  * 後で書きます
@@ -229,3 +238,22 @@ procon_bypass_man_cloudとの接続が完了後、Raspberry Piを起動時にpro
229
238
  セットアップ方法などでわからないことがあればdiscordで質問してみてください。
230
239
 
231
240
  セットアップ方法は https://pbm-cloud.herokuapp.com/faq に書いています。
241
+
242
+ ## 最適化について
243
+ 本稿では、Rubyの最適化について書きます。上級者向けです。適用しなくても普通に動きますが、逆に適用したことで何らかのケースで遅くなる場合があるかもしれません。
244
+
245
+ * jemallocを使う
246
+ * GCの回数が減る(はずな)ので小さな遅延が減ると考えています。が、違いを測定および体感はできませんでした。
247
+ * インストール方法と動作確認
248
+ * sudo apt install libjemalloc-dev
249
+ * export LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libjemalloc.so.2
250
+ * MALLOC_CONF=stats_print:true ruby -e "exit"
251
+ * 適用方法
252
+ * `/usr/share/pbm/current/systemd_units/pbm.service` の `ExecStart` 行に `LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libjemalloc.so.2` を足してください
253
+ * ex) `ExecStart=/bin/bash -c "LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libjemalloc.so.2 /home/pi/.rbenv/versions/3.0.1/bin/ruby /usr/share/pbm/current/app.rb"`
254
+ * jitを有効にする
255
+ * 起動した直後は、コンパイルが走るので遅くなります。しかし、有効にしたところで本プログラムはIOバインドなので効果は薄いようです。
256
+ * 適用方法
257
+ * `/usr/share/pbm/current/systemd_units/pbm.service` の `ExecStart` 行に `--jit` を足してください
258
+ * ex) `ExecStart=/bin/bash -c "/home/pi/.rbenv/versions/3.0.1/bin/ruby --jit /usr/share/pbm/current/app.rb"`
259
+ * ラズベリーパイのGUIをオフにする
@@ -9,12 +9,52 @@
9
9
  * wget https://raw.githubusercontent.com/splaplapla/procon_bypass_man/master/docs/setup_raspi.mitamae.rb -O setup_raspi.mitamae.rb
10
10
  * sudo ./mitamae-armhf-linux local setup_raspi.mitamae.rb -l debug
11
11
  * sudo reboot
12
- * sudo sh /usr/share/pbm/shared/add_procon_gadget.sh の実行に成功させる
13
- * /etc/rc.local に sh /usr/share/pbm/shared/add_procon_gadget.sh って書く
12
+ * sudo sh /usr/share/pbm/shared/add_procon_gadget.sh の実行する
13
+ * 何も表示されなければOK
14
14
  * PCとRaspberry Pi4を接続し、プロコンとして認識していることを確認する
15
15
  * sudo gem i pbmenv
16
16
  * sudo pbmenv install latest
17
17
 
18
+ Raspberry Piのセットアップは以上です。
19
+ 次は、SwitchとRaspberry Piとプロコンにケーブルを接続した上で、次のコマンドをshellに入力し、procon_bypass_manの動作確認を行なってください。
20
+
21
+ ```shell
22
+ cd /usr/share/pbm/current
23
+ sudo /home/pi/.rbenv/versions/3.0.1/bin/ruby app.rb
24
+ ```
25
+
26
+ 次のような出力が画面に表示されれば、動作しています。
27
+
28
+ ```
29
+ ----
30
+ ProconBypassMan::VERSION: 0.2.2
31
+ RUBY_VERSION: 3.0.1
32
+ Pbmenv::VERSION: 0.1.10
33
+ pid: 574
34
+ root: /usr/share/pbm/v0.2.0
35
+ pid_path: /usr/share/pbm/v0.2.0/pbm_pid
36
+ setting_path: /usr/share/pbm/current/setting.yml
37
+ uptime from boot: 60 sec
38
+ use_pbmenv: true
39
+ session_id: s_c6f36422-c20f-4a04-a446-b4a235c2face
40
+ device_id: d_8b0c90d8-90*************************
41
+ bypass_mode: normal(5)
42
+ ----
43
+ ```
44
+
45
+ <hr>
46
+
47
+ procon_bypass_manを手動で起動する場合は、先ほどの2行のコマンドを毎回入力してください。
48
+ procon_bypass_manを自動起動する方法については `GETTING STARTED` を参照してください。
49
+
50
+ <hr>
51
+
52
+
53
+ ケーブルの接続方法は、次の写真を参考にしてください。
54
+
55
+ <img src="https://user-images.githubusercontent.com/1664497/151661582-3a1e8ce9-6c38-4754-8075-7a4453b3109a.jpg" width="500px">
56
+
57
+ <!--
18
58
  ## 上記手順の動作確認方法
19
59
  * 使えそうなイメージ
20
60
  * navikey/raspbian-bullseye
@@ -48,3 +88,5 @@ sudo ./mitamae-armhf-linux local setup_raspi.mitamae.rb -l debug
48
88
  * /etc/modules に指定の文字列があること
49
89
  * /boot/config.txt に指定の文字列があること
50
90
  * /usr/share/pbm/shared/add_procon_gadget.sh が存在していること
91
+
92
+ -->
@@ -6,10 +6,9 @@ module ProconBypassMan
6
6
  @args = args
7
7
  end
8
8
 
9
+ # @raise [any]
9
10
  def perform
10
11
  @klass.perform(*@args)
11
- rescue => e
12
- ProconBypassMan::ReportErrorJob.perform(e)
13
12
  end
14
13
  end
15
14
  end
@@ -0,0 +1,50 @@
1
+ class ProconBypassMan::Background::JobQueue
2
+ extend ProconBypassMan::CanOverProcess
3
+
4
+ include Singleton
5
+
6
+ attr_reader :distributed_queue
7
+
8
+ # @override
9
+ def self.enable?
10
+ true
11
+ end
12
+
13
+ # @override
14
+ def self.distributed_class
15
+ Queue
16
+ end
17
+
18
+ # @override
19
+ def self.socket_file_path
20
+ "/tmp/procon_bypass_man_background_job_queue_queue".freeze
21
+ end
22
+
23
+ def self.push(value)
24
+ return unless enable?
25
+
26
+ instance.distributed_queue.push(value)
27
+ end
28
+
29
+ def self.pop
30
+ return unless enable?
31
+
32
+ instance.distributed_queue.pop
33
+ end
34
+
35
+ def self.size
36
+ return unless enable?
37
+
38
+ instance.distributed_queue.size
39
+ end
40
+
41
+ def self.clear
42
+ return unless enable?
43
+
44
+ instance.distributed_queue.clear
45
+ end
46
+
47
+ def initialize
48
+ @distributed_queue = DRbObject.new_with_uri(self.class.socket_path)
49
+ end
50
+ end
@@ -1,5 +1,5 @@
1
1
  module ProconBypassMan::HasExternalApiSetting
2
- def server_pool
3
- ProconBypassMan.config.server_pool
2
+ def api_server
3
+ ProconBypassMan.config.api_server
4
4
  end
5
5
  end
@@ -6,9 +6,9 @@ module ProconBypassMan
6
6
  end
7
7
 
8
8
  def perform_async(*args)
9
- ProconBypassMan::Background::JobRunner.push(
9
+ ProconBypassMan::Background::JobQueue.push(
10
10
  args: args,
11
- reporter_class: self,
11
+ job_class: self.name, # drb上のQueueに格納するので念の為文字列入れて、取り出すときにevalでクラス化する
12
12
  )
13
13
  end
14
14
  end
@@ -5,7 +5,7 @@ class ProconBypassMan::PostCompletedRemoteMacroJob < ProconBypassMan::BaseJob
5
5
  def self.perform(job_id)
6
6
  ProconBypassMan::RemoteMacroHttpClient.new(
7
7
  path: path,
8
- server_pool: server_pool,
8
+ server: api_server,
9
9
  ).post(job_id: job_id)
10
10
  end
11
11
 
@@ -5,7 +5,7 @@ class ProconBypassMan::ReportBootJob < ProconBypassMan::ReportEventBaseJob
5
5
  def self.perform(body)
6
6
  ProconBypassMan::ReportHttpClient.new(
7
7
  path: path,
8
- server_pool: server_pool,
8
+ server: api_server,
9
9
  retry_on_connection_error: true,
10
10
  ).post(body: body, event_type: :boot)
11
11
  end
@@ -4,7 +4,7 @@ class ProconBypassMan::ReportCompletedUpgradePbmJob < ProconBypassMan::ReportEve
4
4
  def self.perform
5
5
  ProconBypassMan::ReportHttpClient.new(
6
6
  path: path,
7
- server_pool: server_pool,
7
+ server: api_server,
8
8
  ).post(body: nil, event_type: :completed_upgrade_pbm)
9
9
  end
10
10
  end
@@ -5,7 +5,7 @@ class ProconBypassMan::ReportErrorJob < ProconBypassMan::ReportEventBaseJob
5
5
  def self.perform(body)
6
6
  ProconBypassMan::ReportHttpClient.new(
7
7
  path: path,
8
- server_pool: server_pool,
8
+ server: api_server,
9
9
  ).post(body: body, event_type: :error)
10
10
  end
11
11
  end
@@ -5,7 +5,7 @@ class ProconBypassMan::ReportErrorReloadConfigJob < ProconBypassMan::ReportEvent
5
5
  def self.perform(body)
6
6
  ProconBypassMan::ReportHttpClient.new(
7
7
  path: path,
8
- server_pool: server_pool,
8
+ server: api_server,
9
9
  ).post(body: body, event_type: :error_reload_config)
10
10
  end
11
11
  end
@@ -5,7 +5,7 @@ class ProconBypassMan::ReportLoadConfigJob < ProconBypassMan::ReportEventBaseJob
5
5
  def self.perform(body)
6
6
  ProconBypassMan::ReportHttpClient.new(
7
7
  path: path,
8
- server_pool: server_pool,
8
+ server: api_server,
9
9
  ).post(body: body, event_type: :load_config)
10
10
  end
11
11
  end
@@ -0,0 +1,43 @@
1
+ class ProconBypassMan::ReportProconPerformanceMeasurementsJob < ProconBypassMan::BaseJob
2
+ extend ProconBypassMan::HasExternalApiSetting
3
+
4
+ # @param [ProconBypassMan::Procon::PerformanceMeasurement::MeasurementCollection] measurement_collection
5
+ def self.perform(measurement_collection)
6
+ return if measurement_collection.nil?
7
+
8
+ collected_spans_size = measurement_collection.spans.size
9
+ metric = ProconBypassMan::Procon::PerformanceMeasurement.summarize(
10
+ spans: measurement_collection.spans
11
+ )
12
+ body = {
13
+ timestamp: measurement_collection.timestamp_key,
14
+ interval_from_previous_succeed_max: metric.interval_from_previous_succeed_max,
15
+ interval_from_previous_succeed_p50: metric.interval_from_previous_succeed_p50,
16
+ write_time_max: metric.write_time_max,
17
+ write_time_p50: metric.write_time_p50,
18
+ read_time_max: metric.read_time_max,
19
+ read_time_p50: metric.read_time_p50,
20
+ time_taken_max: metric.time_taken_max,
21
+ time_taken_p50: metric.time_taken_p50,
22
+ time_taken_p95: metric.time_taken_p95,
23
+ time_taken_p99: metric.time_taken_p99,
24
+ read_error_count: metric.read_error_count,
25
+ write_error_count: metric.write_error_count,
26
+ gc_count: metric.gc_count,
27
+ gc_time: metric.gc_time,
28
+ succeed_rate: metric.succeed_rate,
29
+ load_agv: ProconBypassMan::LoadAgv.new.get,
30
+ collected_spans_size: collected_spans_size,
31
+ }
32
+ ProconBypassMan.logger.info(body)
33
+
34
+ ProconBypassMan::ProconPerformanceHttpClient.new(
35
+ path: path,
36
+ server: api_server,
37
+ ).post(body: body)
38
+ end
39
+
40
+ def self.path
41
+ "/api/devices/#{ProconBypassMan.device_id}/procon_performance_metrics"
42
+ end
43
+ end
@@ -5,7 +5,7 @@ class ProconBypassMan::ReportReloadConfigJob < ProconBypassMan::ReportEventBaseJ
5
5
  def self.perform(body)
6
6
  ProconBypassMan::ReportHttpClient.new(
7
7
  path: path,
8
- server_pool: server_pool,
8
+ server: api_server,
9
9
  ).post(body: body, event_type: :reload_config)
10
10
  end
11
11
  end
@@ -4,7 +4,7 @@ class ProconBypassMan::ReportStartRebootJob < ProconBypassMan::ReportEventBaseJo
4
4
  def self.perform
5
5
  ProconBypassMan::ReportHttpClient.new(
6
6
  path: path,
7
- server_pool: server_pool,
7
+ server: api_server,
8
8
  ).post(body: nil, event_type: :start_reboot)
9
9
  end
10
10
  end
@@ -5,7 +5,7 @@ class ProconBypassMan::SyncDeviceStatsJob < ProconBypassMan::BaseJob
5
5
  def self.perform(status)
6
6
  ProconBypassMan::SendDeviceStatsHttpClient.new(
7
7
  path: path,
8
- server_pool: server_pool,
8
+ server: api_server,
9
9
  ).post(status: status, pbm_session_id: ProconBypassMan.session_id)
10
10
  end
11
11
 
@@ -1,7 +1,6 @@
1
- require "procon_bypass_man/background/jobs/concerns/has_internal_api_setting"
2
1
  require "procon_bypass_man/background/jobs/concerns/has_external_api_setting"
3
2
  require "procon_bypass_man/background/jobs/concerns/job_performable"
4
- require "procon_bypass_man/background/job_runner"
3
+ require "procon_bypass_man/background/job_queue"
5
4
  require "procon_bypass_man/background/job_performer"
6
5
  require "procon_bypass_man/background/jobs/base_job"
7
6
  require "procon_bypass_man/background/jobs/report_event_base_job"
@@ -11,7 +10,7 @@ require "procon_bypass_man/background/jobs/report_reload_config_job"
11
10
  require "procon_bypass_man/background/jobs/report_error_reload_config_job"
12
11
  require "procon_bypass_man/background/jobs/report_load_config_job"
13
12
  require "procon_bypass_man/background/jobs/report_error_job"
14
- require "procon_bypass_man/background/jobs/report_pressed_buttons_job"
15
13
  require "procon_bypass_man/background/jobs/report_completed_upgrade_pbm_job"
14
+ require "procon_bypass_man/background/jobs/report_procon_performance_measurements_job"
16
15
  require "procon_bypass_man/background/jobs/sync_device_stats_job"
17
16
  require "procon_bypass_man/background/jobs/post_completed_remote_macro_job"