May - 29th

緯度経度から地名を検索

Posted at 6:17 pm | Filed Under Google, PHP, PostgreSQL, Web Services

Google Maps APIでは住所から緯度経度を取得することは出来るが、逆に緯度経度から地名を取得するのは無理なのだろうか。ざっと仕様を眺めたところではそんな機能はないみたいだ。

#追記:可能になったらしい

猛烈に腹が立ってきたので測量やら何やらについて調べる。そういえば、そもそもPHPにはGoogle Map APIを扱うPEARのライブラリがない。

PostgreSQL + PostGISで何か出来ないかと、国土地理院の「街区レベル位置参照情報ダウンロードサービス」を調べてみた。これなら、緯度経度から近接する街区レベルの情報が取れるのではないか。

さらには、PostLBSを使って緯度経度から割り出した単純な距離ではなく道のりで距離を絞り込んで検索、なんてこともできるかもしれない。

もっとも、商用サービスとしては地図データのメンテナンスが難しそうなのと、もしデータの整合性に問題があったときの対応が面倒なので、やるなら公開するのが一番かも。

Read More>

Mar - 25th

社内文書の検索システム

Posted at 1:07 am | Filed Under PostgreSQL, Software

思い立って仕事の合間にブラウザから閲覧する社内文書の全文検索システムを作っている。

【ざっとした要件】

■PDF、Word、Excel、PowerPointのファイルに対応

wvWarepdftotextxlhtmlが使える。

■検索エンジンはSennaを利用

Hyper EstraierNamazuが候補だった。

前者は付属のCGIが便利だけど改造するのが面倒で、後者は珍しさと真新しさに欠けるので。

技術的な優位性とかは考慮せず。

ludiaが使えるので。

■ファイルをアップロードするとその場でインデックスを更新

PDFはludiaのマニュアル通りに、他はテキストに変換してINSERT。

■アップロード処理中はプログレスバーを出す

カッチョイイ!

■検索クエリはGETで渡す

外部サービスと結合しやすいし。

■追加されたファイルの情報を表示

トップページに更新情報として最近追加されたファイルを表示してあげる。

非同期通信で定期更新。

■検索結果にスニペットを表示

ludiaの関数が使える。

誤検出があってもファイルを開く前にユーザが見て判断できる。

■SennaのバインディングはPostgreSQL

MySQLだと本体にパッチを当てないといけないのでPostgreSQLに。

【いろいろ環境設定】

ExcelファイルをHTMLに変換するツールはxlhtml。Mac OS X 10.4.9でxlhtml-0.5をビルドしたら「cole/Makefile.am: required file `./depcomp’ not found」というエラーが出て失敗した。下のようにやってみた。

$ aclocal
$ autoconf
$ automake --add-missing
$ make
$ sudo make install

これで通った。

wv2がfinkに入っていたのでインストールしてみたが、wvWareの使い方の方がウェブでたくさん見つかるのにwv2だといろんなコマンド群が入らないのでwv1系をインストール。途中でlibgsfのバージョンが低いと怒られたが、finkだとlibgsfじゃなくてlibgsf1.114という名前になっていたので、いったんlibgsfを外して入れ替える。このパッケージ構成はよくわからない。

コピー禁止のPDFファイルをインデックス化するために、こちらを参考にxpdfをちょっと変更。まあ、自分だけで使うツールだし、いいよね。ね?ね?

SennaとludiaのインストールはThinkITの記事マニュアルを参考に。今回はMecabを使うことにした。

DBはPostgreSQL。createdbの際、エンコーディングはUTF-8を指定した。

テーブルとファンクション、インデックスの作成はこんな感じ。ウェブからアップロードされたファイルは新しくユニークなファイル名を付与されて適当なパス上に保存される。元の名前はDBに格納されて、検索結果ページでクリックされるとattachmentとして元のファイル名でインライン表示されるようにした。ええ、SQLもDBもあんまり得意じゃありません。

CREATE OR REPLACE FUNCTION
	pgs2pdftotext1(TEXT)
RETURNS TEXT AS '$libdir/pgsenna2', 'pgs2pdftotext1'
LANGUAGE 'C' STRICT IMMUTABLE;

CREATE TABLE search (
	search_id serial PRIMARY KEY,
	filename text NOT NULL DEFAULT '', --元のファイル名
	filepath text NOT NULL DEFAULT '', --新たに付与したファイル名
	regist_date timestamp without time zone
		NOT NULL DEFAULT '2007-01-01 00:00:00'
);

CREATE INDEX
	idx_search_filepath
ON search
USING fulltextb(pgs2pdftotext1(filepath));

PDFファイルのデータをINSERTする場合、こんなSQLでインデックスが作成される。

INSERT INTO search
	(
		filename,
		filepath,
		filetext,
		regist_date
	)
VALUES
	(
		'元のファイル名',
		'新しいファイルへのパス',
		pgs2pdftotext1('新しいファイルへのパス'),
		now()
	);

PowerPointやExcel、Wordのファイルもそれぞれ => テキスト => PDFと変換してINSERTは常に同じコマンドを使うようにしてもいいんだけれど、それも不健康な感じなのでテキストとして普通に処理することにした。now関数を使うけど、別にDBのレプリケーションはしないからいいや。

【実装しないもの】

今回の作業で実装しない機能は:

  • クローラ(Window環境用も作りたくなるから)
  • ファイル形式の自動判定(無理!拡張子で判定)
  • 検索結果にタグ付けして次に簡単に呼び出せるようにする(時間が…)

クローラはないけど、特定のディレクトリ内のファイルを一気に処理するバッチファイルは作っておいた。最初のデータ入力が面倒だし。

もしかしたら実装しちゃうかも:

  • 検索語のサジェスチョン(インクリメンタルサーチで今までに入力されたデータから引っ張ってくる)

こんなもんかな。さて、作業開始。

Read More>

Mar - 9th

日々雑感

Posted at 1:33 am | Filed Under PostgreSQL, Subversion, WordPress

更新が滞っていたが、その間にも近所の新しい分譲住宅地で地主が首を吊ったとか、WordPressのサーバがクラックされて配布中のファイルが書き換えられていたりとか、まあいろいろとあった。あと、誕生日も過ぎた。

今は社内文書、特にPDFの仕様書なんかを溜め込んで全文検索できるようにする作業が進行している。いろいろ試したが、フロントエンドを作りやすいのでSenna + Ludiaで実装している。MySQL自体にパッチを当てるのはいかがなものかと思うので、パッチなしでPostgreSQLと連動するLudiaにした。

Subversionはなんだかんだいいながら影舞と連動して動くようになり、仕事の開発関連の作業は順調。かみさんの日記サイトはいつまでも放置されたままなので閉鎖した。何度作ってもいつもろくに使われないまま消えてしまう。まあ、そんなものなのだろう。

親指がもげてもなんとかなる。それが人生だ。

Read More>

Mar - 1st

PostgreSQLのスケーラビリティ

Posted at 7:47 pm | Filed Under PostgreSQL

PostgreSQL8.2は16CPUまでスケールするらしい。

OSS iPediaという性能評価サイトがあって、SRAがpgpoolの調査なんかをやっている。pgpool + Slony Iの調査など、面白い記事がたくさんある。

OIDの扱いがネックになってレプリケーションを組むときは悩むので、調査対象になっているのは助かる。

Read More>

Feb - 7th

PGCluster

Posted at 2:39 pm | Filed Under PGCluster, PostgreSQL

本家サイトが全然更新されていないので放置していたPGClusterだが、pgFoundryのサイトをみるとちゃんと活発に開発されていた。PGClusterだけに、ちゃんと同期してもらいたい。

入門用に読んだプレゼン資料(PDF)が参考になったので(PDF)日本語にして置いておく

Read More>

« go back