色々、仕事をしているとワードやエクセルの資料がいっぱい、たまりますよね。
みなさん、どうやって管理してますか。
色々調べた結果、ECMっていう言葉にたどり着きました。
いわゆるドキュメント管理というものです。
まー、少人数でやっているプロジェクトなんで、あまり大そうな物を導入すると返って管理が手間になりますよね。
そこで、便利で実用的な物を紹介することにしました。
まず、構成から
OS:FreeBSD
Subversion
Apache
Hyper Estraier
TortoiseSVN
こんな感じです。
Subversionについて
中心となるのは、Subversionですね。
このSubversionというのは、バージョン管理ツールというもので、ファイル群を使用する人たちで共有していくものです。
例えば、プロジェクト内のワードファイルをある管理されているディレクトリで編集するとして、その場合、その場所から最新をダウンロードして、編集完了後に戻しておくといった物です。
そんなのは、サーバで共有しておいて、直接編集すればいいじゃんと思いますが、そんなことをすると誰が編集中かわからないし、最後に上書きしてしまったら、永遠に過去の状態が消失してしまいます。
ということで、過去の状態も全て管理してくれるのが、バージョン管理ツールということです。 編集中の人fがいれば、ロックをかけられますし、編集して上書きしようとしたら、既に誰かが編集してしまったことがわかったりします。
ということで、バージョン管理にまかせておけば、書類の世代管理や、状態管理は不要ということです。
しかしながら、そういった作業が面倒なソフトであれば、お勧めするわけがありません。 このSubversionの良いところは、このソフトを中心に色々便利なツールが実用レベルで揃っているということです。
世の中、ウィンドウズを使用している人が大半だと思います。
そういった人には、エクスプローラに融合してくれるTortoiseSVNが最適です。
このソフトは、通常ならコマンドで行うSubversionの動作を、全てGUIでこなし、しかも、エクスプローラを拡張してくれるので、意識せずに利用できます。
TortoiseSVNは、有名なソフトですので、Googleで検索すれば色々と良さがわかると思います。
バージョン管理は、これでできたのですが、満足というわけにはいきません。
Hyper Estraierについて
大量にある資料から、何かを探したい時がプロジェクトを進行してくると徐々に増えていきますよね。
それを解決してくれるのが、全文検索を行ってくれるツールです。
日本では、Namazuというソフトがあるのですが、ここでは、Hyper Estraierを使用してみます。
このソフトは、資料中の単語を集めて、索引を作成してくれます。
探したいときに、単語を指定してやると、索引から対象となるファイルを教えてくれます。
要するにGoogleのような物ですね。 このソフトは、外部のツールと連携して、色々なファイルに対応できますので工夫次第で、化けるソフトです。
先ほど紹介したSubversionで管理されている資料を、このHyper Estraierで、索引付けを行い自由な単語で検索できるようにしてみましょう。
しかも、ユーザインターフェースは、ブラウザです。
ブラウザで行うことで、クライアントに幅ができて便利ですね。 これで、プロジェクト内専用、Googleが実現できるということです。
では、FreeBSDのPortsを使って、全部セットアップしてしまいます。
※Subversionをセットアップする時に apache用のmodを作るようにして下さい。
TortoiseSVNだけは、Windowsにインストールして下さい。
SubversionとTortoiseSVNは、よそのページで、セットアップ方法を学んできて下さい。
まず、Apacheで、SubversionのリポジトリをWebDav経由で公開します。
svn.confファイルを以下のように記述して作成して下さい。 ※パスは、/usr/local/etc/apache22/Includes/
------------------------------------------------------------------------------------
<Location /svn/doc>
DAV svn
SVNPath /usr/home/svn/svnroot
AuthzSVNAccessFile /usr/home/svn/svnaccess
</Location>
------------------------------------------------------------------------------------
svnaccessファイルを以下のように記述して作成して下さい。 ※パスは、/usr/home/svn/ 上記のsvnaccessのパスに合わして下さい。
------------------------------------------------------------------------------------
[/]
* = rw
[svnroot:/]
* = w
------------------------------------------------------------------------------------
これで、みんなが参照できるようになったはずです。
Hyper Estraierの設定
次に、Hyper Estraierを設定しましょう
適当なディレクトリを作成し、そこで作業を行います。
まず、estwaver init casket とコマンドをたたいてみましょう。
すると、casketディレクトリが作成されます。
このディレクトリの中に、Hyper Estraierの索引がたまっていきます。
ここからが、難しいので、気を引き締めましょう。
まず、casketディレクトリの中の、_confというファイルを編集します。
seed: 1.0 | http:// hogehoge とあるので、先ほど公開した、WebDavのURLを記載します。
allowrx: ^http:// hogehoge ここに、上記と同じURLを記載します。 これを書かないと、勝手によそのサーバまで検索対象にしてしまうからです。
denyrx:に、拡張子らしきものが、たくさん書かれています。 ここに記載があるものは、対象から外すという意味なので、対象にしたい拡張子を外します。 しかしながら、なんでも外せば良いというものではなく、Hyper Estraierが対応できるものに限定しましょう。
例) doc,xls,pdf 等
urlrule: に以下を追加しましょう。
urlrule: \.doc${{!}}application/msword
urlrule: \.xls${{!}}application/excel
urlrule: \.pdf${{!}}application/pdf
typerule:に以下を追加しましょう。
typerule: ^application/(msword|excel)${{!}}H@/usr/local/share/hyperestraier/filter/estfxmsotohtml
typerule: ^application/pdf${{!}}H@/usr/local/share/hyperestraier/filter/estfxpdftohtml
language: 1 とりあえず、日本語ということで
textlimit: 40960 これぐらいは、ほしいでしょ
threadnum: 1 並列処理をさせるとバグるみたいです。
_confは、これぐらいです。
フィルタの設定
さーさらに、難しくなりますよ
次は、ワードやエクセル、PDF用のフィルタを準備します。
portsから
testproc/xlhtml
testproc/wv
testproc/pdftohtml
textproc/html2text
をセットアップします。
さらに、perlのスクリプトを作成します。
/usr/local/bin/timeoutshを以下の記述で作成します。
------------------------------------------------------------------------------------
#!/bin/sh
# arg 1.. timeout value 2..exec command
count_timeout=$1
shift 1;
$@ &
pid=$!
count=0
while [ $count -lt $count_timeout ]
do
isalive=`ps -f | grep $pid | grep -v grep | wc -l`
if [ $isalive -eq 1 ]; then
count=`expr $count + 1`
sleep 1
else
count=`expr $count_timeout`
fi
done
isalive=`ps -f | grep $pid | grep -v grep | wc -l`
if [ $isalive -eq 1 ]; then
kill -s QUIT $pid
wait $pid
echo $pid was terminated by a SIG$(kill -l $?) signal.
fi
------------------------------------------------------------------------------------
timeoutshに実行権を与えておいて下さい。 例) chmod a+x timeoutsh
次にフィルタスクリプトを改造します。
/usr/local/share/hyperestraier/filter/estfxmsotohtmlの中
最後の方にある記述(case文)を書き換えます。
------------------------------------------------------------------------------------
~~~
# output the result
case "$infile" in
*.doc)
wvWare --charset=UTF-8 --nographics -x wvText.xml "$infile" 2> "/dev/null" | output
;;
*.xls)
timeoutsh 60 xlhtml -te -nc -fw -a "$infile" 2> "/dev/null" | html2text -nobs | output
;;
*.ppt)
ppthtml "$infile" 2> "/dev/null" | html2text -nobs | output
;;
*)
printf '<div>!!! UNKNOWN FORMAT !!!</div>\n' | output
;;
esac
------------------------------------------------------------------------------------
もう一つ、/usr/local/share/hyperestraier/filter/estfxpdftohtmlの中
------------------------------------------------------------------------------------
~~~
# output the result
pdftohtml -q -i -stdout -enc UTF-8 "$infile" | html2text -nobs | output
------------------------------------------------------------------------------------
フィルタは、こんなもんでしょう。
Hyper Estraierの改造
さーゴールが近づいてきましたよ。
実は、上記のフィルタは、 Hyper Estraierを改造することを前提にしています。
理由は、検索した結果のタイトルが化けてしまうからです。
そこで、ports内でコンパイルした後のソースを改造します。
※以下は、1.4.13用です。
/usr/ports/textproc/hyperestraier/work/hyperestraier-1.4.13/
wavermod.cのmake_doc_with_xcmd内で、フィルタを実行するコマンドの引数にurlを追加します。
sprintf(cmd, "%s \"%s\" \"%s\" ", xcmd, iname, oname );
↑を以下に書き換えます。
sprintf(cmd, "%s \"%s\" \"%s\" \"%s\" ", xcmd, iname, oname, url );
本来、これだけで、とりあえず良いのですが、フルパスで結果をみたい方は、以下も行います。
make_doc_with_xcmdに引数として char* url_keep を追加します。 ※プロトタイプ宣言も忘れないで下さい。
fetch_document関数内の頭で、char url_keep[4096];を宣言します。
if(!est_url_shuttle ~~~の直前で、strcpy( url_keep, url );を記述します。 これで、urlの中身が変更される前にurlのコピーが取れます。
make_doc_with_xcmd関数をコールするところに引数として、url_keepを追加します。
sprintf(cmd, "%s \"%s\" \"%s\" ", xcmd, iname, oname );
↑を以下に書き換えます。
sprintf(cmd, "%s \"%s\" \"%s\" \"%s\" ", xcmd, iname, oname, url_keep);
ソースを無事書き終えたら、makeしましょう。
成功したら、豪快にコピーです。
cp estwaver /usr/local/bin/estwaver
次に検索結果の詳細が化けるので、対応しておきます。
estseek.cで、
xmlprintf("<a href=\"%@\" class=\"doc_title\">", turi); の次の行から、以下のようなソースがあるのですが、URIをそのまま出力してしまうので、置き換えてしまいます。
前
sprintf(numbuf, "%%%d@", detail ? 9999 : g_attrwidth);
xmlprintf(numbuf, title);
後
xmlprintf("<script type=\"text/javascript\">document.write(decodeURI(\"");
xmlprintf("%s",title);
xmlprintf("\"));</script>");
xmlprintf("<span class=\"doc_link\">"); の次の行も同じ処置を入れておきます。
前
sprintf(numbuf, "%%%d@", detail ? 9999 : g_attrwidth);
xmlprintf(numbuf, turi);
後
xmlprintf("<script type=\"text/javascript\">document.write(decodeURI(\"");
xmlprintf("%s",turi);
xmlprintf("\"));</script>");
幅の制限が効かなくなりますが、化けるよりはマシということで。
makeしましょう。
成功したら、また、豪快にコピーです。
cp estseek.cgi /usr/local/libexec/estseek.cgi
以上で、Hyper Estraierが、完了ですとしたいのですが、まだまだ、ありますよ。
索引の作成
いよいよ、索引を作成してみましょう。
随分前のように思えますが、estwaver init casket で作成した、作業ディレクトリにもどりましょう。
そこで、estwaver crawl casket とコマンドを打ち込みましょう。
すると、どがとかと、画面いっぱいに文字が羅列されていきます。
これは、estwaverが、urlをたどって索引を作りはじめたということです。
この作業は、ファイル数分行うので、数によっては、時間がかかります。
気長に待ちましょう。
と、待っているのもしょうがないので、ブラウザより検索が行える環境を作りましょう。
Hyper Estraierは、検索にcgiを利用します。
とにかく、apacheにcgiを実行できる場所を確保し、そこに、cgiの雛形をコピーします。
例) apache22のcgi-bin以下にdoccgiを作り、そこにコピーします。
cp /usr/local/share/hyperestraier/estseek.* /usr/local/www/apache22/cgi-bin/doccgi/.
cp /usr/local/libexec/estseek.cgi /usr/local/www/apache22/cgi-bin/doccgi/.
次に、estseek.confを修正します。
indexname: にestwaver init casket で、作成したディレクトリのパスに_indexを追加して記述します。
例)
indexname: /hogehoger/casket/_index
後の設定は、Hyper Estraierのベージをgoogleすれば、色々とわかります。 とりあえず、上記だけでも問題無いです。
次に、htmlを用意しましょう。
------------------------------------------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>Index</TITLE>
<META http-equiv=Content-Type content="text/html; charset=UTF-8">
<META content="MSHTML 6.00.2900.3243" name=GENERATOR></HEAD>
<BODY>
<FORM method="get" action="/cgi-bin/doccgi/estseek.cgi" >
<DIV>
書類検索
<INPUT type="text" name="phrase" value="" size="32" tabindex="1" />
<INPUT type="submit" value="検索" tabindex="2" />
<INPUT type="hidden" name="enc" value="UTF-8" />
</DIV>
</FORM>
</BODY>
</HTML>
------------------------------------------------------------------------------------
こんな感じですか、さー、後は、あなた次第で、活用して下さい。
ほんとに便利な世の中ですね。