携帯で見れる各国指数ページの作成方法
sorry Japanese only
PAGE作成日 2008/10/12
最終更新日 2008/11/25
page size = Mbyte

各国の指数が見られるページは数多くあれど、携帯で見られるページは非常に少なく、ページを表示した時のパケット数が少ないページはまずありません。

ということで自分で作ってみました。

        昨日  本日   騰落
N225    0  8567 ↓0%
TOPIX    0   726 ↓0%
USD     0.0  78.3 ↓0%
上海A   0  5709 ↓0%
SSE50   0  1390 ↓0%
ハンセン   0 13002 ↓0%
H株     0  10029 ↓0%
SENSEX  0  19967 ↓0%
RTS      0   1549 ↓0%
XU100  0 57035 ↓0%
FTSE    0  5690 ↓0%
DJI     0  12647 ↓0%
EWZ     0.0  66.2 ↓0%
BVSP   0 69386 ↓0%

JAL      0   1 ↓0%
ANA      0   180 ↓0%
シチズン    0   430 ↓0%
1309   0 15680 ↓0%
SBショクヒン  714   714 ↓0.0%

最終更新 08-14 03:43 376755

このようなテキストのみでパケット数が少なく、携帯向けのページを作成する方法です。



この QRコードにアクセスすると実際にページが表示されますが、約 1300byte、1パケットは 128byteですから、約 10パケットで指数の確認ができます。
無駄にパケットを消費するアイコン、見やすくするための左詰め、右詰めなどをしていません。
色分け(上がった時は赤、下がった時は緑)を無くすともっと少なくなるんですけどね。

このページを表示するには、大まかに分けると 4つの部分に分かれます

(1) Mysqlのテーブル作成
(2) 指数や株価を hp上から取得して Mysqlへ入れ込む shスクリプトの作成
(3) shスクリプトを一定時間で動かす crontabの設定
(4) ページにアクセスした時、Mysqlよりデーターを抽出して最新の情報を表示する PHPページの作成

それと、他の指数表示ページには無い機能として、
(5) ページにアクセスした時、最新の情報を取得するページの作成
という機能を備えたページも作ってみました

(1) Mysqlテーブルの作成

どのような情報を Databaseに蓄積していけば良いかを考えると、

id
分類 (株か指数か)
名前 (N225とか)
日付
時間
価額

この 6項目を、私は蓄積していくことにしました
(今になって思うと、分類は不要でしたが)

これらを Mysql内に蓄積できるよう、フィールドを作成します
ちなみに、私が使っている mysqlは 4.1.21-standardです

[root]# mysql -u root -p
Enter password:hogehoge
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 468253 to server version: 4.1.21-standard

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+------------------+
| Database         |
+------------------+
| COUNTER_DB       |
| blog_data        |
+------------------+
2 rows in set (0.00 sec)
今のところ、ページのカウンターに使っている COUNTER_DBと、Word Pressのブログ用 blog_dataが登録されています

ここに、
mysql> create database kabu;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+------------------+
| Database         |
+------------------+
| COUNTER_DB       |
| blog_data        |
| kabu             |
+------------------+
3 rows in set (0.00 sec)
新しく kabuという Databaseを作成します

この kabuという Databaseの中に、蓄積したい Fieldを作成していきますが、kabuという Databaseを作る時は何も考える必要はありませんでしたが、その中に Fieldを作る時は、テキスト型とか日付型など、各テーブルのデーター型と、それぞれのレコードをどのぐらいの大きさ、レコード長を考えて作らなければなりません
それでは Fieldを Tableの中に作ります。Fieldは toushinという名前にしました

mysql> use kabu
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> create table toushin (id int unsigned primary key not null auto_increment,bunrui varchar(5),name varchar(10),date date,time time,kagaku float) engine=MyISAM;
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+----------------+
| Tables_in_kabu |
+----------------+
| toushin        |
+----------------+
1 row in set (0.00 sec)

mysql> show fields from toushin;
+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| id     | int(10) unsigned |      | PRI | NULL    | auto_increment |
| bunrui | varchar(5)       | YES  |     | NULL    |                |
| name   | varchar(10)      | YES  |     | NULL    |                |
| date   | date             | YES  |     | NULL    |                |
| time   | time             | YES  |     | NULL    |                |
| kagaku | float            | YES  |     | NULL    |                |
+--------+------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

一気に話が進んでしまいましたが、
id - 整数型、Nullではダメ、自動で加算、(10)は 10ケタの意味?、42億までカウント可
bunrui - キャラクター型、5文字
name - キャラクター型、10文字
date - 日付型
time - 時間型
kagaku - 浮動小数点型

他にも色々な型や長さがありますが、こんな検索すれば良いでしょうか

このように作ったフィールドへ、N225から SB食品までの 19項目を、昼間は 15分間隔、夜間は 1時間間隔でデーターを蓄積すると、mysqlのディレクトリーは、1ヶ月で容量 700kbyteを消費します。

以上で mysqlのテーブル作成はおしまい

(2) 指数や株価を hp上から取得して Mysqlへ入れ込む shスクリプトの作成

各国の指数や株価を、色々な hpより getし、必要な部分だけに整形し、(1)で作ったフィールドへレコードを追加するシェルスクリプトです

データーを取得させてもらう hpは、個人のページとかではなく、なるべく大きな、yahooとかにします。
というか yahooさん、沢山アクセスさせてもらってます。
(Yahoo!プレミアム会員に入っているので許して下さい)

ということで、例えば日経225だったら、このページを使います --> Yahooファイナンスメインページ
このページの右の方に、日経225,TOPIX,米国ドルが表示されているので、この数値を mysqlへ登録できる以下の形式に変換します


insert into toushin (bunrui,name,date,time,kagaku) values ('ETF','N225',20070405,123951,17541.0);

N225を 2007年04月05日 12時39分51秒 17541円で登録。分類は ETF

quote.yahoo.co.jpのページソースから、この形式に変換を行うのは、以下の shスクリプトで変換します
#!/bin/sh
#

filename="/tmp/kabu.txt"          --(a)
mysqlpass="hogehoge"              --(b)

datej=`/bin/date +%Y%m%d`         --(c)
timej=`/bin/date +%H%M%S`

#
# N225
#
name="N225"
wget --quiet -O $filename "http://quote.yahoo.co.jp/"        --(d)
nedan=`grep -a "TOPIX" $filename | \
sed -e s/" "//g | sed -e s/"<b>"/" "/g | sed -e s/"<\/b>"/" "/g | \
awk '{print $4}'| sed -e s/","//g`                           --(e)

/usr/local/bin/mysql kabu -u root --password=$mysqlpass -e \
"insert into toushin \
(bunrui,name,date,time,kagaku) values \
('ETF','$name',$datej,$timej,$nedan)"                        --(f)

(a) wgetで取得するページのソースファイルのファイル名を指定
(b) mysqlのパスワードを書き込む
(c) 日付と時間を変数へ入れる。このオプションだと mysqlで使える形式になっている
(d) wgetでソースファイルを取得
(e) 日経225の指数値のみを、ページのソースファイルの中から sed,aws,grepなどを使って抽出する
(f) 抽出した指数値、日付、時間を mysqlへ書き込む

というようなことをやる shスクリプトを、getしたい指数、株価ごとに作成します
例えば上海Aは http://finance.cn.yahoo.com/q?s=000001.ss から数値を持ってきますが、そのスクリプトは 000001.ss.sh
ハンセン指数は http://hk.finance.yahoo.com/ から数値を持ってきて、スクリプトは HSI.sh
ANAの株価は http://quote.yahoo.co.jp/q?s=9202.t から数値を持ってきて、スクリプトは 9202.sh

なるべく最新のデーターを getできるよう、ダウだったら yahoo.comから、FTSE100(イギリスの指数)だったら yahoo.co.ukにアクセスして数値をもらってきた方が、shスクリプトの抽出部分を作るのは、どこから持ってこようが考えるのがとても大変なんだから、せっかく作るんだったら、最新のデーターがあると思われるところから持ってきた方が良いと思います(私はそうしてます)

(3) shスクリプトを一定時間で動かす crontabの設定

(2)で作った shスクリプトを crontabへ登録して、一定ごとに指数、株価を勝手に更新するようにします

細かく取得すればするほど良いような気もしますが、負荷や長期間に及ぶデーター取得で HDDパンク?なんてなるのも嫌なので、適度な時間間隔、昼間は 15分ごと、夜間は 1時間ごとで良いかな?と思い、crontabへ登録しました

まず 24時間を 3箇所に分けて
日本と時間が近い地域、日本、中国
インドやトルコなど
12時間ずれている EUやアメリカ
1,16,31,46 9-17 * * 1-5 /usr/local/bin/N225.sh
月曜から金曜(1-5)の 9時から17時(9-17)の 1,16,31,46分に N225.shを実行

2 0 * * * /usr/local/bin/N225.sh
日付変更の計算上、日付変わったすぐの 0時2分にデーター取得

3 18-23 * * 1-6 /usr/local/bin/XU100.sh
月曜から土曜(1-6)の 18時から23時(18-23)の 3分にデーター取得

5 18-23,0-9 * * 1-6 /usr/local/bin/DJI.sh
月曜から土曜日(1-6)の 18時から23時と0時から9時(18-23,0-9)の 5分にデーター取得

という設定を crantabに書き込みます

(4) ページにアクセスした時、Mysqlよりデーターを抽出して最新の情報を表示する PHPページの作成

ページを表示すると、パケット数は 10パケット 1300byte程度しかありませんが、そのページを作るソースファイルは 20kbyteほどあります

今日と昨日との比較を行う 1dページのソースファイルは 1d.htmlです

PHPのプログラム部分では、
現在の日本時間から、現地の前日最終時間を計算し最終価格を取得
それと本日の最終価格で騰落を計算して結果を body変数へ入れる。
1個終わったら、次の指数の計算をして body変数へ追加。
これを繰り返した後、最終日付とか時間を付け足して PHPによる mysqlの処理は終了

1d.htmlのソースファイルだと、コメントを含めて 576行目までが PHPの計算部分
この部分はバックグランドで計算するだけで実際のページにはなりません
実際に表示されるページ部分は、577行目の 1行だけです。
この最後の 1行で body変数の中に蓄えた各指数値を吐き出してページを作ります(となります)

で、1dページを作り終えて動作するようになって、こりゃ凄い!PHPから mysqlなんかラクラクだぜ!
と自分で感激していい気になって作った他のページ、例えば過去 1年間の最高価額と本日の価額を比較する max.htmlのソースファイルは max.htmlなんですが
どちらのソースファイルも、同じような処理をダラダラと繰り返し行っています。
非効率です
もしかしたら doループとかで一気に出来るのかもしれません。
いや、どう考えても出来そうです
しかし、各国の前日の計算をさせる部分でめげました。ややこしすぎです。
冬時間になったら、前日の計算がずれるだろうなぁ。

(5) ページにアクセスした時、最新の情報を取得するページの作成

こんなページを作っておくと、このページにアクセスした時 shスクリプトが実行できるようです

<html><head><meta name=CHTML><meta http-equiv=Content-Type content="text/html; charset=EUC-JP"></head><body bgcolor=black text=white><?php
$nowtime=date("Hi");

$o = `/usr/local/bin/USD.sh`;
if (($nowtime > 830)  and ($nowtime <1530)) $o = `/usr/local/bin/N225.sh`;
if (($nowtime > 2200) or  ($nowtime < 600)) $o = `/usr/local/bin/DJI.sh`;

?><meta http-equiv=refresh content="0;url=1d.html"></body></html>

なんで $oだったんだっけか・・?忘れてしまいました

おわり

10593
戻る