procon_bypass_man 0.2.0 → 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 (93) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +19 -6
  3. data/.github/workflows/gitleacks.yml +2 -1
  4. data/.github/workflows/release.yml +1 -0
  5. data/.github/workflows/ruby.yml +1 -1
  6. data/.rubocop.yml +4 -0
  7. data/.ruby-version +1 -1
  8. data/CHANGELOG.md +16 -1
  9. data/Gemfile +6 -3
  10. data/Gemfile.lock +3 -3
  11. data/README.md +17 -8
  12. data/Steepfile +0 -1
  13. data/bin/generate_default_app +10 -0
  14. data/docs/getting_started.md +98 -25
  15. data/docs/setup_raspi_by_mitamae.md +44 -2
  16. data/lib/procon_bypass_man/background/job_performer.rb +1 -2
  17. data/lib/procon_bypass_man/background/job_queue.rb +50 -0
  18. data/lib/procon_bypass_man/background/jobs/base_job.rb +1 -1
  19. data/lib/procon_bypass_man/background/jobs/concerns/has_external_api_setting.rb +2 -2
  20. data/lib/procon_bypass_man/background/jobs/concerns/job_performable.rb +16 -0
  21. data/lib/procon_bypass_man/background/jobs/post_completed_remote_macro_job.rb +1 -1
  22. data/lib/procon_bypass_man/background/jobs/report_boot_job.rb +1 -1
  23. data/lib/procon_bypass_man/background/jobs/report_completed_upgrade_pbm_job.rb +1 -1
  24. data/lib/procon_bypass_man/background/jobs/report_error_job.rb +1 -1
  25. data/lib/procon_bypass_man/background/jobs/report_error_reload_config_job.rb +1 -1
  26. data/lib/procon_bypass_man/background/jobs/report_load_config_job.rb +1 -1
  27. data/lib/procon_bypass_man/background/jobs/report_procon_performance_measurements_job.rb +43 -0
  28. data/lib/procon_bypass_man/background/jobs/report_reload_config_job.rb +1 -1
  29. data/lib/procon_bypass_man/background/jobs/report_start_reboot_job.rb +1 -1
  30. data/lib/procon_bypass_man/background/jobs/sync_device_stats_job.rb +1 -1
  31. data/lib/procon_bypass_man/background.rb +3 -4
  32. data/lib/procon_bypass_man/bypass/bypass_command.rb +6 -15
  33. data/lib/procon_bypass_man/bypass/bypass_value.rb +6 -0
  34. data/lib/procon_bypass_man/bypass/procon_to_switch.rb +107 -0
  35. data/lib/procon_bypass_man/bypass/switch_to_procon.rb +64 -0
  36. data/lib/procon_bypass_man/bypass.rb +5 -112
  37. data/lib/procon_bypass_man/configuration.rb +16 -40
  38. data/lib/procon_bypass_man/device_connection/output_report_sub_command_table.rb +1 -1
  39. data/lib/procon_bypass_man/device_connection/procon_setting_overrider.rb +12 -3
  40. data/lib/procon_bypass_man/procon/macro.rb +1 -1
  41. data/lib/procon_bypass_man/procon/performance_measurement/last_bypass_at.rb +17 -0
  42. data/lib/procon_bypass_man/procon/performance_measurement/measurement_collection.rb +9 -0
  43. data/lib/procon_bypass_man/procon/performance_measurement/measurements_summarizer.rb +84 -0
  44. data/lib/procon_bypass_man/procon/performance_measurement/procon_performance_span_transfer_job.rb +8 -0
  45. data/lib/procon_bypass_man/procon/performance_measurement/queue_over_process.rb +38 -0
  46. data/lib/procon_bypass_man/procon/performance_measurement/span_queue.rb +42 -0
  47. data/lib/procon_bypass_man/procon/performance_measurement/span_transfer_buffer.rb +39 -0
  48. data/lib/procon_bypass_man/procon/performance_measurement.rb +103 -0
  49. data/lib/procon_bypass_man/procon.rb +2 -1
  50. data/lib/procon_bypass_man/procon_display/bypass_hook.rb +12 -0
  51. data/lib/procon_bypass_man/procon_display/http_request.rb +31 -0
  52. data/lib/procon_bypass_man/procon_display/http_response.rb +23 -0
  53. data/lib/procon_bypass_man/procon_display/server.rb +33 -0
  54. data/lib/procon_bypass_man/procon_display/server_app.rb +17 -0
  55. data/lib/procon_bypass_man/procon_display/status.rb +20 -0
  56. data/lib/procon_bypass_man/procon_display.rb +11 -0
  57. data/lib/procon_bypass_man/remote_macro/queue_over_process.rb +26 -44
  58. data/lib/procon_bypass_man/remote_macro/remote_macro_object.rb +22 -24
  59. data/lib/procon_bypass_man/remote_macro/remote_macro_receiver.rb +1 -1
  60. data/lib/procon_bypass_man/remote_macro/remote_macro_sender.rb +1 -1
  61. data/lib/procon_bypass_man/remote_macro/task.rb +1 -5
  62. data/lib/procon_bypass_man/remote_macro/task_queue.rb +6 -10
  63. data/lib/procon_bypass_man/remote_pbm_action/commands/update_remote_pbm_action_status_command.rb +1 -1
  64. data/lib/procon_bypass_man/runner.rb +4 -9
  65. data/lib/procon_bypass_man/scheduler.rb +15 -6
  66. data/lib/procon_bypass_man/support/callbacks.rb +72 -34
  67. data/lib/procon_bypass_man/support/can_over_process.rb +60 -0
  68. data/lib/procon_bypass_man/support/gc.rb +8 -0
  69. data/lib/procon_bypass_man/support/http_client.rb +9 -6
  70. data/lib/procon_bypass_man/support/load_agv.rb +20 -0
  71. data/lib/procon_bypass_man/support/procon_performance_http_client.rb +7 -0
  72. data/lib/procon_bypass_man/support/retryable.rb +16 -0
  73. data/lib/procon_bypass_man/support/signal_handler.rb +1 -1
  74. data/lib/procon_bypass_man/version.rb +1 -1
  75. data/lib/procon_bypass_man/websocket/client.rb +2 -2
  76. data/lib/procon_bypass_man/worker.rb +32 -0
  77. data/lib/procon_bypass_man.rb +41 -10
  78. data/procon_bypass_man.gemspec +1 -1
  79. data/project_template/README.md +0 -5
  80. data/project_template/app.rb +21 -11
  81. data/project_template/app.rb.erb +62 -0
  82. data/project_template/lib/app_generator.rb +31 -0
  83. data/project_template/web.rb +1 -1
  84. data/sig/main.rbs +10 -52
  85. data/tmp/.keep +0 -0
  86. metadata +34 -10
  87. data/lib/procon_bypass_man/background/job_runner.rb +0 -45
  88. data/lib/procon_bypass_man/background/jobs/concerns/has_internal_api_setting.rb +0 -5
  89. data/lib/procon_bypass_man/background/jobs/concerns/job_runnable.rb +0 -16
  90. data/lib/procon_bypass_man/background/jobs/report_pressed_buttons_job.rb +0 -15
  91. data/lib/procon_bypass_man/bypass/usb_hid_logger.rb +0 -44
  92. data/lib/procon_bypass_man/io_monitor.rb +0 -108
  93. 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: 6ca0c509c42d13cd0a9177c80b09c7f31bbeb6fad810e0f85210811cd69bffa2
4
- data.tar.gz: ae97eb1796fb709840dcac7138e8ac8a2fd8be15f134585da8538f3958fb3442
3
+ metadata.gz: dddf32b941507a57c7b2c5656879e132132f51eefcd64f29788567c81566c235
4
+ data.tar.gz: e3649afcdb4877b41c6d05754ed77176d46a1fcc46a3d45751e15b1c91f6a23d
5
5
  SHA512:
6
- metadata.gz: 33f58604e017bc01b6f7057877ab79045456f7fb10ff880fe640b47195374c8f170f5d5e7f97f643148d5b06313a3b9c6cfbd77d0e2701875e3bd1e6d4e397b1
7
- data.tar.gz: d69d376c75ef7692ae7d2c74e8715aa00bea4dfbe2ff6d7359b69bbdff5ef65cd39132f82dcaa297c60fd3459ac9aff66f0751d2cc2e818e613bbd53cef2f829
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:
@@ -55,6 +55,14 @@ jobs:
55
55
  - run: ruby -cw project_template/web.rb
56
56
  - run: ruby -ryaml -e 'puts YAML.load_file("./project_template/setting.yml")["setting"]' > /tmp/content_of_setting.rb && ruby -cw /tmp/content_of_setting.rb
57
57
 
58
+ outdated_app_checker:
59
+ executor:
60
+ name: ruby
61
+ tag: 3.0.1
62
+ steps:
63
+ - checkout
64
+ - run: ruby bin/generate_default_app && git diff --exit-code project_template/app.rb
65
+
58
66
  bundle_install:
59
67
  parameters:
60
68
  ruby-version:
@@ -101,27 +109,31 @@ jobs:
101
109
 
102
110
  build_jobs: &build_jobs
103
111
  - check_pbm_version
112
+ - outdated_app_checker
104
113
  - syntax_check:
105
114
  matrix:
106
115
  parameters:
107
116
  ruby-version:
117
+ - "2.5.5"
108
118
  - "3.0.1"
109
119
  - "3.0.2"
110
- - "3.1.1"
120
+ - "3.1.2"
111
121
  - bundle_install:
112
122
  matrix:
113
123
  parameters:
114
124
  ruby-version:
125
+ - "2.5.5"
115
126
  - "3.0.1"
116
127
  - "3.0.2"
117
- - "3.1.1"
128
+ - "3.1.2"
118
129
  - lint:
119
130
  matrix:
120
131
  parameters:
121
132
  ruby-version:
133
+ - "2.5.5"
122
134
  - "3.0.1"
123
135
  - "3.0.2"
124
- - "3.1.1"
136
+ - "3.1.2"
125
137
  requires:
126
138
  - bundle_install
127
139
  - type_check:
@@ -130,16 +142,17 @@ build_jobs: &build_jobs
130
142
  ruby-version:
131
143
  # - "3.0.1" # たまにSEGVするので
132
144
  - "3.0.2"
133
- - "3.1.1"
145
+ - "3.1.2"
134
146
  requires:
135
147
  - bundle_install
136
148
  - rspec:
137
149
  matrix:
138
150
  parameters:
139
151
  ruby-version:
152
+ - "2.5.5"
140
153
  - "3.0.1"
141
154
  - "3.0.2"
142
- - "3.1.1"
155
+ - "3.1.2"
143
156
  requires:
144
157
  - bundle_install
145
158
  workflows:
@@ -5,7 +5,8 @@ on: [push]
5
5
  jobs:
6
6
  gitleaks:
7
7
  runs-on: ubuntu-latest
8
+ timeout-minutes: 5
8
9
  steps:
9
10
  - uses: actions/checkout@v1
10
11
  - name: gitleaks-action
11
- uses: zricethezav/gitleaks-action@master
12
+ uses: zricethezav/gitleaks-action@v1.6.0
@@ -6,6 +6,7 @@ on:
6
6
  jobs:
7
7
  release:
8
8
  runs-on: ubuntu-latest
9
+ timeout-minutes: 5
9
10
  permissions:
10
11
  contents: write
11
12
 
@@ -12,8 +12,8 @@ on:
12
12
 
13
13
  jobs:
14
14
  test:
15
-
16
15
  runs-on: ubuntu-latest
16
+ timeout-minutes: 5
17
17
  strategy:
18
18
  matrix:
19
19
  ruby-version: ['3.0.1', '3.1.1']
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,5 +1,20 @@
1
+ ## [0.2.3] - 2022-8-27
2
+ * プロコンのラグ具合をpbm-cloudに送信し、グラフで見れるようになりました #158
3
+ * 非同期ジョブをmasterプロセス経由で実行するようになりました #191
4
+ * バイパス処理が数秒間固まる現象がおそらく直りました #179
5
+
6
+ ## [0.2.2] - 2022-07-10
7
+ * project_template/app.rbを動的に生成する仕組みを追加しました
8
+ * ドキュメントからpbm_webに関する記述を削除しました
9
+ * 起動スクリプト(app.rb) がたまに意図せず /usr/share/pbm/current を削除してしまう不具合を修正しました
10
+
11
+ ## [0.2.1] - 2022-05-29
12
+ - 入力表示機能を提供するSwitchProconInputViewerに対応しました
13
+ - https://github.com/splaplapla/switch-procon-input-viewer
14
+ - app.rb内のバグ修正, ログファイルとして残る世代を減らしました
15
+
1
16
  ## [0.2.0] - 2022-05-20
2
- - 3つ以上のボタンを操作するマクロに対応する
17
+ - 3つ以上のボタンを操作するマクロに対応しました
3
18
  - IOに関するログをデフォルトで無効にしました
4
19
  - 有効にする場合はapp.rbに `config.io_monitor_logging = true` を記述してください
5
20
  - 接続が安定化するまでの時間が短くなりました
data/Gemfile CHANGED
@@ -10,8 +10,11 @@ gem "rspec"
10
10
  gem "pry"
11
11
  gem "timecop"
12
12
  gem "rubocop", require: false
13
- gem "steep", require: false
14
- gem 'typeprof', require: false
15
- gem 'rbs', require: false
16
13
  gem "sinatra", require: false
17
14
  gem "webrick", require: false
15
+
16
+ if Gem::Version.new(RUBY_VERSION) > Gem::Version.new("2.6.0")
17
+ gem 'typeprof', require: false
18
+ gem 'rbs', require: false
19
+ gem "steep", require: false
20
+ end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- procon_bypass_man (0.2.0)
4
+ procon_bypass_man (0.2.3)
5
5
  action_cable_client
6
6
  pbmenv (>= 0.1.9)
7
7
  sorted_set
@@ -36,11 +36,11 @@ GEM
36
36
  parallel (1.21.0)
37
37
  parser (3.0.3.2)
38
38
  ast (~> 2.4.1)
39
- pbmenv (0.1.9)
39
+ pbmenv (0.1.10)
40
40
  pry (0.14.1)
41
41
  coderay (~> 1.1)
42
42
  method_source (~> 1.0)
43
- rack (2.2.3)
43
+ rack (2.2.3.1)
44
44
  rack-protection (2.2.0)
45
45
  rack
46
46
  rainbow (3.0.0)
data/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  <img width="880" alt="スクリーンショット 2022-04-02 9 10 38" src="https://user-images.githubusercontent.com/1664497/161356057-71e4bc2a-0217-4434-9bf1-0002b9fb261a.png">
14
14
 
15
-
15
+ https://user-images.githubusercontent.com/1664497/171327108-f12f56a5-fc36-48da-95a5-65e976553a20.mov
16
16
 
17
17
  <!--
18
18
  ![image](https://user-images.githubusercontent.com/1664497/123414210-942f6980-d5ee-11eb-8192-955bd9e37e0b.png)
@@ -33,7 +33,7 @@ Switch <-- (PBM): ZR連打
33
33
  * データ通信が可能なUSBケーブル
34
34
 
35
35
  ## 使うソフトウェア
36
- * ruby-3.0.x
36
+ * ruby 2.5 以上
37
37
 
38
38
  ## Usage
39
39
  * USBガジェットモードで起動するRaspberry Pi4を用意する
@@ -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'
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "./project_template/lib/app_generator"
4
+
5
+ AppGenerator.new(
6
+ prefix_path: "./project_template",
7
+ enable_integration_with_pbm_cloud: false,
8
+ ).generate
9
+
10
+ puts "Created project_template/app.rb"
@@ -10,22 +10,26 @@
10
10
  * [pbmenvを使わない方法](#pbmenvを使わない方法)
11
11
  * [普段使いをするためのセットアップ](#普段使いをするためのセットアップ)
12
12
  * [レイヤー](#レイヤー)
13
- * モード
14
13
  * [マクロ](#マクロ)
15
14
  * [左スティックの感度調整](#左スティックの感度調整)
16
- * 設定ファイルの書き方
15
+ * [入力表示](#入力表示)
16
+ * [設定ファイルの書き方](#設定ファイルの書き方)
17
17
  * プラグインの書き方
18
18
  * [設定ファイルの書き方がわからない、エラーが起きるとき](#設定ファイルの書き方がわからない、エラーが起きるとき)
19
19
  * [procon_bypass_manのアップグレード方法](#procon_bypass_manのアップグレード方法)
20
20
  * [procon_bypass_man_cloudについて](#procon_bypass_man_cloudについて)
21
+ * [最適化について](#最適化について)
21
22
 
22
23
  ## はじめに
23
24
  ### procon_bypass_manで解決したいこと
24
25
 
25
- 通常、ボタン連射をするには、市販されているサードパーティー製のコントローラーを使う必要があるのですが、ボタンの押した感覚や各種設定方法は各社の独自仕様であるため、それらを手に馴染ませるのがとても大変です。
26
- 特に「説明書を熟読してコントローラーの設定方法を覚えること、設定されている状態を思い出す」がつらい。
27
-
28
- このツールを使うことで、使い慣れたコントローラーを使ってボタン連射ができます。また、設定内容はテキストで管理しているため一目瞭然です。
26
+ サードパーティー製のコントローラーは頑丈で使いやすいですか?
27
+
28
+ 通常、ボタンの連射をするには、サードパーティー製のコントローラーを使う必要があるのですが、ボタンの押した感覚や各種設定方法は各社の独自仕様であるため、それらを手に馴染ませるのがとても大変です。
29
+ 特に「説明書を熟読して、コントローラーの設定方法を理解し適用すること、時間が空いてから設定されている状態を思い出す」がつらいと思っています。
30
+ また、サードパーティー製のコントローラーは非常に壊れやすく、同じ製品が再び購入できるとは限りません。
31
+
32
+ 本ツールを使うと、使い慣れた純正コントローラーを使って、サードパーティー製のコントローラー以上のことができます。設定内容はテキストで管理しているため一目瞭然です。設定内容のコピーも容易です。
29
33
 
30
34
  ### procon_bypass_manでできること
31
35
 
@@ -34,11 +38,12 @@
34
38
  * 連射中は特定のキーの入力を無視したり、複数のキーをトリガーに連射することもできます
35
39
  * マクロ
36
40
  * [活用例](/docs/setting/splatoon2_macro_sokuwari_bubble.md)
37
- * 特定の同じ操作の繰り返し(モード)
38
41
  * 左スティックの感度調整
39
42
  * [設定方法](/docs/setting/left-analogstick-cap.md)
40
43
  * WEBから設定状態の閲覧・反映
41
44
  * ボタンリマップ
45
+ * 入力表示
46
+ * https://github.com/splaplapla/switch-procon-input-viewer
42
47
 
43
48
  ## セットアップ
44
49
  ### ラズベリーパイのセットアップ
@@ -47,26 +52,66 @@
47
52
 
48
53
  ### procon_bypass_manのインストール
49
54
 
50
- pbmenvを使うと https://pbm-cloud.herokuapp.com と連携ができるのでおすすめですが、pbmenvを使わなくてもprocon_bypass_manをインストールすることは可能です。
55
+ pbmenvを使うと https://pbm-cloud.herokuapp.com と連携ができるのでおすすめですが、pbmenvを使わなくてもprocon_bypass_manをインストールすることは可能です。
56
+ 次の4つからインストール方法を1つ選んでください。
57
+
58
+ * pbmenvを使う方法
59
+ * systemにインストールされているrubyを使う場合(初心者におすすめ)
60
+ * rbenvでインストールしたrubyを使う場合
61
+ * pbmenvを使わない方法
62
+ * systemにインストールされているrubyを使う場合(初心者におすすめ)
63
+ * rbenvでインストールしたrubyを使う場合
64
+
65
+ ちなみに、rbenvを使った方がラグは少ないような気がしますが、明確な体験の違いはそこまでないように思います。
51
66
 
52
- #### pbmenvを使う方法
67
+ #### 1) pbmenvを使う方法
53
68
 
54
69
  https://github.com/splaplapla/pbmenv
55
- pbmenvはprocon_bypass_manのバージョンマネジャーです。procon_bypass_manはバージョンアップによって起動スクリプトに変更が入ることがあって、バージョンアップするときはpbmenvを使うとエラーが起きることなくインストールができるようになります。また、pbm-cloudと連携してすべての機能を使うには、pbmenvの利用が必須になります。
70
+ pbmenvはprocon_bypass_manのバージョンマネジャーです。
71
+ procon_bypass_manはバージョンアップによって起動スクリプトに変更が入ることがあって、バージョンアップするときはpbmenvを使うとエラーが起きることなくインストールができるようになります。また、pbm-cloudと連携してすべての機能を使うには、pbmenvの利用が必須になります。
56
72
 
73
+ ##### 1-1) systemにインストールされているrubyを使う場合(初心者におすすめ)
74
+
75
+ ```bash
76
+ sudo apt-get install ruby ruby-dev
77
+ sudo gem i bundler pbmenv
78
+ sudo pbmenv install latest --use
79
+ cd /usr/share/pbm/current
80
+ sudo ruby app.rb
57
81
  ```
58
- gem install pbmenv
59
- sudo pbmenv install latest
82
+
83
+ ##### 1-2) rbenvでインストールしたrubyを使う場合
84
+ rbenvはrubyのパッケージマネージャーです。
85
+
86
+ ```bash
87
+ rbenv install 3.0.1
88
+ sudo gem install pbmenv
89
+ sudo pbmenv install latest --use
60
90
  cd /usr/share/pbm/current
61
91
  sudo /home/pi/.rbenv/versions/3.0.1/bin/ruby app.rb
62
92
  ```
63
93
 
64
- #### pbmenvを使わない方法
94
+ #### 2) pbmenvを使わない方法
95
+ https://github.com/jiikko/procon_bypass_man_sample にある app.rb と setting.yml を Raspberry Pi にダウンロードすれば、起動することができます。
65
96
 
66
- https://github.com/jiikko/procon_bypass_man_sample にある app.rb と setting.yml を Raspberry Pi にダウンロードし、ruby 3.0.1 をインストールすれば起動することができます。
97
+ ##### 2-1) systemにインストールされているrubyを使う場合(初心者におすすめ)
67
98
 
99
+ ```bash
100
+ sudo apt-get install ruby ruby-dev wget
101
+ wget https://raw.githubusercontent.com/jiikko/procon_bypass_man_sample/master/app.rb
102
+ wget https://raw.githubusercontent.com/jiikko/procon_bypass_man_sample/master/setting.yml
103
+ sudo gem i bundler
104
+ sudo ruby app.rb
68
105
  ```
106
+
107
+ ##### 2-2) rbenvでインストールしたrubyを使う場合
108
+ rbenvはrubyのパッケージマネージャーです。
109
+
110
+ ```bash
69
111
  rbenv install 3.0.1
112
+ sudo apt-get install wget
113
+ wget https://raw.githubusercontent.com/jiikko/procon_bypass_man_sample/master/app.rb
114
+ wget https://raw.githubusercontent.com/jiikko/procon_bypass_man_sample/master/setting.yml
70
115
  sudo /home/pi/.rbenv/versions/3.0.1/bin/ruby app.rb
71
116
  ```
72
117
 
@@ -87,12 +132,12 @@ pbmenvを使っていない場合は、 https://github.com/splaplapla/procon_byp
87
132
  ゲームをやめたくなったらSwitchはそのままスリープに入って問題ないです。このときにRaspberry Piも一緒に電源が切れてしまいますが故障することはありません。
88
133
 
89
134
  ## レイヤー
90
- あらかじめレイヤーごとにキーの配置を設定しておき、用途に応じてレイヤーを切り替えることで違うキーが入力できるという機能です。
135
+ レイヤーごとにボタンの設定をすることができ、用途に応じてレイヤーを切り替えることで、違う設定を即座に適用できるという機能です。
91
136
  レイヤーは、up, down, left, rightの4つあります。 設定ファイルの書いている `prefix_keys_for_changing_layer` を押しながら、十字キーのup, down, left, rightのどれかを押すと、レイヤーを変更することができます。
92
137
 
93
- レイヤー毎の定義方法は、 `layer` ブロックで囲って定義します。
138
+ 設定ファイルでのレイヤー毎の定義方法は、 `layer` ブロックで囲って定義します。
94
139
  以下の例は、upレイヤーとleftレイヤーだけに設定が書かれています。ゲーム進行状況によってレイヤーを切り替えてください。
95
- 初期レイヤーは、 up です。
140
+ procon_bypass_manを起動した直後に有効になっているレイヤーは、 up です。
96
141
 
97
142
  ```ruby
98
143
  layer :up do
@@ -110,15 +155,12 @@ layer :down do
110
155
  end
111
156
  ```
112
157
 
113
- ## モード
114
- * 後で書きます
115
-
116
158
  ## マクロ
117
159
 
118
160
  決まった入力を繰り返し実行できる機能を「マクロ」と呼んでいます。
119
- スプラトゥーンであれば、バブル即割の操作や、試合中の味方へのスーパージャンプもマクロ経由で入力できます。
161
+ マクロを使うことで、スプラトゥーンであれば、バブル即割の操作や、試合中の味方へのスーパージャンプもマクロ経由で入力できます。
120
162
 
121
- マクロの実態はただの文字列で`toggle_r_for_0_2sec` や `toggle_r_for_1sec`といった時間指定もできますし、`[:x, :down, :a, :a]` のような1文字のずつの入力も可能です。
163
+ 設定ファイルに記述するマクロは文字列で定義します。
122
164
  マクロを設定ファイルに定義するには、「プラグイン」か設定ファイルへ直接を記述する「open_macro」のどちらかで行えます。
123
165
 
124
166
  「プラグイン」を使用する場合は、マクロの詳細を記述する必要がなく、PBMのバージョンアップとともに改善が入る可能性があります。
@@ -133,10 +175,13 @@ open_macroは、マクロの詳細を設定ファイルに直書きするため
133
175
  y, x, b, a, sl, sr, r, zr, minus, plus, thumbr, thumbl, home, cap, down, up, right, left, l, zl
134
176
  ```
135
177
 
178
+ <!--
136
179
  マクロの形式には、1ボタンずつ入力する「バージョン1」と時間指定のできる「バージョン2」があります。
137
180
  バージョン1は、 `[:x, :y, :up]` と記述すると、x, y, 十字キーの上ボタンを順番に入力します。バージョン1では実行時間を指定することはできません。
181
+ -->
138
182
 
139
- バージョン2では、 複数のボタンを同時に、時間を指定して「連打」「押しっぱなし」「無操作」ができます。
183
+ マクロは、複数のボタンを同時に「連打」「押しっぱなし」または「待機」ができます。
184
+
140
185
  連打はtoggleで、押しっぱなしはpressing, 無操作は、waitというキーワードを使います。
141
186
  複数のボタンを同時押しの場合は、andで繋ぎます。Xボタンを押しっぱなしにして、ZRボタンを連打する場合は `pressing_x_and_toggle_zr` と記述します。
142
187
  これに時間を指定をする場合は、forで繋ぎます。 `pressing_x_and_toggle_zr_for_1sec` となります。
@@ -151,7 +196,7 @@ y, x, b, a, sl, sr, r, zr, minus, plus, thumbr, thumbl, home, cap, down, up, rig
151
196
  * toggle_x_and_toggle_zr_for_0_2sec
152
197
  * XボタンとZRボタンを0.2秒間連打
153
198
 
154
- 上述したマクロ(ステップ)は、open_macroで記述できます。次は実際の記述例です。
199
+ 上述したマクロ(ステップ)は、open_macroという構文でも記述できます。次は実際の記述例です。
155
200
 
156
201
  ```
157
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]
@@ -162,8 +207,17 @@ open_macro :sokuwari, steps: [:toggle_r_for_0_2sec, :toggle_thumbr_for_0_14sec,
162
207
  ## 左スティックの感度調整
163
208
  [左スティックの感度調整](/docs/setting/left-analogstick-cap.md)
164
209
 
210
+ ## 入力表示
211
+ * 使い方は https://github.com/splaplapla/switch-procon-input-viewer を参照してください。
212
+ * https://zenn.dev/jiikko/articles/2ef0ccbdfe0fe7 に技術的な解説を書きました
213
+
165
214
  ## 設定ファイルの書き方
166
- * 後で書きます
215
+ 設定ファイルは、ymlフォーマットに埋め込まれたRubyスクリプトで記述します。
216
+ Rubyスクリプトな上に独特な構文に対して、アレンジを加えることは難しいと思ったので、マウス操作をするだけで設定ファイルを生成するツールを作りました。
217
+ https://splaplapla.github.io/procon_bypass_man_setting_editor/ です。
218
+ このツールで設定ファイルを生成し、コピペをするだけで大半のことは済みます。
219
+
220
+ TODO 設定ファイルの書き方
167
221
 
168
222
  ## プラグインの書き方
169
223
  * 後で書きます
@@ -184,3 +238,22 @@ procon_bypass_man_cloudとの接続が完了後、Raspberry Piを起動時にpro
184
238
  セットアップ方法などでわからないことがあればdiscordで質問してみてください。
185
239
 
186
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
  class ProconBypassMan::BaseJob
2
- extend ProconBypassMan::Background::JobRunnable
2
+ extend ProconBypassMan::Background::JobPerformable
3
3
 
4
4
  def self.servers
5
5
  raise NotImplementedError
@@ -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
@@ -0,0 +1,16 @@
1
+ module ProconBypassMan
2
+ module Background
3
+ module JobPerformable
4
+ def perform(*)
5
+ raise NotImplementedError, nil
6
+ end
7
+
8
+ def perform_async(*args)
9
+ ProconBypassMan::Background::JobQueue.push(
10
+ args: args,
11
+ job_class: self.name, # drb上のQueueに格納するので念の為文字列入れて、取り出すときにevalでクラス化する
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end