RubyでJVLink2007年01月18日 01:58

JRAのDATA Lab
C++やらVBやらでプログラムするサンプルはあるけど
当然Rubyのサンプルは無い

Rubyにwin32oleがあってActiveXをRubyで使えるんのは
「るびま」で結構前に知っってたんで
DATA Labをwin32ole経由で使ってみたけどどうも引数渡しが発生するJVOPEN、JVREAD、JVGETSが使えない。

であきらめてたんだけど最近_invokeで書けばいいらしいことを知る。

んでJVLINKクラスをライブラリを作ってみた。
っといってもJVOPEN、JVREAD以外はほぼまんま
JVOPENのreadcount downloadcount,lastfiletimestampは
JVLINK.jvreadを行った後
JVLINK.readcount
JVLINK.downloadcount
JVLINK.lastfiletimestamp
で取得
JVREADのbuff,size,filenameは
JVLINK.rbuff
JVLINK.rsize
JVLINK.rfilename
で取得
rがついてるんはJVGETSの引数はgbuff...としたかったから
まぁJVGETSと共有にしても特に問題ないと思うけど

問題はJVGETSをまだ使えないこと
JVGETSはいろいろやって結局駄目だったorz
バイト型のポインタ配列はどうやって取得すればいいのやら

とりあえず全部ダウンロードするテストスクリプト
-----------------------------------------------
require "./jvlink.rb"
#JVLINKオブジェクトを作成
jvlink = JVLINK.new
DATASPEC[0].each do |dataspec|
puts "JVOpen:" + dataspec
fromtime = 19850101000000
if dataspec =="TCOV" or dataspec=="RCOV" then
option = 2
else
option = 4
end
rt = jvlink.jvopen(dataspec,fromtime,option,0,0,"" )
if rt==0 then
puts "readcount:" + jvlink.readcount.to_s
puts "downloadcount:" + jvlink.downloadcount.to_s
puts "lastfiletimestamp:" + jvlink.lastfiletimestamp.to_s
while jvlink.downloadcount!=jvlink.jvstatus()
sleep 0.3
end
jvlink.jvclose()
else
puts "JVOPENエラー:" + rt.to_s
jvlink.jvclose()
exit
end
end
jvlink.jvclose()
-----------------------------------------------
このスクリプトはLinuxでも使用可能(のはず)
その代わりWin版RubyをWine経由で使わないとwin32oleを使えないけどね~
インストールするならone click installer版のRubyが楽

ライブラリは以下のようなの
jvlink.rb
-----------------------------------------------
require "win32ole"
include WIN32OLE::VARIANT

class JVLINK
def initialize
@jvlink = WIN32OLE.new('JVDTLab.JVLink')
sid = "UNKNOWN"
@jvlink.jvinit(sid)
@jvlink
end
def jvinit(sid)#initializeでjvinitは実行しているので再実行しなくてもよい
@jvlink.jvinit(sid)
end
def jvsetuiproperties()
@jvlink.jvsetuiproperties()
end
def jvsetservicekey(servicekey)
@jvlink.jvsetservicekey(servicekey)
end
def jvsetsaveflag(saveflag)
@jvlink.jvsetsaveflag(saveflag)
end
def jvsetsavepath(savepath)
@jvlink.jvsetsavepath(savepath)
end
def jvopen(dataspec,fromtime,option,readcount,downloadcount,lastfiletimestamp)
jvopen = @jvlink.ole_method('JVopen')
rc = @jvlink._invoke(jvopen.dispid, \
[dataspec,fromtime,option, 0, 0, ''], \
[VT_BSTR,VT_BSTR,VT_INT,VT_I4|VT_BYREF,VT_I4|VT_BYREF,VT_BSTR|VT_BYREF])

@readcount = WIN32OLE::ARGV[3]
@downloadcount = WIN32OLE::ARGV[4]
@lastfiletimestamp = WIN32OLE::ARGV[5]
rc
end
def readcount
@readcount
end
def downloadcount
@downloadcount
end
def lastfiletimestamp
@lastfiletimestamp
end
def jvrtopen(dataspec,key)
@jvlink.jvrtopen(dataspec,key)
end
def jvstatus()
@jvlink.jvstatus()
end

def jvread(buff,size,filename)
jvread = @jvlink.ole_method('JVRead')
rc = @jvlink._invoke(jvread.dispid, [buff,size,filename],
[VT_BSTR|VT_BYREF,VT_I4|VT_BYREF,VT_BSTR|VT_BYREF])
@rbuff = WIN32OLE::ARGV[0]
@rsize = WIN32OLE::ARGV[1]
@rfilename = WIN32OLE::ARGV[2]
rc
end
def rbuff
@rbuff
end
def rsize
@rsize
end
def rfilename
@rfilename
end
#jvgetsは現在動かず
# def jvgets(buff,size,filename)
# gbuff=buff.unpack("c*")
# jvgets = @jvlink.ole_method('JVGets')
# rc = @jvlink._invoke(jvgets.dispid, \
# [gbuff,size,filename], \
# [VT_ARRAY|VT_VARIANT,VT_I4|VT_BYREF,VT_BSTR|VT_BYREF])
# @gbuff= WIN32OLE::ARGV[0].pack("c*")
# @gsize = WIN32OLE::ARGV[1]
# @gfilename = WIN32OLE::ARGV[2]
# rc
# end
#
# def gbuff
# @gbuff
# end
# def gsize
# @gsize
# end
# def gfilename
# @gfilename
# end

def jvskip()
@jvlink.jvskip()
end
def jvcancel()
@jvlink.jvcancel()
end
def jvclose()
@jvlink.jvclose()
end
def jvfiledelete(filename)
@jvlink.jvfiledelete(filename)
end
def jvmvcheck(key)
@jvlink.jvmvcheck(key)
end
def jvmvplay(key)
@jvlink.jvmvplay(key)
end

def m_saveflag
@m_saveflag
end
def m_savepath
@m_savepath
end
def m_servicekey
@m_servicekey
end
def m_jvlinkversion
@m_jvlinkversion
end
def m_totalreadfilesize
@m_totalreadfilesize
end
def m_currentreadfilesize
@m_currentreadfilesize
end
def m_currentfiletimestamp
@m_currentfiletimestamp
end
def parenthwnd
@parenthwnd
end
end

#dataspec
#蓄積系データ
TOKU = "TOKU" #特別登録馬
RACE = "RACE" #レース情報
DIFF = "DIFF" #蓄積情報
BLOD = "BLOD" #血統情報
SLOP = "SLOP" #坂路調教
YSCH = "YSCH" #開催スケジュール
TCOV = "TCOV" #特別登録馬補填情報
RCOV = "RCOV" #レース補填情報

#速報系データ
_0B12 = "0B12" #速報レース情報
_0B30 = "0B30" #速報オッズ(全賭式)
_0B31 = "0B31" #速報オッズ(単複枠)
_0B32 = "0B32" #速報オッズ(馬連)
_0B33 = "0B33" #速報オッズ(ワイド)
_0B34 = "0B34" #速報オッズ(馬単)
_0B35 = "0B35" #速報オッズ(3連複)
_0B36 = "0B36" #速報オッズ(3連単)
_0B20 = "0B20" #速報投票(全賭式)
_0B11 = "0B11" #速報馬体重
_0B14 = "0B14" #速報開催情報
_0B13 = "0B13" #速報データマイニング予想
_0B41 = "0B41" #時系列オッズ(単複枠)
_0B42 = "0B42" #時系列オッズ(馬連)
DATASPEC =
[
[TOKU,RACE,DIFF,BLOD,SLOP,YSCH,TCOV,RCOV],
[_0B12,_0B30,_0B32,_0B33,_0B34,_0B35,_0B36,_0B20,_0B11,_0B14,_0B13,_0B41,_0B42]
]
-----------------------------------------------

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://iik.asablo.jp/blog/2007/01/18/1120455/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。