1. Gem install
$ ruby setup.rb config --prefix=~/local
2. Rails install
$ gem install rails -i ~/local/lib/gems --no-rdoc --no-ri
3. Add environment into .bashrc
$ echo 'export GEM_HOME=~/local/lib/gems' >> ~/.bashrc
4. link
$ ln -s ~/local/lib/gems/bin/rails ~/local/bin
$ ln -s ~/local/lib/gems/bin/rake ~/local/bin
## Create test project ##
$ cd tmp
$ rails test
$ ln -s ~/tmp/test/public ~/public_html/rails
Now we can access to http://xxx/rails
しかし、、、Rails 2.3.2のCGIハンドラが動かない。バグっぽい。
同じことがpostされている
http://www.ruby-forum.com/topic/182327
2009年3月21日土曜日
rails 2.3.2対応
Rails 2.3.2へのUpgrade
Debian experimentalのRuby1.9.1を使用する
1. ruby1.9.1をインストールにする。
URI::ParserというクラスがRuby1.9.1 (1.9.0はダメ)から入っているようで
Rails 2.3.2もそれを想定してあるためまずUpgradeする。
2. gemのインストール
ソースからインストール (/usr/bin/gem1.9というのができる)
3. rails for ruby1.9.1のインストール
$ sudo gem1.9 install -v=2.3.2 rails
4. narrayのインストール
$ sudo gem1.9 install narray
5. hpricotのインストール
$ sudo gem1.9 install hpricot
コンパイルにしくじるので、hpricot_scan.cの
RHASH(hash)->tblをRHASH_HASH(hash)に変更して
xxx.soをlib以下へコピー
あと、fast_xsは、hpricot_scanのエラーのせいでとまっているので
ruby extconf.rb; make
でコンパイルしてコピー
6. mysql.so
2.8.1のソースをもってきてmake install
7. libopenssl-rubyのインストール
$ apt-get install libopenssl-ruby1.9
8. rackのインストール
webrickを起動するのに必要
(今は1.8で動作させているので1.9ではいらないけど一応入れとく)
ruby1.9.1だと、./script/consoleとか動かないので
sumida-systemで起動するものは、ruby1.8で稼動させる。
そのために、ruby1.8でもrails/hpricotなどを入れる。
追記:
state_machineをgemで導入
Debian experimentalのRuby1.9.1を使用する
1. ruby1.9.1をインストールにする。
URI::ParserというクラスがRuby1.9.1 (1.9.0はダメ)から入っているようで
Rails 2.3.2もそれを想定してあるためまずUpgradeする。
2. gemのインストール
ソースからインストール (/usr/bin/gem1.9というのができる)
3. rails for ruby1.9.1のインストール
$ sudo gem1.9 install -v=2.3.2 rails
4. narrayのインストール
$ sudo gem1.9 install narray
5. hpricotのインストール
$ sudo gem1.9 install hpricot
コンパイルにしくじるので、hpricot_scan.cの
RHASH(hash)->tblをRHASH_HASH(hash)に変更して
xxx.soをlib以下へコピー
あと、fast_xsは、hpricot_scanのエラーのせいでとまっているので
ruby extconf.rb; make
でコンパイルしてコピー
6. mysql.so
2.8.1のソースをもってきてmake install
7. libopenssl-rubyのインストール
$ apt-get install libopenssl-ruby1.9
8. rackのインストール
webrickを起動するのに必要
(今は1.8で動作させているので1.9ではいらないけど一応入れとく)
ruby1.9.1だと、./script/consoleとか動かないので
sumida-systemで起動するものは、ruby1.8で稼動させる。
そのために、ruby1.8でもrails/hpricotなどを入れる。
追記:
state_machineをgemで導入
2009年3月16日月曜日
mysql index
backtestをしていると、ある一定時間経つと急激に遅くなっていたので
調査をしてみた。
最初は、Buffer poolが足りないのかなと思って増やしていたのだけど
それでも、遅くなるまでの時間が長くなるだけでまた遅くなる。
backtestを行うtick tableのスタートポイントを変えてみたのだけど
必ず遅くなっていた近辺でやっぱり遅くなることが判明。
ということで、SQLをexplainしてみてみると、
where: file: sortといった感じで、見たくない文字が、、、。
そこで、MySQLのIndexが使用されない場合を検索してみると
order byで指定しているカラム以外をwhereに使ってると
使われないといった記述があった。
実はそれ以外にも結構使用されない場合があるみたい。
named_scope: barsの中のSQLで、datetimeをorder byで使っていて
whereの中は、
datetime >= xxx and open is not NULL, close is not NULL
としていたので、sortがfileになっていたみたい。
とりあえず、NULLかどうかはアプリ側で判断することにして条件を外す。
1テーブルあたりのselectが0.43msから、0.01msへ。
ということで、体感的にもかなり速くなった。SQLは重要。
調査をしてみた。
最初は、Buffer poolが足りないのかなと思って増やしていたのだけど
それでも、遅くなるまでの時間が長くなるだけでまた遅くなる。
backtestを行うtick tableのスタートポイントを変えてみたのだけど
必ず遅くなっていた近辺でやっぱり遅くなることが判明。
ということで、SQLをexplainしてみてみると、
where: file: sortといった感じで、見たくない文字が、、、。
そこで、MySQLのIndexが使用されない場合を検索してみると
order byで指定しているカラム以外をwhereに使ってると
使われないといった記述があった。
実はそれ以外にも結構使用されない場合があるみたい。
named_scope: barsの中のSQLで、datetimeをorder byで使っていて
whereの中は、
datetime >= xxx and open is not NULL, close is not NULL
としていたので、sortがfileになっていたみたい。
とりあえず、NULLかどうかはアプリ側で判断することにして条件を外す。
1テーブルあたりのselectが0.43msから、0.01msへ。
ということで、体感的にもかなり速くなった。SQLは重要。
2009年3月11日水曜日
deadlock解消
Decisionをつねにdupして、ThreadPoolに投げこんで処理をすすめていたが
毎回@sessionを利用してDBに書くのもSVMを利用するとなるとコストが高いのでdupしないでいけるようにデザイン変更。
その際、deadlockが発生していたが、原因は以下だった。
1. Decisionのstatusが1度実行するとdoneになる。
2. statusをreadyにしなかったため、2度目の実行がすぐに終わってしまう。
3. Agentは、Decisionの終了を待つため、condition_waitするがその前に
Decisionがready statusじゃないので、Decision::start/finalizeを
実行せずに終了してしまう。つまり、spin_lockして待つわけではないので、Agentのcond_waitを待たない。 したがってdeadlockしてしまう。
とりあえずstatusをちゃんと変更するようにして解消
毎回@sessionを利用してDBに書くのもSVMを利用するとなるとコストが高いのでdupしないでいけるようにデザイン変更。
その際、deadlockが発生していたが、原因は以下だった。
1. Decisionのstatusが1度実行するとdoneになる。
2. statusをreadyにしなかったため、2度目の実行がすぐに終わってしまう。
3. Agentは、Decisionの終了を待つため、condition_waitするがその前に
Decisionがready statusじゃないので、Decision::start/finalizeを
実行せずに終了してしまう。つまり、spin_lockして待つわけではないので、Agentのcond_waitを待たない。 したがってdeadlockしてしまう。
とりあえずstatusをちゃんと変更するようにして解消
2009年3月6日金曜日
仮想環境のネットワーク
kvm で仮想ネットワークを使用するときは、-net nic -net tapとして
ifconfig tap0 0.0.0.0 up
brctr add br0 tap0
で tap0をbridgeインターフェースに入れる。
udhcpdのconfigは
start 192.168.5.30
end 192.168.5.254
interface xenbr0
max_leases 225
option subnet 255.255.255.0 <- 必要
option router 192.168.5.1
option dns 192.168.5.1
で設定しておいてあげるとd-iがいい感じに設定してくれる
ifconfig tap0 0.0.0.0 up
brctr add br0 tap0
で tap0をbridgeインターフェースに入れる。
udhcpdのconfigは
start 192.168.5.30
end 192.168.5.254
interface xenbr0
max_leases 225
option subnet 255.255.255.0 <- 必要
option router 192.168.5.1
option dns 192.168.5.1
で設定しておいてあげるとd-iがいい感じに設定してくれる
2009年3月5日木曜日
Design change
すべてのサービスをThread化して
- MarketAgent
- CandleMaker
- DealAgent
と3つのうち、CandleMakerは1つだけ起動するようにやっていたが
例えば、Forex, Commodity, Stockと3つのマーケットを監視するように
していたとき、処理が重くなってしまい、その後に稼動するDealAgentが
遅れてしまうため、マーケットごとに起動するようにした。
つまり、各マーケットごとに3つのタスクが1セットになる。
コンテナは1つで、いくつでもスレッドをたてられるようにしてあるので
まぁ、9個のタスクをあげてもいい。
Todo:
- クラスアンロードの実装
- スレッドを制御するためのインターフェースの実装
今は、とりあえず、feedsテーブルから登録を削除すれば
トリガーとなるupdateメッセージは送信されなくなるので
その後は、タスクは何もしなくなる。あるタスクだけ変更して
リロードしたい時のための口が必要
- 上記Serviceをまとめた設定ファイルの実装
例えば、services.ymlというファイルに
forex:
- fetch
- candle_maker
- deal
commodity:
- fetch_commodity
- candle_maker_commodity
- deal_commodity
みたいな感じにして、起動時にロードして起動する
- MarketAgent
- CandleMaker
- DealAgent
と3つのうち、CandleMakerは1つだけ起動するようにやっていたが
例えば、Forex, Commodity, Stockと3つのマーケットを監視するように
していたとき、処理が重くなってしまい、その後に稼動するDealAgentが
遅れてしまうため、マーケットごとに起動するようにした。
つまり、各マーケットごとに3つのタスクが1セットになる。
コンテナは1つで、いくつでもスレッドをたてられるようにしてあるので
まぁ、9個のタスクをあげてもいい。
Todo:
- クラスアンロードの実装
- スレッドを制御するためのインターフェースの実装
今は、とりあえず、feedsテーブルから登録を削除すれば
トリガーとなるupdateメッセージは送信されなくなるので
その後は、タスクは何もしなくなる。あるタスクだけ変更して
リロードしたい時のための口が必要
- 上記Serviceをまとめた設定ファイルの実装
例えば、services.ymlというファイルに
forex:
- fetch
- candle_maker
- deal
commodity:
- fetch_commodity
- candle_maker_commodity
- deal_commodity
みたいな感じにして、起動時にロードして起動する
2009年3月2日月曜日
RubyのException
今さらながら、rescueでExceptionを捕捉してraiseする場合でも
ちゃんと、ensureは実行される。
raise以降のやつはもちろん走らない
begin
begin
raise Exception
rescue Exception
p 'Hello'
raise Exception
p 'Hello2'
ensure
p 'Yahoo'
end
rescue Exception
p 'Finish'
end
-- Result --
"Hello"
"Yahoo"
"Finish"
ちゃんと、ensureは実行される。
raise以降のやつはもちろん走らない
begin
begin
raise Exception
rescue Exception
p 'Hello'
raise Exception
p 'Hello2'
ensure
p 'Yahoo'
end
rescue Exception
p 'Finish'
end
-- Result --
"Hello"
"Yahoo"
"Finish"
2009年3月1日日曜日
登録:
投稿 (Atom)

