tomcat6にsolr
solrを使うためにtomcatが必要だった.
centos5にjdk1.6を入れており,tomcat5.5ではjdk1.6に未対応とのこと.
tomcat5.5なら,yumで一発で入ったんだが..
久々のtomcatで,tomcat6にsolrを入れる時点で,結構手間取ってしまった.
とりあえずここが役に立った.
Setup Solr on Ubuntu Intrepid
あと,こことか.
Solrのインストール
memcachedがアツい
http://gihyo.jp/dev/feature/01/memcached
かなり勉強になる.
前から興味はあったけど,調べてなかったんだよね.
さて,何からはじめようかな
memo:consistent hasing
http://www.hyuki.com/yukiwiki/wiki.cgi?ConsistentHashing
PerlスクリプトをRPMの中に入れようとすると,requireまで依存性チェックした
specファイルを書いて,あるアプリケーションのインストーラを作成している.
cpでperlスクリプトをコピーするようにした.
rpmbuildは通るが,いざインストールしようとすると,
のようなエラーが出た.
requireまで依存性チェックしてくれなくても..
調べたら,すぐ解決方法が見つかった.
Template Toolkit ですが、こちらで試したところ、単に これの RPM を作るだけでは「他の Perl モジュールが必要です」というエラーでインストールできません。
rpmbuild コマンドで RPM パッケージを作ると、自動で依存関係を調べて使わない Perl モジュールにまで依存してしまうのが問題です。解決方法としては 2 つあります。
- 必要とされるもの全部いれる。
- Template Toolkit のソースRPM に含まれる spec ファイルを書き換えて「AutoReqProv: no」を追加して、自動で依存関係設定しないようにする
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.成功.