2010年5月28日金曜日

ThreadPoolExecutorの挙動

本職Javaで Thread を管理する仕組みを作成することに。
Java 5 なので、まよわず ThreadPoolExecutor を利用することに。
んで、ハマった挙動についてメモ。

ThreadPoolExecutor はシンプルな FIFO (LIFO) を提供してくれるものと
思っていたが、実はそうではない。ハマりどころはcorePoolSizemaximumPoolSizeの設定値と指定する Queue のサイズによっては
シンプルな FIFO(LIFO) にはならないということ。

Javadoc からすると、
corePoolSize
通常使う thread の数。

maximumPoolSize
thread の最大数


とある。なので、
corePoolSize = 3
maximumPoolSize = 5

とかで Executor を作ったら、通常は 3 つ。Queue があふれてきたら、最大 5 つで動作するという認識だった。
この認識は正解で、最初は thread 3 つで稼働。thread 3 つが埋まると、キューイングされていき、最大キューイング数に達すると thread が増えていった。
が、thread が増えた際に処理されるキューが FIFO ではなかった。
何が処理されたかというと、キューイングであふれた新着 JOB だった。
挙動をまとめると、

  1. job 到着時、通常 thread が開いていたら即座に thread 生成。

  2. 通常 thread が埋まっている場合、キューイング

  3. 通常 thread が埋まっているかつ、キューイングも埋まっている場合、新着 Job を 新規 thread 生成で実行。

  4. MAX thread まで埋まるかつ、キューイングが一杯の場合、execute 時にエラーを吐く。

  5. 新着 Job がこなくて、thread が空くと、キューの先頭 Job が処理される。



FIFO ではないでしょ?

Java 屋なんだけど、初めて Java の記事をのっけた気がする。。。

以上。

2010年5月27日木曜日

VMWare チューニング

Java開発(仕事)とRails(趣味)は ubuntu で行っている。
メインはWindowsだが、会社のルール上別 OS に切り替えるのは厳しいため、
VMWare で ubuntu を動かしている。
ほとんどはターミナル経由でCUIなのだが、Eclipseを使いたくなり
GUI で操作し始めたのだが、死ぬほど遅い。
いちいち固まる。Windowsも固まる。
なのでチューニングを調べたらあった。

参考:DJ_SATORUの研究日誌

同じように .vmx ファイル上に
mainMem.useNamedFile = "FALSE"
MemTrimRate = "0"

を記述したら劇的に変わった。

もっと早くにやるんだった。

2010年5月14日金曜日

Rails(3beta3) で国際化(I18n) その1

Rails3 で国際化を試していく。
自分の中でもあやふやだった部分を潰していく。(ブラウザの言語設定は本当に参照できないのかとか)

テスト用の MVC を生成して確認していく。
$ rails g scaffold state code:string, name:string


ブラウザの言語設定で判定する場合
HTTP_ACCEPT_LANGUAGE を参照する。

# app/controllers/application_controller.rb
before_filter :set_locale
def set_locale
I18n.locale = request.env['HTTP_ACCEPT_LANGUAGE'].split(",").first
end

URL で判定する場合

# app/controllers/application_controller.rb
before_filter :set_locale
def set_locale
I18n.locale = params[:locale]
end


# config/routes.rb
scope "/:locale" do
map.resources :states
end

$ rake routes
GET /:locale/states(.:format) {:action=>"index", :controller=>"states"}
states POST /:locale/states(.:format) {:action=>"create", :controller=>"states"}
new_state GET /:locale/states/new(.:format) {:action=>"new", :controller=>"states"}
GET /:locale/states/:id(.:format) {:action=>"show", :controller=>"states"}
PUT /:locale/states/:id(.:format) {:action=>"update", :controller=>"states"}
state DELETE /:locale/states/:id(.:format) {:action=>"destroy", :controller=>"states"}
edit_state GET /:locale/states/:id/edit(.:format) {:action=>"edit", :controller=>"states"}

URL パラメータで判定する場合
ロケールの選択は上記URL で判定する場合と同様で before_filter で行う。
rails で生成する URL には自動で現在設定されているロケールを付け足す。

# app/controllers/application_controller.rb
def default_url_options(options={})
{ :locale => I18n.locale }
end

routes は普通の設定で問題ない。(ってかこっちじゃないと動かない)

# config/routes.rb
map.resources :states

ドメインから判定する方法もあるらしいが、com などだったらどうするんだろう?
と、いうことでドメインはぱす。
RESTful で考えると URL か URL Param になる。
が、やっぱりブラウザの言語設定で判断したいかな。

参考
http://guides.rubyonrails.org/i18n.html

2010年5月12日水曜日

ubuntu 10.04 で Ruby on Rails(環境構築編)2

$ rails example
$ cd example
$ rails g scaffold test code:string name:string
$ rake db:migrate

を実行後、config/application.rb をつついて
$ rails s

を実行し、http://localhost:3000/tests にアクセスすると
なにやら怪しげなエラーが発生した。

google先生に質問したところ、英語で
「1.9.1 は非サポートなんで、1.9.2 を使ってね」
と、いうありがたい回答をいただいた。

なのでまた環境構築しないと。。。

□ruby1.9.2のインストール準備
$ sudo apt-get install subversion
$ sudo apt-get install autoconf

□ruby1.9.2のインストール
$ rvm install ruby-head

ruby1.9.2はheadからインストールしないと、rails3は動かない。
preview1では実際 scaffold できなかった。(ruby BUG)

以上。

2010年5月10日月曜日

ubuntu 10.04 で Ruby on Rails(環境構築編)

rvm で ruby をインストールするとすさまじく楽勝。
ただし、事前セットアップがかなり必要なため、そこをメモしておく。

* よく分からないがおそらく ruby インストール前にインストールしておく必要アリ。

□事前セットアップ
$ sudo apt-get install gcc
$ sudo apt-get install build-essential
$ sudo apt-get install bison byacc gperf
$ sudo apt-get install zlib1g-dev
$ sudo apt-get install libreadline5 libreadline5-dev
$ sudo apt-get install libncurses5 libncurses5-dev
$ sudo apt-get install libssl-dev
$ sudo apt-get install sqlite3 libsqlite3-dev
$ sudo apt-get install curl
$ sudo apt-get install git-core


最新が入っていますといわれるものは無視する。
上記パッケージをすべてインストールした状態で
$ rvm install 1.9.1
とかする。

□rails(3 beta3) インストール
$ gem install rails --pre
$ gem install sqlite3-ruby


これで rails3 beta3 が完動する。(rails cも含めて)
もちろん rails g scaffold も動く。
rvm さまさまである。
自力でインストールした際は GEM_PATH の設定や、bindle のエラーなどではまりまくったがすんなり動くところまでたどり着いた。

明日から rails3 使ってみよう!

以上。

ubuntu 10.04 で Ruby(環境構築編)

複数バージョンの Ruby が簡単に切り替えられる rvm を使う。
□必要なもののインストール
1.git
$ sudo apt-get install git-core

2.curl
$ sudo apt-get install curl

3.zlib(開発環境)
$ sudo apt-get install zlib1g-dev

□rvm のインストール
1.github からソースのダウンロード
$ mkdir -s .rvm/src
$ cd .rvm/src
$ git clone git://github.com/wayneeseguin/rvm.git
$ cd rvm
$ ./install


□インストール後に表示されるメッセージに従い、.bashrc を変更
$ vi ~/.bashrc

先頭行に追加
if [[ -s /home/◯◯/.rvm/scripts/rvm ]] ; then source /home/◯◯/.rvm/scripts/rvm ; fi

□1.9.1インストール
$ rvm install 1.9.1

□1.8.7インストール
$ rvm install 1.8.7

各バージョンを利用する場合は
$ rvm 1.9.1

すばらしいな、これ。

2010年5月6日木曜日

ubuntu 10.04 を VMware へインストール

VMware player に ubuntu 10.04 を新規簡易インストールした際
ログイン画面で文字入力ができなくなった。
ググってみたが話題には上がってなかったためメモ。

原因は VMware へインストールする際のバグらしい。

以下の方法で対処。

1.ログイン画面の右下で再起動を選択。
2.再起動中、shift キーをずっと押し続けておく。
  (GRUB ブートローダを起動するため)
3.recovery mode を選択。
4.Recovery Menu の root(Drop to root shell prompt) を選択。
5./etc/default/console-setup を vi で開いて編集。
  以下の項目を編集

XKBMODEL="hhk" # SKIP
XKBLAYOUT="jp,us" # us
XKBVARIANT="," # U.S. English

XKBMODEL が SKIP なのが問題のよう。ここだけ hhk にしても大丈夫。
残りの項目はログイン時のデフォルト設定っぽい。
XKBLAYOUT => keybord
XKBVARIANT => language

google 先生が答えてくれなかったのはたぶん世間一般は
9.10 からアップデートしているんだろうな。

以上。