ぽこひでブログ

ほのぼの大学4年をやってる [ぽこひで] の学生エンジニアブログ?

Rubyのclockworkを使って為替情報を定期的に取得

noob-programmer.hatenablog.com
前回、為替情報を取得したので、もうちょっと有用性をもたすために、定期取得を実装してみました。定期実行っていったらRubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例に書いてあったcronが一般的なのかなって思って使い方調べてみたらRubyにはclockworkっていうgemがあるみたいで、使いやすそうだったので、今回はこれを使いました!

gem install clockwork

で入れると、簡単にいれれて、実行例は

この検索上位に出てきたサイト2つを参考に。っていっても、思ったより簡単でした。clockworkの中身は一切見てないので詳しい実装方法はよくわかんないですが、基本的にはこれで動くようです。

#clock.rb
require 'clockwork'
include Clockwork

every(5.minutes, ' ') do
  #ここに5分おきに実現したい処理を書く
  puts "5分おきに処理されてまっせ"
end

以上!こんだけです。こんだけで、5分おきになんらかの処理をしてくれるコード出来上がり。恐ろしく簡単でした。実行方法は

#ruby clock.rbではなくて
$ clockwork clock.rb

で実行可能です。ただこれだけでは、端末を終了すると、定期実行と言っておきながら、中断されてしまうので、バックグラウンドで実行させるためにnohupコマンドと & を使います。

$ nohup clockwork clock.rb &

で実行できて、中止したいときは

$ ps -x | grep clock
$ kill [プロセスID]

でできるそうです。nohupコマンドは実行すると出力内容は全て、カレントフォルダ上にnohup.outというテキストファイルができてそこに保存されているはずです。

詳しい記法は下のサイトで確認してみてください。
tomykaira/clockwork · GitHub

ということで、以上の実行例をもとに前回のプログラムを改良してみるとこんな感じになりました。

require 'open-uri'
require 'json'
require 'clockwork'
include Clockwork

every(5.minutes,'fx-rate') do 
	html = open('http://www.gaitameonline.com/rateaj/getrate').read
	json = JSON.parse(html)['quotes']
	#ある時間帯の為替情報を国ごとに取得
	now = Time.now.strftime("%Y/%m/%d %H:%M:%S")

	#各データのテキストに書き込む。
	json.each do |data|
  		filename = 'fx-rate/' + data['currencyPairCode'].downcase + '.txt'
  		File.open(filename,'a') do |f|
  		#f.puts "日時,高値,安値,始値,ASK,BID"
  		f.puts "#{now},#{data['high']},#{data['low']},#{data['open']},#{data['ask']},#{data['bid']}"
  		end  
	end
	puts "#{now}に取得完了"
end

中身は全く変わってなくて、為替取得した時のプログラムをevery(5.minutes, 'fx-rate') do ~~~~ endでかこっただけ。 中身の処理も前回みたいに出力するだけじゃなくて、5分おきに為替情報を取得するために、各通貨ペアごとのtxtファイルに為替情報を追加していく感じにしました。
これを

$ nohup clockwork clock.rb &

で実行して、いまこの記事書いてる最中も実験で実行しているとこです。これで試験的にデータを1日分集めて、実際に今度はグラフにでもしてみよっかなーって思ってます。ではでは