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
北の風のちやや強く海上では後北の風強くくもり朝から昼過ぎ雨

干し芋のリスト