Home > Programming Archive

Programming Archive

H2 Databaseでのクラスタリング

Pure JavaのRDBにH2 Databaseというものがある。組み込みにもサーバ用途にも使えて、なおかつものすごく高速らしい。あるテストによるとmysqlよりも高速だとか。詳しい情報は公式ページを参照のこと。今回はこのH2をサーバモードで起動してクラスタリングしてみます。クラスタリングはサーバを複数起動しておいて、クラスタリング用のプログラムを起動させるだけ。

java -cp h2.jar org.h2.tools.Server -tcp -tcpPort 9101 -baseDir db1
java -cp h2.jar org.h2.tools.Server -tcp -tcpPort 9102 -baseDir db2

java -cp h2.jar org.h2.tools.CreateCluster -urlSource jdbc:h2:tcp://localhost:9101/sample -urlTarget jdbc:h2:tcp://localhost:9102/sample -serverlist localhost:9101,localhost:9102 -user sa

と実行するだけ。とても簡単にクラスタ化できます。ただ、2台しかできず、仕組み上スケール化にはならないようです。(Pure Javaだからそこらへんは自分で書いた方が?)

JRuby on Railsでの非同期処理

jrubyにおいてのスレッド処理はjava vm上で動いているため、javaのスレッド機構を使っている。なので、jrubyにおいてのスレッドはネイティブスレッドである。そこで、JRuby on RailsではとくにBackgroundDrbなどを使わずとも非同期処理が行える。書き方はrubyのスレッドと同様で、Thread.new{}とするだけ。

Thread.new {
channels = Channel.asc(:updated_at).limit(20)
channels.each do |channel|
channel.update_feeds
end
}

上記サンプルはRSSを非同期に更新するプログラムの抜粋。ただし、スレッドを生成したコントローラのインスタンスが有効である間でしかスレッドは生きられないので、開発環境ではコントローラのインスタンスはキャッシュされないため、プロダクション環境でしか有効でない点に注意。

Railsをjrubyで使うときの注意点など

JRuby でRailsを使うにあたってはいろいろと不具合がありますが、そのうちのひとつとして、jruby script/consoleで正しく日本語が扱えないという問題があります。この問題はどうもreadlineが関係しているようで、次のようにして回避することはできます。

jruby script/console –irb=”jirb –noreadline”

これで日本語を正しく扱えるようになるんですが、十字キーやタブを認識しなくなったりと副作用がでます。どうしても日本語を使って何かをしたい時にだけ使うとよいでしょう。

そのほかの問題点としてはjdbc-adapterの型変換がおかしい?問題があります。たとえばactiverecord-jdbcsqlite3-adapterを使った時、datetime型がinteger型になってしまい、日付を扱うことができません。(バージョン0.8.2時点)そのほかにもデータベースとしてh2 databaseを使用した場合、usersテーブルに余計な情報が入ってしまいます。

jruby script/generate model user
jruby -S rake db:migrate

としたとき、db/schema.rbには

create_table “users”, :force => true do |t|
t.string    “name”,       :limit => 2147483647
t.string    “admin”,      :limit => 2147483647
t.string    “remarks”,    :limit => 2147483647
t.timestamp “created_at”
t.timestamp “updated_at”
end

と、name,admin,remarksが勝手に作られます。h2ではusersというシステムテーブルがあり、勝手に作られるカラムはこれの要素なのですが、railsがテーブル情報を作成する際にデータベースのスキーマ情報を読んで作っているからだと思います(システムテーブルの情報を持ってくるのが問題だけどおそらくJDBCの問題)。この問題は一応jruby本家の方にも報告されてるようなので、そのうち対応されるのかなと思います。

RMagickのインストール for Ubuntu and Rails

DebianでRMagickをインストールをgemを使ってインストールしようとするとなぜかコンパイルできなくてはまった記憶があるが、Ubuntuだと結構すんなり入ってしまう。gemでのインストールにはMagick-configが必要になってくるので、あらかじめインストールしておく。

sudo aptitude install libmagick9-dev

でインストールができる。続いて

sudo gem install rmagick

でrmagick(現在の最新版は2.5.2)がインストールできる。Rails2.1からはgemの依存関係を設定ファイルに書き出し、移行後の環境において、インストールチェックおよびインストールが簡単にできるようになっている。

rake gems

とするとgemパッケージの依存関係を調べて表示してくれる。

rake gems:install

とすれば足りないものをインストールしてくれる。ちなみに、設定の書き方はちょっと調べないとわからないものがあるので要注意。たとえばwill_paginateなんかがそう。パッケージ名とライブラリ名が異なっている場合は:libなどで正しく指定してあげないとだめ。

config.gem ‘mislav-will_paginate’, :lib => ‘will_paginate’, :source => ‘http://gems.github.com’
config.gem ’sqlite3-ruby’, :lib => ’sqlite3′
config.gem ‘rmagick’, :lib => ‘RMagick’

サンプルとしてはこのような感じ。

以上。

C/C++でUTF-8の読み書き

C/C++でUTF-8のファイルを扱おうと思うと結構大変だったりする。wifstreamを使って以下のようにして読み込んでみたけど文字化け。

wifstream wifs(L”file.txt”);
wstring line;
while(getline(wifs, line))
{
wprintf(”%s”, line.c_str());
}

どうにかならないかなと探していたらVC2005以降からだけれどもfopenにエンコードが指定できるとか。

_fopen_s(”file.txt”, “rw,ccs=UTF-8″)

という感じにccs=UTF-8を指定するだけ。今回のお仕事ではWindows限定なのでこれで万事OK!この情報に行き着くまでに実に2時間はかかったよ(^^;

Home > Programming Archive

Search
Feeds
Meta

Return to page top