2006年11月27日

Plagger::Plugin::Notify::MissileLauncher - Ejectじゃ刺激が足りない人に

実弾発射と姿勢制御可能なUSB接続ミサイルランチャー発売という物が発売されておりますが、これをPlaggerのNotifyとして使おうというプラグインです。

Ejectの動きだけじゃ気づかないよ!って人におすすめです。

package Plagger::Plugin::Notify::MissileLauncher;
use strict;
use base qw( Plagger::Plugin );

use Device::USB::MissileLauncher;

sub register {
my($self, $context) = @_;
$context->register_hook(
$self,
'publish.feed' => \&update,
'publish.finalize' => \&finalize,
);
$self->{count} = 0;
}

sub update {
my($self, $context, $args) = @_;
$self->{count}++ if $args->{feed}->count;
}

sub finalize {
my($self, $context, $args) = @_;
$self->fire if $self->{count};
}

sub fire {
my $self = shift;
my $ml = Device::USB::MissileLauncher->new;
$ml->do($_) for @{ $self->conf->{command} };
$ml->do('fire');
}

1;

__END__

=head1 NAME

Plagger::Plugin::Notify::MissileLauncher - Notify feed updates to Missile

=head1 SYNOPSIS

- module: Notify::MissileLauncher

=head1 AUTHOR

Kazuhiro Osawa

=head1 SEE ALSO

L<Plagger>, L<Device::USB::MissileLauncher>

=cut

動作イメージ

Posted by Yappo at 17:44 | Comments (0) | TrackBack

2006年11月21日

電車運行維持のためにぬれ煎餅を買ってください!!電車修理代を稼がなくちゃ、いけないんです。

亀気味だけど
潮風とロマンのふるさと銚子電気鉄道

緊急報告

電車運行維持のためにぬれ煎餅を買ってください!!
電車修理代を稼がなくちゃ、いけないんです。

銚子電鉄商品購入と電車ご利用のお願い

泣いた。
風車で動いてるネットサービスより、濡れ煎餅売って走ってる電車の方がかわゆす。

緊急報告の掲載以来、全国各地から沢山の皆様にNETによるぬれ煎餅他のご注文を頂いております。本日、22:00現在で3000件を超えました。一つ一つの注文書にお書きいただいた応援のメッセージに感動しております。改めて、私たちの使命に責任を感じながら、現在発送の準備をしているところでございます。  ここで、皆様にご確認をお願いいたします。アクセスが混み合っている時などのことなのか詳細は不明ですが、ネット決済のお客様の何件かに決済未完了が確認されております。  送信時、または送信後のエラーにご注意くださいますようお願い申し上げます。

  レール文鎮については急遽納品を確認しておりますので、しばらくお待ちください。
  ご注文の商品についても、できるだけ早い発送を目指しておりますが、20日程度かかることが
  予測されますので、ご了承くださいますようお願い申し上げます。

  発送状況や車輌の検査についての情報は、このホームページやブログにてご報告いたします。
        
                                              11月21日22:30

web siteも混み気味でほんとに殺到してるんだなぁ。

ガンガレ

Posted by Yappo at 23:12 | Comments (0) | TrackBack

2006年11月20日

the spam退治の能率を100倍うpする方法

最近あり得ないくらいにspamが来てて、過去に行ったアジア全て(台湾、韓国、中国)からのip接続のblockも意味なくなってしまって途方に暮れたのですが
初心に返ってSpammAssassinを真面目に使う事を思いついた。

家はmew使ってて+spam/にspamに振り分けられたメール、+spam/spam/にspamから漏れたメール、+spam/ham/に誤爆したメールを振り分ける様にしてるんだけど。
学習させるたびにコマンドうって、学習させたメールを+trash/にやるのがだるくて使ってなかった。

そこで最近学習した、面倒い事はちょっとしたツールで対処ってのをやった。

$ alias spaml="sa-learn --spam $MAILDIR/spam/spam;rm $MAILDIR/*"
これだけ作ったんだけど、spamlってやれば+spam/spam行きのメールをspam扱いにしてrmしてくれる。
今の所誤爆もないのでhamもやっていない。

これだけじゃ、まだだめでMewの操作も簡潔にしないと漏れたspamが100件とかきたら辛いのでemcasのマクロを登録。
普段だとosp<TAB>s<TAB><RET>な感じでキーを打っているのでこれも楽にしたい。
.emacsをにちょっと追加

(fset 'my-mew-set-spam
"ospam/spam\C-m")
(define-key mew-summary-mode-map "zz" 'my-mew-set-spam)
これでzzで振り分けられる様になった。

意外にspamの認識力が高くなって来て、spamフォルダに毎日500くらい自動的に行ってる。
spam退治が100倍以上効率うpした!

ので、能率が100倍うpした。

Posted by Yappo at 22:15 | Comments (0) | TrackBack

トラックバック動かなかった

まえにstatic/cgi系の分割をやった時にmt-tb.cgi/xxxなURLをバックエンドに飛ばすの忘れてたw
直すついでに、rss2.0とatom feedをfeedburner経由にしたのと、はてBまわりの装飾を加えた。

Posted by Yappo at 21:01 | Comments (0) | TrackBack

DanさんにString::Diffの事でマジレス

はてなブックマーク - 404 Bookmark Not Found / 2006年11月19日

OO interface もつけた方がいいのでは; entryのcommentがstatus 500で落ちるのでこちらに
なんでOOなのかを考えたら、二つ思いついた。
ARRAY refで帰ってくるから$diff->[0], ->[1]でアクセスするのが嫌だという場合
my($old, 
$new) = String::Diff::diff('this is Perl', 'this is Ruby');
と書けるので問題なし。
これはPODに記載無いので書いといた。

次に、<:ins></ins>とかを毎回書くのがやだからnewで初期化させろ!という場合

# change to default marks
%String::Diff::DEFAULT_MARKS = (
remove_open => '<del>',
remove_close => '</del>',
append_open => '<ins>',
append_close => '</ins>',
separator => '&lt;-OLD|NEW-&gt;', # for diff_merge
);
と書ける様にした。
ほぼmyをourにしただけである。

この2点は反映して0.02でうpました。

これ以外でOOしたい場合というのは

my $diff = Algorithm::Diff->new( \@seq1, \@seq2 );
みたいな用法なのかなぁと。
でも、それで便利なケースってのが思い浮かばないのでスルーです。。。

添削きぼんぬ。これみてるか知らないけど。

Posted by Yappo at 19:27 | Comments (0) | TrackBack

2006年11月18日

String::Diff - 行内差分取得モジュール

普通のdiffは行単位での差分を取るんですが、一行の中での差分がどうしても取りたくてString::Diff(2008/06/24リンク切れなおしたtokuhirom++)ってのを作りました。
既存のCPANモジュールだとString::ShowDiffが微妙に近かったんですが、目的の事が出来ないので作りました。

出来ることは
文字列同士の差分を作って変更無い場所、変更が合った場所で配列を分けて作成。

  my $diff = String::Diff::diff_fully('this is Perl', 'this is Ruby');
for my $line (@{ $diff->[0] }) {
print "$line->[0]: '$line->[1]'\n";
}
# u: 'this is '
# -: 'Perl'

for my $line (@{ $diff->[1] }) {
print "$line->[0]: '$line->[1]'\n";
}
# u: 'this is '
# +: 'Ruby'


差分の合った部分にマークを付ける。htmlタグとか入れられるのでwebにも使えます。
  my $diff = String::Diff::diff('this is Perl', 'this is Ruby');
print "$diff->[0]\n";# this is [Perl]
print "$diff->[1]\n";# this is {Ruby}

my $diff = String::Diff::diff('this is Perl', 'this is Ruby',{
remove_open => '<del>',
remove_close => '</del>',
append_open => '<ins>',
append_close => '</ins>',
});
print "$diff->[0]\n";# this is <del>Perl</del>
print "$diff->[1]\n";# this is <ins>Ruby</ins>


差分同士の結果をマージして一つの文字列にする。
  my $diff = String::Diff::diff_merge('this is Perl', 'this is Ruby'{
remove_open => '<del>',
remove_close => '</del>',
append_open => '<ins>',
append_close => '</ins>',
});
print "$diff\n";# this is <del>Perl</del><ins>Ruby</ins>

そのマージを正規表現のパターンにしてしまう。
  my $diff = String::Diff::diff_regexp('this is Perl', 'this is Ruby');
print "$diff\n";# this\ is\ (?:Perl|Ruby)

tracの差分表示っぽいのが簡単に作れると思います。
実際hatena wikiでそれっぽく実装しました。

これで20個めのCPANモジュールか。

Posted by Yappo at 14:00 | Comments (6) | TrackBack

2006年11月16日

自分用のpmsetupを作った

折角svkにしたのでmiyagawaさん作のpmsetupを使う様にしようと思って自分用にカスタマイズした。
http://svn.yappo.jp/repos/public/misc/pmsetup
元と違うのは、パッケージ作ったらsvkのローカルリポジトリにimportしてしまう点と、パッケージで作成されるファイルの中にリリースツールを同梱した点。
リリースツールといっても、Plaggerのtoolsの中に入ってる物をコピーしてきただけです。

使い方手順としてはpmsetupで作るとローカルの任意の場所にimportしてくれるので、一通り作るまではローカルリポジトリで作業して公開できる段階でsvk copy //scratch/proj //mirror/public/proj するイメージで。
いったんmirrorに持ってたらリリースしたいタイミングでtools/release.pl 0.01とかすれば、Changesのチェックして勝手にtagきってリリース状態にしてくれます。
cpan-uploadするかも聞いてくるのでyすれば、cpan-uploadの環境さえあれば勝手にアップロード出来ます。のはず。

最初に起動した時に色々聞かれるので適切に答えて下さい。

Posted by Yappo at 23:51 | Comments (0) | TrackBack

2006年11月15日

悪のりで学ぶsvnadmin/trac入門実用編

とある平和なある週末に事件は起こった
xx:14 ([aopy]+) stfuawsc汚染なコードをciってまった

xx:14 (A) ちょ
xx:14 (B) ww
xx:14 (C) www
xx:14 (D) stfuawsc
xx:14 {[ainOS]+} パネラーディスカッション
という事で、直近のコミットした内容をこの世から抹消しなければならなくなった。
しかもtrac上のデータもあわせて..!
消したいリビジョンは100である。

svnのデータを消す

コマンドだけで直前のコミットを取り消せないものかと調べたが、出来ないという事が分かった。
ちょっと冷静になって、svnadmin dumpとsvnadmin loadの組み合わせで何とか出来ないか?と考え
$ svnadmin dump /svn/public > /tmp/public.dump
して該当データを探してみた
Revision-number: 100
Prop-content-length: 112
Content-length: 112

ここからデータ

最後のほうに、該当するデータっぽいのを発見出来た、Revision-numberも100と書いてあるので、当たりっぽい。
Content-lengthとかもあって大分親切。なんかmailのフォーマットぽい。

って事で、このRevision-number: 100の行からファイル末尾まで削除して

$ cat /tmp/public.dump | svnadmin load /svn/public.new
$ mv /svn/public /svn/public.old
$ mv /svn/public.new /svn/public
した。
そして、手元のcoしたディレクトリでsvn upしてみたら
Reference to non-existent revision 100 in filesystem '/svn/public/db'
と言われたお><
落ち着いて
$ svn up -r 99
したら、エラーが出なくなった。

これでsvnの証拠隠滅は完了した。

tracのデータのつじつまあわせ

気を良くしてtracにアクセスしたら、見た事のないエラーが出てびっくりした。
そりゃそうだ、リポジトリの中とtacの中のデータが不整合してるからだ。

tracはsqliteつかってるので

$ sqlite3 /trac/public/db
してsqlを使える状態にして、あれこれ調べた。
で、大体消す場所を把握したので
sqlite> delete from revision where rev = 100;
と打った、しかしtracがまだ怒ってる!
もう少しデータを漁って、ようやく別の消すデータを発見
sqlite> delete from node_change where rev=100;
これでどうだ!

見事、問題のコミットは帳消しに出来ましたとさ。
めでたBoofyめでたBoofy

追記:
svnのいらないリビジョンはsvnadmin dump -r 0:99 | svnadmin load とかで消せて。
trac-admin resync で同期が取れるそうです。

みなさま突っ込みありがとうございます。

Posted by Yappo at 23:32 | Comments (2) | TrackBack

svk startup memo

生のsvnを使っていて良いのは中学生までなのでsvkを始めました。
といってもmacbookの方にはsvkを入れてたんだけど、あまり使っていなかったのでメインの開発環境にsvkを入れました。

ありきたりでつまらない内容ですがチラシの裏です。

install

SVN::Mirror 0.72 は subversion 1.2 以上を要求してくるので、手元の環境で使えずに0.71を入れました。
LANG=jaな環境でinstallするとtestこけるのでLANG=C cpanな感じでinstallです。

そしてinstall SVKなのですが、06keyword.tでなんかこけるのでforce installです。(SVK 1.08)
こけてる内容もクリティカルじゃ無いっぽいので無視です。
なんかsvk-devにも報告あがってるみたいだけど、よく読んでない。

setup

$ svk mirror http://svn.yappo.jp/repos/public/ //mirror/public
$ svk sync //mirror/public
$ svk cp //mirror/public //public
教科書的にミラーを作ってローカルブランチ作成です。

import to local

importしたいファイルのカレントディレクトリで
$ svk import //public//proj/trunk -m 'proj import'
してがしがしimportしました。
ローカルに連続でimportしてってもいいし、一個importするたびにほんとのリポジトリにうpしてってもいいのかな。
一個一個やってったほうが奇麗かも。理由はあとで。

commit to remote

smerge

ローカルブランチのcommitをリモートの本家リポジトリに反映します
$ svk smerge //public //mirror/public -m 'commit message'
これで、全ての変更内容がhttp://svn.yappo.jp/repos/public/に反映されます。
全部いっぺんがいやなら
$ svk smerge //public/Soozy/trunk //mirror/public/Soozy/trunk
でもいけるはず。まだ試してないけど。
これだと、手元で細かくcommitしてるのに本家は荒くなっちゃうので
$ svk smerge -l //public //mirror/public
として、ローカルのコミットログをまとめて送れるようになります。
いったんコミットメッセージをエディタに流し込んでくれる形なので、任意な形でコメントが書けます。
これでも、diffの内容としては荒いので
$ svk smerge -I //public //mirror/public
として、ローカルの1コミット毎の内容をそのまま本家に転送します。
ローカルで上げたリビジョンの数だけ本家もリビジョン上がる感じです。
これやった瞬間に本家に全部コミットされるので注意です。

で、importしたときにsvk smerge -Iとかしちゃうと、2回分のログが発生するのでimportしたらオプション無しのsvk smergeして2回分を1回にまとめちゃうと奇麗かなぁと思いました。
http://trac.yappo.jp/trac/changeset/178みたいな感じです。
纏めないとhttp://trac.yappo.jp/trac/changeset/181http://trac.yappo.jp/trac/changeset/182のように2回に分かれます。

どうでもいいっすね。

svk push

カレントディレクトリのリポジトリをsmergeするって感じすかね。
ここでは
$ svk co //public ./public
cd ./public
したものとして書いてます。
ローカルの1コミットを纏めてコミットする
$ svk push -l

バラバラでコミットする
$ svk push

svkが付けるコメント

特にオプションつけないでsmerge/pushすると
r196@haruna: ko | 2006-11-15 19:51:20 +0900
みたいなコメントが自動的に付与されますが、これを消したい場合は--verbatimオプションをpush/smerge時に付ければ消えます。

よく考えれば、普通はsvk pushを使うね。
こんかいはimportしまくったからsmergeしただけか。

svk pull

svk co //publicでチェックアウトした先のディレクトリでsvk pullすると、本家リポジトリが変更されてたら、//mirror/publicもupdateした上で//publicもupdateして、手元のディレクトリの内容もupdateしてくれた。
pullした時のmirror/local/currentdirを通したコリジョンとかの扱いはよくわかってない。

push/smergeする前に-Cオプションで変更点を確認しないと高校に入れないので注意。

以上、チラシの裏Boofy

Posted by Yappo at 21:15 | Comments (0) | TrackBack

複数のsvnリポジトリを一つにまとめる方法

うちのsvnリポジトリは、trac等で公開をする前までは、各コンポーネント毎にリポジトリを作るという非効率な管理をしていました。
そろそろ嫌になって来たので、これを全部公開用にまとめようと思い、helpみながら頑張りました。

要件的には、リビジョン番号が変わっても良いから、とにかくlogを含めてインポートしたい!
という感じです。

最初はsvkとか使わなきゃだめなのかなぁ、とか思ってたのですがsvnadminだけで願いが叶いました。
dumpとloadを使います。
loadする時はオプション無しでloadしてしまうと、dump前のファイルパスにデータをぶっ込んでくれちゃうので、trunkとかが混ざってカオスになっちゃいました。
そこで--parent-dirオプションを使って、どのパスにloadするかを明示的に指定してloadします。
--parent-dirで指定するパスは、読み込ませる側のリポジトリ内に予めmkdirしておく必要が有ります。
/svn/Acme-Monta のリポジトリを /svn/public_repos に入れたい場合は

$ svn mkdir -m 'create import dir' file:///svn/public_repos/Acme-Monta
$ svnadmin dump /svn/Acme-Monta | svnadmin load --parent-dir Acme-Monta
のように作業します。
commit日時は引き継がれるので、リビジョン番号と日時の並びが変になりますが気にしない感じで。
影響でtracの最近のtimeline消えた!

これで、作業環境がすっきりしました^^
あとはsvkを本格的につかいまする。

それsvnadminでできるよ
それsvn

Posted by Yappo at 18:44 | Comments (0) | TrackBack

2006年11月14日

2ちゃんねるの携帯全文検索

九段ではたらく社長のここだけの話: 掲示板横断検索機能スタート

対応掲示板は、大手掲示板を中心にさらに複数追加予定です。
これって、ひろゆきの中の人の了承済みです?

うちでもやりたい!

Posted by Yappo at 18:41 | Comments (0) | TrackBack

2006年11月13日

Lingua::JA::Summarize::Extract - 日本語文章のサマリ抽出

なんとなくPlaggerドリブンで日本語の文章の中から特徴的な文節を抽出するモジュールを書きました。
具体的にはGetSenというWebサービスをCPANモジュールで使いたかったという感じです。
CPANに上げてあります。
Lingua::JA::Summarize::Extract

簡単な使い方は

use strict;
use warnings;
use utf8;

use Lingua::JA::Summarize::Extract;

my $extracter = Lingua::JA::Summarize::Extract-&gr;new;
my $text = "日本語の文章を沢山書きます";
my $result = $extracter-&gr;extract($text);
my $summary = $result-&gr;as_string;
utf8::encode($summary);
print $summary;#サマリーが出てくる。

このような感じです。

実際の抽出例は

Shibuya.pm Tech Talks #7で話して来た

Shibuya.pm Tech Talks #7でお話しして来ました。
皆様おつかれさまです。

自分は自然文書から住所抽出してくれるGeography::AddressExtract::Japanというモジュールを作った時の話をして来ました。
他の方々は成果物の発表系だったのに対し、自分はモジュール作成の過程の話をしました。ここでもピントずらすの全開です。
住所抽出をするにあたり、とっかかりをどうしたか、実装方法をどうするか、具体的になにしたか、といった流れです。

開場で100名オーバ、インターネット中継で200接続程合ったらしくYAPC::Asia 2006 Tokyoと規模変わらんと思った。
なんかしらんけど画面が切れてるのを直してるので時間を潰したのが痛かった。
後半がほぼカットです。

話し終わって椅子に座ろうとした所で Dan the Encode.pm Maker さんから、自分の作ったRegexp::*つかってみなよ?と提案をうけました。Danさんのはメタ文字があると有利だという事です。

発表資料(ディレクターズカット版)
Geography::AddressExtract::Japanのtrac
svnは

svn co http://svn.yappo.jp/repos/public/Geography-AddressExtract-Japan/trunk/

クオリティを高めて実用的なのにしていきたいと思っているのでアイディアとかパッチとか大歓迎です。
ねこ大好き。

という文章が
Shibuya.pm Tech Talks #7で話して来た
Shibuya.pm Tech Talks #7でお話しして来ました。
自分は自然文書から住所抽出してくれるGeography::AddressExtract::Japanというモジュールを作った時の話をして来ました。
Geography::AddressExtract::Japanのtrac
svn co http://svn.yappo.jp/repos/public/Geography-AddressExtract-Japan/trunk
として抽出されます。
他の方々のエントリで試しましたが、なかなかいい感じに要約してくれてました。

デフォルトはN-gramっぽく文を切り分けていき、「。」や改行で文章を分割し、分割した文章にスコアを付けて特徴的な文章を計算します。
スコアの計算方法等はGetSenでも利用しているTerm::Extractを参考にしました。

単語の切り分けやスコアリングや文章の分割方法はいつも通りプラグイン形式で変更出来ます。

my $summary = Lingua::JA::Summarize::Extract->extract($text, { plugins => [ 'Parser::Trim' ] });
これは、N-gramをやめて、文字種別に単語を切り分ける方法に変更します。

文章の切り分けかたを独自に作ると、様々なフォーマットのテキストに対して特徴分の取得ができます。
例えば

package Lingua::JA::Summarize::Extract::Plugin::Sentence::2ch;

use strict;
use base qw( Lingua::JA::Summarize::Extract::Plugin );

sub sentence {
my $self = shift;
my $text = $self-&gr;text;

my $i = 1;
my @sentence = map {
my @dat = split /<&gr;/, $_;
{ line =&gr; $i++, text =&gr; $dat[3], name =&gr; $dat[0], mail =&gr; $dat[1], date =&gr; $dat[2] }
} split /\n/, $text;
\@sentence;
}

1;

というプラグインを書けば、2chのDATの1レスを単位として文章の分割を行い、そのスレッドの特徴的なレスの抽出が可能です。
それに併せてLingua::JA::Summarize::Extract::Parser::2chのようなパーサも書いてレスの本文のみを抽出してから、特徴語を出す必要はありますが。。。

ざっくりとした概要作成には使えるとおもいます。

Posted by Yappo at 15:19 | Comments (2) | TrackBack

2006年11月07日

Geo::Coordinates::Converter::Fomat::LocaPoint

折角Geo::Coordinates::Converterを作ったので、サンプル的にフォーマッタを作ってみました。
LocaPointという位置情報表現仕様があったので、これのフォーマッタを試しに作ってみました。
http://trac.yappo.jp/trac/browser/Geo-Coordinates-Converter-Format-Locapoint/trunk
緯度経度が一つの情報として表されている為、既存のGeo::Coordinates::Converterではうまく扱えないため、converterの戻り値で使われるGeo::Coordinates::Converter::Pointにlocapointと言うメソッドを生やして、それを使っています。

使い方は

use Geo::Coordinates::Converter;
Geo::Coordinates::Converter->add_default_formats('locapoint');

my $geo = Geo::Coordinates::Converter->new(locapoint => 'SW8.HQ9.CR8.PU9', format => 'locapoint');
my $point = $geo->convert('degree');
print $point->lat;
print $point->lng;

という感じです。
tokyo測地系からLocaPointへデータを変換するには
use Geo::Coordinates::Converter;
Geo::Coordinates::Converter->add_default_formats('locapoint');

my $geo = Geo::Coordinates::Converter->new(lat => '40.41.20.904', lng => '-74.02.40.390', datum => 'tokyo');
my $point = $geo->convert(wgs84 => 'degree');
print $point->locapoint;

と書けます。
LocaPointはwgs84を使うそうなので、wgs84以外の値を入れた場合にはwgs84への変換が必須です。

測地系の変換はどうだか分からないけど、フォーマット変換には使えそうな予感がしました。

Posted by Yappo at 20:56 | Comments (1) | TrackBack

Geo::Coordinates::Converter - 緯度経度を簡単に変換する

だいぶ再発明感があるのですが、緯度経度データを簡単に変換出来るモジュールを作りました。
Geo::Coordinates::Converter CPANにうp済みです。

既存で似た者は結構あったのですが、どれも変換処理がdatumのメソッド名直書きとか値がハードコードされてたりで、自由度低めだったので新しく作りました。
測地系/フォーマット等をプラグインっぽく簡単に追加出来る様にして座標周りのフレームワークとして使える様に実装しました。

使い方は

use strict;
use warnings;
use Geo::Coordinates::Converter;

my $geo = Geo::Coordinates::Converter->new( lat => '35.65580', lng => '139.65580', datum => 'wgs84' );
my $point = $geo->convert( tokyo => 'dms' );

print $point->lat;
print $point->lng;

のような感じです。

変換精度が物を言うような所も有り、実装はだいぶ悩みました。
測地系の変換方法やフォーマット等もユーザー側で変更出来るように作ってあるので物好きな人が変換エンジンを公開してくれれば面白そうです。
標準ではdegree/dms変換とtokyo測地系/wgs84/世界測地系(jgd2000)等の相互変換が可能です。
東経134度27分9秒9867″みたいなフォーマットは入れてませんが、簡単に作れます。
どっちにしろ日本人くらいしか使わなさそうなので、入れちゃっても良かったかもです。

tokyo測地系はメッシュ情報を使わない簡易的な方法なので、メッシュ使って厳密にやる場合は各自実装する必要が有ります。
Web用途に限れば添付してる物だけで十分っぽいです。

内部的にはdegreeで値を持って相互変換するようにしてあります。
測地系の追加はGeo::Coordinates::Converter::Datum以下にWgs84とかを参考にしながら新しくパッケージを置けば自動的に使える様になります。
測地系変換は三次元直交座標に変換する方法をとってます。

フォーマットはG::C::Converter::Format以下に作って

Geo::Coordinates::Converter->add_default_formats('locapoint');
とすれば追加出来ます。
デフォルトのフォーマッタ一覧はourな変数で持ってるので直接書き換えるのも有りです。

こんだけカスタマイズ出来るって所が自信の無さの現れですが。

Posted by Yappo at 20:42 | Comments (2) | TrackBack