2008年7月28日月曜日

safari

Click証券ではsafariは使えない。。。

FireFox3入れたらちゃんとログインできた。

2008年7月7日月曜日

ssh

UbuntuへsshでMacから接続する

ssh-serverのインストール
sudo apt-get install openssh-server

安全のためsshで接続する

Macで鍵を生成する
ssh-keygen -t rsa -C "SSH2 RSA"

~/.ssh/へ秘密鍵id_rsa、公開鍵id_rsa.pubが作成される

公開鍵をUbuntuの~/.ssh/authorized_keyとして保存

sshサーバの再起動
sudo /etc/init.d/ssh restart

Macより接続する
ssh

2008年7月2日水曜日

MacBook

MacBook blackを買った。

アキバで146100円。通常より3万円以上OFF
せっかくなのでやったことのメモ

Ubuntuの共有をマウント
動画用コーディックの追加 Xvid、WMVはどうすればよいかまだ不明
写真、音楽のコピー
シェル等のコピー

mac rubyでもClick証券用発注ツールは動作した

今後試してみたいこと
DTrace
ZFS
Darwine

AppleというよりSunの技術ですな
Appleはパッケージングがうまいということかな

OSXは今のところ快調。
困ったことも特になし!!

2008年6月17日火曜日

FX 月曜日



金曜のNY市場の終値と月曜のオーストラリア市場の始値に乖離があった場合、
月曜日の値動きが金曜のNY終値に回帰することを狙って取引をする。

2002年の4月から現在までUSDJPYで検証したのでメモ。
ロスカットは-0.40pips

一回あたりの期待値 0.12
損益合計 38.57 pips
276:46(322)
勝率 85.7142857142857%

2008年5月24日土曜日

ボリンジャーバンド グラフ

ボリンジャーバンド入門を読んだ
ボリンジャーバンドはジョン・A・ボリンジャーによって開発され、
この本の著作者でもある

ボリンジャーバンドを描写するスクリプトをgnuplotで作成した
著者もgnuplotで作図していた

gnuplotを使うのは大学以来、ubutnuで使うとは思わなかった
sudo apt-get install gnuuplot

ボリンジャーバンドの計算は、rubyで標準偏差を計算し2σを使用

bash gnuplot.sh bollinger.dat out


gnuplot.sh
#!/bin/bash

INPUT=$1
OUTPUT=$2

gnuplot <<EOF
reset
set title "Bollinger Bands"
#set size 2.0, 2.0
set terminal png
set output "${OUTPUT}.png"
set xdata time
set timefmt "%m/%d%H:%M"
set format x "%m/%d %H:%M"
set title "Bollinger Bands"
set yrange [102.0:105.0]
set ytics (102.0, 102.5, 103.0, 103.5, 104.0, 104.5, 105.0)
#set xrange [50:253]
set lmargin 9
set rmargin 2
set grid
set logscale y
plot '$INPUT' using 1:2:4:3:5 notitle with candlesticks lt -1, \
'$INPUT' using 1:6 notitle with lines lt 1, \
'$INPUT' using 1:7 notitle with lines lt 1, \
'$INPUT' using 1:8 notitle with lines lt 1
EOF


bollinger.dat
05/2213:29 102.98 103.05 102.98 103.03 102.861904761905 103.000846339173 102.722963184637
05/2213:39 103.01 103.05 103.01 103.05 102.871904761905 103.032730014529 102.711079509281
05/2213:49 103.06 103.07 103.0 103.0 102.88 103.048878654657 102.711121345343
05/2213:59 103.04 103.1 103.02 103.08 102.892380952381 103.079880793624 102.704881111138
05/2214:09 103.07 103.13 103.07 103.11 102.907619047619 103.111472402901 102.703765692337
05/2214:19 103.1 103.13 103.1 103.11 102.923333333333 103.136531206948 102.710135459719


out.png


SMTP@Gmail

rubyからGmailを操作できるgmailerというライブラリが使えなくなった
Gmailがバージョンアップしたための模様

メールの自動送信ができなくなったので他の方法
セキュアなSMTPでGmailよりメール送信する
既にtlsmailと言うライブラリが公開されているのでrubygemsでインストールする
sudo gem install tlsmail

さらにそれをラップするメソッドを作った

require 'rubygems'
require 'tlsmail'
require 'time'

module Gmail
def Gmail.get_content(from_address, to_address, subject=nil, body=nil)
content = ""
content << "From: #{from_address}\n"
content << "To: #{to_address}\n"
content << "Subject: #{subject}\n"
content << "Date: #{Time.now.rfc2822}\n\n"
content << "#{body}\n"
return content
end

def Gmail.send(user, pass, from_address, to_address, subject=nil, body=nil)
Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE)
Net::SMTP.start('smtp.gmail.com', 587, 'gmail.com', user, pass, :login) { |smtp|
smtp.send_message(get_content(from_address, to_address, subject, body), \
from_address, to_address)
}
end
end

if __FILE__ == $0
Gmail.send("Gmailのアカウント", "パスワード", "送信元アドレス", "送信先アドレス", "sub", "test")
end


デメリットは、httpでないため会社では使えないことくらいかな
gmailerは良かった

2008年4月17日木曜日

app engine作ってみた

pythonでググりながらwebアプリケーションを作ってみました
はまったのはGQLという独自のDB操作です
データの更新の仕方がちょっとわかりにくかった

できたのはこんな感じーーー
http://cheekycoupling.appspot.com/

実現して欲しい機能
・スケジュールタスク機能
・ruby版
http://googleappengine.blogspot.com/

2008年4月8日火曜日

Google App Engine

googleの新しいサービスApp Engine.
DBも含めたWebアプリの実行環境を提供してくれるサービス.
http://code.google.com/appengine/

まずは、先着1万名までとのことなので早速申し込みましたが、
すでに順番待ちでした.

App Engineの開発環境(ローカルで開発するためのもの)のSDKは
Download可能でした.
http://code.google.com/appengine/downloads.html

Ubuntuで動かすためLinux/Other Platforms用のSDKをダウンロード.
取得したファイルを展開すれば開発準備完了です.

試しに簡単なWebアプリを作ってみる.
適当なディレクトリに次の2つのファイルを作成する.

1. 環境設定ファイル(YAML形式) - app.yaml
application: hello
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
script: hello.py


2. handlers:scriptで指定したファイル hello.py
import time

print ''
print 'Hello!!'
print ''
tm = time.localtime(time.time())
print time.strftime("%Y/%m/%d %H:%M:%S", tm)


準備はこの程度にして起動確認します.

実行は展開したファイル内のgoogle_appengine/dev_appserver.pyの引数に
自身で作成したファイルのディレクトリパスを与えて起動する.
オプションでポート番号などが指定可能でした.
$ ~/sdk/google_appengine/dev_appserver.py ./
WARNING 2008-04-08 23:28:08,144 __init__.py] Could not read datastore data from /tmp/dev_appserver.datastore
INFO 2008-04-08 23:28:08,147 __init__.py] Running application hello on port 8080: http://localhost:8080


http://localhost:8080にブラウザからアクセスしWebアプリの動作を確認する.
こんな感じで表示されました.
pythonはあまりいじったことがないので今はこんな程度です.
いろいろ面白いことができそうです.
Hello!!

2008/04/08 14:47:37

2008年4月7日月曜日

複利パワー

新生銀行の円定期預金は複利で0.8%くらい
あとで便利かと思いRubyで複利を算出するスクリプトを作成する

fuku.rb
puts "usage ruby #{$0} 元本 金利 年数"; exit 100 if ARGV.size != 3

puts "元本 #{ARGV[0]} 金利 #{ARGV[1]}% #{ARGV[2]}年"

base = ARGV[0].to_i
kinri = ARGV[1].to_f / 100.0
num = ARGV[2].to_i

k_sum = 1.0
1.upto(num) { |i|
k_sum *= (kinri + 1)
alt = base * k_sum
printf "%2d %8d\n", i, alt.to_i
}


元本100万円、金利0.8%、10年まで

script$ ruby fuku.rb 1000000 0.8 10
usage ruby fuku.rb 元本 金利 年数
元本 1000000 金利 0.8% 10年
1 1008000
2 1016064
3 1024192
4 1032386
5 1040645
6 1048970
7 1057362
8 1065820
9 1074347
10 1082942


元本100万円、金利10%、10年まで
script$ ruby fuku.rb 1000000 10 10
usage ruby fuku.rb 元本 金利 年数
元本 1000000 金利 10% 10年
1 1100000
2 1210000
3 1331000
4 1464100
5 1610510
6 1771561
7 1948717
8 2143588
9 2357947
10 2593742


やっぱ10%くらいのリターンが欲しいなぁ
ちなみに新生銀行は税引き後0.64%の金利だった
なんか今日は仕事する気分なんなかった。。。

2008年3月11日火曜日

モンテカルロでパイ


モンテカルロシュミレーションにより円周率(パイ)を算出するプログラム。
”まぐれ”という不確実性科学の権威が書いた本を読んでいて簡単に
円周率を出せるというのでやってみた。

適当な円に密接する四角形を描く。ダーツゲームのようにその四角内に矢をあてる。
円の内部に入った矢と四角形内の矢すべての比率が円周率となる。
なんでかはわかりそうだったが、考えてたら頭がいたくなった・・・

とりあえず検証ということでrubyのTKでリアルタイムに描写させようとしたらはまった。
乱数発生の精度が低かった模様。最初は0〜100で乱数生成したので。
その後、精度を0〜10000にしたら良い数値が得られた。
3.14に近づくには100万回くらい待たなければだめみたい。


require "tkclass"
require "tk"

OFFSET=10

$oval=0
$sque=0
$disp_hankei=100
$hankei=10000

module MonteCarlo
def MonteCarlo.plot(max_x=$hankei*2, max_y=$hankei*2)
x = rand(max_x+1)
y = rand(max_y+1)
[x, y]
end
end

label = TkLabel.new do
text("0")
pack()
end

$c = TkCanvas.new('width'=>($disp_hankei+OFFSET)*2, 'height'=>($disp_hankei+OFFSET)*2).pack

Oval.new($c,OFFSET+0,OFFSET+0,OFFSET+$disp_hankei*2,OFFSET+$disp_hankei*2)
Rectangle.new($c,OFFSET+0,OFFSET+0,OFFSET+$disp_hankei*2,OFFSET+$disp_hankei*2)

def plot
x2 = 2
bx, by = MonteCarlo.plot($hankei*2, $hankei*2)
x, y = bx, by

x = bx - $hankei
y = by - $hankei

bx = bx / 100
by = by / 100

if (x*x + y*y) < $hankei*$hankei
$oval += 1
dot = Oval.new($c,OFFSET+bx,OFFSET+by,OFFSET+bx, OFFSET+by, "outline" => "red", "fill" => "red")
else
dot = Oval.new($c,OFFSET+bx,OFFSET+by,OFFSET+bx, OFFSET+by)
end
$sque += 1
end

count=0
TkAfter.new(1, -1, proc do
count+=1
plot
pai = $oval.to_f/$sque.to_f * 4.0
label.text("#{count.to_s} #{pai.to_s}")
end).start

Tk.mainloop


リアルタイムで描写しないのであれば乱数を少数で生成して円でなく扇がたで考え
シュミレーションするとあっというまによい精度でできた。
$oval = 0; $sque = 1

def plot
x, y = rand, rand
$oval += 1 if (x*x + y*y) < 1.0
$sque += 1
end

1000000.times {
plot
}

pai = $oval.to_f/$sque.to_f * 4.0
puts "pai #{pai.to_s}"


出力
pai 3.14324485675514


正直この本は難解な箇所が多々ありまが、理解できるとおもろいです。

2008年2月16日土曜日

システムトレード

FX&日経225先物 システムトレード実践テクニックの本を買った。
Click証券であればシステム的には完全自動売買が可能となるので
試してみようかな。。。
以前、ちょっと試しましたが実践したらすぐバグをみつけそれ以来
止めてしまいました。

本はまだ、途中ですがシステムの検証(バックテスト)はエクセルを使って
やっているようです。OpenOfficeのスプレッドシートもそれなりに
使えますが、やっぱエクセルと比べると見劣りします。

ubuntuならやっぱゴリゴリとスクリプトで検証すべきでしょう

2008年2月13日水曜日

ネットワーク理論3

3万人にアクセスしスクリプトも順調に動作していましたが、
mixiに足あとのつけすぎと怒られました。

自分から30693人時点での結果です。

隔たり次数 0 人数 1
隔たり次数 1 人数 38
隔たり次数 2 人数 365
隔たり次数 3 人数 3716
隔たり次数 4 人数 26573

隔たり次数が2で365人というのは自分の友達は他人の友達という
ことで結構友人がかぶっているのではないかと思います。

この後の推移を見たかったのですがここで止めときます。
おそらくmixiもスモールワールドなんだと思いますが、
実証できなくて残念。

2008年2月12日火曜日

weather hack

天気予報で降水確率が40%以上だったら、傘忘れないでね〜メールを
携帯に送るスクリプトを作りました。

天気予報データからXMLでデータを取得する。
自分の住まいのエリアの1日分の降水確率で40%以上があれば
予報データを組み立て携帯へ送信する。

携帯へはgmailを利用。gmailerというrubyのライブラリが必要です。

後は、crontab or タスクリストへ朝自動で起動する用にしておくだけです。
rubyなのでサクッとできました。

require 'net/http'
require 'gmailer'
require 'rexml/document'

host="www.drk7.jp"
path="/weather/xml/14.xml"

user="gmailのID"
pass="gmailのパスワード"
cellphone="携帯のアドレス"

#降水確率の基準値 メール送るか送らないか
RAINFALL_RATE=40

resp = ""
Net::HTTP.version_1_2

Net::HTTP.start(host, 80) {|http|
response = http.get(path)
if response.code != "200"
raise HttpError, "Http Conection Error."
end
resp = response.body
}

send_flag=false

body = "傘!!\n"
body << "神奈川県東部\n"
doc = REXML::Document.new(resp)
doc.elements.each("./weatherforecast/pref/area/info") do |item|
if item.attributes["date"] == Time.now.strftime("%Y/%m/%d")
#and doc.elements.each("./weatherforecast/pref/area").attributes["id"] == "東部"
body << item.text("weather") + "\n"
body << "降水確率\n"
4.times do |i|
period = item.get_elements("./rainfallchance/period")[i].text
hour = item.get_elements("./rainfallchance/period")[i].attributes["hour"]
body << "#{hour} #{period}\n"
begin
send_flag = true if period.to_i >= RAINFALL_RATE
rescue
end
end
body << item.text("weather_detail") + "\n"
# 西部をスキップする
break
end
end

puts body

if send_flag
GMailer.connect(user, pass) do |g|
g.send(
:to => cellphone,
:subject => "weather hack",
:body => body)
end
end


メールのイメージ
傘!!
神奈川県東部
くもり時々雨
降水確率
00-06 --
06-12 60
12-18 50
18-24 30
北の風のちやや強く海上では後北の風強くくもり朝から昼過ぎ雨

2008年2月10日日曜日

FX@ターミナル


Click証券が提供するFXトレード用のWEB API自作クライアントが実際に
使えるようになりました。現在は成行約定、成行決済、IFO注文、レート取得、
建玉取得だけできます。Click証券のWebページからトレードするよりはすばやく
トレードできます。
Rubyのカーセスの勉強にもなりました。

2008年2月9日土曜日

ネットワーク理論2

mixiへ再びアクセスできるようになりました。
隔たり次数がすぐに上がってしまうバグもあったので修正しました。

mixiのユーザ件数は1000万くらいだったので、スクリプトを途中で
止めた場合に内容をダンプする機能を付け加えました。

あと、アクセスする間隔は2秒が最適のようです。
メモリーが最後まで足りるかは?です。すべてのユーザにアクセスする
には先が長そうです。

途中経過(6千人程度)です。
隔たり次数 0 人数 1
隔たり次数 1 人数 38
隔たり次数 2 人数 365
隔たり次数 3 人数 3716
隔たり次数 4 人数 1832
全人数 5952

list.yaml
"自分のMIXIのID": 
:url: http://mixi.jp/show_friend.pl
:flag: false
:depth: 0


スクリプト
require 'rubygems'
require 'mechanize'
require "yaml"

username = '<メールアドレス>'
password = '<パスワード>'

agent = WWW::Mechanize.new
page = agent.get('http://mixi.jp/')
form = page.forms[0]
form.fields.find {|f| f.name == 'email'}.value = username
form.fields.find {|f| f.name == 'password'}.value = password
form.fields.find {|f| f.name == 'next_url'}.value = '/home.pl'
page = agent.submit(form, form.buttons.first)


def url()
a = nil; id = ""
$list.each do |k,i|
if i[:flag] == false
if a == nil
a = i; id = k
end
if a[:depth] > i[:depth]
a = i
id = k
end
end
end
id
end

def set(id, url, depth)
if !$list.key?(id)
a={:url=>url,:depth=>depth,:flag=>false}
$list[id] = a
end
end

def output_data
result = {}

$list.each do |k,v|
depth = v[:depth]
if result.key?(depth)
result[depth] += 1
else
result[depth] = 1
end
size = v[:list].size if v[:list] != nil
puts "#{k} #{size} #{v[:flag]} #{depth}"
end

result.each do |k,v|
puts "隔たり次数 #{k} 人数 #{v}"
end
puts "全人数 #{$list.size}"
end

$list = YAML::load(File.open("list.yaml").read)

Signal.trap('INT') do
output_data()
YAML.dump($list, File.open("list.yaml", 'w'))
exit 0

end

while (id = url()) != nil
$list[id][:list] = []
depth = $list[id][:depth] + 1
diarylist = agent.get($list[id][:url])
diarylist.links.each do |link|
if link.href =~ /show_friend.pl\?id\=(\d+)/
friend_id = $1.to_s
url = "http://mixi.jp/" + link.href
$list[id][:list] << $1
set(friend_id, url, depth)
end
end
$list[id][:flag] = true
puts "#{id} size #{$list.size}"

#中間報告
output_data() if rand(50) == 20
sleep 2
end

output_data()



本はこれです。

ネットワーク理論

ネットワーク理論の本を読んでます。

新ネットワーク思考—世界のしくみを読み解く(LINKED: The New Science of Networks)

有名なのはケビン・ベーコンゲームというものでケビン・ベーコンと他のハリウッド俳優は
少なくとも2人の共演者で繋がっているという法則。これはハリウッドの世界だけでなく
世界中の人々もすくなくとも6人の友人で繋がっている。自分と福田総理、自分とアフリカの
誰かとも6人の友人を通じてその人にたどり着けるというもの。
これは6次の隔たりと呼ばれています。

そこで思ったのがmixiはどうなってるんだろう?何次の隔たり?
スクリプトを作って検証しようと思いました。

require 'rubygems'
require 'mechanize'

username = '<メールアドレス>'
password = '<パスワード>'

agent = WWW::Mechanize.new
page = agent.get('http://mixi.jp/')
form = page.forms[0]
form.fields.find {|f| f.name == 'email'}.value = username
form.fields.find {|f| f.name == 'password'}.value = password
form.fields.find {|f| f.name == 'next_url'}.value = '/home.pl'
page = agent.submit(form, form.buttons.first)

$list={}
h={}
h[:url] = 'http://mixi.jp/list_friend.pl'
h[:flag] = false
h[:depth] = 0
$list["mixiのid"] = h

def url()
res=nil
$list.each do |k,i|
if i[:flag] == false
i[:flag] = true
return k
end
end
nil
end

def set(id, url, depth)
if !$list.key?(id)
a={:url=>url,:depth=>depth,:flag=>false}
$list[id] = a
end
end

while (id = url()) != nil
#break if $list.size > 100

$list[id][:list] = []
depth = $list[id][:depth] + 1
diarylist = agent.get($list[id][:url])
diarylist.links.each do |link|
if link.href =~ /show_friend.pl\?id\=(\d+)/
friend_id = $1.to_s
url = "http://mixi.jp/" + link.href
$list[id][:list] << $1
set(friend_id, url, depth)
else
# puts "not mutch"
end
sleep 1
end
puts "size #{$list.size}"
end

result = {}

$list.each do |k,v|
depth = v[:depth]
if result.key?(depth)
result[depth] += 1
else
result[depth] = 1
end
size = v[:list].size if v[:list] != nil
puts "#{k} #{size} #{v[:flag]} #{depth}"
end

result.each do |k,v|
pust "隔たり #{k} 人数 #{v}"
end


結果はアクセスし過ぎで接続不可になってしまいました。
sleepの時間を調節しないとダメみたいです。

間隔を空けない連続的なページの遷移・更新を頻繁におこなわれていることが見
受けられましたので、一時的に操作を停止させていただきます。申し訳ございま
せんが、しばらくの間お待ちください。

2008年2月4日月曜日

SG アラブファンド

今日、ソシエテゼネラルのSG アラブファンドを購入したので、
基準価格を取得するスクリプトを作成しました。
これをcrontab(windows ならタスク)で自動起動させ結果を
gmailで飛ばすとかなり便利です。rubyではgmailerという
ライブラリがすでにあります。
私はこれで毎朝、携帯に全投資信託の基準価格を送信して
一喜一憂しております。

実行時はソースファイルをsjisで保存。
ruby sg.rb

ソース sg.rb
require 'uri'
require 'net/http'

$KCODE="s"


class HttpError < StandardError; end

class Sg

SG_URL = 'http://www.sgam.co.jp/html/kagaku01.htm'
attr_reader :day, :value, :diff

def initialize
@data = self.get(SG_URL)
self.parse
end


def get( url, query=nil )



target_uri = URI.parse( url )

resp_data=nil

path = target_uri.path

if query != nil

path = path + '?' + query

end



Net::HTTP.version_1_2

Net::HTTP.start(target_uri.host, 80) {|http|
req = Net::HTTP::Get.new(path)
response = http.request(req)

if response.code != "200"

raise HttpError, "Http Conection Error."

end
resp_data = response.body
}

if resp_data == nil

raise HttpError, "Http Receive Error."

end

resp_data

end

def parse

regex = %r{

<!--Date-->
¥s+([\d\/]+)
¥s+現在</font></p>
¥s+</td>
¥s+</tr>
¥s+</table>

}xs
# 日付を取得
@day = $1 if @data =‾ regex

regex = %r{
<tr>
¥s+<td>¥s<a¥shref=141005_arab_m.html¥starget=¥'_top¥'>SG¥sアラブ株式ファンド</a>¥s</td>
¥s+<td¥salign=center¥snowrap>¥s([¥d¥,]+)¥s</td>
¥s+<td¥salign=center¥snowrap>¥s([¥d¥-¥+]+)¥s</td>
¥s+<td¥salign=center¥snowrap>¥s[¥d¥,]+¥s</td>
¥s+</tr>
}xs

# 日付を取得
if @data =~ regex
@value = $1; @diff = $2
else
raise "ERROR 解析失敗"
end

end

end

if __FILE__ == $0
sg = Sg.new
puts "SG ARAB #{sg.day} #{sg.value} #{sg.diff}"

end


実行結果
$ ruby sg.rb
SG ARAB 2008/2/4 10,029 25

2008年2月2日土曜日

ターミナルでFXトレード


ターミナルからClick証券の発注を行うプログラムを作成しました。
画像はgnome-terminalをキャプチャーしたものです。
テスト中でレートはClick証券のLocal APIサーバより取得してます。

RubyのCursesを使って画面を制御。数秒間隔で外為レートと自分の
建玉一覧を取得します。発注はコマンドで行えるように実装しました。
下のようなイメージでプライスオーダー(po)、買い(logn)の意味です。
rateはオプションで指定可。
> po long [rate]

通貨指定は環境変数のような扱いにしてます。set PAIR=USDJPYで変更できる
ようにしたい。まだ、実装はできてないですが。
もっと簡単に取引出来るようにしたい。リストで注文の候補をだしリスト番号の1を
コマンド入力すると発注の要求をだす感じで。。。

RubyのCursesは始めて使ってみたのですが結構苦戦しました。カーソルの
制御の仕方にてこずりました。
GUIがいろいろとある中、あえてカーセスを使ってみました。少し新鮮かも。

2008年1月16日水曜日

rubyでexcelのデータをブロックでもらう

windowsで結構使えます。
rubyの配列感覚でexcelのデータが扱える。

早速google-code-prettifyでソースコードを表示します。
require 'win32ole'

module Excel
def Excel.each(file)
excel = WIN32OLE.new('Excel.Application')
excel.displayAlerts = false
book = excel.Workbooks.Open(File.expand_path(file))
begin
book.Worksheets.each do |sheet|
sheet.UsedRange.Rows.each do |row|
record = []
row.Columns.each do |cell|
record << cell.Value
rescue e
p e.backtrace
STDERR.puts e.message
ensure
book.Close
excel.Quit
end
end
end

if $0 == __File__
Excel.each(ARGV[0]){ |row|
p row
}
end

google-code-prettify

google-code-prettifyを使いblogger上でソースコードを綺麗に
表示する方法があることがわかったのでメモ。

マイコミ ジャーナルのを参考にgoogle-code-prettifyを設定した

ソースコードに長い行があると途中で文字が隠れてしまう。
自動でテキストエリアにするには以下のコードをHTMLに追加する必要がある

<style TYPE="text/css">
<!--
.prettyprint .tag { margin: 0; padding: 0; }
pre {
overflow: auto;
background-color: #FFFFFF;
display: block;
padding: 5px 10px;
border-style: dotted;
border-width: 2px;
-->
</style>

投資信託の基準価格をスクレイピング

スクレイピングとはHttp/XMLが整っていないWeb環境で必要なデータを取得するための
技術を指す。要するに強引に必要なデータだけをHTMLから取得すること。最近知った言葉。

新生銀行で取り扱っている投資信託の基準価格をスクレイピングにより取得する
rubyにより実装してみる。対象のHTMLは下記のURI

http://qweb6.qhit.net/i_users/shinseibank/qsearch.exe?F=users/shinseibank/fundlist

1. httpクラスのgetメソッドにてHTMLを取得する
2. HTMLをパーシングするのは面倒なので、正規表現で基準価格とのデータのみゲット。
3. 標準出力へ投信信託名、販売会社、基準価格を出力する

新生銀行のWebページがSJISなのでソースコードもSJISとした。
ubuntu(UTF-8)の端末を使用しているので、エンコードも付け加えた。

WindowsもしくはSJIS環境であれば require 'kconv'、.toutf8は必要ない

ソース Shinsei.rb

#!/usr/local/bin/ruby -Ks
require 'net/http'

module InvestmentTrust
class HttpError < StandardError; end
def InvestmentTrust.page_get(host, path)
require 'net/http'
Net::HTTP.version_1_2
res = nil
req = Net::HTTP::Get.new(path)
Net::HTTP.start(host) {|http|
res = http.request(req)
if res.code.to_i != 200
raise HttpError, "HTTP Status Error [#{res.code}]"
end
}
res.body
end
end

class Shinsei
SHINSEI_URL = 'qweb6.qhit.net'
SHINSEI_PATH = '/i_users/shinseibank/qsearch.exe?F=users/shinseibank/fundlist'
REGEX = %r{
(\w+)</A></TD>
¥s+<TD¥sclass="s1">(\w+)</TD>
¥s+<TD¥sclass="s2"¥salign="center">(¥d+/¥d+)</TD>
¥s+<TD¥sclass="s2"¥salign="right"¥snowrap>(¥d+)¥s円<BR><span¥sclass="f[p|m]">([¥+¥-]¥d+)</span>¥s円</TD>
¥s+<TD¥sclass="s2"¥salign="right"¥snowrap>([¥d¥.]+)<br>億円</TD>
}xs

def get()
require 'kconv'
data = InvestmentTrust.page_get(SHINSEI_URL, SHINSEI_PATH)
data.scan(REGEX).each do |m|
puts "#{m.shift} 運用会社 #{m.shift}".toutf8
puts " 日付 #{m.shift} 基準価格 #{m.shift}円 #{m.shift}円 総資産#{m.shift}億円".toutf8
end
end
end

if __FILE__ == $0
s = Shinsei.new
s.get
end


出力

$ ruby -Ks shinsei.rb
インデックスファンド225 運用会社 日興アセット
日付 01/15 基準価格 3689円 -36円 総資産1954.07億円
フィデリティ・日本成長株・ファンド 運用会社 フィデリティ
日付 01/15 基準価格 14777円 -404円 総資産3581.43億円
フィデリティ・日本配当成長株・ファンド(分配重視型) 運用会社 フィデリティ
日付 01/15 基準価格 8364円 -139円 総資産1526.11億円
ダイワ・バリュー株・オープン(愛称:底力) 運用会社 大和投信
日付 01/15 基準価格 10130円 -281円 総資産598.90億円
クレディ・スイス・ジャパン・グロース・ファンド 運用会社 クレディスイス
日付 01/15 基準価格 8616円 -178円 総資産26.10億円
インベスコ店頭・成長株オープン 運用会社 インベスコ
日付 01/15 基準価格 20969円 -1161円 総資産111.61億円
225インデックスファンド 運用会社 T&D
日付 01/15 基準価格 3087円 -31円 総資産55.55億円
MSCIインデックス・セレクト・ファンド コクサイ・ポートフォリオ 運用会社 モルガンスタンレー
日付 01/15 基準価格 13596円 -235円 総資産52.34億円
グローバル・ハイインカム・ストック・ファンド 運用会社 野村アセット
日付 01/15 基準価格 10303円 -189円 総資産2618.37億円
アメリカン・ドリーム・ファンド 運用会社 新生インベストメント
日付 01/15 基準価格 8026円 -201円 総資産31.15億円
JPM・BRICS5・ファンド(愛称:ブリックス・ファイブ) 運用会社 JPモルガン
日付 01/15 基準価格 20697円 -465円 総資産1498.35億円
新生・フラトンVPICファンド 運用会社 新生インベストメント
日付 01/15 基準価格 9143円 -165円 総資産169.01億円
JFアジア株・アクティブ・オープン 運用会社 JPモルガン
日付 01/15 基準価格 25457円 -1289円 総資産348.56億円
HSBCチャイナオープン 運用会社 HSBC
日付 01/15 基準価格 45303円 -2160円 総資産668.27億円
HSBCインドオープン 運用会社 HSBC
日付 01/15 基準価格 34359円 -717円 総資産1834.77億円
HSBCブラジルオープン 運用会社 HSBC
日付 01/15 基準価格 15469円 -446円 総資産1298.66億円
SG ロシア東欧株ファンド 運用会社 ソシエテジェネラル
日付 01/15 基準価格 15875円 -394円 総資産148.11億円
新生・UTIインドファンド 運用会社 新生インベストメント
日付 01/15 基準価格 13570円 -212円 総資産575.41億円
MHAM物価連動国債ファンド 運用会社 みずほ
日付 01/15 基準価格 10357円 +1円 総資産95.70億円
グローバル・ソブリン・オープン(毎月決算型) 運用会社 国際投信
日付 01/15 基準価格 7799円 -69円 総資産55051.91億円
世界のサイフ 運用会社 日興アセット
日付 01/15 基準価格 9936円 -120円 総資産1262.69億円
LM・オーストラリア毎月分配型ファンド 運用会社 レッグ・メイソン
日付 01/15 基準価格 11057円 -98円 総資産1082.67億円
ガリレオ 運用会社 ゴールドマン
日付 01/15 基準価格 9554円 +2円 総資産219.53億円
エマージング・カレンシー・債券ファンド(毎月分配型) 運用会社 新生インベストメント
日付 01/15 基準価格 9950円 -52円 総資産1271.50億円
ニッセイ/パトナム・インカムオープン 運用会社 ニッセイ
日付 01/15 基準価格 6877円 -170円 総資産4394.38億円
エマージング・ソブリン・オープン(毎月決算型) 運用会社 国際投信
日付 01/15 基準価格 10223円 -158円 総資産752.94億円
高利回り社債オープン(毎月分配型) 運用会社 野村アセット
日付 01/15 基準価格 8988円 -129円 総資産423.11億円
高利回り社債オープン・為替ヘッジ(毎月分配型) 運用会社 野村アセット
日付 01/15 基準価格 9051円 +8円 総資産1.25億円
ドイチェ・ヨーロッパインカムオープン 運用会社 ドイチェ
日付 01/15 基準価格 13263円 -124円 総資産179.51億円
新生・世界分散ファンド(複利効果重視型) 運用会社 新生インベストメント
日付 01/15 基準価格 9492円 -98円 総資産12.04億円
新生・世界分散ファンド(分配重視型) 運用会社 新生インベストメント
日付 01/15 基準価格 9537円 -99円 総資産5.45億円
新生・4分散ファンド 運用会社 中央三井AM
日付 01/15 基準価格 9206円 -108円 総資産12.38億円
世界の財産3分法ファンド(不動産・債券・株式)毎月分配型 運用会社 日興アセット
日付 01/15 基準価格 9686円 -225円 総資産1524.72億円
フィデリティ・バランス・ファンド 運用会社 フィデリティ
日付 01/15 基準価格 13287円 -196円 総資産231.83億円
ドイチェ・ライフ・プラン30 運用会社 ドイチェ
日付 01/15 基準価格 10910円 -79円 総資産123.02億円
ドイチェ・ライフ・プラン50 運用会社 ドイチェ
日付 01/15 基準価格 10650円 -130円 総資産94.28億円
ドイチェ・ライフ・プラン70 運用会社 ドイチェ
日付 01/15 基準価格 10360円 -154円 総資産19.03億円
JPMワールド・CB・オープン 運用会社 JPモルガン
日付 01/15 基準価格 9900円 -31円 総資産251.59億円
ラサール・グローバルREITファンド(毎月分配型) 運用会社 日興アセット
日付 01/15 基準価格 11783円 -138円 総資産253.04億円
フィデリティ・USリート・ファンドA(為替ヘッジあり) 運用会社 フィデリティ
日付 01/15 基準価格 10246円 -76円 総資産5.06億円
フィデリティ・USリート・ファンドB(為替ヘッジなし) 運用会社 フィデリティ
日付 01/15 基準価格 11526円 -316円 総資産24.72億円
REITオープン 運用会社 大和投信
日付 01/15 基準価格 13184円 -462円 総資産126.29億円
日本トレンド・セレクト ハイパー・ウェイブ 運用会社 日興アセット
日付 01/15 基準価格 2541円 -70円 総資産149.76億円
日本トレンド・セレクト リバース・トレンド・オープン 運用会社 日興アセット
日付 01/15 基準価格 11172円 +153円 総資産8.30億円
日本トレンド・セレクト 日本トレンド・マネーポートフォリオ 運用会社 日興アセット
日付 01/15 基準価格 10042円 +1円 総資産15.35億円
日本債券ベア 運用会社 T&D
日付 01/15 基準価格 801円 +2円 総資産29.27億円
ゴールドマン・サックス日本株式マーケット・ニュートラル・ファンド(愛称:GSジャパン・ニュートラル) 運用会社 ゴールドマン
日付 01/15 基準価格 10744円 +7円 総資産131.34億円
ゴールドマン・サックス米国株式マーケット・ニュートラル・ファンド(愛称:GS US・ニュートラル) 運用会社 ゴールドマン
日付 01/15 基準価格 8427円 -67円 総資産16.65億円


ちゃんとすべてのデータが取得できたかは?です

2008年1月12日土曜日

ruby mechanizeライブラリをインストール

ブラウザ感覚でwebへアクセスできるもの。関連するライブラリも一緒にいれる必要がある
ubuntu7.04のときはbuild-essentialはインストールしなかった。今回はubuntu7.10なので
必要みたい
$ sudo apt-get install build-essential
途中インストールCDを挿入する必要がある。ubuntu7.10だから!?

$ sudo gem install hpricot
$ sudo gem install hpricot
Select which gem to install for your platform (i486-linux)
1. hpricot 0.6 (mswin32)
2. hpricot 0.6 (jruby)
3. hpricot 0.6 (ruby)
4. hpricot 0.6 (jruby)
5. hpricot 0.6 (mswin32)
6. hpricot 0.6 (ruby)
7. Skip this gem
8. Cancel installation
> 3
Building native extensions. This could take a while...
Successfully installed hpricot-0.6
Installing ri documentation for hpricot-0.6...
Installing RDoc documentation for hpricot-0.6...


$ sudo gem install mechanize
Need to update 12 gems from http://gems.rubyforge.org
............
complete
Install required dependency hoe? [Yn] y
Install required dependency rubyforge? [Yn] y
Install required dependency rake? [Yn] y
Successfully installed mechanize-0.6.11
Successfully installed hoe-1.4.0
Successfully installed rubyforge-0.4.4
Successfully installed rake-0.8.1
Installing ri documentation for mechanize-0.6.11...
Installing ri documentation for hoe-1.4.0...
Installing ri documentation for rubyforge-0.4.4...
Installing ri documentation for rake-0.8.1...
Installing RDoc documentation for mechanize-0.6.11...
Installing RDoc documentation for hoe-1.4.0...
Installing RDoc documentation for rubyforge-0.4.4...
Installing RDoc documentation for rake-0.8.1...

※ 他に確かruby-devが入っている必要がある

クリック証券Local APL ServerをUbuntuへインストール

pythonで書かれているのでpython2.5が入っているか確認。
$ python
Python 2.5.1 (r251:54863, Oct 5 2007, 13:36:32)

クリック証券からアプリをダウンロードし解凍する
解凍したモジュールをインストール。

CLICK-SEC_LocalAPIServer_2.4.0/CherryPy-2.2.1ディレクトリへ移動
$ sudo python setup.py install

CLICK-SEC_LocalAPIServer_2.4.0/CherryTemplate-1.0.0ディレクトリへ移動
$ sudo python setup.py install

※ 解凍したディレクトリにあるinstall.shではうまくいかなかった。

サーバ起動
$ python LocalAPIServer.py
/usr/lib/python2.5/site-packages/cherrypy/lib/profiler.py:54: UserWarning: Your installation of Python doesn't have a profile module. If you're on Debian, you can apt-get python2.4-profiler from non-free in a separate step. See http://www.cherrypy.org/wiki/ProfilingOnDebian for details.
warnings.warn(msg)
/usr/lib/python2.5/site-packages/cherrypy/lib/profiler.py:54: UserWarning: Your installation of Python doesn't have a profile module. If you're on Debian, you can apt-get python2.4-profiler from non-free in a separate step. See http://www.cherrypy.org/wiki/ProfilingOnDebian for details.
warnings.warn(msg)
12/Jan/2008:14:47:35 CONFIG INFO Server parameters:
12/Jan/2008:14:47:35 CONFIG INFO server.environment: development
12/Jan/2008:14:47:35 CONFIG INFO server.log_to_screen: True
12/Jan/2008:14:47:35 CONFIG INFO server.log_file: demoserver.log
12/Jan/2008:14:47:35 CONFIG INFO server.log_tracebacks: True
12/Jan/2008:14:47:35 CONFIG INFO server.log_request_headers: True
12/Jan/2008:14:47:35 CONFIG INFO server.protocol_version: HTTP/1.0
12/Jan/2008:14:47:35 CONFIG INFO server.socket_host: localhost
12/Jan/2008:14:47:35 CONFIG INFO server.socket_port: 8000
12/Jan/2008:14:47:35 CONFIG INFO server.socket_file:
12/Jan/2008:14:47:35 CONFIG INFO server.reverse_dns: False
12/Jan/2008:14:47:35 CONFIG INFO server.socket_queue_size: 5
12/Jan/2008:14:47:35 CONFIG INFO server.thread_pool: 5
12/Jan/2008:14:47:36 HTTP INFO Serving HTTP on http://localhost:8000/

エラーがでるのでpython-profilerを入れる
sudo aptitude install python-profiler

$ python LocalAPIServer.py
12/Jan/2008:18:48:55 CONFIG INFO Server parameters:
12/Jan/2008:18:48:55 CONFIG INFO server.environment: development
12/Jan/2008:18:48:55 CONFIG INFO server.log_to_screen: True
12/Jan/2008:18:48:55 CONFIG INFO server.log_file: demoserver.log
12/Jan/2008:18:48:55 CONFIG INFO server.log_tracebacks: True
12/Jan/2008:18:48:55 CONFIG INFO server.log_request_headers: True
12/Jan/2008:18:48:55 CONFIG INFO server.protocol_version: HTTP/1.0
12/Jan/2008:18:48:55 CONFIG INFO server.socket_host: localhost
12/Jan/2008:18:48:55 CONFIG INFO server.socket_port: 8000
12/Jan/2008:18:48:55 CONFIG INFO server.socket_file:
12/Jan/2008:18:48:55 CONFIG INFO server.reverse_dns: False
12/Jan/2008:18:48:55 CONFIG INFO server.socket_queue_size: 5
12/Jan/2008:18:48:55 CONFIG INFO server.thread_pool: 5
12/Jan/2008:18:48:55 HTTP INFO Serving HTTP on http://localhost:8000/

起動成功

簡単なクライアントでアクセスしXMLのレスポンスを取得した
<?xml version="1.0" encoding="UTF-8" ?>
<messageListResponse>
<responseStatus>OK</responseStatus>
<messageList>
<messageListItem>
<riyo>0</riyo>
<taishosha>1</taishosha>
<title>2007年05月18日(金)お知らせ内容のタイトル</title>
<text>お知らせ内容の本文です。</text>
</messageListItem>
</messageList>
<message>お知らせ一覧の取得が完了しました。</message>
</messageListResponse>

干し芋のリスト