開発
インストールにあるネイティブ依存関係を導入し、次を実行します。
shards install --frozen
crystal spec spec
ameba
crystal tool format --check src spec examples
CIはUbuntu、macOS、Windows UCRT64でビルドします。UIのsmoke testはグラフィカルセッションで実行します。
crystal run scripts/ui-smoke.cr
アイコンはassets/d4-plot.pngを透明背景の正方形PNGに置き換え、ImageMagickを入れてbash scripts/refresh-icons.shを実行します。macOSアイコンはパッケージ時に生成します。
ガイドのスクリーンショット
buildワークフローはWindows・macOS・Linuxで通常のd4-plot実行ファイルをビルドし、
その実行ファイルをkojix2/window-screenshot-action@mainで撮影します。
撮影用アプリを別途コンパイルすることはありません。ビルド完了後にdocsワークフローを
呼び出し、画像アーティファクトからサイトを生成します。docs側でCrystalを導入したり、
アプリを再コンパイルしたりする処理はありません。
各OSで日英の全体表示・拡大表示・D4作成画面を生成し、
screenshots/<windows|macos|ubuntu>/<en|ja>/に保存します。
READMEとガイドには3 OS分を比較表で掲載します。
撮影モードはリポジトリのルートにあるspec/fixtures/rust-multitrack.d4を読み、
一時的なBEDとBAMを生成します。読み込み完了後に対象ウィンドウを表示し、
Actionが撮影とプロセス終了を担当します。
ビルド済みの実行ファイルで確認する場合は、グラフィカルセッションで リポジトリのルートから実行します。
D4_PLOT_SCREENSHOT_SCENE=overview bin/d4-plot
D4_PLOT_SCREENSHOT_SCENE=inspect D4_PLOT_SCREENSHOT_LOCALE=ja bin/d4-plot
D4_PLOT_SCREENSHOT_SCENE=create-d4 bin/d4-plot
WindowsではPowerShellで同じ環境変数を設定してbin/d4-plot.exeを実行します。
Actionから引数なしで起動する場合は、同じ実行ファイルをguide-overview、
guide-inspect、guide-create-d4という名前でコピーし、
D4_PLOT_SCREENSHOT_SCENE=autoで画面を選びます。
環境変数を設定しない通常の起動動作は変わりません。
ログ
LOG_LEVEL=DEBUGで読み取り方式、キャッシュ、取消、パス、座標、バックトレースを記録します。LOG_LEVEL=NONEで無効化します。初期値はINFOです。デスクトップ版はd4-plot-<process-id>.logを次へ保存します。
- Windows:
%LOCALAPPDATA%\D4 Plot\logs、次に%APPDATA%、ホーム - macOS:
~/Library/Logs/D4 Plot - Linux:
$XDG_STATE_HOME/d4-plot/logs、未設定時は~/.local/state/d4-plot/logs
サーバーのログは標準エラー出力、URLとヘルプは標準出力です。D4_PLOT_LOG_FILEでどちらの実行ファイルも保存先を指定できます。約5 MiBでローテーションし、2世代を保持します。過去のプロセスのログは手動で削除します。ファイルを開けない場合は標準エラー出力へ切り替えます。
ファイル読み込みとHTTPにはrequest_id、変換とバックグラウンド書き込みにはjob_idを使います。HTTP応答にはX-Request-IDがあります。DEBUGログにはパス、トラック名、座標が含まれるため、共有前に確認してください。接続トークン付きURLはログに残しませんが、標準出力のURLは接続に使用できます。
上限付きログキューが満杯になると新しいログを破棄し、log.entries_droppedで報告します。通常終了時は受理済みログを書き出しますが、強制終了では失われる場合があります。
UIスレッド
UIng.mainはネイティブUIスレッドで動き、30 msごとにworkerの結果を取り込みます。ネイティブcallbackでファイルI/O、sleep、channel待機、worker joinを行わないでください。yieldしたfiberが別のOSスレッドで再開する可能性があります。
起動時の読み込みはウィンドウ作成前にUIRuntime.loadを使います。書き込みとIGV DesktopへのHTTP通信はBackgroundIOへ送り、結果をUIスレッドのpollで反映します。受理済み書き込みはUI破棄後に完了まで待機します。IGV DesktopのHTTP 204応答には本文がないため、body_ioを読まずに処理します。