雑記帳 2004年 10月第5週

2004/10/24 Sun.

昨日というか今朝寝たのが5時半なんだけど、何故か8時半過ぎには起きるハメになってたりする。遠出は避けたいものだ。
で、今日は俺と「itsuki」と某埼玉県庁勤務の地方公務員、お馴染みのY成君と後輩の女の子二人の計6人で奥多摩方面へ。
もともとは紅葉見学に行こうという趣旨だったらしいけど、時期的にあと2週間くらい遅ければよかったけどね。まだ微妙でした。
とりあえず「itsuki」に家まで迎えに来てもらって、移動中はほとんど寝てました。2時間しか寝られてないし。動けないってーの。

まず七代の滝というトコへ行ったんだが、悪路にもかかわらずレガシィB4に頑張ってもらう。しかも6人乗りという悪環境だし。
途中に宙吊り放置されてるケーブルカーってか、荷物運搬のための簡易ケーブルカーが頭上にあってビビったりしたけど。
奥多摩のこの辺なら採掘作業とかやってた時期もあるだろうし、そういったモノの名残でしょう。そういうのを見るのも面白い。
で、行き先知らないけどとりあえず移動を開始したようで、相変わらず自分は半分意識が飛んでる状態で車に揺られてました。
奥多摩湖周遊道路の周辺で車を止めてると、突如白バイの大集団が通過していく。その時は何か事件かとしか思わなかった。
ところが、この時にはまさか自分達がその白バイの集団のお世話になるとは夢にも思わなかった。そして、事件は起こった。
そう、あれは丁度お昼時の出来事だった。気が付くと、周囲には警視庁の方々がざっと40人程度。うーん、これはかなり圧巻。
いやね、俺は何も悪いことしてません。まぁ、色んな偶然というか不幸が重なっただけです。とりあえず時間がかかりましたね。
朝食抜きな上に睡眠不足な自分もイライラしてましたが、渦中の人はもっとイライラしていただろうし、まぁ色々あったワケですよ。
あれこれ詳細に書いてもいいんだけど、本人の名誉の問題もあるので割愛。どこかのプリメーラに期待してたけど、来ないしさ。
で、ようやく昼食でどこかのそば屋に入る。そば定食1,400円也。味は良かったと思うけど、量が最悪。あと2セットは食えたな。
その後もさらにドライブは続き、自分は睡眠を続け、たまにオープンカー状態のコペンに乗って気分爽快だったり。でも眠いぞ。
しばらくすると、5年2ヶ月ぶり2回目の場所となる日原鍾乳洞へ到着。外の気温は約10度、鍾乳洞の中もそれくらいらしい。
財布を車の中に置いてきたため、入場料600円はお財布代わりの公務員に立て替えてもらい、早速中へ入る。うん、寒いな。
どこかの坊主が半ケツしてデジカメを撮っていた光景が思い出されます。で、40分くらい散策してから、ようやく外に出ることに。
そのまま立川の方へ帰ってきて、一部の人が直帰、残りは万願寺のサイゼへ行くことに。時間は大体18時半くらいとかだっけ。
体調が思わしくないせいか、一服つけても気分が悪い。パスタやらライスやらを食って、自分はモノレールにて一人で帰る事に。
そう、この男の運転するレガシィB4は凄まじく寝心地が悪いのだ。その上に食後という事も重なって気分悪くなるのは明瞭だし。
で、多摩センで本屋に寄ってお目当ての本を探してみるも見つからず。10月に発刊されるはずなんだけどなぁ。まだなのか?
何も買わないで帰るのは癪に障るので、コンビニで飲むヨーグルトブルーベリー味を買って、それを飲みつつ帰宅。疲れた。
あ、結局日原鍾乳洞への入場料を立て替えてもらったままじゃん。別にいいか。次に会って忘れてたら教えて下さいK岡さん。

2004/10/25 Mon.

いい加減にPerlでやりたい事がなくなってしまった。ってか、ただのアイディア不足なだけか。さて、どうしたらいいもんかね。
こんな事を延々と考えていても、別にアイディアが振って湧くワケでもないし、時間は有限だ。ってなワケで、Javaの学習。
昔に一時的に勉強したってのもあって、そりゃ多少はわかります。品川でのC++で、OOPも多少は学びました。ならば再開だ。
んで、早速教則本を片手にあれこれやっているんだけど、どうにもこうにも気分が乗らない。あのさ、Javaって何が作れるの?
何だか以前も似たような事を書いた気がする。何が作れるかわからんから、何も作りようがない。うーん、またこの循環か。
何と言うかさ、JavaとかってPerlやらと違って実用的なサンプルプログラムを配布してるトコって少ない。よって、手本が少ない。
しかも、サンプルが無い以上、それを元手に改造して勉強するってのもできないし。言い換えれば、業務用言語ってことなのか?
どうでもいいけど、文字列の扱いがC系並にメンドくさいな。クラスの継承とかもよくわからんし。これでいいのかプログラマー。
あと、デバッガー使わないと凄まじくメンドい。とりあえずは「Eclipse」の導入を検討。「JBuilder」は使用期限切れになってるし。
しょうがないけど、英語を読みつつ「Eclipse」を入れる事にします。うーん、何を作って勉強すればいいんだか。本気で困ったぞ。

2004/10/26 Tue.

さて、昨日から検討していた「Eclipse」を早速導入してみた。日本語化できるってのは便利でいい。起動時にこんなのが出ます。

Eclipseって聞くと、どうしてもLUNA SEAのSUGIZOさんが使ってたギターが頭に出てきてしまうんですが。あれもEclipseだよね。
とにかくセットアップを終えて(ってか圧縮ファイルを解凍するだけ)軽く使ってみたんですが、エディタ+プロンプトよりはいいな。
デバッグ作業をしようとすると、専用の画面(パースペクティブというらしい)に切り替わるのもいい。まずはさっさと慣れないとな。
ってか、よくもまぁこれだけのレベルのモノを無償配布するよな。金取れそうなレベルだと思うんだが、オープンソースらしいし。
あとは、配色設定とかできるのは助かる。メモ帳みたいな配色設定は、目に負担がかかります。自分の環境はこんな感じ。

あ、ちなみにこの画像はただのエディタです。この雑記はオーサリングソフトは使わずに、すべてエディタ上で編集してるのです。
学校の黒板がどうして深緑色なのかがよくわかります。長時間見続けるには、明るい色はキツいのです。全体的に暗めがいい。
そんなこんなで配色設定も済ませて、簡単なのを組んで実行してみる。うん、いちいちjavacとかやらずに済むから楽ですな。
で。ネットであれこれと探し物をしていたワケですよ。参考になりそうなプログラムとか。でも、やっぱり配布サイトが少ない。
Perlでは、例えば一番主流となっている配布プログラムといえば掲示板系である。何故、掲示板はここまで普及しているのか。
言い方が悪いな。「何故、掲示板系のプログラムは初心者などを対象に広く出回っているのだろうか」が正しい言い方になるか。
Perlとは本来は文書管理の為に開発された言語である。よって、ファイル操作や文字操作などが非常に手軽にできるのが特徴。
掲示板を一つ作るだけで、ログファイルの操作によるファイル操作、書き込みや読み出しなどによる文字列操作が覚えられる。
URLエンコードなども覚えられるし、HTMLの基礎やデザイン、画面系CGIで多用されるフォームの概念まで一通り網羅する。
言ってみれば、掲示板系のプログラムはPerlの参考書そのものみたいなモノ。んで、Javaでそういうのは無いんですかね?
個人で手軽に開発するってモノじゃないんだろうなぁ。何というか、業務用言語?個人レベルで何ができるかもわからんしさ。
やっべぇよ、このままじゃ何も勉強にならんって。やっぱり手っ取り早いのはJSPか?あまりあれこれ入れたくないんだよなぁ。

2004/10/27 Wed.

さて、つい先ほど正式に次のプロジェクトが決まりました。ちなみに、異動は11月1日付けとのことです。一体どうなることやら。
相変わらず話がさっぱりで、結局場所は新宿らしいし。一体どういう事なんだ。それにしても、ここはアホが多い職場ですね。
んで、どこの仕事をやるのかと言うと、もう二度と関わりたくないと思った天下の○○○コ○○ェ○です。うわっ、マジかよっ!?
もうね、みかか系には関わりたくないんだよね、ホントに。しかも何が厄介かって、今回はC系をやりに行くのです。イヤだー。

そんな逆境にも挫けずに、今日はサーブレットコンテナとして名高い「Tomcat」を導入。「Eclipse」と連携を取れればよし。
まずは、「Tomcat」を公式からダウンロードと思ったけど、ウチの社内イントラで配布してたから、そちらから入手することに。
別に何もややこしいことしないでも、普通にインストール終了。で、正常に稼動しているかを確認するためにlocalhostで接続。
……あれ?403で蹴られます。何もしてないのに、インストール失敗も何もないだろ!と思ったら、ポート番号指定して無いや。
画面貼ろうと思ったけど、ウィンドウ小さくするとJSPのデザインがおかしく見えるから却下。とりあえず正常に入ってるようです。
続いて、「Eclipse」と連結させるために専用のプラグインを入手。素晴らしいものを開発する人もいるもんだ。便利すぎますよ。
さて、あとは設定関連をあれこれ変更するだけで「Eclipse」から「Tomcat」本体を操作できるようになるはず。……なるはず。
ならねぇし。設定箇所がかなり色々とあってわかりにくいな。パスやらJREやらを見直しまくって、とりあえず再起動してみる。
OK、ようやく起動コンソールを直接操作できるようになりました。「Tomcat起動」を実行してみると、何とか起動はするっぽい。
しかし、何故かパースペクティブ関連エラーが出る。正常に動いてるからいいんだろうけど、無駄なダイアログはウザすぎだ。
エラー内容を「Google」に放り込むと、2件ヒット。うわ、この症状が出る人って少ないのか?結局は解決できましたけどね。

で、一応開発環境の超最低限は用意できたんだけど、次から行くのはC系なんだよな。Visual Studio .NETでも借りてくるか。
しかし、開発じゃなくてソースコードの見直しらしい。そんなん俺には無理ですよ?せめてデバッガーくらいは使わせて下さい。
相手も天下の某みかかだし。あそこ関連のはホントにイヤ。細かいとこにやたらとうるさいし。結局鬱になるのは変わらんのか。

2004/10/28 Thu.

今日は朝から没頭している事があります。え?まさかJavaなんて真面目にやってるワケないですよ。時代はPerlであります。
昨日からちょっとあれこれ調べている事があって。何で「Google」の検索はあんなに速いのかと。どういうシステムを使ってんだ。
で、ネットであちこち見て回ってると、どうやら数千台規模のマシンで並列処理を行なっているらしいです。はい、俺には無理。
ってか、そんな環境あるはずねえよ!やむを得ないので、スクリプトの改造だけでいかにして検索を速くできるかを試行錯誤。
ウチのサイトで使ってる検索方式は全文検索というもので、全てのファイルを読み込んで中身を検索する方式で、遅いです。
一方のインデックス方式は、あらかじめファイルの中身を単語区切りなどで索引(これがインデックス)を作成しておくものです。
ファイルの量が多ければ多いほど、前者の検索方式は凄まじいパフォーマンスの低下を見せます。ブラウザのタイムアウトも。
とりあえず、ウチでもインデックス方式を導入してみようと思い、まずはあれこれ考える。果たしてどんな機能が必要なのか。

まずは、インデックスを作成する機能。ってか、インデックスの中身って何よ?「Namazu」でも使えればいいんだろうけどさ。
あれこれ余分なもの入れて、システムをごちゃごちゃさせたくないし。ここは適当に推測してみる。さて、中身は何だろうか。
ここでふと思いつく。全文検索は、ただ単にファイルを大量に開いて閉じてを繰り返してるから、遅いのではないだろうか。
ならば、あらかじめ存在するファイルを一つのファイルにまとめて読ませておいたらどうだろうか。インデックスとは違うなぁ。
とにかく、数百ものファイルを読んでたのが1つのファイルで済めば、どう考えても速度は上がるだろう。そう思い、早速実験。

  • インデックスは、CGIから見たファイルへのパス、タイトルまたはファイル名、ファイル本文とする。
  • 上記の各項目はタブ区切りにして保存し、1つのファイルのインデックスあたり1行が生成される事とする。
  • 行数は検索対象の指定拡張子に該当するファイル数と同等になること。総バイト数は異なる点に注意。
  • インデックス検索は全文検索と同等の結果を出力すること(これができなければ意味が無い)。

まずはインデックス作成処理を組み込み、管理者のみインデックスを更新可能とするような機能を実装する。これは楽勝かな。
次に、検索方法を変更。ここはかなり改修が入る。個々のファイルを処理している部分を、インデックスのみに変更する。
検索結果に出力するファイルの本文のためのタグの取り払い処理などは、インデックス作成機能に全部実装する事にする。
HTMLからタイトルを検出する処理も同じく。検索だけに特化させないと、パフォーマンスが悪くなる。多分。自信ないけど。
で、一通り完成したのが「こちら」です。まだ改修部分がありそうなので、一応テスト版ということになります。さて、計測するか。
計測対象は以下の通りの4パターン。ローカルは会社のマシンなんだけど、別に家のと比べても大差無いでしょ。誤差程度だ。
ちなみに、計測回数は10回で、一回あたり平均何秒の処理を要しているかで、処理性能を計ります。大雑把だけどさ。
また、サーバーよりもローカルでの処理の方が速い上に、オーバーヘッドやレスポンスも考えて、検索対象ファイル数を変更。
ローカルの検索対象ファイル数は127、サーバーのファイルは101としてみた。多分これくらいで釣りあいも取れるっしょ。
もちろん、インデックス検索の場合は対象ファイルはインデックスのみです。中身の行数が127行か101行かの違いはあります。
また、検索条件は検索ワードに「CGI BBS」の2つの単語を入力して、OR検索(いずれかの単語を含む)を指定しました。

  • 会社のローカルマシンにて、今まで通りの全文検索を行なう。
  • サーバーに上げた状態で、今まで通りの全文検索を行なう。
  • 会社のローカルマシンにて、新規に作成したインデックス検索を行なう。
  • サーバーに上げた状態で、新規に作成したインデックス検索を行なう。

計測結果は以下の通り。所要時間はPerlのtime関数を使用。処理開始時と終了時の時刻の差を秒数で表しました。

1. 3 3 3 3 3 3 3 3 3 3 平均3.0秒
2. 10 8 4 5 11 12 6 4 13 5 平均7.8秒
3. 1 2 2 2 2 1 2 2 1 2 平均1.7秒
4. 3 4 3 3 7 7 3 6 3 6 平均4.5秒

ケース1とケース3、ケース2とケース4を比較すると、明らかに(自称)インデックス検索の方が速度が向上してます。
ファイルのオープンなどはPerl内部で使用するメモリ内とは別の部分から読み出すため、時間かかるのはやむを得ない。
これで検索対象ファイルが増えれば増えるほど、全文検索と比べて速度に差がついていく。また近いうちに計測するか。
しかし、何よりも驚きなのが、ローカルで実行するのとサーバー上で実行するのとは、処理速度が3倍近く違う点だ!
でも、ケース2とケース4を見ればわかる通り、結構速度にバラつきがあったりする。これはどう結論付ければいいんだか。
何はともあれ、いい勉強になりました。でも、本場のインデックス検索を試してみない事にはどうしようもないんだろうけど。

2004/10/29 Fri.

来週から新宿に異動になる以上、ここの支社内で期限が切られてる提出書類は出せるうちに出さないとメンドいことになる。
そんなワケで、朝からあれこれ書類ばかり書いてました。支社内から外に出る時には配置移動シートってのを書くワケです。
それと、総務部に提出するための異動届。ってか、こんなのをいちいち出してやらんと人の動きも把握できないのかクソ会社。
あのな、本人に書かせないでお前らが勝手に書いてくれってーの。しかも、やり方がアナログすぎ。ホントに情報処理業界か?
あと、11月8日までと言われていた、一番メンドいっぽい書類が三枚ほど。働いてれば書く、いわゆる年末調整の書類です。
ところが、他人と比べて書く項目が圧倒的に少ない。そりゃそうだ。生保未加入、損保未加入、配偶者無し。これは楽ですな。
結局は住所氏名やら捺印やらを適当に済ませて、さっさと総務に提出。はい、年末調整は終了。さて、微妙に時間が余った。

で、また今日もPerlの話になるワケです。速度がどうこうとか昨日は書いたけど、今日ももう少しだけ速度について書いてみる。
Perlではベンチマークという便利なモノが(確か)標準であります。実際にベンチマークするには、こんな感じで書きます。

#    Benchmarkモジュール使用の宣言
use Benchmark;
#    試行回数をセット
my $count = 10000;
my %codes = ();
#    比較対象のコードを記述
$codes{'code1'} = q{
    (中略)
};
#    比較対象のコードを記述
$codes{'code2'} = q{
    (中略)
};
timethese ($count, \%codes);

ベンチマークを行なうためのコーディングは、普通はこんな感じになります。ただ、これは非常に使いづらいという欠点がある。
自分というか大半のPerlをCGIとして利用する人にとっては、コマンドラインからPerlを叩けばいいというものではないのです。
例えば、$ENV{"QUERY_STRING"}などの値を読み出すには、非常にメンドくさい。こういう時にはDEVEL::DProfというのがある。
これもモジュールの一種で、実行するCGIのサブルーチンごとにその処理が何秒かかったかを計測してくれる優れモノです。
スクリプトの文頭に書いてある「#!/usr/local/bin/perl」というPerlへのパスの部分に、「-d:DProf」と追記するだけで問題なし。
もちろん、DEVEL::DProfモジュールがインストールされている事が条件。これって標準で入ってたっけ?あまり覚えてないけど。
とりあえず、スクリプトの文頭に追記して実行すると、そのスクリプトがあるディレクトリに「tmon.out」というファイルができる。
このファイルがあるディレクトリから「dprofpp」というコマンドを実行すると、細かい計測時間が出てきます。かなり有用っぽい。
試しに、新しく作った(自称)インデックス検索から「CGI BBS」というワードを指定して、OR検索をしてみます。以下、出力結果。

おぉ、これはスゴい。何の処理が時間かかっているかが一目瞭然。やはり高速化には気を遣わないといけない。速度は命です。
で、これを見てどういう風に高速化を進めていけばいいのか。とりあえずは時間を食う処理を見直すところから始めるんだけど。
……どこをどう改良したら速くなるのかがイマイチわかんねぇ。バグ出さないのに必死で、速度までは気が回らないのが現状。
とりあえず今日は有用なモジュールを使えたという事で満足しました。改良はその内です。だって来週から新宿になる事だし。
他にも面白いモジュールとかも色々あるんだろうなぁ。開発に役立つモジュールのリンク集みたいな都合のいいモノないですか?

2004/10/30 Sat.

昨日の夜は何故か23時半に寝るという快挙を成し遂げてしまった。たまーにえらく早い時間に眠くなったりするんだよね。
んでもって、起床が朝9時だったりする。午前中に起きれたとは言え、こんなえらい早い時間に起きて何をしろっていうのだ。
とりあえず暇つぶしに、ちょい前からやり始めたFF9をやってみるが、あまりにキツいので却下。ケアル使えるメンバーいねぇ。
こりゃクリアするのは当分先になりそうだと思いつつ、数十分で断念。んで、セカンドマシンのノートPCを久々に起動してみる。
以前からこのマシンを開発専用機にしようかなとも思ってたりする。ってか、これをサーバーにしちゃえば常時起動できるしね。
でも、メインのデスクトップの環境をコピーするとなると、結局デスクトップのIP設定やら何やらをまた変更するハメになるし。
もう1年くらいはシステム入れ替えてないけど、結構安定して動いてくれているから、これ以上手を加えたくないんだよねー。
そんなワケで、必要なものだけをちょこちょこ移して、また封印。机の上に2台もマシンがあると邪魔くさくてしょうがないし。
で、月曜にそなえて軽くC言語の本を読んだり、家にある本をまた片っ端から読み直すという、相変わらずの休日となった。
さて、明日は大学の学園祭に少し顔を出すつもり。ってか、気が付くと今は朝の5時。生活が狂うと月曜からキツいなー。