Google

2008年4月5日土曜日

おくればせながら...Hyper Estraier


ウチの某案件で使うことになり

実際に触ってみました。

形態素解析はMeCabを使います。
■ MeCabインストール
- libiconv - 日本語パッチ

$ wget http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.12-ja-1.patch.gz

- libiconv
$ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz
$ tar zxvf libiconv-1.12.tar.gz
$ cd libiconv-1.12
$ gzip -dc ../libiconv-1.12-ja-1.patch.gz patch -p1
$ ./configure
$ make
$ sudo make install


- QDBM

$ wget http://qdbm.sourceforge.net/qdbm-1.8.77.tar.gz
$ tar zxvf qdbm-1.8.77.tar.gz
$ cd qdbm-1.8.77
$ ./configure --enable-zlib
$ make
$ sudo make install


- MeCab

http://mecab.sourceforge.net/ から DL
$ wget --output-document=./mecab-0.97.tar.gz http://downloads.sourceforge.net/mecab/mecab-0.97.tar.gz?modtime=1202034262&big_mirror=0
$ tar zxvf mecab-0.97.tar.gz
$ cd mecab-0.97
$ ./configure --enable-utf8-only --enable-mutex --prefix=/usr/local/mecab
$ make
$ sudo make install


- mecab-ipadic

http://mecab.sourceforge.net/ から DL
$ wget --output-document=./mecab-ipadic-2.7.0-20070801.tar.gz http://downloads.sourceforge.net/mecab/mecab-ipadic-2.7.0-20070801.tar.gz?modtime=1185895550&big_mirror=0
$ tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --with-charset=utf8 --with-mecab-config=/usr/local/mecab/bin/mecab-config
$ make


※ libiconv.so.2 がない!と怒られたときは
  /usr/local/mecab/lib 以下に、シンボリックリンクを張る
  $ sudo ln -s /usr/local/lib/libiconv.so.2 ./libiconv.so.2

$ sudo make install


■ Hyper Estraier インストール
-- Hyper Estraier

$ wget http://hyperestraier.sourceforge.net/hyperestraier-1.4.13.tar.gz
$ tar zxvf hyperestraier-1.4.13.tar.gz
$ cd hyperestraier-1.4.13
$ ./configure --prefix=/usr/local/hyperestraier\
--includedir=/usr/local/mecab/include\
--libdir=/usr/local/mecab/lib\
--libexecdir=/usr/local/mecab/libexec\
--enable-mecab\
--enable-dlfilter\
--enable-regex
$ make
$ sudo make install


■ とりあえず動かす場合
1.適当なディレクトリを作ってスタティックコンテンツを置く
$ mkdir /tmp/contents
※ 自分は、mysql に入っているデータから 1レコード=1ファイルの tsv を作って置きました。

2. ドキュメントルートにインデックスの作成

$ cd /var/www ( アタクシの環境の場合、/var/www )
$ sudo /usr/local/hyperestraier/bin/estcmd gather -il ja -sd /var/www/test_search /tmp/contents


3. apache のデフォルト cgi-bin ディレクトリに、cgiもろもろファイルをコピー

$ mkdir /usr/local/apache/cgi-bin/fts
$ cp /usr/local/mecab/libexec/estseek.cgi /usr/local/apache/cgi-bin/fts/
$ cp /usr/local/hyperestraier/share/hyperestraier/estseek.* /usr/local/apache/cgi-bin/fts/

$ vi /usr/local/apache/cgi-bin/fts/estseek.conf


以下の 2 点を変更

indexname: /var/www/test_search
replace: ^file:///home/nurai/test/full_text/contents/{{!}}http://1.my-staging.org/


4.ブラウザからアクセス
http://1.my-staging.org/cgi-bin/fts/estseek.cgi



以上!

2008年3月16日日曜日

Cookie でハマった。。。

とある、webアプリの開発で、Catlyst を使用して
プロトタイピングを行っていました。

環境は完全にローカル構築しています。
================================
OS: Fedora 7/ coLinux 0.72
Perl: 5.8.8
Catlyst: 5.7012
Apache: 2.2.8
mod_perl: 2.0.3
mysql: 5.0.51
================================

ふつうに、セッション管理を行おうとして

----------------------------------------------------------
1. mysql に create table。

mysql > CREATE TABLE session (
id varchar(50),
storage mediumtext,
expires int,
primary key(id)
);
----------------------------------------------------------
2. Helper script で model を作成。

$ perl ./script/myapp_create.pl model Base CDBI DBI:mysql:DB_NAME USER PASSEORD
----------------------------------------------------------
3. AppROOT を修正

package MyApp;
~
use Catalyst qw/
-Debug
ConfigLoader
Session::Manager
Static::Simple
/;
~
__PACKAGE__->config->{session} = {
storage => 'CDBI',
session_class => 'MyApp::Model::Base::Session',
id_field => 'id',
storage_field => 'storage',
expires_field => 'expires',
need_commit => 1,
client => 'Cookie',
domain => 'my-staging_1',
expires => 1209600,
cookie_expires => 0,
cookie_store => 1209600,
rewrite => 0,
};
1;
__END__
----------------------------------------------------------
4. Controller を修正。

package MyApp::Controller::Front;
use Data::Dumper;
~
sub index : Private {
my $self = shift;
my ($c) = @_;
$c->session->{'test'} = 'foober';
~
}
sub check : Local {
my $self = shift;
my ($c) = @_;
warn Dumper $c->session->{'test'};

~
}
1;
__END__


で、

http://my-staging_1/front/ にアクセスし

さらに表示されたページから

http://my-staging_1/front/check にアクセスしてみると、、、


FierFox の場合

$VAR1 = 'foober'



オッケーオッケー。



そして、IE7 の場合。

$VAR1 = undef






なんでやねん?!


http の request header を見ると

cookie が送られていない。。。。



IEのバージョンのせいか?

マイクロソ○トの陰謀か?

と、人様のせいにして逃げてしまいそうになりましたが

根気よく調べていると

昔、大変お世話になった hori-uchi さんのページにブチ当たりました。


http://hori-uchi.com/archives/000109.html

ホスト名か...


ということで

Apache の httpd.confを

#ServerName my-staging_1:80
ServerName 1.my-staging.org:80


とし、

C:\Windows\System32\drivers\etc\hosts


192.168.100.2 1.my-staging.org

にして

アクセスしたら OK でした。





まだまだ不勉強すぎ...

2008年2月28日木曜日

自宅サーバの電源管理

UPS を買うのももったいないので

ノートパソコンを使っています。

さすがに落雷には耐えれないでしょうが、一時的な停電ならイケるからです。

OS は RedHat9。


外部 => 内部電源(バッテリ)に切り替わったとき

安全に poweroff したいと思い、いろいろ調べてみると

自分のPCの場合は
/proc/acpi
以下のファイルやらをゴニョゴニョすると出来そうな感じです。

後でやってみよう。

覚書き::http://akiba.biz/Linux/apm.php

2008年1月10日木曜日

こんなのがほしかった。

Repcached:

http://lab.klab.org/modules/mediawiki/index.php/Repcached#.E3.83.80.E3.82.A6.E3.83.B3.E3.83.AD.E3.83.BC.E3.83.89


memcached をレプリケーションしてくれます。

しかもフェィルオーバ機能付き。

すげぇ。

Apache VirtualHostディレクティブで、perl の@INCを変える

環境:Apache 2.2.4 + mod_perl 2.0.3

<VirtualHost ...>
 PerlOptions +Parent
 PerlSwitches -I/home/foo/perl/lib
 ...
</VirtualHost>

PerlSwitches だけだと反映されない。

<Perl>ディレクティブだと

複数の VirtualHost をまたがって反映されてしまう。

まだまだ分かってないことだらけです。


...なるほどねぇ...

2007年12月25日火曜日

備忘録::memcached

memcachedとは、一言でいうとhash (キーと、値やオブジェクトのペア)を

メモリー上で管理するサーバのことです。

perl(mod_perl) + memcached は良く使っているのですが覚書もかねて

自宅のサーバに入れてみます。


必要なもの
[[ libevent-1.3e ]]
url http://www.monkey.org/~provos/libevent/
DL http://www.monkey.org/~provos/libevent-1.3e.tar.gz


[[ memcached-1.2.4 ]]
url http://www.danga.com/
DL http://www.danga.com/memcached/dist/memcached-1.2.4.tar.gz

# オプションについてはこちら... http://tech.feedforce.jp/memcached.html


Cache::Memcached(perl モジュール)
url http://search.cpan.org/~bradfitz/Cache-Memcached-1.24/lib/Cache/Memcached.pm
DL (CPAN でインストール)


*** INSTALL ************************
■libevent

$ tar zxvf /DIR/libevent-1.3e.tar.gz
$ cd libevent-1.3e$ ./configure --prefix=/usr/local/libevent
$ make
$ sudo make install
$ ls -la /usr/local/libevent
合計 48
drwxr-xr-x 6 root root 4096 xx月 xx 15:34 .
drwxr-xr-x 27 root root 4096 xx月 xx 15:34 ..
drwxr-xr-x 2 root root 4096 xx月 xx 15:34 bin
drwxr-xr-x 2 root root 4096 xx月 xx 15:34 include
drwxr-xr-x 2 root root 4096 xx月 xx 15:34 lib
drwxr-xr-x 3 root root 4096 xx月 xx 15:34 share


■memcached

$ tar zxvf /DIR/memcached-1.2.4.tar.gz
$ cd memcached-1.2.4
$ ./configure --prefix=/usr/local/memd --with-libevent=/usr/local/libevent
$ make
$ sudo make install
$ ls -la /usr/local/memd
合計 32
drwxr-xr-x 4 root root 4096 xx月 xx 15:40 .
drwxr-xr-x 28 root root 4096 xx月 xx 15:40 ..
drwxr-xr-x 2 root root 4096 xx月 xx 15:40 bin
drwxr-xr-x 3 root root 4096 xx月 xx 15:40 share


■Cache::Memcached(perlモジュール)

$ sudo perl -MCPAN -e shell
cpan> install Cache::Memcached

...

Appending installation info to /usr/lib/perl5/5.8.5/i386-linux-thread-multi/perllocal.pod /usr/bin/make install -- OK
cpan> exit

## いくつか依存モジュールを入れますか?って聞かれるので
  とりあえず全部 y


*** BOOT ************************

■memcached

まずは、空きメモリを調べてみます。

$ top
Mem: 1002652k total, 987540k used, 15112k free, 133576k buffers
Swap: 1020116k total, 0k used, 1020116k free, 395872k cached

...

(15112 + 133576 + 395872) / 1024 = 約 530M

の空きメモリ... と思ったけど、その他 mod_perl やら何やらが動いているので
まずは無難に 64M だけ割り当ててみませう。


$ /usr/local/memd/bin/memcached -d -m 64 -l 127.0.0.1 -p 11211
/usr/local/memd/bin/memcached: error while loading shared libraries: libevent-1.3e.so.1: cannot open shared object file: No such file or directory


お。。?あれ?path 通ってね??
$ export LD_LIBRARY_PATH=/usr/local/libevent/lib
$ /usr/local/memd/bin/memcached -d -m 64 -l 127.0.0.1 -p 11211


よっしゃ動いた。
では、今の状態を見てみましょう。


$ ps aux |grep mem
user 22658 0.0 0.3 4648 3032 ? Ss 15:55 0:00 /usr/local/memd/bin/memcached -d -m 64 -l 127.0.0.1 -p 11211

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to serverName (127.0.0.1).
Escape character is '^]'.
stat
STAT pid 22658
STAT uptime 221
STAT time 1198566535
STAT version 1.2.4
STAT pointer_size 32
STAT rusage_user 0.000999
STAT rusage_system 0.000000
...省略


よし。動いているっぽい。
では、テストのスクリプト。

==============================

#!/usr/local/perl --

package test::mem;

use warnings;
use strict;

use Cache::Memcached;
# 下の pm はClass::DBI::mysql を継承した DAO
use Class::DBI::mysql::MYDATA;
use Data::Dumper;

# memd に格納する hash の生存時間。とりあえず 1 分
my $EXPTIME = 60;
my $MEMD = Cache::Memcached->new({
  'servers' => ["127.0.0.1:11211"],
  'debug' => 0
});

my $res = __PACKAGE__->_do_task;
warn Dumper $res;

sub _do_task{
  my $class = shift;
  # sql 文をキーにする。
  my $sql = sprintf("SELECT name, COUNT(*) AS cnt FROM %s WHERE 1=1 GROUP BY name ORDER BY cnt DESC, ctime DESC LIMIT 20;",
  Class::DBI::mysql::MYDATA->table
  );

  # キーとなる文字列に空白はダメらしい??
  # qw で括ればいけそう。でも試してない。
  my $key = '';
  ($key = $sql) =~ s/\s/_/g;

  # まずは memd から取得
  my $rows = $MEMD->get($key);
  if($rows){
    print "from memd.\n";
    return $rows;
  }

  # memd になければ、DB から取得しセットする。
  my $dbh = Class::DBI::mysql::MYDATA->db_Main;
  my $sth = $dbh->prepare($sql);
  $sth->execute;
  my @rows_db = $sth->fetchall_hash;
  $sth->finish;
  $MEMD->set($sql, \@rows_db, $EXPTIME);
  print "from db.\n";
  return \@rows_db;
}
1;
__END__

==============================

まずは1回目。

$ perl ./mem.pl
from db.
$VAR1 = [
  {
    'name' => 'DoCoMo SH903i',
    'cnt' => '17'
  }
];


DB から来てます。



では、2回目。

$ perl ./mem.pl
from memd.
$VAR1 = [
  {
    'name' => 'DoCoMo SH903i',
    'cnt' => '17'
  }
];


よしよし。memd から。



そして、1 分後に 3 回目

$ perl ./mem.pl
from db.
$VAR1 = [
  {
    'name' => 'DoCoMo SH903i',
    'cnt' => '17'
  }
];


expire も上手くいっているようです。


次回はベンチをとって見ます。

2007年10月18日木曜日

メガマックに続き。。。

今回は、まったく技術と関係ない話です。


メガ牛丼


すごいですね。約1200キロカロリー。


もし、こんなのを夕飯に食べたとして

その事が、健康志向の彼女にバレたら、何を言われるか分かりません。。。(笑)


出禁ですね。出禁。