tomcat6にsolr

solrを使うためにtomcatが必要だった.
centos5にjdk1.6を入れており,tomcat5.5ではjdk1.6に未対応とのこと.
tomcat5.5なら,yumで一発で入ったんだが..

久々のtomcatで,tomcat6にsolrを入れる時点で,結構手間取ってしまった.

とりあえずここが役に立った.
Setup Solr on Ubuntu Intrepid

あと,こことか.
Solrのインストール

PerlスクリプトをRPMの中に入れようとすると,requireまで依存性チェックした

specファイルを書いて,あるアプリケーションのインストーラを作成している.
cpでperlスクリプトをコピーするようにした.
rpmbuildは通るが,いざインストールしようとすると,

perl(bin::header.pl) は wab-3.00-1.x86_64 に必要とされています

のようなエラーが出た.
requireまで依存性チェックしてくれなくても..

調べたら,すぐ解決方法が見つかった.

Template Toolkit ですが、こちらで試したところ、単に これの RPM を作るだけでは「他の Perl モジュールが必要です」というエラーでインストールできません。

rpmbuild コマンドで RPM パッケージを作ると、自動で依存関係を調べて使わない Perl モジュールにまで依存してしまうのが問題です。解決方法としては 2 つあります。

  • 必要とされるもの全部いれる。
  • Template Toolkit のソースRPM に含まれる spec ファイルを書き換えて「AutoReqProv: no」を追加して、自動で依存関係設定しないようにする

via PerlモジュールからのRPM作成方法

CentOSでQt4.4をrpmからインストール

ここのページを参考に,
ここから適当なrpmをダウンロードして,

rpm2cpio /tmp/qt4-4.4.3-1.fc8.src.rpm | cpio -id

これで展開.
その後,先程のページを参考にソースを改変した後に,

rpmbuild -bb ./qt4.spec

で,rpmを生成.
その際,

yum -y install libXcursor-devel libXfixes-devel libXinerama-devel libXi-devel

をやっておくことをお勧めする.

Office 2008 for MacでWordなどが起動できない

久しぶりにWordを使う用事ができたので起動したところ,
以下のようなエラーが出た.

FontCacheToolが予期しない理由で終了しました.

再度トライするも,同じ結果に.
とりあえずアップデータをインストールして,様子を見たが,結果変わらず.

検索した結果,'/Applications/Microsoft Office 2008/Office/MicrosoftComponentPlugin.framework/Versions/12/Resources/FontCacheTool'を削除すればいいことが分かった(ソース)

同様の症状が出た方は,やってみるといいかも.

スレッドを楽に扱いたい

前にPerlでスレッドを使ってみたが,例えば同時実行数などを楽に制御してみたいと思った.
TheSchwartz的な何かが欲しい.
調べてみると,Thread::Poolがあった.
これはこれでいいんだけれど,

  • Threadじゃなくてthreadsで実装したい(なんか,今後はithreadsの方が主流らしい?)
  • キューに溜まったタスクが0になれば,joinしたい

と思い,適当に書いてみた.
相変わらず冗長なプログラムだなぁ.

参考資料:

package Mst::threads::Pool;
use threads;
use threads::shared;
use Thread::Queue;
use Thread::Semaphore;

my $KILL_SIGNAL :shared;

sub new {
    my $class = shift;
    my $param = {@_};

    # init
    $param->{concurrency} ||= 3;
    $KILL_SIGNAL = 0;

    my $pool = bless $param, $class;
    $pool->{queue} = Thread::Queue->new;
    $pool->{semaphore} = Thread::Semaphore->new( $param->{concurrency} );

    $pool->{mngr} = threads->new(
	\&thr_mngr,
	$pool->{queue},
	$pool->{semaphore},
	$param->{concurrency},
	);
    
    return $pool;
}

sub thr_mngr {
    my( $queue, $semaphore, $concurrency) = @_;
    while( $queue->pending || !$KILL_SIGNAL){
	if( my $thr_params = $queue->dequeue_nb ){
	    $semaphore->down;
	    threads->new(
		# task
		sub {
		    my $semaphore = shift;
		    my $code = shift;
		    my @a = @_;
		    eval { &$code(@a); };
		    if($@){
			warn $@;
		    }
		    $semaphore->up;
		},
		$semaphore,
		shift @$thr_params,
		@$thr_params,
		);
	}
    }
}

sub enqueue {
    my $self = shift;
    my $subr = shift;

    if( !$KILL_SIGNAL){
	$self->{queue}->enqueue( &shared_clone( [ $subr, @_ ] ));
    }
    elsif( $self->{debug} ){
	warn q{can't create new thread};
    }
}

sub join {
    my $self = shift;
    $KILL_SIGNAL = 1;
    $self->{mngr}->join();
    foreach my $thr (threads->list) {
	if ($thr->tid && !threads::equal($thr, threads->self)) {
	    $thr->join;
	}
    }
}

1;

使用例:

#!/usr/bin/perl
use lib '../lib';
use Mst::threads::Pool;

my $pool = new Mst::threads::Pool(
    concurrency => 3,
    );

foreach(0..9){
    $pool->enqueue("main::test",$_);
}
$pool->join;

sub test {
    my($num) = @_;
    foreach(0..1){
	warn sprintf("count:%2d\n",$num);
	sleep 1;
    }
    print qq{=== exit: $num\n};
}

exit;

結果:

count: 1
count: 2
count: 0
count: 2
count: 0
count: 1
=== exit: 2
=== exit: 0
=== exit: 1
count: 3
count: 4
count: 5
count: 3
count: 4
count: 5
=== exit: 3
=== exit: 5
=== exit: 4
count: 6
count: 7
count: 8
count: 6
count: 7
count: 8
=== exit: 6
count: 9
=== exit: 7
=== exit: 8
count: 9
=== exit: 9

おk.成功.