Files
docview/docs/IMPLEMENTATION-DECISIONS.md
2026-09-21 13:41:40 +09:00

8.4 KiB

実装時の判断記録

設計書はdocs/designへそのまま複写し、SHA-256を保存した。本書は実装時の追加判断であり、原設計の受入条件を書き換えない。

判断 実装と理由 検証・影響
フォントを選択したバイト列だけで供給 MainのFontconfig/GDIでOS索引から選択し、64 KiBずつ既存IPCでWorkerへ渡す。SFNT/TTC解析とPDFiumはWorker内 Linuxのフォントディレクトリー許可を撤去。日本語CID横/縦と転送・取消・上限を試験。Windows実行は未確認。契約
Linuxから実装 Arch Linux x64に加え、専用KVMのUbuntu 24.04でもQt 6.11.2と固定PDFiumをビルド・検証 UbuntuはXvfb/Swayのsoftware描画、ArchはAMD OpenGLも確認。Windows native、対象OSの物理表示・IME、製品配布の受入は未完了
PDFタイルのオフスクリーン余白16px 設計案の2pxでは、タイル境界を横切る文字のアンチエイリアスに差が出た。16px描画して要求矩形だけを返す タイルと全ページの切り出しが試験資料でbyte一致。転送タイルは最大514px、通常512pxのまま
アーカイブワーカーを読み取り専用にする ZIP解析・CRC確認・フォント難読化解除はワーカー、最大64KiBずつの展開結果の保存はメイン側 パーサー侵害で一時領域を無制限に書き込む経路を除去。メイン側で資源256MiB・文書2GiBを確認し、完了後だけ公開
索引を分割する PDF目次最大20,000件、初回64件/128KiB、継続最大256件/512KiB。ページ情報は最大256件/256KiB。アーカイブ目次等も件数と実バイト数で分割 IPC制御フレーム1MiBを保ち、大きなラベルで一括応答が溢れる問題を防止。メイン側でも累積32MiBの索引上限
先読みの予算と優先度 可視タイルと通常操作が完了した後、設定された隣接ページの可視域相当の帯を1件ずつ読む。前ページは末尾、後ページは先頭を対象にする 0〜3ページ、隣接1ページ最大8タイル。余白がなければ先読みせず、先読みで既存キャッシュを追い出さない
メモリ圧迫の段階的対応 OSの利用可能物理メモリを1秒ごとに読み、先読み停止→不可視タイル回収→描画解像度抑制と通知→文書処理停止の順で進む。LinuxはMemAvailable、WindowsはGlobalMemoryStatusEx 閾値・ヒステリシス・位置保持・回復と停止後の再openは 契約。設定のキャッシュ上限・隔離の資源上限は維持する。Windows側の実行は未確認
実際に提示した位置を保存 PDFは可視タイル完成後のframeSwapped、Webは提示時の論理位置を状態へ渡す 未表示のジャンプ先を終了時に保存しない。2秒debounce/10秒最大間隔はStateStoreへ集約
保存先の原本をセッション開始時と照合 全形式のopen時に取得した正規パス・サイズ・更新時刻・物理ファイルIDを保存時にも照合する 閲覧中の変更・置換で古い位置を新原本へ転用しない。通常openでも履歴との同一性不一致を通知。実ファイル置換の回帰
目次の準備中を欠如と区別 能力がloadingの間は空の索引でも表示要求を保持し、パネルに読み込み中と示す 本文のReadyを待たせず、DOM索引到着後に同じパネルへ項目を表示する
見出しの代替と章境界を限定 PDFのoutline代替は内部宛先だけを採用。EPUBの最初/最後の見出しへの指示は成立した章移動にだけ結び付ける 外部だけの目次を見出しありと判定しない。失敗した章境界操作の指示が後の通常移動へ残らない
日本語を初期表示し翻訳資源を分離 tr/qsTr/固定contextからTSを生成し、QMを本体へ埋め込む。Qt標準部品の日本語資源も読み込む 英語localeでの設定・コマンドの案内とQt Quick Dialogを検査。OSネイティブdialogはOS言語に従う。更新・配置条件
Webの内部URLを履歴から除外 Mainで位置の型・上限・originを検証し、resourcePath/CFI/進捗とEPUB package/spineで復元する。旧state/backupのlocation.urlも書込み可能時に除去 旧href形式の復元を維持。読み取り専用・forceReadOnlyではファイルを変えず、本文引用中のURLは削除しない
ZIP入口は読書位置と別に保存 選んだ相対HTMLを同じ原本identityと現在の候補で再確認し、表示成功後だけ記憶する recent-only/position-only、別GUIプロセス再起動、取消・消去・原本置換を試験。記録
固定EPUBの見開きは最大2ビュー 同じ文書profileのprimary/companionへ左右を配置し、author viewportと共通倍率を維持。renderer監視は2枠に限定 LTR/RTL、両向き、単独中央、混在、取消を確認。章loadの同期通知は現在章のみ更新し、読書位置保存は提示後のまま
資源拒否を分類・件数だけ集約 broker、interceptor、ブラウザーCSPの検出を文書内でまとめ、:infoへ表示する URL・本文を記録しない。合成イベント・古いセッションを拒否。契約
PDFリンク枠の辞書をWorker内で補完 PDFium公開APIで不足するBorder/BSをlibqpdfで読み、保存外観がないリンクにだけ数値から一時外観を生成する 原本は書かず、既存外観を維持。通常枠の欠落を解消。NoZoom/NoRotateは描画中だけRect/回転を補正し、原本座標と保存APを保持する。比較
PDF注釈へキーボードで到達 既存のリンク順の後に本文付き注釈を加え、Tab/Shift+Tabで選びEnterで読み取り専用の本文を表示する CropBox外の注釈も選択可能。通常モードのEscで選択解除し、Web文書へ切り替えた後はPDFの選択と画像を回収する
生成資料を使用 利用者から既存コーパスなしとの回答。本文・図形・座標・色の期待値を持つ資料を生成 PDFiumとは独立したPopplerで比較。実書籍全般・全描画機能の互換性を保証する試験には置き換えない
OSの保護が利用できないときは停止 LinuxはLandlock ABI3以上・seccomp・資源上限。WindowsはLPAC・Job・明示ハンドル継承・子側の実token検証を本番経路へ接続 Windows固有部分は未ビルド・未実行。保護なしで起動するフォールバックを設けない
Windowsワーカーの依存物を個別コピー ビルド時に有限のDLL一覧とハッシュを生成し、起動時に検証して専用領域へコピーする インストール先や原本のACLを変更しない。実機でのPE解析・初期表示速度・配布確認は残る
Windowsのprofileを読み取り専用にする AppContainer作成時にできる固有filesystem/registryの書込権限も制限し、子側で検証する 任意Tempと自身のprofileへの書込拒否を試すnative試験を追加。Windowsでの保護成立は未確認

PDF見出しはWorker内の共有qpdf contextでページ/Formの所有元、ParentTree、RoleMapと構造順を読み、文字・座標は公開PDFium APIから取得する。FormだけのStructParentsにも対応し、入れ子Form・名前付きproperty・複数ページの子要素順を試験した。複数呼出や一意に対応できないFormは理由付きページ精度へ下げ、別のstreamの同じMCIDから文字や座標を借用しない。跨ページ見出しはページ別の断片として扱い、フォントサイズから見出しを推測しない。補完アダプター。

本文の検索・保存位置・最近使った文書のローカル記録を実装した。これら補助機能の合格範囲は検証記録のT-P系列で区別する。OCR、PDF入力・編集・保存、外部通信、文書スクリプト実行を追加しない。