
:lang: ja
include::config.adoc[]
// custom css.
//:stylesdir: ./
//:stylesheet: edit.css
//:toc: left
//:imagesdir: Images

// Custom Icons(J)
//:icons: image
//:iconsdir: icons
//:icontype: png
//

{ExtendStyle}
// After need empty-one-line



= CSRender修正内容
[.text-right]
--
ver.1.0　2022/03/17　辻 +
ver.2.0　2022/03/24　辻
--
// tag::sub[]

== 概要
今回検版ツールを修正した内容を説明する文書です。


== 今回の修正箇所
* 実行中のコンソールウインドウを非表示化
* レポート名のOK/NGのつけ方を修正
* 指定先に検版対象を見つけられなかった時のエラー回避を実装

.3/17
[%collapsible] 
====
* 検版するPDF毎でのレポート出力
* 出力するレポート名に検版結果(OK/NG)を明記
====

== 修正の詳細（3/24）

=== 実行中のコンソールウインドウを非表示化
Tool使用後コメントシート抜粋::
----
No.9：検版の結果はツールのUI（出力メニュー）や作成したレポートで確認できるので、検版の実行中でコンソールウィンドウの検版結果の表示は不要
No.17：検版実行時にコンソールが表示されますが不要です
----
また、コンソールを非表示にすることで、増大した処理時間を縮小する狙い

菱池さんの方でPureVerifyのCLI起動オプションにコンソール出力制御引数//consoleOutを追加
/consoleOut:
　０：新規にコンソール作成しメッセージを出力する(デフォルト）
　１：親のコンソールにメッセージを出力する(無い場合は新規に作成)
　２：NULLコンソール(未接続)にメッセージを出力する(メッセージは表示されない）

以下の2パターンで実装し動作を検証

. ProcessStartInfoで直接PureVerify.exeを呼び出し、/consoleOutを2として実行
`PureVerify.exe ~ /consoleOut "2"`
. ProcessStartInfoでmd.exeを呼び出し、その中で/Cオプションを付けつつPureVerifyを実行
`cmd.exe /C PureVerify.exe ~ /consoleOut "1"`

それぞれの動作分析は下記で紹介。結論から言うと両社は結果自体に大きな差は無し。

=== レポート名のOK/NGのつけ方を修正
* 前回の修正で【OK】/【NG】、【日付】で命名していた所をOK_/_NG、[日付]で命名し、全角がファイル名に含まれないように修正
* NGのときに、ファイル名の末尾につけていた&1%1を外すように修正
前回までの例：【NG】target.pdf【220324_1500】&1%1.pdf
今回の修正語：NG_target.pdf[220324_1500].pdf

=== 指定先に検版対象を見つけられなかった時のエラー回避を実装
前回評価チームに配布した時点のツールでは、指定したフォルダ先に検版対象が見つからないとき（対象フォルダとリファレンスフォルダ内に一致するファイル名が存在しない場合）にアプリが落ちてしまっていた。

アプリ落ち自体は、検版処理を対象のPDFファイル毎で並列処理化した際に、それぞれのフォルダ内に共通して存在するファイル名のみをピックアップするように実装していたため、回避できるようになっていた。

今回の修正では、実際に対象とリファレンスに共通して存在するファイルが0だった場合に、その旨をメッセージダイアログで表示するようにした。

また、指定した対象とリファレンスがそれぞれファイルであった場合は、一致しないファイル名であっても、以下のように処理することで検版するように修正した。

. ファイル名が違う場合、そのリファレンスファイルが存在するフォルダに対象フォルダと同じ名前でダミーのファイルを作成（リファレンスを対象の名前でコピー）
. CSRender(CLI)で対象ファイルとリファレンスのダミーをRIP
. PureVerifyで検版
. 検版終了後に作成したダミーを削除

=== その他修正
* 出力メニューに処理の進捗を表示
コンソールの非表示化に伴い、以下のように作業の進捗を表示するように修正。
----
< 検版処理状況 >
　処理待ち数：10/50
　OKファイル数：30
　NGファイル数：10
----
10：残りの画像数、50：検版する画像数、30：検版して一致した画像数、10：検版して不一致だった画像数

* 並列処理内の重複箇所を修正
Pureverifyを並列で実行する際に、それぞれの起動で一致する引数（出力先のパスなど）であっても、毎実行時に生成していたのを並列処理外に移動。並列処理内では、各スレッド毎にことなる箇所のみを処理するように修正。

== 修正後の動作分析（3/24）

処理時間::
[cols="4*", options="header"]
|===
|バージョン\ファイル数
|50ファイル
|100ファイル
|150ファイル

|前回配布時のツール
|0分36.98秒
|1分10.73秒
|1分42.97秒

|3/17の修正版
|3分31.97秒
|6分08.63秒
|9分03.73秒

|今回の修正版(Processで直接PureVerifyを呼び出し)
|2分54.85秒
|5分18.76秒
|8分18.49秒

|今回の修正版(Processでcmd.exe /Cを経由して呼び出し)
|3分03.98秒
|5分18.16秒
|8分17.88秒
|===

処理を並列化した際に処理時間が増大したことの原因は以下であると考えていました。

* レポートの作成回数が増えた（PDFLibの実行回数が増えた）
* コンソールを開いて閉じる回数が増えた

個人的には上記が半々くらいの比率で影響を及ぼしていると思っていました。そのため、コンソールを非表示化すれば時間を抑えられると思いましたが、検証した結果、コンソールの非表示で削減できた時間は僅かでした。原因として考えられるものを以下に挙げました。

* コンソールを非表示にしたといっても、NULLコンソールや親コンソールに書き込んでいるので、あまり時間が変わらない
親コンソールに出力するパターン（/cosoleOut "1"）を実際にコマンドプロンプトで実行し確認してみました。親コンソールに出力させても、「コンソールに< 検版終了 >が出力→PureVerifyのCLI処理が終了する（次のコマンドが入力可能になる）→PureVerifyアプリが終了する（タスクマネージャーで終了を確認）」までの流れに1~2秒掛かりました（以下のダンプ）。nullコンソールへの出力でも同様であると考えられます。
image:cmd_dumpS.png[]

* レポートの作成がやはり重たい
PureVerifyがコンソールに出力しているレポートの作成時間は大体10秒程（1画像で）なので、こちらもそれなりの時間を要しています。

以上を踏まえて、レポートの作成時間はどうしようもないと思います。なので、「コンソールに< 検版終了 >が出力→PureVerifyのCLI処理が終了する→PureVerifyアプリが終了する」のステップで掛かる時間を減らせれば、処理時間を抑えられるかなと思います。解決策としては

* コンソールの書き込みをいっそのことやめてしまう
* PureVerifyのCLIをGUIから完全に独立させる
* PureVerify.exeを呼び出さずにCSRender内に機能を実装する

といったところになるでしょうか。

== 修正の詳細（3/17）

=== 検版するPDF毎でのレポート出力

Tool使用後コメントシート抜粋::
----
No.2：検版結果は、ファイル単位で出力する様にしてほしい。
No.12：【検版レポート】検版結果のPDFファイルは別々のレポートを作成して欲しい。 
----
修正内容::
* ファイル毎でPureVerifyを起動
PureVerifyのCLIツールを呼び出す際に、/inspTiffを引数に追加することで検版するPDFの画像を指定。
* PureVerifyの処理をマルチスレッドで処理
C#のParallelクラスを用い、検版するPDFファイルの数だけ実行されるPureVerifyの処理をマルチスレッド化。スレッドの上限は4に設定。
* GUIーのレポート名指定メニューをレポート出力フォルダ指定メニューに変更
今までは検版レポート名をパスを含めて自由に設定できたが、PDF毎に複数の検版レポートを出力するに伴い、出力先のフォルダパスを指定するのみのメニューに修正。
* レポートの記載内容を一部修正
レポートの記載内容を対象の各PDFファイルに沿った内容となるように修正。

=== 出力するレポート名に検版結果(OK/NG)を明記

Tool使用後コメントシート抜粋::
----
No.3：検版結果レポートを開かなくても、NGのPDFファイルが分かるようにしてほしい
No.13：検版結果のPDFファイルは従来検版ツールのレポートより分かりにくいです。レポートのファイル名を見ると、OK、NGはすぐに分かるようにして欲しい。
----
修正内容::
* 検版レポート名を対応するPDFファイル名に修正
検版レポートの名前を、検版したPDFのファイル名＋実行した日時（年月日_時分）として出力するように修正。
* レポート名の接頭にOK/NGを付与
検版レポートの接頭に【OK】あるいは【NG】を付与し、エクスプローラー上から一目で検版結果を判断可能に修正。
（例：【NG】target.pdf【220317_1500】&1%1.pdf　←　target.pdfというファイルを2022年3月17日15時0分に検版し、その結果がNGだった場合のレポートファイル名）

== 修正後の動作分析（3/17）
処理時間::
[cols="4*", options="header"]
|===
|バージョン\ファイル数
|50ファイル
|100ファイル
|150ファイル

|前回配布時のツール
|0分36.98秒
|1分10.73秒
|1分42.97秒

|今回の修正版ツール
|3分31.97秒
|6分08.63秒
|9分03.73秒
|===

実行ボタンを押してから終了までの処理時間は、修正前からおよそ6倍の長さになった。これはPureVerifyを呼び出す回数と表示するコンソールが増えたためである（コンソールは処理終了から閉じるまでの間に数秒のsleepがあるため）。コンソールは前回ツールの時点で非表示にしてほしいとの要望が数件あり、今後の修正で非表示化することにより、もう少し時間を削減できる見込み（Pureverify内部の修正が必要）。一番削減を見込めるのは、1度のPureVerify呼び出しでPDFごとのレポートを生成することかなあと思います。

レポートの確認::
エクスプローラー上から一目でどのファイルがOK/NGなのか判別可能に。処理中であっても、出力先のフォルダをエクスプローラーで開いていれば、リアルタイムでOK/NGの判別が可能。名前の並び替えでOK/NGを一纏まりに表示できる。
image:tooldump1.png[]


以上
// end::sub[]


