diff --git a/.claude/repo-access.json b/.claude/repo-access.json index 5369745..74f3e5e 100644 --- a/.claude/repo-access.json +++ b/.claude/repo-access.json @@ -1,6 +1,6 @@ { "deny_read": [ - "C:/Users/Papin/clinical-data", + "E:/clinical-data", "data", "exports" ] diff --git a/.claude/rules/lab-pc-operation.md b/.claude/rules/lab-pc-operation.md index cb802e5..e376a67 100644 --- a/.claude/rules/lab-pc-operation.md +++ b/.claude/rules/lab-pc-operation.md @@ -4,7 +4,7 @@ ## 禁止 (Prohibited) -- **データの中身を表示しない**: `type`・`Get-Content`・`cat`・`more`・`sqlite3` 等で,取り込み元・ストア・目録・対応表・バンドル(`C:\Users\Papin\clinical-data\` 配下,サーバの `~/data/` 配下)を読まない.フック(`.claude/repo-access.json`)は SSH の先の読み取りを止められないため,ここで守る +- **データの中身を表示しない**: `type`・`Get-Content`・`cat`・`more`・`sqlite3` 等で,取り込み元・ストア・目録・対応表・バンドル(`E:\clinical-data\` 配下,サーバの `~/data/` 配下)を読まない.フック(`.claude/repo-access.json`)は SSH の先の読み取りを止められないため,ここで守る - **データの一覧を表示しない**: `dir`・`ls`・`Get-ChildItem` でデータのフォルダの中身(ファイル名)を表示しない.件数が必要なら `tiasdata stats`・`tiasdata check` を使う(CLI が無い段階で件数が必要なら,ファイル名を出さずに数だけを返すコマンドにする) - **研究室 PC で編集・コミットしない**: 研究室 PC のリポジトリは `git pull` と `uv sync --no-dev` だけにする - **原本・ストア・目録を手で消さない・動かさない**: 削除・移動が必要な場合は,実行するコマンドを提示してユーザーに依頼する diff --git "a/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" index ea2ab7f..9d5e6f7 100644 --- "a/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" +++ "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -61,7 +61,7 @@ - ※ clone・`uv sync` は未検証(立ち上げの成果物を `main` に取り込んだ後に実行する).デプロイキーでの接続(`git ls-remote`)は 2026-10-02 に確認済み - 研究室 PC からは取得しかできない(デプロイキーは読み取り専用).研究室 PC では編集・push しない(上記「操作方針」) - 置き場所は `C:\Users\Papin\source\`(OneDrive の同期対象外).**ドキュメント・デスクトップ配下には置かない**(研究室 PC ではドキュメントフォルダが OneDrive にリダイレクトされている) -- 目録・ストア・対応表は `C:\Users\Papin\clinical-data\tiasdata\`・`tiasdata-identity\` に置き,場所は設定ファイル `C:\Users\Papin\.config\tiasdata\config.toml` に書く(配置と設定のキーは [SPEC_01「配置」「設定ファイル」](../04_SPEC/SPEC_01_アーキテクチャ設計.md)).設定ファイルの作成と `tiasdata init` は実装後に行う ※ 未検証 +- 目録・ストア・対応表は `E:\clinical-data\tiasdata\`・`tiasdata-identity\` に置き,場所は設定ファイル `C:\Users\Papin\.config\tiasdata\config.toml` に書く(配置と設定のキーは [SPEC_01「配置」「設定ファイル」](../04_SPEC/SPEC_01_アーキテクチャ設計.md)).設定ファイルの作成と `tiasdata init` は実装後に行う ※ 未検証 ## 使う側のリポジトリへの組み込み (Using from Other Repositories) @@ -89,7 +89,7 @@ - データ本体と,実際の患者 ID ↔ 研究用 ID の対応表はリポジトリに入れない.`.gitignore` で `/data/`・`*.sqlite`・`*.db`・`/exports/` 等を除外しているが,そもそもリポジトリの配下に置かない - 手元 PC に臨床データを置かない -- Claude にデータの中身を読ませない.`.claude/repo-access.json` の `deny_read` に研究室 PC のデータフォルダ(`C:/Users/Papin/clinical-data`)とリポジトリ内の `data/`・`exports/` を入れている.データ置き場・DB の場所を追加・変更したら,このリストも更新する +- Claude にデータの中身を読ませない.`.claude/repo-access.json` の `deny_read` に研究室 PC のデータフォルダ(`E:/clinical-data`)とリポジトリ内の `data/`・`exports/` を入れている.データ置き場・DB の場所を追加・変更したら,このリストも更新する ## 環境再現性のルール (Reproducibility Rules) diff --git "a/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" index fb8a1be..5f55224 100644 --- "a/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" +++ "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -78,6 +78,19 @@ - 別名を鍵ごとに分けているのは,GitHub のデプロイキーが 1 つのリポジトリにしか登録できないため(他のリポジトリを研究室 PC に置く場合は,そのリポジトリ用の鍵と別名を同様に作る) - 鍵を作り直したら,GitHub の Settings → Deploy keys から古い鍵を削除する +## 研究室 PC のデータの置き場所 (Lab PC Data Location) + +臨床データは研究室 PC の **E ドライブ(内蔵 SATA SSD・約 465GB・NTFS)の `E:\clinical-data\`** に置く(配置は [SPEC_01「配置」](../04_SPEC/SPEC_01_アーキテクチャ設計.md)).E ドライブは OneDrive の同期対象外. + +2026-10-06 に C ドライブ(空きが少なかった)から移した.手元 PC から SSH 経由で次のように行った. + +1. `C:\Users\Papin\clinical-data\` の全ファイル(26,268 個・45.30GB)を同じ構成で `E:\clinical-data\` へコピーし,コピーしたファイルを読み直して SHA-256 を元と照合した(不一致 0) +2. C と E の構成(相対パス・大きさ・空のフォルダを含むフォルダ)が一致することを確かめてから,C 側を削除した + +- コピー・削除はユーザーが実行し,Claude は試走と照合(件数のみ)を行った +- C 側のフォルダには**読み取り専用の属性**が付いたものがあり,Python の `shutil.rmtree` がアクセス拒否で止まった.属性を外して再試行する(`onexc` で `os.chmod(path, stat.S_IWRITE)`)ことで削除できた +- TIASJudgeModel の手順書(ENV_03 等)にある原本のパス `C:\Users\Papin\clinical-data\…` は古くなった(TIASJudgeModel 側で直す) + ## 研究室 PC への配置 (Lab PC Deployment) 立ち上げの成果物を `main` に取り込んだ後に行う.手順は [ENV_02「研究室 PC のセットアップ」](ENV_02_環境構築手順.md). @@ -91,7 +104,7 @@ ```json { "deny_read": [ - "C:/Users/Papin/clinical-data", + "E:/clinical-data", "data", "exports" ] @@ -106,3 +119,4 @@ - 倫理審査で定められた臨床データの保管ルール(保管場所・アクセスできる人の範囲・保管期間・計算サーバへのコピーの可否) - 目録の DB ファイルのバックアップ方法(仕様設計で決める.バックアップ先も OneDrive の同期対象外にする) +- 臨床データを置く E ドライブを BitLocker で暗号化するか(2026-10-06 時点で未暗号化.C ドライブも同じ.有効化には管理者権限が要る) diff --git "a/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" "b/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" index 8078e34..00c5fef 100644 --- "a/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" +++ "b/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" @@ -45,13 +45,13 @@ | データ | 内容 | 原本の置き場所(研究室 PC) | | --- | --- | --- | -| 舌色データセット | 舌領域を切り出した舌画像(PNG).舌色 5 分類+程度のラベルごとに 9 フォルダ・1085 枚.**1 患者 1 枚ではない**(約 450 人.2 枚以上の患者がいる.下記) | `C:\Users\Papin\clinical-data\TIASJudgeModel\` | -| セグメンテーション用データ | ResUNet の開発時の画像と正解マスク | `C:\Users\Papin\clinical-data\TongueSegmentation\` | -| 舌色データセットの DeepTIAS 出力 | 舌色データセットの各画像の元になった DeepTIAS の全工程の出力(`1-detection`〜`4-featureExtraction`.`analysis.csv` を含む).番号ごとのフォルダ・1085 個.フォルダ名は番号だけで患者 ID を含まない | `C:\Users\Papin\clinical-data\DeepTIAS_TIASJudgeModel\<番号>\` | +| 舌色データセット | 舌領域を切り出した舌画像(PNG).舌色 5 分類+程度のラベルごとに 9 フォルダ・1085 枚.**1 患者 1 枚ではない**(約 450 人.2 枚以上の患者がいる.下記) | `E:\clinical-data\TIASJudgeModel\` | +| セグメンテーション用データ | ResUNet の開発時の画像と正解マスク | `E:\clinical-data\TongueSegmentation\` | +| 舌色データセットの DeepTIAS 出力 | 舌色データセットの各画像の元になった DeepTIAS の全工程の出力(`1-detection`〜`4-featureExtraction`.`analysis.csv` を含む).番号ごとのフォルダ・1085 個.フォルダ名は番号だけで患者 ID を含まない | `E:\clinical-data\DeepTIAS_TIASJudgeModel\<番号>\` | - 舌色データセットは DeepTIAS 2.7 の Image&Calib モードの出力(色補正後の画像を枠で切り出し,マスク外を黒にしたもの)から作られている(TIASJudgeModel の `SPEC_04`) - ラベルは現在フォルダ名で表現されている.基盤に登録するときは,フォルダ名から読み取ったラベルを目録の項目として記録する -- 画像の番号(ファイル名)と,DeepTIAS の出力側の患者 ID・何枚目の画像かの対応は,研究室 PC の対応表(`C:\Users\Papin\clinical-data\DeepTIAS後_ID_番号.xlsx`)にある.2026-10-03 に件数だけを照合し,1085 枚が約 450 人分(2 枚以上の患者が 239 人・874 枚)であることが分かった(TIASJudgeModel の「1 患者 1 枚」の前提は誤りで,ユーザーも確認済み).患者単位で扱うには,この対応表を取り込みに使う必要がある +- 画像の番号(ファイル名)と,DeepTIAS の出力側の患者 ID・何枚目の画像かの対応は,研究室 PC の対応表(`E:\clinical-data\DeepTIAS後_ID_番号.xlsx`)にある.2026-10-03 に件数だけを照合し,1085 枚が約 450 人分(2 枚以上の患者が 239 人・874 枚)であることが分かった(TIASJudgeModel の「1 患者 1 枚」の前提は誤りで,ユーザーも確認済み).患者単位で扱うには,この対応表を取り込みに使う必要がある - DeepTIAS の出力(元は患者 ID のフォルダ `DeepTIAS後_亥鼻_村上_2025.08修正`)は,2026-10-03 に舌色データセットで使った画像の分だけを番号ごとのフォルダへ移し,残り(使わない出力 約 8GB)を削除した(元のデータは研究室のサーバにある).各番号の画像は `2-cropped` × `3-resized`(127 超)で作り直したものと画素で一致する(完全一致 1073・違う画素 1% 未満 12).経緯は `docs/PROGRESS.md` - 舌色データセットには**同じ写真の重複**が 5 組ある(2026-10-03 確認).ファイルが同一で対応表の患者 ID が違う 2 組(122/184・548/566.ラベルは同じ),ほぼ同じ画像(違う画素約 0.7%)が連番で 2 回登録された 3 組(381/382・508/509・515/516.うち 381/382 は程度,515/516 は舌色のラベルが違う).382・509・516 のフォルダの DeepTIAS 出力は,それぞれ 381・508・515 の出力のコピー(元の出力は見つからなかった) @@ -105,7 +105,7 @@ ### 個人情報・臨床データの扱い(必須) - **データ本体と,実際の患者 ID ↔ 研究用 ID の対応表は本リポジトリに入れない**(GitHub・研究室の GitBucket のどちらにも) -- 原本は研究室 PC の `C:\Users\Papin\clinical-data\` 配下に置く.研究室 PC のドキュメントフォルダは OneDrive に同期されるため,その配下には置かない(目録の DB ファイルも同様) +- 原本は研究室 PC の `E:\clinical-data\` 配下に置く(内蔵 SSD.2026-10-06 に C ドライブから移した).研究室 PC のドキュメントフォルダは OneDrive に同期されるため,その配下には置かない(目録の DB ファイルも同様) - 学習は研究室の計算サーバ(Newton・Archimedes)で行い,**臨床データを手元 PC に置かない**.手元 PC ではダミーデータで開発する - **Claude にデータの中身を読ませない**.データフォルダは `.claude/repo-access.json` の `deny_read` に入れる - エラーメッセージ・ログ・CLI の出力に,実際の患者 ID・個人を特定できる情報を出さない diff --git "a/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" "b/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" index df6e9c3..a27be95 100644 --- "a/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" +++ "b/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" @@ -62,9 +62,11 @@ ### 研究室 PC (Lab PC) ```text -C:\Users\Papin\clinical-data\ +E:\clinical-data\ ├── TIASJudgeModel\ # 取り込み元(原本.基盤は読むだけで変更しない) ├── TongueSegmentation\ # 取り込み元(原本) +├── DeepTIAS_TIASJudgeModel\ # 取り込み元(舌色データセットの DeepTIAS 出力.番号ごと) +├── DeepTIAS後_ID_番号.xlsx # 画像の番号 → 患者 ID・何枚目の対応表(取り込みで読む) ├── tiasdata\ # 基盤のデータ(catalog.root) │ ├── catalog.sqlite # 目録 │ ├── store\ # ストア(store\<先頭 2 文字>\.<拡張子>) @@ -73,8 +75,9 @@ └── tiasdata-identity\ # 対応表(identity.sqlite).目録とは別のフォルダ ``` -- すべて OneDrive の同期対象外(`C:\Users\Papin\` 直下の独自フォルダ)に置く -- `.claude/repo-access.json` の `deny_read` に `C:/Users/Papin/clinical-data` が入っているため,上記はすべて Claude の読み取り禁止の対象になる +- 研究室 PC の内蔵 SSD の E ドライブ(約 465GB.OneDrive の同期対象外)に置く.2026-10-06 に `C:\Users\Papin\clinical-data\` から移した(`docs/PROGRESS.md`) +- E ドライブは BitLocker で暗号化していない(C ドライブも同じ).倫理審査の保管ルールで暗号化が必要なら,管理者権限で有効にする(人間の作業) +- `.claude/repo-access.json` の `deny_read` に `E:/clinical-data` が入っているため,上記はすべて Claude の読み取り禁止の対象になる ## 設定ファイル (Configuration) @@ -85,13 +88,13 @@ ```toml [catalog] -root = "C:/Users/Papin/clinical-data/tiasdata" # catalog.sqlite・store/・bundles/・backups/ -identity = "C:/Users/Papin/clinical-data/tiasdata-identity/identity.sqlite" +root = "E:/clinical-data/tiasdata" # catalog.sqlite・store/・bundles/・backups/ +identity = "E:/clinical-data/tiasdata-identity/identity.sqlite" [sources.tiasjudgemodel] # 取り込み元(名前で指定する) -path = "C:/Users/Papin/clinical-data/TIASJudgeModel" +path = "E:/clinical-data/TIASJudgeModel" importer = "tongue_color_folders" -patient_map = "C:/Users/Papin/clinical-data/DeepTIAS後_ID_番号.xlsx" # 画像の番号 → 患者 ID・何枚目(患者 ID は identity.sqlite にだけ入れる) +patient_map = "E:/clinical-data/DeepTIAS後_ID_番号.xlsx" # 画像の番号 → 患者 ID・何枚目(患者 ID は identity.sqlite にだけ入れる) [servers.newton] # 受け渡し先 host = "hasegawa@192.168.23.14" diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index ae38867..56bb1e6 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -22,3 +22,6 @@ - 方法: 対応表の xlsx(番号・何枚目・患者 ID)で引き,`2-cropped` × `3-resized` の作り直しが舌色データセットの画像と画素で一致するかで確認.対応表どおりで引けない 192 件(撮影日等の下位フォルダ・ID と合わないフォルダ名・何枚目の誤り等)は画素の一致で探して全件特定した.Claude は件数だけを見て,番号以外の名前・患者 ID は表示していない.移動・削除はユーザーが実行 - 設計判断: 名前の規則を推測せず画素の一致を正とした(対応表の誤り 29 件を含めて確実に特定できるため).`LabImg` × `4-mask` は撮影画像全体の大きさで,データセットの画像(枠の大きさ)とは一致しない - 発見: 同じ写真の重複が 5 組(PLAN_01「現在あるデータ」).うち 2 組はラベルが違う.取り込み(Step 3)までに扱いを決める +- [x] **研究室 PC の臨床データを E ドライブへ移した**: 研究室 PC に E ドライブ(内蔵 SSD・約 465GB)ができたため,`C:\Users\Papin\clinical-data\` 全体(26,268 ファイル・45.30GB)を `E:\clinical-data\` へコピーし,SHA-256 と構成の照合の後に C 側を削除した(2026-10-06.C の空き 53.5GB).docs・`.claude/repo-access.json`・`lab-pc-operation.md` のパスを書き換えた + - 失敗パターン: C 側の削除が読み取り専用の属性が付いたフォルダで止まった(`shutil.rmtree` の WinError 5).属性を外して再試行する `onexc` で解決.コピー済み・照合済みだったためデータの欠損は無し + - 未実装・後段: TIASJudgeModel の手順書の原本のパスが古い.E ドライブの暗号化(BitLocker)は未定(ENV_03「人間が確認すべき事項」)