-
Notifications
You must be signed in to change notification settings - Fork 0
DevHRSoftUsingJVLinkToSQLite
ここでは、新しく競馬ソフトを開発する際、JVLinkToSQLite を使って JV-Data を SQLite データベースに変換し、活用するための手順を説明します。
- ビルド手順
- 設計のポイント
JVLinkToSQLite のビルドには、Visual Studio 2022 以降で、Professional エディション相当の機能を持つ開発環境が必要になります。競馬ソフトであれば、基本的に「個人開発」が想定される使用シナリオになるはずですので、こちらのページから無料のコミュニティ エディションを入手し、使用することが可能です。
Windows 向けのパッケージ マネージャーとして Chocolatey をインストールします。
Chocolatey のインストールが終わっていれば、以下の手順でインストール可能です:
- 管理者権限で PowerShell を実行します。
- 以下のコマンドを投入します:
PS C:\> choco install nuget.commandline -y
NuGet CLI リファレンス 等を参考にインストールし、パスを通しておく方法でもかまいません。
Chocolatey のインストールが終わっていれば、以下の手順でインストール可能です:
- 管理者権限で PowerShell を実行します。
- 以下のコマンドを投入します:
PS C:\> choco install 7zip -y
7-Zip の公式サイト等からダウンロード、インストールしていただく方法でも可能です。
JRA-VAN データラボの「ソフト登録の流れ」に従い、作者 ID とソフトウェア IDを発行しておきます(未発行の場合でも手順は進められますが、最終的には発行した各種 ID をお使いください)。
- JVLinkToSQLite のソース コードを clone するなどして取得します(以下、
C:\git\JVLinkToSQLite
フォルダに取得したものとして説明しています)。 - 「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>
- 「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を生成します:
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>
- 発行した作者 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>
- ビルド結果は、
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 によるノード選択と、<
や >
をエスケープしない更新機能を持っていますので、大抵のことはできると思います。
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 下でリリースを予定されているのであれば、ここにあるようなめんどう事を考える必要ありません!
- JVLinkToSQLite とは
- 簡単な使い方
- 動作設定の仕様
-
テーブルの仕様
- NL_TK_TOKUUMA テーブル
- NL_TK_TokuUmaInfo テーブル
- NL_RA_RACE テーブル
- NL_SE_RACE_UMA テーブル
- NL_HR_PAY テーブル
- NL_H1_HYOSU_ZENKAKE テーブル
- NL_H1_HyoTansyo テーブル
- NL_H1_HyoFukusyo テーブル
- NL_H1_HyoWakuren テーブル
- NL_H1_HyoUmaren テーブル
- NL_H1_HyoWide テーブル
- NL_H1_HyoUmatan テーブル
- NL_H1_HyoSanrenpuku テーブル
- NL_H6_HYOSU_SANRENTAN テーブル
- NL_H6_HyoSanrentan テーブル
- NL_O1_ODDS_TANFUKUWAKU テーブル
- NL_O2_ODDS_UMAREN テーブル
- NL_O3_ODDS_WIDE テーブル
- NL_O4_ODDS_UMATAN テーブル
- NL_O5_ODDS_SANREN テーブル
- NL_O5_OddsSanrenInfo テーブル
- NL_O6_ODDS_SANRENTAN テーブル
- NL_O6_OddsSanrentanInfo テーブル
- NL_WF_INFO テーブル
- NL_JG_JOGAIBA テーブル
- NL_UM_UMA テーブル
- NL_KS_KISYU テーブル
- NL_CH_CHOKYOSI テーブル
- NL_BR_BREEDER テーブル
- NL_BN_BANUSI テーブル
- NL_RC_RECORD テーブル
- NL_HN_HANSYOKU テーブル
- NL_SK_SANKU テーブル
- NL_BT_KEITO テーブル
- NL_DM_INFO テーブル
- NL_TM_INFO テーブル
- NL_CK_CHAKU テーブル
- NL_CK_KisyuChaku テーブル
- NL_CK_ChokyoChaku テーブル
- NL_CK_BanusiChaku テーブル
- NL_CK_BreederChaku テーブル
- NL_HC_HANRO テーブル
- NL_YS_SCHEDULE テーブル
- NL_HS_SALE テーブル
- NL_HY_BAMEIORIGIN テーブル
- NL_CS_COURSE テーブル
- NL_WC_WOOD テーブル
- RT_RA_RACE テーブル
- RT_SE_RACE_UMA テーブル
- RT_HR_PAY テーブル
- RT_O1_ODDS_TANFUKUWAKU テーブル
- RT_O2_ODDS_UMAREN テーブル
- RT_O3_ODDS_WIDE テーブル
- RT_O4_ODDS_UMATAN テーブル
- RT_O5_ODDS_SANREN テーブル
- RT_O5_OddsSanrenInfo テーブル
- RT_O6_ODDS_SANRENTAN テーブル
- RT_O6_OddsSanrentanInfo テーブル
- RT_H1_HYOSU_ZENKAKE テーブル
- RT_H1_HyoTansyo テーブル
- RT_H1_HyoFukusyo テーブル
- RT_H1_HyoWakuren テーブル
- RT_H1_HyoUmaren テーブル
- RT_H1_HyoWide テーブル
- RT_H1_HyoUmatan テーブル
- RT_H1_HyoSanrenpuku テーブル
- RT_H6_HYOSU_SANRENTAN テーブル
- RT_H6_HyoSanrentan テーブル
- RT_WH_BATAIJYU テーブル
- RT_WE_WEATHER テーブル
- RT_AV_INFO テーブル
- RT_JC_INFO テーブル
- RT_TC_INFO テーブル
- RT_CC_INFO テーブル
- RT_DM_INFO テーブル
- RT_TM_INFO テーブル
- RT_WF_INFO テーブル
- SY_PROC_FILES テーブル
- JVLinkToSQLite を使った競馬ソフトの開発