Skip to content

DevHRSoftUsingJVLinkToSQLite

Akira Sugiura edited this page Jan 13, 2024 · 8 revisions

ここでは、新しく競馬ソフトを開発する際、JVLinkToSQLite を使って JV-Data を SQLite データベースに変換し、活用するための手順を説明します。

  • ビルド手順
  • 設計のポイント

ビルド手順

前提条件

Visual Studio 2022 のインストール

JVLinkToSQLite のビルドには、Visual Studio 2022 以降で、Professional エディション相当の機能を持つ開発環境が必要になります。競馬ソフトであれば、基本的に「個人開発」が想定される使用シナリオになるはずですので、こちらのページから無料のコミュニティ エディションを入手し、使用することが可能です。

Chocolatey のインストール

Windows 向けのパッケージ マネージャーとして Chocolatey をインストールします。

NuGet コマンド ライン インターフェイス (CLI) のインストール

Chocolatey のインストールが終わっていれば、以下の手順でインストール可能です:

  1. 管理者権限で PowerShell を実行します。
  2. 以下のコマンドを投入します:
PS C:\> choco install nuget.commandline -y

NuGet CLI リファレンス 等を参考にインストールし、パスを通しておく方法でもかまいません。

7-Zip のインストール

Chocolatey のインストールが終わっていれば、以下の手順でインストール可能です:

  1. 管理者権限で PowerShell を実行します。
  2. 以下のコマンドを投入します:
PS C:\> choco install 7zip -y

7-Zip の公式サイト等からダウンロード、インストールしていただく方法でも可能です。

作者 ID、ソフトウェア IDの取得

JRA-VAN データラボの「ソフト登録の流れ」に従い、作者 ID とソフトウェア IDを発行しておきます(未発行の場合でも手順は進められますが、最終的には発行した各種 ID をお使いください)。

手順

  1. JVLinkToSQLite のソース コードを clone するなどして取得します(以下、C:\git\JVLinkToSQLite フォルダに取得したものとして説明しています)。
  2. 「Developer Command Prompt for VS 2022」を起動し、取得したフォルダに移動します:
**********************************************************************
** Visual Studio 2022 Developer Command Prompt v17.8.3
** Copyright (c) 2022 Microsoft Corporation
**********************************************************************

C:\Program Files\Microsoft Visual Studio\2022\Professional>cd "C:\git\JVLinkToSQLite"

C:\git\JVLinkToSQLite>
  1. 「Developer Command Prompt for VS 2022」内で PowerShell を起動します:
C:\git\JVLinkToSQLite>powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

PS C:\git\JVLinkToSQLite>
  1. 以下のコマンドを投入し、公開鍵と秘密鍵※1を生成します:
PS C:\git\JVLinkToSQLite> $rsa = New-Object System.Security.Cryptography.RSACryptoServiceProvider
PS C:\git\JVLinkToSQLite> $rsa.ToXmlString($false) | Out-File public.txt -Encoding utf8
PS C:\git\JVLinkToSQLite> $rsa.ToXmlString($true) | Out-File private.txt -Encoding utf8
PS C:\git\JVLinkToSQLite>
  1. 発行した作者 IDとソフトウェア ID、公開鍵(public.txt の内容)を指定し、Build.ps1 を実行します:
PS C:\git\JVLinkToSQLite> .\Build.ps1 -AuthorId '<ここに作者 ID を指定>' -SoftwareId '<ここにソフトウェア ID を指定>' -PublicKey '<ここに公開鍵を指定>'

・・・略

PS C:\git\JVLinkToSQLite>

なお、作者 ID とソフトウェア ID が未発行の場合は、オプションを何も指定せずに、Build.ps1 を実行してください:

PS C:\git\JVLinkToSQLite> .\Build.ps1

・・・略

PS C:\git\JVLinkToSQLite>
  1. ビルド結果は、work ディレクトリに出力されます。ここに生成される自己解凍形式のファイルは、簡単な使い方の「インストール」で扱う自己解凍形式ファイルと同等のものになりますので、以降はそちらと同等の扱いが可能です:
PS C:\git\JVLinkToSQLite> dir .\work\


    ディレクトリ: C:\git\JVLinkToSQLite\work


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/01/07     17:46        4092833 JVLinkToSQLiteArtifact_0.1.0.0.exe


PS C:\git\JVLinkToSQLite>

設計のポイント

以下の理由から、JVLinkToSQLite は、ライセンスとして GPLv3 を採用しています:

  • JVLinkToSQLite とは」に記載の通り、競馬ソフトの開発者が本来やりたいのは、予想理論の実装や支援機能の開発であり、独自性が強いデータを一般的な形式に変換することではないでしょう。そういった共通的な機能は、誰でも再利用できるよう、OSS になっていてほしいです。
  • しかし、OSS にするには、不自由なソフトウェア ライセンス部分※2が問題になります。コピー レフトではないオープン ソース ライセンスは、その条件の緩さからか、明確な両立ができません。これを解決するため、例えば、MIT ライセンスに独自の条項を加えている方などもいらっしゃいますが、独自ライセンスは一般的な理解が定まりにくいリスクがあり、やはり標準的なライセンスで対応できることが望ましいです。
  • この点、GPLv3 では、こういう不自由なライブラリを利用するソフトウェアを書くことも標準で考慮されており、追加の許可を認めるだけで、それが可能になるのです。

ただ、GPLv3 は、周知の通り「ウイルス性」や「ライセンス感染」などとまで呼ばれる強いコピー レフト性を持つライセンスです。もし、ご自分で実装される予定の競馬ソフトを、GPL 以外のライセンス下でリリースしたい場合は、JVLinkToSQLite とそのソフトが、別々のプログラムであり続けるよう設計をお願いします※3。考慮が必要になる以下のポイントをまとめましたので、参考にしてください:

  • プロジェクト構成
  • インストール
  • 実行
  • 動作設定の更新
  • SQLite データベースの使用

なお、具体的な例として、JVLinkToSQLite を使った競馬ソフトのサンプルも公開していますので、併せて参考にしていただければと思います。

プロジェクト構成

GNUライセンスに関してよく聞かれる質問」の「「集積物」とそのほかの種類の「改変されたバージョン」の違いは何ですか?」にある通り、JVLinkToSQLite が、ご自分で実装される予定の競馬ソフトにとって単なる「集積物」と見做せるのであれば、全体を GPL にする必要はありません。これを実現するには以下のような考慮をしておくと良いでしょう:

  • JVLinkToSQLite のソース コードを、自分の競馬ソフトの *.sln*.csproj 内に混ぜ込まない
    • 素のまま置いておくと、予期せず開いて内容を参照してしまうリスクがあるため、zip 等で固めてしまっておくのが吉
  • ビルド成果物を丸々配置する
    • 内容の取捨選択をしようとすると、やはり内部構造を知り、後述の細かな制御をすることに繋がってしまうため、上記手順でできあがった自己解凍形式のファイルを、丸々抱えてしまうと良い

インストール

プロジェクト構成に従い、自己解凍形式のファイルを丸々抱えるのであれば、あとはどこかのタイミングでその exe をキックし、展開すればインストールは完了します。サンプルでは、何かしらの処理をする前に毎回チェックする形にしていますが、インストール スクリプトに混ぜ込む、初回起動時に処理する等でも良いと思います。

実行

JVLinkToSQLite を「コマンドライン引数を使って実行し、標準出力をログ エリアに表示しつつ、終了を単純に待ち合わせる」ような形にすると良いでしょう。

実行状況の進捗のわかりやすさのため、JVLinkToSQLite は多くの標準出力を吐き出しますので、「それを使えばもっと細かな制御を行えるのでは?」と考えてしまうかもしれませんが、それは避けてください。プロジェクト構成で挙げた FAQ にも「コマンドライン引数が使われるときには、モジュールは通常別々のプログラム」「しかし、コミュニケーションが親密な場合は、より大規模なプログラムに結合されていると考えうる」旨の記載があります。

ちなみに、この「コマンドライン引数を使って実行し、標準出力をログ エリアに表示しつつ、終了を単純に待ち合わせる」には、お決まりのイディオムがありますので、JVLinkToSQLite を使った競馬ソフトを作る際は、共通処理として一つ作っておくと便利です。以下はサンプルの処理から、そのイディオムを抜き出したものです:

int ExecuteProcess(string fileName, string arguments)
{
    var psi = new ProcessStartInfo();
    psi.FileName = fileName;
    psi.Arguments = arguments;
    psi.UseShellExecute = false;
    psi.RedirectStandardOutput = true;
    psi.CreateNoWindow = true;
    psi.WorkingDirectory = Path.GetDirectoryName(fileName);
    var p = Process.Start(psi);

    var task = p.StandardOutput.ReadLineAsync();
    while (!p.WaitForExit(1))
    {
        if (task.IsCompleted)
        {
            var line = task.Result;
            // ・・・ここで line をログ エリアに表示する処理を行う・・・
            task.Dispose();
            task = p.StandardOutput.ReadLineAsync();
        }
        else
        {
            Thread.Sleep(1);
        }
    }

    if (p.ExitCode != 0)
    {
        // ・・・ここで実行した結果がエラーだった時の処理を行う・・・
    }

    return p.ExitCode;
}

動作設定の更新

実行時と同様、コマンドライン引数経由で行ってください。サンプルでやっている通り、JVLinkToSQLite は、XPath によるノード選択と、<> をエスケープしない更新機能を持っていますので、大抵のことはできると思います。

SQLite データベースの使用

JVLinkToSQLite は、パフォーマンス向上のため、以下のパラメータで SQLite データベースを操作します:

PRAGMA MMAP_SIZE = 2147483648;
PRAGMA JOURNAL_MODE = MEMORY;
PRAGMA SYNCHRONOUS = OFF;
PRAGMA LOCKING_MODE = EXCLUSIVE;
PRAGMA ENCODING = "UTF-8";

従って、JVLinkToSQLite が実行中は、基本的に DB ファイルの読み込み/書き込みは許可されません。サンプルの通り、JVLinkToSQLite の実行が終わってから、DB ファイルを扱うようにします。

===============================================================================

※1)公開鍵は、公にするとあまりよろしくない情報を標準出力する際の暗号化に使われています。出力された行が Encrypted ~ のようになっていたら、以下の PowerShell スクリプトのように、秘密鍵を使って復号化が可能です:

$str = '…ここに暗号化された結果を入力…'

$rsa = New-Object System.Security.Cryptography.RSACryptoServiceProvider
$rsa.FromXmlString('ここに秘密鍵(`private.txt` の内容)を指定')
$data = [Convert]::FromBase64String($str)
$decryptedData = $rsa.Decrypt($data, $true)
[System.Text.Encoding]::UTF8.GetString($decryptedData)

※2)開発に必要な JRA-VAN Data Lab. SDK の「JV-Data構造体\C#版\JVData_Struct.cs」など。一般的に、ライセンスなしと呼ばれる、OSS にできないものになります。
※3)もちろん、ご自分で実装される予定の競馬ソフトも GPL 下でリリースを予定されているのであれば、ここにあるようなめんどう事を考える必要ありません!

Clone this wiki locally