雨の竜王公園を散歩 アップロード画像の縮小
朝から雨が降り続ける日曜日、娘たちを送って、また迎えに行く・・・今日はお隣が地鎮祭
建設にアップする画像の軽量化のルーチンを組み込んで、DBに取り込む画像の軽量化を図る

画像アップロード共通化・圧縮対応
1.概要
システム全体の画像アップロード処理を共通サービス化し、GDライブラリによる圧縮・リサイズを追加した
2.対象箇所の調査結果
| コントローラー | メソッド | 最大 | ストレージパス |
|---|---|---|---|
| CompanyAdminController | uploadLogo | 5MB | company_logos/ |
| ProjectController | uploadPhoto | 50MB | photos/ |
| ChecklistController | uploadEvidence | 50MB | evidence/ |
| ConstructionPlanController | uploadItemImage | 5MB | plans/{id}/images/ |
| ConstructionPlanController | uploadTemplateImage | 5MB | templates/images/ |
| SafetyPatrolController | storePhoto | 10MB | patrol_photos/ |
以下は非画像混在・CSV等のため対象外とした:
- RiskAssessmentController(Excel/Word/PDF/Image混在)
- SafetyPatrolController::store(PDF/Image混在、圧縮不可のPDFが主)
- AdminController, AuditMasterController, EnvironmentController, IsoClauseController(CSVのみ)
元宇品の散歩 環境側面の見直し

法規制の特定を見直したので、同じような処理をしている環境側面の特定方法も修正する
今まで特定のための検索条件を工事概要から実施していたが、法規制の特定で作成した工事に関する条件DBを共有化、項目追加することに変更する・・・また、フロントエンドも法規制と同じようにする
| 質問 | 回答 |
|---|---|
| 条件保存方式 | project_conditions` テーブル新規作成。環境側面モーダルの条件も同テーブルに登録 |
| AI軽量化 | 今回は対象外。次のステップとして実施 |
| edit_overview の廃止範囲 | ☑ボックスで設定した内容を概要欄に転記する機能をすべて廃止。テキストボックスのみに変更 |
| @section(‘extra_tabs) | 環境側面編集画面のみで使用。他ページへの影響なし |
1.edit_overview.blade.php の変更
1-1.廃止する要素
現在のファイルは3エリアで構成:
| エリア | 内容 | 対応 |
|---|---|---|
| エリア1(上部) | textareaとフォーム | 残す |
| エリア2(中央) | 「選択した項目を概要に追加する」ボタン | 残す |
| エリア3(下部) | チェックボックス群(工事種別・立地条件・工事規模・工事の特性・仮設設備等) | 削除 |
雨の散歩 法規制の再構築コーディング開始


1-3.更新ファイル
app/Models/Regulation.php ← $fillable 新カラム追加
app/Http/Controllers/ChecklistController.php ← 全面再構築
app/Http/Controllers/AdminController.php ← CSV新フォーマット対応
resources/views/components/eval_modal.php ← deleteEvidence URL修正
resources/views/layouts/footer.blade.php ← z-50 → z-10(モーダル被り解消)
routes/web.php ← conditionMatchルート追加・deleteEvidenceルート修正
法規制特定のコードの問題点が洗い出せたので、Excelシートをもう一度、見直しと再構築をして、いよいよコードを作成する

1.法規制特定機能 再構築(Step 1〜8)
1-1.概要
edit_Laws_Regulations.blade.phpとindex.blade.phpを指示書に従い全面再構築した
1-2.新規作成ファイル
database/migrations/
2026_06_05_095137_add_select_columns_to_regulations_table.php
2026_06_05_095150_add_source_to_checklist_results_table.php
2026_06_05_112359_add_unique_index_to_checklist_results_table.php
app/Services/
RegulationMatcherService.php
resources/views/
components/laws_condition_modal.blade.php
Laws_Regulations/edit_Laws_Regulations.blade.php ← 新設計版
Laws_Regulations/index.blade.php ← 新設計版
Laws_Regulations/_tab_bar.blade.php ← 共通パーシャル
キクと散歩 法規制コードの3回目の修正

checklist_results (プロジェクト別選択結果)
※課題:保存は全件DELETE → INSERT の洗い替え方式
| カラム | 型 | 役割 |
| project_id | FK | 現場 |
| regulation_id | FK | 法規制 |
| is_checked | boolean | 適用/非適用 |
c
法規制のコードを見直しを始めた・・・まずは現状分析
1.現在のテーブル構成
regulations`(法規制マスタ)
※課題:ai_description1列に「キーワード」と「制御フラグ」を混在させている
| カラム | 型 | 役割 |
| id | PK | — |
| parent_id | FK(self) | 親=null、子=親ID(2段構造) |
| group_code | string | 法律名(主に親) |
| ref_law | string | 関係条文(主に子) |
| action_conten | text | 実施すべき内容 |
| full_law_text | text | 原文(展開表示用) |
| ai_description | text | AI判定用キーワード(【選択必須】/【選択しない】制御フラグも兼用) |
| explanation_image | string | 解説画像 |
我が家の妻側が丸見え 労働安全衛生法のレビュー
建設アシストの法規制管理の見直しを貸しする・・これで2回目となる
それなりに満足できる法規制の特定とはなっているが、もう一度判定に使っているAIを検討した結果、AIに頼らず、条件選定で多くが可能なことが分かってきたので変更を検討するが、今まで法規制の解釈のためにベースとなる体系(Excel→CSVで取込)を見直しをする必要ができてきた
2回目も、かなり突っ込んできたが、途中でかなり妥協をしていたので、今回は腰を入れて見直しを開始する・・・やはり、安衛法の解釈は複雑、言葉の定義から、法規制と思っていたのが実は「ガイドライン」だったり、新しい発見も多い・・・1日をかけて約半分まで終わったが・・・疲れる
ここで、もう一度「元請」周りの安衛法による定義を確認する
| 呼称 | 意味 | 根拠 |
| 事業者 | 労働者を使用する者すべて(元請も下請も) | 法2条3号 |
| 注文者 | 仕事を他人に請け負わせる者(下に出せば中間業者も注文者) | 法31条等 |
| 元方事業者 | 一の場所の仕事の一部を下請に請け負わせている事業者=元請(全業種共通) | 法15条1項 |
| 特定元方事業者 | 元方事業者のうち建設業・造船業(特定事業)のもの | 法15条1項 |
| 関係請負人 | 元方事業者の下のすべての請負人(一次・二次…下請全部) | 法15条1項 |
選任される「人」の呼称
| 呼称 | 誰が選任 | 役割 | 根拠 |
| 統括安全衛生責任者 | 特定元方事業者 | 現場全体の安全衛生を統括管理する人 | 法15条 |
| 元方安全衛生管理者 | 特定元方事業者 | 統括の管理事項のうち技術的事項を管理する人 | 法15条の2 |
| 店社安全衛生管理者 | 特定元方事業者(中小規模現場) | 店社(支店等)から現場を指導・巡視する人 | 法15条の3 |
| 安全衛生責任者 | 各下請(関係請負人) | 統括安全衛生責任者との連絡役 | 法16条 |
- 元方事業者(全業種)→ 法29条:関係請負人とその労働者が法令違反しないよう指導する義務。建設業ではさらに法29条の2で危険場所の技術的指導。
- 特定元方事業者(建設・造船)→ 法30条:統括管理措置。協議組織の設置・運営、作業間の連絡・調整、作業場所の巡視、関係請負人の安全衛生教育の指導・援助、仕事の工程・機械設備の配置計画と関係法令措置の指導、その他労働災害防止に必要な事項の6つです。
- 注文者(設備等を請負人に使わせる者)→ 法31条:足場・型枠支保工等の設備面の措置
雨のみなと公園 コードのレビュー
台風の接近で朝からかなりの雨です・・・甲斐犬のキクの散歩は予定通り、上下に登山用のレインコートを着込んで散歩、でも40年前のゴアテックスは効果が薄く、かなり浸み込んできました・・・やはり、新しいのを使わないと大雨は無理かな


環境側面であるコードのレビューを実施した
\environment\edit_environment.blade.php
\environment\index.blade.php
1.最優先:CSPとインラインハンドラの矛盾
これが一番の地雷です。直近で@alpinejs/cspに移行してscript-srcから unsafe-eval を外したのに、1-1.この2画面はインラインイベントハンドラだらけonclick=”openAiModal()” / “closeAiModal()” / “runAiEstimate()”
onclick=”addCustomRow()” / “removeCustomRow(this)”
onclick=”window.print()”
script-srcからunsafe-inlineも外す方針なら、これらは全滅
Alpineだけ対応しても、素のonclickが残っていればCSPの一貫性は崩れる・・セキュリティ監査を目標にするなら、unsafe-inline除去は通過点になるはずなので、ここはaddEventListener方式へ統一すべき・・幸い既に477〜492行で同パターンを使っているのでdata-action=”open-ai-modal”のような属性+委譲リスナーに寄せれば機械的に直せる
元宇品の散歩
建設アシストのコードのセキュリティ対策として、CSP(Content Security Policy)でunsafe-evalを禁止した結果、Alpine.js の式評価がブロックされ動作不能になった問題を解決します
1.パッケージ切り替え・ビルド設定
package.json / resources/js/app.js
| 変更内容 | 詳細 |
| alpinejs → @alpinejs/cspに差し替え | npm install @alpinejs/cspを実行、app.jsのインポートを変更 |
| グローバル Alpine コンポーネントを app.jsに集約 | alpine:initイベント内で Alpine.data()を登録 |
app.jsに登録したグローバルコンポーネント:
| コンポーネント名 | 用途 |
| scheduleInitModal(chartType, switchUrl) | 工程表 初期選択モーダル |
| flashMessage | プロフィール保存後フラッシュメッセージ(2秒フェードアウト) |
| dropdownMenu | ナビゲーション ドロップダウン |
| laravelModal(initialShow, modalName, focusable) | Breeze 標準モーダル(フォーカストラップ付き) |
iso_app 開発ロードマップ
1. プロジェクト概要
so_app は、建設会社の作業所管理をシステム化した業務アプリケーションです。ISO監査・施工計画・環境側面・リスクアセスメント・安全パトロール・法規制管理を統合した、建設DXを目指した詳細な管理システム
| 項目 | 内容 |
| 技術スタック | Laravel(PHP) + Vite + Tailwind CSS + SQLite/MySQL |
| AI機能 | Claude API(法規制選定・環境側面推論・監査支援) |
| モデル数 | 約45モデル(ISO監査・工事管理・環境・安全・リスクなど) |
| 現在の状態 | 複数社でテスト運用中 |
| 目標 | 建設業界のDX化 |
| 特徴 | セキュリティを重視した「統制下でのAI活用」の実証システム |
2. フェーズ別ロードマップ
Phase 1: 品質と信頼性の確立(現フェーズ)
| 作業 | 状態 |
| セキュリティ監査(Critical 1〜4 テナント分離) | ✅ 完了 |
| セキュリティ監査(High 7〜9 認可漏れ) | ✅ 完了 |
| AI送信情報のガード機構(InputValidator) | ⏳ 次タスク |
| AI送信内容の透明性確保(ユーザー画面への明示) | ⏳ 予定 |
| Medium 13 ファイル名処理 | ⏳ 予定 |
Phase 2: 保守性と共通化
| 今後作業 | 効果 |
| Blade コンポーネント化(写真・添付・印刷UI) | 新機能追加が高速化 |
| AI Service の共通基底クラス | AI呼び出しの一元管理 |
| PrintHelper・共通ヘルパー関数の整備 | 重複コードの削減 |
| トレイト化(HasPhotos, HasAttachments等) | モデルの統一化 |
| Policy への移行(Phase 3) | 認可の構造的解決 |
| グローバルスコープによるテナント自動分離 | 忘れて漏れる事故の防止 |
4. 直近のアクションアイテム
| 作業内容 | 対象ファイル | 状態 |
| InputValidator の実装(AI送信ガード機構) | app/Services/Ai/InputValidator.php | ⏳ |
| 既存AI Serviceへの組み込み(5箇所) | AiRecommendationService等 | ⏳ |
| Environment + RiskAssessmentへのトレイト確認 | 完了確認 | ✅ |
| ai_usage_logs テーブルの設計・作成 | database/migrations/ | ⏳ |
| プロンプトキャッシュの実装 | 全AI Service | 📅 |
| ログローテーション設定(.env変更) | config/logging.php | 📅 |
5. 業界への影響と目標
このシステムは「技術者が作った業務システム」ではなく、「業務実践者がAIを道具として使って作った業務システム」です。建設業界のDX化に向けて、特に以下の点で先進的な位置付けにあります
- ISO監査・施工計画・環境・安全・法規制管理の統合(業界で類を見ない)
- 「機密情報は外部AIに出さない」設計によるセキュリティと利便性の両立
- 大手企業の情報セキュリティ要件に対応可能な「統制下でのAI活用」の実証
- 30年以上の建設業務経験と20年のISO審査経験が詰め込まれた業務知識
今AIの活用に伴い、AIのセキュリティが大きな課題となっていますが、「AI使用禁止」ではなく、「適切な制御下での活用」という選択肢を具体例として示すことが目標とし、このシステムが業界全体のAI活用推進のモデルケースとなることを目指します
Phase 3: AIゲートウェイ・セキュリティ監視
| 今後作業 | 期待効果 |
| AI利用ログテーブル(ai_usage_logs)の実装 | コストの可視化・会社別分析 |
| コスト制御(予算上限・アラート)コスト制御(予算上限・アラート) | APIコストの自動管理 |
| ルールベース匿名化サービス | 機密文書の安全なAI活用 |
| セキュリティ監視Console Command | 日次自動チェック |
| セキュリティダッシュボード | 運用状況の可視化 |
| プロンプトキャッシュの実装 | APIコスト最大90%削減 |
Phase 4: 組織内AI・高度なセキュリティ
| 今後作業 | 内容 |
| Ollama + ローカルLLMの検証 | 自前AIの感触をつかむ(無料) |
| 契約書・技術文書の匿名化処理 | 機密情報を外部に出さない仕組み |
| 統合AIパイプライン | 匿名化→外部AI→復元の一連の流れ |
| AI利用の完全監査ログ | セキュリティ監査員AI |
| 管理ダッシュボードの高度化 | リアルタイム監視・異常検知 |
Phase 5: 商用化準備
| 今後作業 | 内容 |
| サーバーセキュリティの強化 | ファイアウォール・HTTPS・バックアップ |
| ユーザー管理のセキュリティ強化 | パスワードポリシー・2FA・セッション管理 |
| スケーラビリティ対応 | 複数社本格導入への対応 |
| SLA・サポート体制の整備 | 商用化に向けた運用体制 |
3. サーバー・ユーザー管理セキュリティ計画
3.1 ユーザー管理の強化(優先度高)
| 項目 | 内容 | 優先度 |
| パスワードポリシー | 複雑性要件・有効期限の設定 | 高 |
| ログイン試行回数制限 | ブルートフォース攻撃対策 | 高 |
| セッションタイムアウト | 一定時間後の自動ログアウト | 高 |
| 退職者の即時無効化 | アカウント無効化フローの整備 | 高 |
| 二要素認証(2FA) | 重要操作時の追加認証 | 中 |
| アクセスログ閲覧UI | 管理者向けの操作履歴確認機能 | 中 |
3.2 サーバーセキュリティ(段階的に対応)
| 項目 | 内容 | 難易度 |
| HTTPS の徹底 | SSL証明書の設定・自動更新 | 低 |
| 不要ポートの閉鎖 | ファイアウォール設定 | 中 |
| OS・PHP・Laravelのアップデート方針 | 定期更新のルール化 | 低 |
| バックアップ体制 | 自動バックアップの設定・復旧手順 | 中 |
| ログローテーション | 日次ローテーション設定(保存14日) | 低 |
| 依存ライブラリの脆弱性チェック | composer audit の定期実行 | 低 |
海の見えるレストラン
新しいマザーボードに交換
現在のパソコンの構成
- マザー ASUS ROG STRIX B550-A GAMING
- CPU Ryzen9 3950X(16C32T 3.5-4.7GHz)
- メモリ DDR4 PC4-28800 3600MHz 2✕32GB=64GB
- グラフィックボード GeForce RTX™ 4070 Ti
- M.2SSD PCle4.0 NVMe M.2 Kingston KC3000 1021GB PCIe Gen 4.0 x4 70000MB/S
- M.2 SSD PCIe Gen4x4 NVMe M.2 diloca EN760 2TB 2280 4800MB/s
- 電源 MSI 750W MAG A750GL PCIE5 PS1326
・PCIe 5.0 GPU ネイティブ16ピン(12VHPWR)450W対応
・ATX 3.0 対応/フルモジュラー設計
・80 PLUS Gold認証取得 - ケース NZXT(CA-H510E-B1)


ログインに関するセキュリティ
1.ログインに関するセキュリティ
SaaS運用に向けたセキュリティ強化として、フェーズ1(必須項目)の完了およびフェーズ2の主要項目を実装した。
1-1. HTTPS強制(フェーズ1)
- iPadのChromeブラウザでログインフォーム送信時に「送信されている情報は保護されません」の警告が表示されていた。
- XサーバのSSL化は設定済みだったが、LaravelのURL生成がHTTPになっていた。
① `app/Providers/AppServiceProvider.php` に追記
“`php
use Illuminate\Support\Facades\URL;
public function boot(): void
{
if (!app()->environment(‘local’)) {
URL::forceScheme(‘https’);
}
}
② `bootstrap/app.php` にTrustProxies設定を追加
“`php
$middleware->trustProxies(at: ‘*’);
“`
結果
- iPadでの警告が解消された。
- ローカル環境(HTTP)では適用しない条件分岐を追加し、ローカルの動作も正常化。
1-2. セッションのセキュア設定(フェーズ1)
本番・ローカル各.envに以下を追記:
| 項目 | 本番 | ローカル |
| SESSION_SECURE_COOKIE | true | false |
| SESSION_ENCRYPT | true | true |
| SESSION_SAME_SITE | strict | lax |
結果
- セッションCookieのHTTPS限定送信を設定。
- セッションデータの暗号化を有効化。
- 既存ログインユーザーのセッションが一度無効化されたが、再ログインで正常動作を確認。
1-3. ログイン失敗のロック機構(フェーズ1)
app/Http/Requests/Auth/LoginRequest.php を確認した結果、Laravel標準のRateLimiterによる以下の機能がすでに実装済みであることを確認した。
- 5回失敗でアカウント一時ロック
- メール+IPアドレスの組み合わせでカウント
- 時間経過で自動解除
- Lockoutイベントの発火
結果
- 追加実装不要。実装済みを確認。
1-4. セキュリティヘッダーの実装(フェーズ2)
app/Http/Middleware/SecurityHeadersMiddleware.phpを新規作成し、bootstrap/app.php` に登録。
設定したヘッダー:
| ヘッダー | 設定値 | 効果 |
| Strict-Transport-Security | max-age=31536000 | HTTPS強制をブラウザに記憶 |
| X-Frame-Options | DENY | クリックジャッキング防止 |
| X-Content-Type-Options | nosniff | MIMEタイプ誤判定防止 |
| Referrer-Policy | strict-origin-when-cross-origin | URL漏洩防止 |
| Content-Security-Policy | self + unsafe-inline | XSS対策 |
注意事項
- ローカル環境(APP_ENV=local)では全ヘッダーをスキップする条件を追加。
- TipTapエディタ・Axios使用のため、CSPは段階的に厳格化する方針とした。
1-4. セキュリティヘッダーの実装(フェーズ2)
app/Http/Middleware/SecurityHeadersMiddleware.hpを新規作成し、bootstrap/app.php` に登録。
設定したヘッダー:
| ヘッダー | 設定値 | 効果 |
| Strict-Transport-Security | max-age=31536000 | HTTPS強制をブラウザに記憶 |
| X-Frame-Options | DENY | クリックジャッキング防止 |
| X-Content-Type-Options | nosniff | MIMEタイプ誤判定防止 |
| Referrer-Policy | strict-origin-when-cross-origin | URL漏洩防止 |
| Content-Security-Policy | self + unsafe-inline | XSS対策 |
注意事項
- ローカル環境(APP_ENV=local)では全ヘッダーをスキップする条件を追加。
- TipTapエディタ・Axios使用のため、CSPは段階的に厳格化する方針とした。
1-5. 不審ログイン通知メール(フェーズ2)
新しいIPアドレスからのログインを検知し、登録メールアドレスへ通知メールを自動送信する機能を実装。
新規作成ファイル
app/Mail/SuspiciousLoginMail.php
resources/views/emails/suspicious_login.blade.php
resources/views/emails/suspicious_login_text.blade.php(HTML/テキスト両形式対応)
修正ファイル
app/Http/Controllers/Auth/AuthenticatedSessionController.php
検知ロジック:
$isNewIp = !LoginLog::where(‘user_id’, $user->id) ->where(‘ip_address’, $request->ip()) ->where(‘id’, ‘!=’, $log->id) ->exists(); if ($isNewIp && $user->email) { Mail::to($user->email)->send( new SuspiciousLoginMail($user, $request->ip(), now()->format(‘Y年m月d日 H:i’)) ); }
メール設定
| 環境 | 設定 |
| 本番 | Xサーバ SMTPサーバ(sv13426.xserver.jp:587) |
| ローカル | MAIL_MAILER=log(ログファイルに出力) |
動作確認結果
- Gmail:受信トレイに正常届を確認 ✅
- MSN(Outlook):迷惑メールフォルダに届くことを確認 ✅
残課題
MSN/Outlookの迷惑メール判定を解消するため、DNSへのSPFレコード追加を推奨。
レコード種別:TXT
値:v=spf1 include:xserver.jp ~all
2.フェーズ別進捗
フェーズ1(必須・リリース前)
| 項目 | 状態 |
| パスワードのハッシュ化(bcrypt) | ✅ 完了(実装済み確認) |
| HTTPS強制 | ✅ 完了 |
| セッションのセキュア設定 | ✅ 完了 |
| ログイン失敗のロック機構 | ✅ 完了(実装済み確認) |
フェーズ2(リリース後早めに)
| 項目 | 状態 |
| セキュリティヘッダー(HSTS等) | ✅ 完了 |
| 不審ログイン通知メール | ✅ 完了 |
| SPF・DKIMの設定 | ⬜ 未対応(推奨) |
| パスワードリセットフローの強化 | ⬜ 未対応(次回 |
下関四日目 新しいマザーボード
下関三日目
下関二日目
下関に出張 昼から仕事
MACmini4にLaravelローカル環境構築
パソコンのエラー
メインパソコンのエラー
沖永良部から広島に
建設アシストセキュリティ監査
1. セキュリティ監査の実施
iso_app (建設アシスト)のセキュリティ強化を実施する
1.1 監査方法
Claude Code(Opus 4.7)を「セキュリティ監査員」として起用し、以下の観点でアプリケーション全体を調査しました。
- 認証・認可の漏れ(全コントローラーを網羅的に調査)
- テナント分離の実装状況(マルチカンパニー対応の確認)
- ファイルアクセス制御
- AI API への機密情報送信リスク
- 入力検証・出力エスケープ
- 依存ライブラリの脆弱性
1.2 監査サマリー
| 重大度 | 件数 | 対応状況 |
| Critical | 6件 | 4件完了・2件対応中 |
| High | 8件 | 7件完了・1件対応中 |
| Medium | 2件 | 計画中 |
| 合計 | 16件 | 11件完了 |
3. High 項目の詳細
| 項目 | コントローラー | 内容 | 状態 |
| 認可漏れ | ChecklistController | getEvidence で他社データをJSON取得可能 | ✅ 完了 |
| 認可漏れ | EnvironmentController | index/edit/save/aiEstimate でテナント確認なし | ✅ 完了 |
| 認可漏れ | RiskAssessmentController | downloadAttachment で他社ファイルダウンロード可能(16メソッド) | ✅ 完了 |
| AI情報 | AuditAiService | 被監査対象名・業務概要がAPI送信される | ⚠ 対応中 |
| AI情報 | SafetyPatrolController | 作業内容・使用機械の詳細が送信される | ⚠ 対応中 |
| AI情報 | risk_assessment.blade.php | 下請業者名・プロジェクト名がプロンプトに含まれる | ⚠ 対応中 |
4. 是正処置の内容
4.1 共通トレイトの新規作成
認可ロジックを一元化する AuthorizesTenantAccess トレイトを作成しました。
app/Http/Controllers/Concerns/AuthorizesTenantAccess.php
このトレイトにより:
- 認可ロジックが1箇所で管理される
- 各コントローラーへの適用が use 一行で済む
- 将来の Policy 移行への布石となる
- 役割ベースの例外(システム管理者は全社アクセス可)を正しく処理
4.2 適用したコントローラーと保護されたメソッド数
| コントローラー | 保護メソッド数 | 対応回 |
| ProjectController | 8メソッド | 第1回 |
| ConstructionPlanController | 15メソッド | 第1回 |
| SafetyPatrolController | 14メソッド | 第1回 |
| ChecklistController | 6メソッド | 第1回 |
| EnvironmentController | 4メソッド | 第2回 |
| RiskAssessmentController | 16メソッド | 第2回 |
| 合計 | 63メソッド | ー |
4.3 テストケース(26件 全PASS)
各コントローラーに対して以下のパターンを網羅的にテスト:
- 他社ユーザーが各リソースにアクセス → 403
- 自社ユーザーがアクセス → 200(正常)
- role=1 システム管理者 → 全社アクセス可(200)
- 削除・変更系でDBの状態が変わらないことを確認
4.4 実施コストと効果
| 項目 | 内容 |
| 実施時間(合計) | 約2時間半 |
| API利用コスト | $6.51(約1030円) |
| 外注した場合の市場価格 | 130〜350万円相当 |
| コスト比 | 約1300〜3500倍の費用対効果 |
| コード変更量 | 673行追加、12行削除 |
| テスト件数 | 26件 全PASS |
2. Critical 項目の詳細
2.1 テナント分離の欠落(Critical 1〜4) ✅ 完了
最も重大な問題でした。URL のIDを変えるだけで他社のデータに読み取り・編集・削除アクセスが可能な状態でした
| 対象コントローラー | 影響範囲 | 重大度 |
| ProjectController | show/edit/update/destroy/editOverview/updateOverview/uploadPhoto(8メソッド) | Critical |
| ConstructionPlanController | downloadDocx/downloadXlsx/generatePdf/diagramEditor等(15メソッド) | Critical |
| SafetyPatrolController | create/store/index/show/destroy/generateAiChecklist等(14メソッド) | Critical |
| ChecklistController | deleteEvidence/getEvidence等(6メソッド) | Critical |
2.2 AI API への機密情報送信(Critical 5〜6) ⚠ 対応中
発注者名・予算・下請業者名・近隣企業名などが、マスキングなしで Anthropic Claude API に送信される可能性がありました。
【現状の評価(設計意図の確認後)】
現状のAI利用は「チェックボックス選択による固定語彙のみを送信」という設計になっており、実質的な機密情報漏洩リスクは低い状態です。ただし、将来の機能拡張で誰かがフリーテキストを送る実装をしてしまうリスクの予防として、コードレベルのガード機構を実装予定です。
5. 進捗状況
| フェーズ | 内容 | 状態 |
| Phase A | リスクアセスメント(自主監査) | ✅ 完了 |
| Phase B-1 | Critical 1〜4 テナント分離 | ✅ 完了 |
| Phase B-2 | High 7〜9 認可漏れ(Environment, RiskAssessment) | ✅ 完了 |
| Phase B-3 | Critical 5〜6, High 10〜12 AI関連 | ⏳ 次フェーズ |
| Phase B-4 | Medium 13 ファイル名処理 | ⏳ 後ほど |
| Phase C | AIゲートウェイ構築・匿名化 | 📅 来月 |
| Phase D | 監視・運用体制の確立 | 📅 数ヶ月後 |
| Phase E | 継続的改善(PDCA) | 継続 |
6. 次フェーズの計画
6.1 AI送信情報のガード機構(InputValidator)
現在の「固定語彙のみ送信」という設計意図をコードで強制するバリデータークラスを実装します。
- 会社名・個人名らしき文字列の検出
- 長い数字列(電話番号・契約番号等)の検出
- 検出時の警告ログ記録
- 既存のAI Serviceへの組み込み(5箇所)
6.2 将来計画:ローカル AI 前処理
契約事項・技術的背景・経営内容の文書化を扱う際、自前サーバーに置いたローカルAIで一般化処理をしてから外部AIに送信する仕組みを構築予定です。
- ルールベース匿名化サービス(Phase 1): 氏名・会社名・金額の自動マスキング
- ローカルLLM検証(Phase 2): Ollama + Llama 3.2 などで自前AIの感触をつかむ
- 統合AIゲートウェイ(Phase 3): 匿名化→外部AI→復元のパイプライン構築
Claude Code 最適化
1. プロジェクト容量の実測結果
Claude Codeのトークン消費がものすごい・・・いくら請求が来るやら(トークン量は1億となっていた!!)、これは大変なのでトークン削減・コスト最適化の実践を考える
iso_app プロジェクトの容量分析結果(2026年5月実測):
| フォルダ | サイズ(MB) | 分類 | 除外対象 |
| node_modules/ | 103.25 | npmライブラリ | ✅ 除外必須 |
| vendor/ | 73.14 | Composerライブラリ | ✅ 除外必須 |
| storage/app/ | 59.91 | 写真・添付ファイル | ✅ 除外必須 |
| storage/logs/ | 4.33 | ログファイル | ✅ 除外必須 |
| storage/fonts/ | 5.87 | IPAexフォント | ✅ 除外必須 |
| storage/framework/ | 0.27 | Laravelキャッシュ | ✅ 除外必須 |
| public/ | 18.39 | ビルド成果物・画像 | ⚠ 一部除外 |
| resources/ | 1.32 | ビュー・CSS・JS | ❌ 必要(含める) |
| database/ | 0.86 | マイグレーション | ❌ 必要(含める) |
| app/ | 0.38 | 実コード | ❌ 必要(含める) |
⚠ 実コード(app/, resources/, database/, routes/, config/)の合計はわずか 2.7MB。全体の 1% です。
2. .claudeignore の設定
.claudeignore ファイルをプロジェクトルートに作成することで、Claude Code が読み込む対象を 268MB から 2.7MB に削減できます。
依存ライブラリ(最重要)
vendor/
node_modules/
アップロードされた写真・添付ファイル(iso_app固有)
storage/app/public/photos/
storage/app/public/evidence/
storage/app/public/plans/
storage/app/public/ra_attachments/
Laravelキャッシュ・ログ
storage/logs/
storage/framework/
storage/fonts/
ビルド成果物
public/build/
public/storage/
手書きCSSは含める
!public/css/print-common.css
Git・IDE
.git/
.idea/
.vscode/
バイナリ・大容量ファイル
*.zip *.tar.gz *.pdf *.xlsx *.sql *.sqlite
沖永良部で仕事2日目
沖永良部で仕事1日目
南の島に出張
Laravel 基礎知識
1. Laravel とは
Laravel は PHP で書かれたオープンソースの Web アプリケーションフレームワークです。2011 年に Taylor Otwell によって作られ、現在では PHP フレームワークの中で最も人気のあるものの一つとなっています。MVC(Model-View-Controller)アーキテクチャを採用しており、ビジネスロジック・データ・表示を分離して開発できます。
1.1 主要な機能
| 機能 | 説明 |
| Eloquent ORM | データベース操作をオブジェクト指向で直感的に扱える。SQLをほとんど書かずにDB操作が可能 |
| Blade テンプレート | シンプルかつ強力なテンプレート構文。HTMLとPHPを綺麗に分離 |
| Artisan | コマンドラインツール。コードの自動生成・マイグレーション・キャッシュクリアを効率化 |
| ルーティング | Route::get(‘/users’, …) のような直感的な記述でURLとコントローラーを結びつける |
| 認証(Auth) | ログイン・登録・パスワードリセットなどの認証機能を標準装備 |
| マイグレーション | データベース構造のバージョン管理 |
| キューと スケジューラ | 非同期処理・タスクの定期実行 |
2.Composer による依存管理
2.1 Composer とは
Composer は PHP の依存管理ツールです。JavaScript の npm、Python の pip に相当します。Laravel 自体も Composer を使ってインストール・管理されます。「アプリの部品調達係」と考えると理解しやすいです
2.2 Composer の3つの役割
- 買い物リストの管理: composer.json = 「このアプリに必要な部品リスト」
- 部品の調達と配置: Packagist からライブラリを取得して vendor/ に配置
- 部品同士の互換性チェック: バージョン矛盾がないか自動確認
2.3 ライブラリの所在
| 場所 | 役割 |
| Packagist (packagist.org) | PHPライブラリのカタログ(Amazonのサイトに相当) |
| GitHub | 実際のソースコードの置き場所(Amazonの倉庫に相当) |
| vendor/ フォルダ | あなたのPCに取ってきた完成品(自宅に届いた荷物) |
| ローカルキャッシュ | 一度落としたものの控え(物置に置いてある予備) |
2.4 よく使うコマンド
composer install # composer.lock通りにインストール
composer update # 制約内で更新
composer require guzzlehttp/guzzle # 新規パッケージ追加
composer remove vendor/package # パッケージ削除
composer dump-autoload # オートローダーの再生成
日曜日も天気が良い


建設アシストのコードが多くなってきたので、Claude Codeのトークン消費が多くなってくる(毎回、コードを読み込んで応答するため)・・・2日ごとにクレジット要求が来るようになったので、今噂のchatJPのClaude Code向けのプラグインであるCodexをインストールをして、さっそく工事管理のフロントエンドを修正させたが、ずいぶん時間がかかり、おまけにClaude codeも消費しているようで、またクレジットが切れてしまった・・・いくら請求が来るのか戦々恐々・・・Codexが使えるようであればFreeから契約するかと思っていたが、もう少し様子をみる必要がある・・・・Claude Codeを使わなくても、Clude,Geminiなどでもコード作成はできるが、スピードとシステム全体の網羅性はClaude Codeを使いだすと数倍以上に効率が良いため、中々戻れない


























































