WindowsのJavaアプリで、Wineから起動すると、次に起動するときに
Access Violationがでて起動しなくなってしまうものがありました。
今日調べてたら、どうも、winecfgで、pixelshaderをオフれば大丈夫という
ことが判明。
2009年10月18日日曜日
2009年9月24日木曜日
2009年9月19日土曜日
2009年8月22日土曜日
2009年8月6日木曜日
2009年7月19日日曜日
読書@Cafe
「すべての男は消耗品である。 Vol.10 大不況とパンデミック」
http://www.amazon.co.jp/gp/product/images/4584131651/ref=dp_image_0?ie=UTF8&n=465392&s=books
村上龍のエッセイ。テレ東のカンブリア宮殿ででていて、どんな本書いているのかということで
ちょうど、Cafeに本があったので読んでみた。
1箇所だけ
「どうして貧困はいけないのだろう」
この問いかけだけ頭にのこった。彼の結論はひらたくいうと
「歴史的にみると、ひどくなると暴動がおこってしまい、事前に救済するよりコストが高くつく」
ということらしい。そういう視点もあるなといった感じ。
http://www.amazon.co.jp/gp/product/images/4584131651/ref=dp_image_0?ie=UTF8&n=465392&s=books
村上龍のエッセイ。テレ東のカンブリア宮殿ででていて、どんな本書いているのかということで
ちょうど、Cafeに本があったので読んでみた。
1箇所だけ
「どうして貧困はいけないのだろう」
この問いかけだけ頭にのこった。彼の結論はひらたくいうと
「歴史的にみると、ひどくなると暴動がおこってしまい、事前に救済するよりコストが高くつく」
ということらしい。そういう視点もあるなといった感じ。
2009年7月12日日曜日
MySQL Error 1016
mysqldumpで、Error 1016がでたときは、open-files-limitの値を増やす必要あり。
パーティショニングを使うとファイル数が増えるので対応しないといけない。
[mysqld_safe]
open-files-limit = 20480
などのようにする
パーティショニングを使うとファイル数が増えるので対応しないといけない。
[mysqld_safe]
open-files-limit = 20480
などのようにする
2009年7月7日火曜日
MySQL インデックス
whereの中で、
datetime < '2009-1-1 0:05:00'
ではindexが使われない
datetime <= '2009-1-1 0:00:00'
としないといけない。
datetime < '2009-1-1 0:05:00'
ではindexが使われない
datetime <= '2009-1-1 0:00:00'
としないといけない。
2009年5月17日日曜日
債券 2
- デュレーション
要は、プライスに対する利回りの微分
ゼロクーポン債で、pをプライス、nを残存期間、Cを償還額としたときの現在価値は以下の式
p = C / (1+r)^n
本来のデュレーションは、dp/drとのこと。
実務ではこれに味付けしたものをデュレーションと呼んでるっぽい。
- 修正デュレーション
変化率にマイナスを付加したもの -(dp/dr)/p
- マコーレデュレーション
額面C%の半年複利のクーポン、利回りr%
式を展開するとクーポン部分も1つの債券と考えて、それの変化率を足し合わせたものという
ことがわかる。
(1+r/2) * 修正デュレーション
要は、プライスに対する利回りの微分
ゼロクーポン債で、pをプライス、nを残存期間、Cを償還額としたときの現在価値は以下の式
p = C / (1+r)^n
本来のデュレーションは、dp/drとのこと。
実務ではこれに味付けしたものをデュレーションと呼んでるっぽい。
- 修正デュレーション
変化率にマイナスを付加したもの -(dp/dr)/p
- マコーレデュレーション
額面C%の半年複利のクーポン、利回りr%
式を展開するとクーポン部分も1つの債券と考えて、それの変化率を足し合わせたものという
ことがわかる。
(1+r/2) * 修正デュレーション
債券 1
ピムコの本を読んで債券にちょっと興味を持ったので
少しお勉強してみた。
- ゼロクーポン債
利子がない代わりに、はじめから価格が償還額より低く売られている債券
利回り一番計算楽 :D
Q. 90円が2年後に100円になるゼロクーポン債の年複利の年利回りは
A. 90(1+r)^2 = 100
なので、r = sqrt(100/90) - 1
Q. 90円が2年後に100円になるゼロクーポン債の半年複利の年利回りは
A. 90(1+r/2)^4 = 100
を満たすr
- 利付債
ある期間ごとにクーポン(利子)が支払われる債券
Q. 割引率2%、償還期限2年、額面100円で年に4%が支払われる利付債がある。現在価値は?
A. 1年後のクーポンの現在価値は
(100*0.04)/(1+0.02)
償還金の現在価値は
(100*0.04)/(1+0.02)^2
足したものが現在価値
少しお勉強してみた。
- ゼロクーポン債
利子がない代わりに、はじめから価格が償還額より低く売られている債券
利回り一番計算楽 :D
Q. 90円が2年後に100円になるゼロクーポン債の年複利の年利回りは
A. 90(1+r)^2 = 100
なので、r = sqrt(100/90) - 1
Q. 90円が2年後に100円になるゼロクーポン債の半年複利の年利回りは
A. 90(1+r/2)^4 = 100
を満たすr
- 利付債
ある期間ごとにクーポン(利子)が支払われる債券
Q. 割引率2%、償還期限2年、額面100円で年に4%が支払われる利付債がある。現在価値は?
A. 1年後のクーポンの現在価値は
(100*0.04)/(1+0.02)
償還金の現在価値は
(100*0.04)/(1+0.02)^2
足したものが現在価値
2009年5月13日水曜日
2009年5月3日日曜日
読書@Cafe
ロジック作成に尽力しようとしたのだけど、、、ついついたくさんある本に
惑わされよんでみた。
1.餃子屋と高級フレンチでは、どちらが儲かるか?
ストーリー仕立ての初学者用の会計の本。で、タイトルの答えはまぁ、どっちでも
なく、単にビジネススタイルが違うぞっていう感じで流されてた。
この本で学んだことは、
「時間を使うことは、お金を使うこと」。つまりTime is moneyってことかな。
2. タートルズの本 (タイトル忘れた)
P/Lフィルターがためになった。
ほとんど同じことを読む前に自分もやろうとしてたから。
惑わされよんでみた。
1.餃子屋と高級フレンチでは、どちらが儲かるか?
ストーリー仕立ての初学者用の会計の本。で、タイトルの答えはまぁ、どっちでも
なく、単にビジネススタイルが違うぞっていう感じで流されてた。
この本で学んだことは、
「時間を使うことは、お金を使うこと」。つまりTime is moneyってことかな。
2. タートルズの本 (タイトル忘れた)
P/Lフィルターがためになった。
ほとんど同じことを読む前に自分もやろうとしてたから。
2009年5月1日金曜日
Bluetooth & GPS
Bluetooth経由でGPSを受信する方法
1. sdptool add --channel=1 OPUSH
2. rfcomm bind /dev/rfcomm0
以上。
1. sdptool add --channel=1 OPUSH
2. rfcomm bind /dev/rfcomm0
以上。
2009年4月25日土曜日
2009年4月17日金曜日
deadlock due to conn pool
新しいDB環境を作ってやろうとしたら、急にdeadlockが発生するようになったが
その時は、他のことも色々といじっていたので、原因解析に1日かかってしまった。
結局、コネクションプール(pool stanza)をdatabase.ymlに記述していなかったので
データをとりにいこうとして、ロックされたみたいだった。
4つ以上のdecisionで並行テストをしようとすると、どんなときでも起こっており
テーブルからデータをひっぱってくるところでとまっていたようだったので
怪しいと思い、mysqladmin processlistでチェックをしていたら、Bingoだった。
その時は、他のことも色々といじっていたので、原因解析に1日かかってしまった。
結局、コネクションプール(pool stanza)をdatabase.ymlに記述していなかったので
データをとりにいこうとして、ロックされたみたいだった。
4つ以上のdecisionで並行テストをしようとすると、どんなときでも起こっており
テーブルからデータをひっぱってくるところでとまっていたようだったので
怪しいと思い、mysqladmin processlistでチェックをしていたら、Bingoだった。
2009年4月15日水曜日
invest_productの移動
finance pluginsのなかで、tickerをcurrency, commodity, stock,...と
いうようにわけて、それぞれで特殊なメソッドを追加したかったので
invest_product_idをtickからticker_symbolの属性へと変更した。
まぁ、symbolがおなじで違うproductってのもないだろうから
よいか。
あと、ちょっとsignsテーブルをみたりするのにSQLを打つのが
面倒になってきたのでyasnippetを導入してみた。
sumida-modeもそこそこ便利になってきたので
もう少し改善できないか考える。
いうようにわけて、それぞれで特殊なメソッドを追加したかったので
invest_product_idをtickからticker_symbolの属性へと変更した。
まぁ、symbolがおなじで違うproductってのもないだろうから
よいか。
あと、ちょっとsignsテーブルをみたりするのにSQLを打つのが
面倒になってきたのでyasnippetを導入してみた。
sumida-modeもそこそこ便利になってきたので
もう少し改善できないか考える。
2009年4月9日木曜日
2009年4月4日土曜日
読書@Library
今日からステキな図書館 & カフェで開発をすることにしました。
そこは7:00 - 23:00までやっていて気兼ねなくいれるので
開発の拠点をそこに移します。
あと、そこのにある本で読んでいったものを記録に
残すことにします。まずは今日読んだ本は
ここでも非凡な人は模倣ではなく簒奪という生き方を
やるのだという点が感慨深いものがありました。
あと、カンファレンスでいった言葉で響いたものが
ありました。
「今日が人生最後の日と考えて、今日やることは
本当にやりたいことか問いかけて、数日間 NOで
ある場合は何かを変える必要がある」
そこは7:00 - 23:00までやっていて気兼ねなくいれるので
開発の拠点をそこに移します。
あと、そこのにある本で読んでいったものを記録に
残すことにします。まずは今日読んだ本は
「スティーブ・ジョブズ 偉大なるクリエイティブ・ディレクターの軌跡」
ジョブスの様々な栄光と苦難の歴史が書かれています。ここでも非凡な人は模倣ではなく簒奪という生き方を
やるのだという点が感慨深いものがありました。
あと、カンファレンスでいった言葉で響いたものが
ありました。
「今日が人生最後の日と考えて、今日やることは
本当にやりたいことか問いかけて、数日間 NOで
ある場合は何かを変える必要がある」
2009年4月2日木曜日
MySQL 大量データインサート & 設定 & grant
mysqldumpをとって普通にやると、今で、2Gくらいのテキストファイルができる。
で、こいつは普通にオープンしようとするとエライことになるので
追記できない。そういう場合は
$ mysql
$ set autocommit=0
$ set global general_log = 'OFF'
$ set global slow_query_log = 'OFF'
$ source xxx.sql
で、my.cnfのメモリ関連
innodb_buffer_pool_size=128M
innodb_log_file_size=32M
sort_buffer_size=1M
read_rnd_buffer_size=1M
innodb_doublewrite=false
innodb_file_per_table
## Debian
log_bin = /var/log/mysql/mysql-bin.log
とした。
## 備忘ログ
grant all on *.* 'user'@'%' identified by 'password' with grant option
''でくくる部分は注意。
で、こいつは普通にオープンしようとするとエライことになるので
追記できない。そういう場合は
$ mysql
$ set autocommit=0
$ set global general_log = 'OFF'
$ set global slow_query_log = 'OFF'
$ source xxx.sql
で、my.cnfのメモリ関連
innodb_buffer_pool_size=128M
innodb_log_file_size=32M
sort_buffer_size=1M
read_rnd_buffer_size=1M
innodb_doublewrite=false
innodb_file_per_table
## Debian
log_bin = /var/log/mysql/mysql-bin.log
とした。
## 備忘ログ
grant all on *.* 'user'@'%' identified by 'password' with grant option
''でくくる部分は注意。
2009年3月28日土曜日
Xrea serverへRails install
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
$ 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日日曜日
2009年2月26日木曜日
2009年2月25日水曜日
Thread化
今まで、1 process - 1 serviceという形で設計してきたのだが
やはり、Marketの数が増えてくると、serviceで分けなければならなくなり
Rubyのインスタンス数が増え、それごとに、30MB近くメモリが必要と
なるため、1 process - Many services on threads という
設計にした。
(当初このようにしていたのだが、途中で変更したが、元に戻す)
注意点 1: Thread周り
スレッドプールを自作して使っているのだが、
デーモン化した子プロセス内で
ちゃんとThreadを作ってあげないと、ダメ。
プロセスコピーするから、Threadもコピーされるからいいかと
思ってたんだけど違うのかな。ちゃんと勉強しよう。
注意点 2 : 設計に関して
listenするagentは、メッセージを受信したあと、
Threadでyield内が実行されるため
DBコネクションをきちんとお掃除してあげないと
残ってしまう。
処理するThread内で、
ActiveRecord::Base.clear_active_connections!を
読んであげると、DB connection poolに返し
再利用されるみたい。
connection.disconnect!をしてしまうと、再利用されないで
切られてしまう。次にまた新規のコネクションを開こうとするので
時間がかかる。
やはり、Marketの数が増えてくると、serviceで分けなければならなくなり
Rubyのインスタンス数が増え、それごとに、30MB近くメモリが必要と
なるため、1 process - Many services on threads という
設計にした。
(当初このようにしていたのだが、途中で変更したが、元に戻す)
注意点 1: Thread周り
スレッドプールを自作して使っているのだが、
デーモン化した子プロセス内で
ちゃんとThreadを作ってあげないと、ダメ。
プロセスコピーするから、Threadもコピーされるからいいかと
思ってたんだけど違うのかな。ちゃんと勉強しよう。
注意点 2 : 設計に関して
listenするagentは、メッセージを受信したあと、
Threadでyield内が実行されるため
DBコネクションをきちんとお掃除してあげないと
残ってしまう。
処理するThread内で、
ActiveRecord::Base.clear_active_connections!を
読んであげると、DB connection poolに返し
再利用されるみたい。
connection.disconnect!をしてしまうと、再利用されないで
切られてしまう。次にまた新規のコネクションを開こうとするので
時間がかかる。
2009年2月22日日曜日
Gnome session使用時の注意点
今日は、急にGnome sessionが途中で止まるようになったのだが
調べていくと、gnome-settings-daemonで止まっているようだった。
そこで調べた結果が↓
http://projects.gentoo.gr.jp/docs/chkdoc/data/20070127155510.xml
consoleからxinitってもうみんなやんないのかな??
以下引用:
調べていくと、gnome-settings-daemonで止まっているようだった。
そこで調べた結果が↓
http://projects.gentoo.gr.jp/docs/chkdoc/data/20070127155510.xml
consoleからxinitってもうみんなやんないのかな??
以下引用:
gnome-settings-daemonでは、ローカルのdbusセッションが動作している必要があり、 それが動作していない場合は起動に失敗します。 GDMは自動でdbusセッションを起動しますが、 別のDMや.xinitrcファイルと共にstartxを使用している場合は、 dbusセッションを手動で起動してあげる必要があります。それには、 Xのスタートアップファイル(startxでは.xinitrc、 DMでは.xsession)に下記を追加します。
| Code listing 1.1: dbusセッションの起動 |
eval `dbus-launch --exit-with-session --sh-syntax` |
必ずgnome-session(直接起動しているのであれば、 gnome-settings-daemon)を起動する行手前に上記をおくようにして下さい。
別の方法として、 startxを使用し.xinitrcで何か特別なことをしていない場合に、 .xinitrcを削除し.profileや/etc/rc.confでXSESSIONをgnomeと設定することも可能です。 これにより、gnome-sessionが立ち上がる前に正しくdbusセッションが起動されます。
2009年2月21日土曜日
Ruby Cairoまとめ

CairoのRuby bindingであるrcairoを使ってみた。
で、それで、ticker-appletのメッセージボックスを描いてみた。
pythonには、pynotifyというメッセージボックス描画APIがあるようだが、Rubyにはなさげだったので、真似してticker-appletに描いてみた。
Cairoは以下のストーリーで使用する
1. Surfaceの作成
surface = Cairo::ImageSurface.new(format, width, height)
2. Contextの作成
context = Cairo::Context.new(surface)
3. Contextへの描画
## 背景 ##
context.set_source_rgb(1,1,1)
context.rectangle(0,0,width,height)
context.fill
## Text
markup = "Hello World "
attr_list, text = Pango.parse_markup(markup)
layout = context.create_pango_layout
layout.attributes = attr_list
layout.text = text
context.show_pango_layout(layout)
## 移動 ##
context.translate(100, 200)
## 画像ロード ##
context.set_source_pixbuf(Gdk::Pixbuf.new('file.png')
context.paint
といった感じ。
## GTKとの連携プレー ##
drawing_area = Gtk::DrawingArea.new
drawing_area.signal_connect('expose_event') do |widget, event|
context = widget.window.create_context
## ... ##
end
意外と簡単に使えるのでグラフ描画ライブラリも将来デザインしてみよう。
2009年2月18日水曜日
2009年2月14日土曜日
2009年2月10日火曜日
SQL join
Joinは時間がかかる。3.3ms↓
@fetch_symbols = Tick.all(:select => "name", :joins => :ticker_symbol).map { |u| u[:name]}.uniq
0.1+0.2+0.1ms = 0.4ms↓
m = Market[@market_config["market"]]
@fetch_symbols = TickerSymbol.find(m.ticks.map(&:ticker_symbol_id)).map(&:name)
@fetch_symbols = Tick.all(:select => "name", :joins => :ticker_symbol).map { |u| u[:name]}.uniq
0.1+0.2+0.1ms = 0.4ms↓
m = Market[@market_config["market"]]
@fetch_symbols = TickerSymbol.find(m.ticks.map(&:ticker_symbol_id)).map(&:name)
Sumida Project 2
Sumida systemをRuby 1.9に対応させた。こちらへBlogを移動して
開発過程を記述していく。その際に理解したこと、勉強したことも綴る。
元のblog
http://blog.livedoor.jp/projsumida/
開発過程を記述していく。その際に理解したこと、勉強したことも綴る。
元のblog
http://blog.livedoor.jp/projsumida/
登録:
投稿 (Atom)






