2009年2月26日木曜日

exim4

lennyがreleaseされてから、sid内のeximがデフォルトでrelay禁止になってた。
ということで、以下をupdate-exim4.conf.confに追加して
update-exim4.confを実行する。

dc_relay_domains='xxx'
dc_relay_nets='192.168.16.0/24'

これでOK。

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!をしてしまうと、再利用されないで
切られてしまう。次にまた新規のコネクションを開こうとするので
時間がかかる。

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が起動に失敗する

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日土曜日

ticker applet


ようやくTicker Appletがほぼ完成した。
あとはデザインと、設定画面だけ。Ruby/Gnome2で
Preferenceメニューを作るやり方が不明。
Gtk+だと、from_fileみたいな関数があるけど、、、。

まぁ、とりあえず、あとは片手間でもできそうなので
一旦終了し、SVMでパターン認識によるトレード戦略の
デザインにとりかかろう。

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日水曜日

Race condition


Sumidaで起こったRace conditionの状態をまとめてみた。
とりあえず、Threadの数を増やして解決してみた。

thread

n秒sleepしているThreadを待つとdeadlockしてseg fault
まぁ、待つThreadはいつまでまてばいいか不明なので理解はできるけど
この場合はThreadをkillしてあげないといけないのかな、、、。
Threadの処理の中に、残りの時間を持たせてpollingするか。

2009年2月14日土曜日

Inject

Injectorになった。

BoardPrice.with_symbol.inject({ }) { |h, e| h[e[:name]] = e[:bid]; h}

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)

Sumida Project 2

Sumida systemをRuby 1.9に対応させた。こちらへBlogを移動して
開発過程を記述していく。その際に理解したこと、勉強したことも綴る。

元のblog
http://blog.livedoor.jp/projsumida/

SKK more

1. 間違って入力したひらがなを漢字にやりなおしたいとき
* あたまに戻って [Q]
* M-Qとすると便利


2. 外来語のローマ字入力
* [/]を打ってから入力

3. 記号
* きごうと入力

4. ギリシャ文字
* /greek

5. 文字コードで入力
* \

6. 読みのコンプリーション
* [tab]、 '.', ','

7. 一時入力
* [Q]を押してから、最後に[q]を入力

SKK more

1. 間違って入力したひらがなを漢字にやりなおしたいとき
* あたまに戻って [Q]
* M-Qとすると便利


2. 外来語のローマ字入力
* [/]を打ってから入力

3. 記号
* きごうと入力

4. ギリシャ文字
* /greek

5. 文字コードで入力
* \

6. 読みのコンプリーション
* [tab]、 '.', ','

7. 一時入力
* [Q]を押してから、最後に[q]を入力

2009年2月9日月曜日

ssh コネクション共有方法

sshで、1つのコネクションを共有する方法

速いし、passfraseいれなくてよくなるので便利。

.ssh/configに

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p

を追加。