sidetech

(元)インフラエンジニアの寄り道メモ。

System Answer G2でJSONデータの取得練習

今回のネタは特にSystemAnswerG2ではなくてもよくて、私の頭の体操の為にやってみているだけなのですが、最近は何かと「API」だの「REST API」だの「JSON」だのと聞きます。

何時頃からXMLからJSONに変わってきた?変わってない?ここら辺がソフト屋でもないもんでインフラ屋はちょっと疎いですよね[E:coldsweats02]

先日、AWSのCloudWatchのデータをJSONフォーマットで抜き出したりもしましたが、どうやらJSONは勝手を覚えておいた方が良さそうです。

なので、API公開しているもので、数値でありながら面白そうなJSONデータが無いかな~?と探していましたら、ありました。

為替情報です。全くもってFXとかやる軍資金もないので口座開設しないと利用できないAPIは扱えないのですが・・・一般公開?されているAPIってボチボチあるんですね。1回コツを覚えておけば応用は出来るでしょう。

で、どうせなら取得したものをグラフにしてしまえと、最近なんでも受け皿にされているSAG2にデータを取りこんでみます。今回の主旨はJSONデータの取り出し・加工の勉強なんで、始値終値・売り値・買い値などなど拘らず、どちらにせよSAG2ではローソクの表現は出来ませんので、まぁ将来的に「色々なAPI情報の取得を汎用的に出来る様に」という道筋が出来る程度で良い感じでやってみます。

言語は手っ取り早く・・・Perlで書きます。ボチボチほかの言語も慣れないとかな?
で、色々と全部自分で解析して書くのは面倒なんで

#yum install perl-JSON

と、モジュールを突っ込んでおきます。

データのソースとしては、外為オンラインさんが、JSONのデータを1秒単位で吐き出しているようなので・・・(心の中で)試験目的で突っつかせてもらいます。
取得方法は、困ったときは「curlを使う」と、誰かがささやいていた様な気がします。

で、あとは、JSONモジュールの使い方を少し調べて…。

##################
###perlJSONのデータの取り出しサンプル
#!/usr/bin/perl -w
use JSON;

open (FAI, "curl -s http://www.gaitameonline.com/rateaj/getrate |") || die "value=$!";
while (<FAI>) {
$fai_data = $_;
};
close (FAI);

my $items = JSON->new()->decode($fai_data);
my @data = $items->{quotes};

print "ASK=".$data[0][20]->{ask}."\n";
##################
while文の所はかっこ悪いですが、使い回し楽なもんで[E:coldsweats01]

苦労したのは多次元配列にどのように入るのかピンとこなくて。
JSONのデータは、どうやら配列の格納時に考えないといけないようですね。これは他にもデータを見てみないとかな…。

で、取り出してみた結果・・・。

Sag2finance_2
一応、1分周期ではなく5分周期で取得しています。ただ、何銭が動いているだけなので、少しグラフの表現が苦しそうです。

SAG2は、1コマンド1取得という仕組みなので、例えば今回の様な1度に色々な数字が取れる場合でも、4項目あったら4コマンドを発行させる形になるので、少々先方に無駄にアクセスさせることになってしまいます。
その為、今回は1項目だけのサンプルになりますが、例えばcronでAPIをスケジュール取得させておいて、その取得データを舐めるような仕様にすれば、無駄にAPIを突きに行かなくて済みます。あとは、ローカル環境で、要素を合わせた再計算をさせてからデータを吐きたいなどもあるかもしれないので、一時的にローカルでデータ成型するのもありかもしれません。

そうそう、APIで気を付けなければならないのは、API側も猛烈に連続取得されるのは都合悪かったりする場合もあるんで、再取得タイミング調整をする機構が実装されていたりとかもあるので注意しなければならんすね。