コンテンツにスキップ

画面

扱うこと: 画面全体の目的・設計方針・実装方式・ウィンドウとタブの構成、起動時にどのタブを開くか。扱わないこと: 各タブの詳しい仕様(この区分の各ページ)、画面の実装構成そのもの(画面の実装構成)。先に読むページ: 設計の概要。

項目 内容
起動 zip 版は tebunko.bat(名称は 決めたこと U1)、インストーラー版は tebunko.exe(installer/tebunko.cs)。どちらも PowerShell の窓を残さずに画面だけを開く(配布と実行ポリシー(Mark-of-the-Web))
スクリプト scripts/tebunko/gui.ps1(処理)/ scripts/tebunko/xaml/tebunko.xaml(画面定義)
使用する共通関数 writeListFile / readStatusFile / getSearchIndexes / readContentIndexLines / toResultLine / toResultHeader(部品ごとの関数)、および画面で追加する関数(実装構成)
起動する処理 scripts/tebunko/indexer.ps1(インデックス作成)を、画面のプロセスの中のスレッドで実行する(別のプロセスは起動しない。プロセスとスレッド)。検索(検索)と残った Office の終了(前回残った Office の確認)は画面内で実行する

全体構成・動作環境・フォルダ構成は 設計の概要 を参照。

タブの一覧

flowchart TB
    win["1 ウィンドウ<br>(tebunko)"]
    win --> t1["インデックス管理<br>index-tab.md"]
    win --> t2["検索<br>search-tab.md"]
    win --> t8["設定<br>settings-tab.md"]
    win -. "左の欄の下の[バージョン情報]" .-> about["バージョン情報"]

この区分のページ

概要

目的

インデックスの作成・検索・元のファイルを開く、までの一連の操作を 1 つの画面で完結させる。設定ファイルの編集やバッチの使い分けは要らない。特に、最も頻度の高い「ワードを入れて検索し、結果を見て、元のファイルを開く」操作を短くする。

利用場面

場面 頻度 画面での操作
初回の準備 1 回 フォルダ選択ダイアログ・ドラッグ&ドロップでインデックスを追加し、[すべて更新]([インデックス管理]タブ)
検索 毎日・何度も ワードを入れて Enter。結果をファイルごとの見出しで確認し、行のダブルクリックで元のファイルの該当箇所を開く([検索]タブ)
インデックスの更新 時々 最終更新日時・中断・失敗を見て、[すべて更新]([インデックス管理]タブ・状態の判定と表示)
残った Office の終了 まれ 起動時に出る確認で、前回のインデックス作成が起動したまま残った Office を終了する(前回残った Office の確認)

設計方針

  1. 作業単位でタブを分ける。[インデックス管理][検索][設定]の 3 つとする(番号は、画面を作る前の起動用バッチ 1_変換.bat・2_検索.bat・9_Office強制終了.bat に合わせたもの。[設定]は後から足した)。残った Office の終了は、専用のタブを持たず、起動時の確認で行う。
  2. 検索は 1 ワードずつ、結果は画面に出す。ワードを入れて Enter で検索し、結果を画面の表で確認する。表から元のファイルを開ける。
  3. 保存を意識させない。インデックスの追加・編集・削除・チェックの変更、検索オプションはその場で保存する。保存の操作は無い。
  4. 状態を常に見せる。インデックスの件数・最終更新日時・中断や失敗の有無を表示する。前回残った Office プロセスは、起動時の確認で知らせる(前回残った Office の確認)。
  5. 入力の誤りはその場で、文章で知らせる。ダイアログではなく、入力欄の下に表示する。ダイアログは確認が必要な操作に限る。
  6. 操作はすべて画面で行う。設定ファイル(setting.config。画面での読み書き)は画面が読み書きするため、直接編集する必要は無い。

実装方式

PowerShell 5.1 + WPF とする。Windows 標準の .NET Framework 4.x に含まれるため、追加インストールは要らない。exe も作らない。

検討した方式 採否 理由
WPF(XAML) 採用 画面定義(XAML)とロジック(ps1)を分けられる。表(DataGrid)・一致箇所の強調など表現の自由度が高い
WinForms 不採用 実装は簡単だが、座標指定のレイアウトで画面変更の手間がかかる
メニュー+メモ帳 不採用 最小コストだが、結果の表示や状態表示ができない
Excel を画面にする 不採用 読み込みが遅い。操作にマクロが要る
ローカル Web 画面(HttpListener) 不採用 ブラウザからフォルダのフルパスを取れない。この規模には過剰
HTA(mshta) 不採用 技術が古く、セキュリティ製品にブロックされやすい
C# で exe 化(csc.exe) 不採用 自作 exe は SmartScreen 等に止められやすい
実行時コンパイル(Add-Type/csc.exe) 不採用 powershell.exe → csc.exe と一時 DLL の生成は資産管理・EDR に注目されやすい(MITRE ATT&CK T1027.004)。画面の型は PowerShell class、検索は .NET 直接呼び出しにした(画面の実装)

範囲

機能 実行場所 備考
インデックス作成 画面のプロセスの中のスレッド(IndexingSession が tebunko/indexer.ps1 -Channel を実行する) 時間がかかるため、画面のスレッドとは別のスレッド(優先度 BelowNormal)で実行する。1 ファイルの更新は取り込みのスレッドで並べて行う。進み具合・[中止]・ログは画面に表示する([インデックス管理]タブ)。スレッドの分け方は プロセスとスレッド
検索 画面内(検索の司令のスレッド SearchService と照合のプール) tebunko/lib.ps1 の検索関数を使う(検索の実行)。スレッドは画面を開いている間使い回す。結果ファイルへの出力は必要なときだけ行う(結果をファイルに出力)
残った Office の終了 画面内 shared/office/office_process.ps1 の関数(tebunko/lib.ps1 から読み込む)で、記録のある Office を取得・終了する。記録の読み取りは画面の裏の仕事で行う(前回残った Office の確認)

画面構成

ウィンドウ

項目 仕様
構成 1 ウィンドウ・3 画面([インデックス管理][検索][設定])。左の欄に画面の一覧を縦に並べ、その下に[バージョン情報]を置く。窓の下端はステータスバー
大きさ 初期 1280 × 820、最小 1024 × 640。サイズ変更可。広げると結果の表が伸びる
タイトル tebunko
下部 ステータス表示(直前の操作の結果)。インデックスを更新している間だけ、左に 1 行 更新中: <名前> 205 / 455 件(失敗 1 件)・残り約 3 分 を出す。それまでの文は、更新を始めたときに消す(背景は変えない。件数・失敗は更新全体のもの。名前は更新中の最初の行から取り、取れないときは 更新中 205 / 455 件。1 件も終わるまでは 更新中: <名前> 準備しています。文言は getIndexingStatusLine)。閉じるのはタイトルバーの[×]で行う
起動中の表示 スクリプトの読み込みに数秒かかるため、起動するとすぐに小さなウィンドウ(アイコン・tebunko・説明の文・進み具合の棒・「起動中…」。文字は本体の画面と同じ Segoe UI・Yu Gothic UI・Meiryo UI)を出す。画面を描き終わったら閉じる。多重起動の判定より前に出すため、2 つ目の起動でも一瞬出る
起動時の読み込み インデックス一覧・検索対象のツリーの読み込みと、別スレッドでの集計(更新の状況・件数・残っている Office)は、画面を描き終わってから始める。それまで一覧は空で、下部に「読み込んでいます…」と出る。どのタブを開くか(起動時に開くタブ)と、設定から戻す検索のオプション・開き方は、画面を出す前に決める
多重起動 名前付き Mutex で 1 つに制限する。2 つ目は、すでに開いている画面のウィンドウを前面に出して(最小化していれば元に戻して)終了する
起動時の知らせ(設定が壊れていたとき) 最初の起動で setting.config が JSON として読めなければ、setting.config.broken-<日時> に退避して既定の設定で起動し、メイン画面が出た後にメッセージボックスで 1 回知らせる(壊れた設定ファイルの退避)。多重起動の 2 つ目は退避しない
インデックス作成の開始 [すべて更新]は、まず更新の対象を数え、インデックスごとの件数を確認するダイアログを出す(インデックス作成の確認ダイアログ)。更新が無いインデックスは 更新不要 と出る
インデックス作成の実行後 インデックス作成は画面のプロセスの中のスレッドで実行し、画面は閉じない。インデックス作成中も検索のタブを使える。インデックス作成中に画面を閉じるときは、インデックス作成を止めてから閉じる(閉じる)

起動時に開くタブ

flowchart TD
    S(["起動"]) --> A{"work/store/ingest_status.tsv に『未取り込み』の行がある?<br>(前回のインデックス作成が中断中)"}
    A -- はい --> T1["[インデックス管理]を開く"]
    A -- いいえ --> B{"検索対象インデックスに<br>本文インデックスのファイルが 1 件以上ある?"}
    B -- いいえ --> T1
    B -- はい --> T2["[検索]を開く<br>検索ワード欄にフォーカス"]
  • インデックス作成は画面のプロセスの中で動くため、画面を開いた時点で動いているインデックス作成は無い。
  • 前回のインデックス作成が起動した Office が残っていれば、画面を描き終わったあとに確認を出す(前回残った Office の確認)。タブは切り替えない。
  • 更新に失敗したファイルが残っているだけの場合は[検索]を開き、[インデックス管理]タブの見出しに ⚠ を付ける。
  • 本文インデックスのファイルの有無は、最初の 1 件が見つかった時点で判定を打ち切る(件数は 状態を読み直すタイミング のとおり別スレッドで数える)。