# 管理者用環境構築手順 (Administrator Setup)

プロジェクト作成時に **一度だけ** 行う初期設定．

## GitHub リポジトリの作成 (Repository Creation)

private リポジトリとして作成する（臨床データは含めないが，研究途中のコードを公開しないため）．

```bash
gh repo create rintoHasegawa/TIASJudgeModel --private --source=. --remote=origin \
  --description "舌画像から舌色 5 分類を推定する機械学習モデル（TIASjudge 用）"
```

## リポジトリのセキュリティ設定 (Repository Security Settings)

Dependabot alerts（脆弱性検出）と Dependabot security updates は**リポジトリごとに既定で OFF** なので，作成直後に有効化する（冪等なので再実行してよい）．

```bash
gh api -X PUT repos/rintoHasegawa/TIASJudgeModel/vulnerability-alerts
gh api -X PUT repos/rintoHasegawa/TIASJudgeModel/automated-security-fixes
```

検証:

```bash
gh api repos/rintoHasegawa/TIASJudgeModel/vulnerability-alerts       # 204 なら有効（404 なら無効）
gh api repos/rintoHasegawa/TIASJudgeModel/automated-security-fixes   # {"enabled":true,...} なら有効
```

※ 依存バージョンの定期更新は `.github/dependabot.yml` で設定する（別物．リポジトリ設定とは独立に動く）．

## Newton 側の初期設定 (Server Setup)

```bash
mkdir -p ~/work/TIASJudgeModel        # コード置き場（push で上書きされる）
mkdir -p ~/data/TIASJudgeModel        # データ置き場（push の対象外）
chmod 700 ~/data/TIASJudgeModel       # 共用サーバなので自分だけに絞る
```

コードを初回送信したあと，サーバ上で以下を確認する．

```bash
cd ~/work/TIASJudgeModel
uv sync
uv run python -c "import torch; print(torch.cuda.is_available(), torch.cuda.device_count())"
```

`uv sync` は CUDA 版 PyTorch が入るため時間がかかる．`True` と GPU 台数が出ることを確認する．`False` の場合は [ENV_01「CPU / GPU の依存差」](ENV_01_技術スタック.md)に従う．

## Archimedes 側の初期設定 (Archimedes Setup)

2026-09-27 に実施．Newton と同じ構成にそろえる．

1. **手元の公開鍵を登録する**（パスワード認証が必要なため人間が実行する）

   ```powershell
   type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh -J labpc hasegawa@192.168.23.15 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
   ```

   聞かれるのは **Archimedes の `hasegawa` アカウントのパスワード**（研究室 PC には鍵で入れるので聞かれない）

2. **uv をユーザー領域に入れる**（Archimedes には未導入だった）．シェルの設定ファイルを書き換えないよう `UV_NO_MODIFY_PATH=1` を付ける（リモート実行ツールは `~/.local/bin/uv` を絶対パスで呼ぶため PATH の設定は不要）

   ```bash
   curl -LsSf https://astral.sh/uv/install.sh | env UV_NO_MODIFY_PATH=1 sh
   ```

3. ディレクトリを作る（Newton と同じ．データ側は `chmod 700`）
4. 研究室 PC の専用鍵（下記「研究室 PC から Newton への鍵設定」と同じ鍵）を Archimedes の `~/.ssh/authorized_keys` にも追記する
5. 臨床データを研究室 PC から直送する（下記の手順で `$rhost` を `hasegawa@192.168.23.15` にする）

> ⚠ **Archimedes の `/home` は共用ディスクがほぼ満杯**（2026-09-27 時点で使用率 97%・空き 64 GB）．このプロジェクトの使用量の目安はデータ 0.4 GB・Python 環境（CUDA 版 PyTorch）6〜8 GB・学習結果（重み 1 本約 0.1 GB × 実験数）．重みを溜め込まないこと．

## 臨床データの初回コピー (Initial Data Copy)

原本は研究室 PC に置き，**研究室 LAN 内で Newton へ一度だけコピーする**．手元 PC を経由させない．

### 原本の置き場所 (Source Location)

```text
C:\Users\Papin\clinical-data\TIASJudgeModel\
```

ラベルごとの 9 フォルダに PNG が直置きされている（内訳は [TEST_01 データセット構成調査](../06_TEST/TEST_01_データセット構成調査.md)）．

> ⚠ **研究室 PC では「ドキュメント」フォルダが OneDrive（`OneDrive - 千葉大学`）にリダイレクトされている**．臨床データをドキュメント・デスクトップ配下に置くとクラウドへ同期されるため置かない．上記のプロファイル直下の独自フォルダは同期対象外である．

### フォルダ名の対応 (Folder Mapping)

日本語フォルダ名をそのまま転送すると Windows（CP932）と Linux（UTF-8）の文字コード差で名前が壊れるため，**ASCII のスラッグ名に対応付けて**コピーする．

| 研究室 PC のフォルダ | サーバ上のディレクトリ |
| --- | --- |
| `淡紅（正常）` | `images/light_red_normal` |
| `暗赤紅＿あり` | `images/dark_red_strong` |
| `暗赤紅＿ややあり` | `images/dark_red_mild` |
| `紫＿あり` | `images/purple_strong` |
| `紫＿ややあり` | `images/purple_mild` |
| `紅＿あり` | `images/red_strong` |
| `紅＿ややあり` | `images/red_mild` |
| `淡白＿あり` | `images/pale_strong` |
| `淡白＿ややあり` | `images/pale_mild` |

### 研究室 PC から Newton への鍵設定 (Key Setup)

研究室 PC から Newton へ非対話で転送するため，**研究室 PC 専用の鍵**を作って Newton に登録する（2026-09-27 に実施済み）．

- 研究室 PC の鍵: `C:\Users\Papin\.ssh\id_ed25519_newton`（パスフレーズなし．コメントは `papin-DESKTOP-1QLOO91-to-Newton-TIASJudgeModel`）
- Newton 側: 上記の公開鍵を `~/.ssh/authorized_keys` に追記済み
- 初回接続時は Newton のホスト鍵を受け入れる必要がある（`-o StrictHostKeyChecking=accept-new`）

※ Windows の OpenSSH サーバーは **SSH エージェント転送に対応していない**ため，手元の鍵を研究室 PC 経由で使い回すことはできない（専用鍵が必要になる理由）．

### 手順 (Procedure)

1. 研究室 PC で作業する（**`hostname` で研究室 PC であることを確かめてから実行する**）
2. PowerShell で以下を実行する（対応表どおりに 9 フォルダを転送する）

   ```powershell
   $key   = "$env:USERPROFILE\.ssh\id_ed25519_newton"
   $root  = "C:\Users\Papin\clinical-data\TIASJudgeModel"
   $rhost = "hasegawa@192.168.23.14"
   $map = [ordered]@{
     "淡紅（正常）"     = "light_red_normal"
     "暗赤紅＿あり"     = "dark_red_strong"
     "暗赤紅＿ややあり" = "dark_red_mild"
     "紫＿あり"         = "purple_strong"
     "紫＿ややあり"     = "purple_mild"
     "紅＿あり"         = "red_strong"
     "紅＿ややあり"     = "red_mild"
     "淡白＿あり"       = "pale_strong"
     "淡白＿ややあり"   = "pale_mild"
   }
   foreach ($k in $map.Keys) {
     $slug = $map[$k]
     ssh -i $key $rhost "mkdir -p ~/data/TIASJudgeModel/images/$slug"
     $files = @(Get-ChildItem -LiteralPath (Join-Path $root $k) -File -Filter *.png)
     for ($i = 0; $i -lt $files.Count; $i += 100) {
       $chunk = $files[$i..([Math]::Min($i+99, $files.Count-1))] | ForEach-Object { $_.FullName }
       scp -i $key -q @chunk ($rhost + ":~/data/TIASJudgeModel/images/" + $slug + "/")
     }
   }
   ```

   ※ `scp "...\*.png"` のようにワイルドカードを渡す方式は使わない（PowerShell はネイティブコマンドの引数を展開しないため）．ファイル一覧を列挙して 100 件ずつ渡す（コマンドライン長の上限を避けるため）．

3. コピー後に件数を突き合わせる

   ```powershell
   (Get-ChildItem -LiteralPath $src -Recurse -File).Count   # 研究室 PC 側（1085 の見込み）
   ssh hasegawa@192.168.23.14 "find ~/data/TIASJudgeModel/images -type f | wc -l"
   ```

4. 原本は研究室 PC に残す（Newton 側は作業用コピー）

### 実施記録 (Completion Record)

2026-09-27 に上記手順で転送完了．**Newton・Archimedes の両方**の `~/data/TIASJudgeModel/images/` に **9 ディレクトリ・1085 ファイル（443 MB）**．研究室 PC 側の件数と完全一致し，非 PNG は 0 件．ディレクトリ権限は `drwx------`．転送は研究室 PC → Newton の直送であり，手元 PC は制御コマンドのみを送っている（画像は手元を通っていない）．

以降は再転送しない．データセットの内容確認（枚数・クラス分布・破損チェック）はサーバ上のコマンドで行い，**集計結果のみ**を手元で見る．

※ 研究室 PC から Newton への鍵が未登録の場合はパスワードを求められる．

## 学外アクセス用の踏み台 (Off-campus Access)

研究室 PC を ProxyJump の踏み台にする設定は SmTIAS-LightSim で構築済みのため，本プロジェクトでの追加作業は不要（未設定の場合は同プロジェクトの `docs/02_ENV/ENV_02_環境構築手順.md`「学外から接続する（研究室 PC 経由）」に従う）．

## 人間が確認すべき事項 (Human Checklist)

Claude は実施できない．着手前に確認する．

- 臨床データの倫理審査・データ利用許諾の範囲（機械学習での二次利用が含まれるか）
- データを研究室の共用計算サーバに置くことが規程上許容されるか
- 研究室 PC で SSH サーバを動かすことが研究室のルールに照らして問題ないか
