Áleran Vocals
Piano, entrenamiento con micrófono y juegos de oído para alumnos de canto: notas, escalas, afinación, rango vocal, resistencia e intervalos.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證tmux からくり屋敷 — tmux のキーで屋敷の仕掛けを解くタイムアタック。押すキーはいつも画面に出る (browser + real tmux CLI)
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗tmux のキー操作を、本物の tmux と同じ画面で身につけるタイムアタック。分割・移動・全画面・ウィンドウ・コピーモードの問題を次々に解く。押すキーはいつも画面に出ているので、遊んでいるうちに指が覚える。
▶ 今すぐ遊ぶ: https://t29mato.github.io/games/tmux-dojo/
web/): 3 つのコースのタイムアタック。インストール不要。ランキング(ランキング)と端末の引き継ぎは任意./tmux-da): 本物の tmux の中で 11 面を解くweb/)ページの中の小さな tmux で遊ぶ。web/index.html をそのまま開けば動く(file:// でも静的サーバーでも)。名前か合言葉を付けるまでは一切通信しない。
| コース | 問題数 | 目安 | 中身 |
|---|---|---|---|
| 入門(手ならし・初めてはここ) | 15 | 12 秒 | 分割・移動・全画面・閉じる・ウィンドウの作成と切り替え。1 問 1 キー |
| 中級(腕試し) | 20 | 14 秒 | 大きさ・名前・入れ替え・ウィンドウを閉じる・スクロール(コピーモード)も混ざる |
| 上級(真剣勝負) | 16 | 18 秒 | 1 問で 2〜3 手の連続技 |
| 達人(使っている人へ) | 14 | 1 問 7〜25 秒 | tmux を使っている人向け。join-pane・swap-window・move-window・並べ方(prefix M-1〜M-5 と Space、完成図つき)・synchronize-panes・prefix q と番号・検索して行をコピー・rotate-window・キーのないコマンド(new-window -n、kill-session -t)。tmux 3.8 の既定どおりに動く |
prefix q と同じ番号で示し、いま居るペインは緑の枠と番号。やることと次のキーは、いま居るペインのプロンプトのすぐ上にシェルのコメント(#)として出る。行き先のペインには点線と印、いま居るペインからの矢印(押すキーつき): のコマンドも全部試せる。タイトル画面(P)と稽古の結果から入り、Esc 2 回か「やめる」で戻る。下に、遊んだコースで覚えたキーの早見表(日本語、たためる): プロンプト: コマンド名は tmux と同じく、ほかと区別できるところまで縮めてよい(kill-ses、swapw、selectl)。あいまいなら ambiguous command: kill, could be: …、ないものは unknown command:(tmux 3.8 のコマンド表で判定)。display-message(#S #W #I #P #{…} を展開)、send-keys -t、list-keys・show-messages(prefix ?・prefix ~。q で閉じる一覧)、show-options がある。見るだけのコマンドと、tmux にあってゲームが再現しないコマンドは問題中でもミスにならない(そう出る)。ないコマンド・あいまいなコマンド・頼まれていない操作はミスw b e W B E ^ 0 $ H M L f F t T ; , g G C-u C-d C-b C-f、emacs の M-f M-b M-< M-> も tmux 3.8 と同じ位置に動く。V で行ごと選べ、行をまるごとコピーする問題の手順と「標準」は V を使うo で次のペインへ、; で直前のペインへ)も出すset -g prefix、ゲームにある操作への bind / bind -n / bind -r / unbind、vim-tmux-navigator(プラグインの既定どおり Ctrl+h/j/k/l、Ctrl+\、合図 → Ctrl+l)。renumber-windows、break-pane -d、縮めたコマンド名も読む。読めない行は理由つきで一覧に出す。自分の設定で遊んだ記録も、既定のキーの記録と同じランキングに載るmatsu-kaze-tsuru-482)を別の端末で入れると、同じ記録が見られるopen web/index.html # macOS
python3 -m http.server -d web 8000 # または http://localhost:8000/
server/)ランキングと引き継ぎのための小さな API。Cloudflare Workers + D1(SQLite)。アカウントは無く、合言葉は SHA-256 だけを保存する。記録の検証(1 問あたり平均 0.4 秒未満、1 問 0.1 秒未満、合計が合わない記録、その日の出題順でない記録、途中で長く止まった記録、順番を変えた回は弾く)と、アドレスごとの回数制限(分ごと、合言葉の新規作成は日ごとも)をする。自分の .tmux.conf で遊んだ記録はランキングに「自分の設定」と出る。名前は見えない文字を落とし、制御文字や積み重ねたアクセントを弾く。
ランキングに載せる記録には、押したキーの記録(klog: キーごとの ms と表示名、問題ごとの開始 ms)が付く(keylogs 表)。サーバはそれが記録と合うか(キーの数、最後のキーの時刻 ≈ タイム、問題の切れ目 ≈ 各問の秒)と、人の手らしいか(間隔が 15 ms 未満のキーが 3 割を超える、間隔が全部同じ)を見て、合わなければ 400 で理由(key log: …)を返す。古いクライアントのキー記録なしの記録はこれまでどおり受ける。キー記録は影(/v1/ghost の above= で 1 つ上の人、name= でその人のベスト)と「この回を見る」(再生)に使う。名前のある人は遊んでいる .tmux.conf を公開できる(/v1/conf、8 KB まで、そのまま保存。confs 表)。ランキングの「自分の設定」がそのリンクになる。
keylogs と confs の表は Worker が初回に自分で作るが、本番のデプロイ前に手で作っておくのが確実(既存のデータには触らない):
cd server
npx wrangler d1 execute tmux-da --remote --command "CREATE TABLE IF NOT EXISTS keylogs (key_hash TEXT NOT NULL, run_id TEXT NOT NULL, log TEXT NOT NULL, PRIMARY KEY (key_hash, run_id))"
npx wrangler d1 execute tmux-da --remote --command "CREATE TABLE IF NOT EXISTS confs (key_hash TEXT PRIMARY KEY, text TEXT NOT NULL, at TEXT NOT NULL)"
公開された設定を消すには(本人が消せない事情のとき):
npx wrangler d1 execute tmux-da --remote --command "DELETE FROM confs WHERE key_hash = (SELECT key_hash FROM players WHERE name = 'その名前')"
cd server
npx wrangler d1 execute tmux-da --remote --file schema.sql # 表を作る(初回だけ)
npx wrangler deploy
表を変えたときは server/migrations/ に ALTER を置く(既存のデータに安全なものだけ)。Worker は初回に自分でも当てるが、デプロイ前に手で当てておくのが確実:
npx wrangler d1 execute tmux-da --remote --file migrations/0001-scores-own.sql
荒らしの名前や記録を消すには(合言葉は分からないので名前で):
npx wrangler d1 execute tmux-da --remote --command "DELETE FROM scores WHERE key_hash = (SELECT key_hash FROM players WHERE name = 'その名前'); UPDATE players SET name = NULL WHERE name = 'その名前'"
ステージング(本番と別の Worker と D1)。試しの名前や記録はこちらへ送る。ページは ?api=staging を付けるとこちらにつながる。
cd server
npx wrangler d1 execute tmux-da-staging --remote --file schema.sql # 初回だけ
npx wrangler deploy --env staging # https://tmux-da-api-staging.starrydata-mcp-cloudflare.workers.dev
npm install # Playwright と wrangler(初回だけ。npx playwright install chromium も)
npm test # 全部
npm run test:unit # 単体テストだけ(数秒)
scripts/test.sh game # unit | game | online | cli のどれか 1 つ
| 種類 | 場所 | 中身 |
|---|---|---|
| 単体 | web/test/unit/ | コースと称号、記録(追加・移行・端末の合流・影・苦手)、通信(偽のサーバ相手) |
| 単体+API | server/test/ | 合言葉・記録の検証規則、キー記録の検証(Playwright で録った人の手の記録 fixtures/keylogs.json と、機械らしい記録)、API 全体を Node 内蔵の SQLite 上で(同期・名前・ランキング・影・公開設定・回数制限・CORS) |
| 結合(ゲーム) | web/test/playthrough.mjs | 本物のキーボードイベントで 3 つのコースを通す。手順だけで全種類解けるか、問題の境で居場所と部屋が引き継がれるか、指示の文字が動かないか、飛ばないか、一時停止、行の編集、音 |
| 結合(通信) | web/test/online.mjs, server/smoke.mjs | wrangler dev --local を立て、ブラウザ 2 つを 2 台の端末に見立てて同期・ランキング・影を通す |
| CLI 版 | test/playthrough.sh | 下を参照 |
push のたびに GitHub Actions(.github/workflows/test.yml)で全部が走る。
test/playthrough.sh
キー操作の代わりに tmux のコマンドで全面を解き、見張り役が 1 面ずつ進めるかを確かめる。script(1) で疑似端末のクライアントをつなぐので、デタッチと再接続の面も試せる。
ブラウザ版は t29mato.github.io の games/tmux-dojo/ から配信している。web/ を更新したら、隣にクローンしてあるサイトのリポジトリへコピーし、そちらでコミットして push する:
scripts/publish.sh # ../t29mato.github.io/games/tmux-dojo/ にコピー(SITE_DIR で変更可)