2010-01-18[n年前へ]
■アプリケーション間を繋ぐRubyスクリプトを作るには?
Windows上で動くアプリケーション間を繋ぎたい、と思うことがあります。そんな例のひとつが、たとえば、こんなものになります。
それは、ハードウェアに繋がれたログファイルを定期的に吐き出すアプリケーションがあり、そのハードウェアの状況に応じて、他の制御アプリケーションを通じて他のハードウェアを制御したい、というような場合です。
そんな時、Rubyでこんな具合のスクリプトを組み、対応してしまうことがあります。hoge.txtは、「ハードウェアに繋がれたログファイルを定期的に吐き出すアプリケーション」が刻々出力を行っている「ログファイル」です。
require 'win32GuiTest' open("hoge.txt", "r") do |f| data=f.readlines[f.readlines.length-1] message=$1 if /^hoge:(.+)$/=~data @gui.sendKeys(message+'{ENTER}',1) endつまり、ログファイルの最後の行を読み込み、その出力結果を用いた何かの処理を行い、SendKeys(Win32guitest)で他の(異なる・あるいは同じハードウェアを制御するための)アプリケーションを操作する、という具合です。ここでは、単純のために、捜査対象ウィンドウを最前面に持ってきたり・フォーカスさせる、といった部分は端折っていますが、こんな「その場対応スクリプト」を書いてしまうことがあります。そんな風に対応せざるを得なかったりすることもあります。
ログファイルを出力できないアプリケーション1と、それと全く無関係の、他のアプリケーション2を繋ぐ場合には、どうすれば良いのでしょう。アプリケーション1のウィンドウを監視する・ウィンドウに対するメッセージをフックする、といったことをすれば良いのでしょうか・・・?
2010-03-02[n年前へ]
■ファイル末尾からn行目を高速に読み込むRuby関数
他アプリケーションが書き出すログファイルを、刻々Rubyで読み・内容に応じた処理をさせたい、と思う状況もままある、と思います。そんな時、ログファイルを逐一読むと時間がかかってしまうので、保存されているログファイルの末尾から2行目だけを読みたくなります。
ファイル末尾からなぜ2行目を読むかというとそれは、ファイル末尾行は書きだし中で、欲しい情報には十分ではない、というような理由です。そこで、Rubyで書いた「ファイル末尾からn行目を高速に読む」関数を、ここにメモしておきます。
この関数"tail"の引数は、
- filename:開きたいファイル
- line:末尾から何行目を出力する(返す)か
- readLength:末尾から何バイト(だけ)を読みこみ、処理させるか ら行目の内容を出力する、という具合です。
def tail(filename,line,readLength) ary=[] f=File.open(filename) begin f.seek(-readLength,IO::SEEK_END) rescue end while f.gets ary<<$_ end f.close return ary[ary.length-line] end while true puts tail(ARGV[0],1,64) sleep 1 endこのスクリプトを、tail.rbというような名前で保存し、
ruby tail.rb readme.txtとすれば、その瞬間に保存されているreadme.txtの下から2行目を出力し続ける、ということがされます。
Rubyで他アプリケーションのログファイルをリアルタイム監視して、何らかの動作・制御を行わせたい・・・という実に「ニッチ」な用途のスクリプトです。しかし、同じようなことをする状況の人も多いかもしれない、というわけで、今日は、ここにメモしておくことにします。