Category Archives: Programming

Impressions Programming Software

静岡&山梨旅行とGeotagging

GWは休めるかどうか分からないからとまったく予定を立てていなかったのですが、4月末についカッとなって宿をおさえ二泊三日の静岡&山梨旅行へ行ってきました。

travel_set

更に絶好の機会なので、以前設置しておいた自作の「FOMA端末用GPSログ取得スクリプト」を使ってトラックログを作成し、撮影した写真のGeotaggingにも挑戦してみました。

このCGIスクリプトはPerlで作成したもので、FOMA端末からアクセスする事で位置情報を取得してログを保存することができ、更にそのログをGPXもしくはKML形式で取得することができます。

このスクリプトとDoCoMo FOMA端末(P-01A)を使用し、

  1. トラックポイントを保存しながら写真撮影
  2. 帰宅後、iPhotoへ写真を取り込み
  3. ログデータをGPX形式でサーバから取得して保存
  4. GPSPhotoLinkerを使ってGeotag埋め込み作業

という手順で念願のGeotaggingを行う事ができました。

ちなみに1のログ保存に関しては、やはり結構面倒くさい気がしました。

というのもFOMA端末内蔵のGPS位置情報や基地局のエリア情報はトラステッドなiAppli DXから取得するか、あるいはHTTP経由で外部へ送信することで取得できるようになっています。

ただし後者の場合にはプライバシー保護の為だとは思いますが、情報送信の度に確認ダイアログがでてしまいます。

今回のスクリプトはもちろんHTTP経由送信の仕組みを利用したものなので、いちいち移動するたびにポチポチと数回ボタンを押す必要があるわけです。

しかしそれほど細かいログは必要なく大まかな撮影場所さえ保存できればよいなら、

  • 写真撮影したい場所に着いたら撮影開始前に現在地のログを保存する
  • 撮影が長時間にわたる場合には10〜20分間隔くらいでログを残すようにする
  • 急遽撮影した場合には、撮影後なるべく時間を置かずに現在地のログを保存する

のような点に注意してログを残していけば、GPSPhotoLinkerと組み合わせてなんとか実用範囲内だと思いました。既製のGPSロガー製品だとこの辺りの使い勝手がどんなに良いかという点については、使った事がないので分かりませんが(苦笑)

それから4でちょっとハマりました。拙作の「GPSログ取得スクリプト」では

http://refits.cgk.affrc.go.jp/tsrv/jp/rgeocode.html

で提供されている「逆ジオコーディングサービス」を使わせていただき、その位置の都道府県や市区町村名等を取得してUTF-8で保存するようになっています。

この内容をそのままtrkptのname要素として出力するようにしていたのですが、このGPXデータをGPSPhotoLinkerに直接読み込ませるとソフトウェアが不正終了してしまう現象に悩まされました。

GPSPhotoLinkerにも読み込んだ位置情報を元にReverse Geocodingする機能があるし、無理に住所を出力する必要もなかろうということで、とりあえず暫定的にname要素を適当なASCII文字列にしてみたところうまくGPSPhotoLinkerへ読み込んでExifへ書き込む事ができました。

「さっさとGPSロガー買った方が早いんじゃね?」という声がこの辺りから聞こえてきそうな気もしますが、もう少しこの方法でGeotaggingにトライしてみたいと思います。

Programming

PerlでコマンドラインからTwitterとJaikuに同時投稿するスクリプト

TwitKu とかずっと開きっぱなしだとアレなこともあったりする今日この頃なので、コマンドラインから JaikuTwitter に同時投稿するPerlスクリプト書いた。というか Net::TwitterNet::Jaiku を使ってみたかっただけだったりする。

#!/usr/local/bin/perl

use strict;
use warnings;

use utf8;

use Encode;
use Encode::Guess qw/ shiftjis euc-jp 7bit-jis utf8 /;
use Net::Jaiku;
use Net::Twitter;

my $j = Net::Jaiku->new( username => "",
             userkey => "" );
my $t = Net::Twitter->new( username => "",
           password => "" );

foreach (@ARGV) {
    my $m = Encode::encode('utf8', Encode::decode('Guess', $_));
    $t->update( $m );
    $j->setPresence( message => $m );
}
exit;

Encode::Guess してるので、Windows でも Mac でも大丈夫かも?

Twitter&Jaiku cross posting perl script

エラー処理とかそういうのはなにもしてません。

Programming

今日のPerl(息抜き)

会社から貸与された新しい機種のPHS端末。まったく電話帳が入っておらず、以前の機種からの引継ぎも出来ないとのことでイライラ。社員の情報は ActiveDirectory で管理されているはずなので、LDAP から名前と電話(内線/外線)番号、メールアドレス等の情報を引っ張ってこれることを思い出し、ついカッとなって PHS 端末にインポート可能な形式の csv を生成する Perl スクリプトをデッチアップすることに。

まず引っかかったのが、携帯の電話帳に必須の「読み仮名」をどうしようかということ。読みが仮名で入っていないと、うまく電話帳検索の自動分類が働かないのでやっぱり対応必須だろう。だけど LDAP から「読み仮名」は取得できない。というわけで、ローマ字表記名をカナに変換できないかと Lingua::JA::Romaji を評価していたのですがイマイチうまく動かない。とりあえず時間も無いので断念。

続いて Dan Kogai さん作Lingua::JA::Kana を使ったらイイ感じ!!……と思ったんだけど、

「Junko」さんが 「Jウンコ」さんになってしまった

ため泣く泣く保留。 Lingua::JA::Romanize::* ってどうなんだろう。仮名->ローマ字のみかな?今度調べよう。

次に難字問題。にぽたん研究所:難字に難儀 にあるとおり、cp932 -> euc-jp でうまく変換できない文字がある。俗に言う「ハシゴ高」とかの難字。数字、カタカナなどを半角変換するために Encode::H2Z::z2h を使う場合、入力は euc-jp になるため、一度 euc-jp を経由してしまうので難字が化けてしまう。さらに、この難字を問題が出ない異字体に変換する Lingua::JA::Regular があるが、これも nipotan さんの先のエントリにあるとおり、内部で Jcode を経由するので「〓」(ゲタ文字)になってしまったりとちょっとクセがある。

そこでとりあえず nipotan さんが 30 分もかけ苦労して作成されたという Shift_JIS 用の %KANJI_ALT_TABLE を南無南無とありがたく使わせていただき、

my $enc = Encode::find_encoding('cp932');
my $string = $enc->encode($string);
my ($key, $value);
while ( ($key, $value) = each(%KANJI_ALT_TABLE_SJIS) ) {
   $sjis =~ s/$key/$value/ge;
}
Encode::from_to($string, 'cp932', 'euc-jp');
Encode::JP::H2Z::z2h(\$string);
Encode::from_to($string, 'euc-jp', 'cp932');

ってな感じでお茶を濁して終了。無事端末にインポート可能な csv を生成することが出来た。 今日の息抜きはここまで。

Plagger Programming Software

Plagger::Plugin::Filter::AutoTaggingをアップデート

Plagger::Plugin::Filter::AutoTagging を少し改変しました。

AutoTagging.pm

変更内容は以下の通り。

  • otsune さんの diff を適用&ちょっと修正 (db省略時処理とMeCab用Encode処理のパフォーマンス改善) < otsune さんThx!
  • sub init を plugin.init ハンドラに変更しました。(他のプラグインの初期化処理もそのようになっているようなので……)

実は otsune さんに書いて頂いたdiff をそのまま適用したところうまく動きませんでした。というのも、「db 省略時に id_safe を使ってファイル名を生成するように」とコードを追加されておられるのですが、Plagger::Util::filename_for で $feed が参照できないために動きませんでした。

で、これ自体は単純なミスだと思ってなんとか取り込ませていただこうとしたのですが、otsune さんの意図が「Feed毎に学習できるように」というものなのか、それとも単に「Pluginユニークなdb名を生成したい」からなのか、それともなにか他にもあるのか気になりだして悩んでしまいました。

とりあえず Plagger::Util::filename_for で id_safe が使えるように safe_id と id サブルーチンを実装(というか Plagger::Feed から持ってきた)し、$self->id で $self->plugin_id が返るようにしてお茶を濁しておきましたが、これでは「Feed 毎に学習を分ける」という目的は達成できません。

学習データが完全に共通の場合、特に generate_tags を有効にするとあっというまにラベルがどんどん増えてDBのサイズが膨らんでしまいますし、guess の精度にも影響があるかもしれないので Feed 毎に学習データを分けられる(もちろん共通にもできる)ようにしておいたほうが色々と都合が良いかも?

ちょっと悩みます。

あと、safe_id は Plugin.pm レベルで持っていてもいいような気がしました。でもそんなのは既に議論されていそうだし、私のやり方よりもよい別の実現方法が既に実装されているのかも?

最近 Plagger の事を調べたりプラグインを書くのもご無沙汰だったので分からないことが多いのですが、ボチボチやっていこうと思いますので何かあれば皆様是非ご教授くださいませ。

Plagger Programming Software

久しぶりにPlaggerでなんかやってみた

前回書いたとおり、Text::MeCab と Algorithm::NaiveBayes を利用して Auto Tagging する Plagger のプラグインを作成してみました。もちろん、Text::MeCab と Algorithm::NaiveBayes モジュールが必要です。

Plagger::Plugin::Filter::AutoTagging.pm

Perl のコード自体書いたのは久しぶりなので、あまり自信はないです。途中単純なミスにハマりながらもなんとか作りました。なにかおかしなところがあったら、是非ご指摘いただけると幸いです。

ちなみにしばらくの間、某所のDebien サーバで

– module: Filter::AutoTagging
config:
mecab_charset: utf-8
db:
generate_tags: 3
guess_tags: 3
threshold: 0.8
training: 1

とかやってテストをまわしていましたが、精度はイマイチです。generate_tagsでのキーワードの抽出方法はもう少しきちんと考えた方がいいかもしれない?あと、MeCab辞書が utf-8 の環境でしかテストしていません。

ちなみに config 項目の詳しい説明はこちら

Plagger/Plugin/Filter/AutoTagging

Plagger Programming Software

久しぶりにPlaggerでなんかやってみたくなった

ずっと前から Plagger の最新動向を追うのをやめてしまっていたのですが、しばらくぶりに最新バージョンにアップデートして遊んでみました。

まず Debian でサーバを立て、Plagger を trunk からインストール。なるべく多くのプラグインと依存モジュールを頑張って入れました。Search::Estraier が使ってみたかったので HyperEstraier もインストール。

Search::Estraier に関しては下記のURLを参照のこと。

http://subtech.g.hatena.ne.jp/miyagawa/20060504/1146744042
http://subtech.g.hatena.ne.jp/miyagawa/20060504/1146739431

HyperEstraier をインストールしてマスターを起動し、管理者アカウントとノードを作成。example にあった search.yaml を変更して試してみたらすんなり動きました。イカス。

さらに、形態素解析エンジンの MeCab とその Perl バインディングである Text::MeCab を試してみたくなったのでインストール。MeCab の辞書は UTF-8 へコンバートしました。

んで例の「分かち書き」を試してみるといい感じ。これで各単語数カウントしてベイズ推定使えば日本語でもある程度精度のよいスパム判定とか自動レイティングとかできちゃうんでしょうか?(そんな簡単にはいかないか……)

と思ったけど「そんなの既に誰かやってそうだなあ。ずいぶん長いこと Plagger のこと調べてなかったからよく分からないしなあ。」といういつもの葛藤に苦しみながらも、エイヤとチャレンジしてみることに。

read more

Books Mac Programming

Amazonで買った本が届く

会社から帰宅したら、先日買った「Lifehack with Mac」と「Perl プログラミング救命病棟」が届いていました。

Books

これから読もうと思ったけど時間が取れなそうです。明日は外出なので電車の中で読むことにします。

Programming

エラー忘却型コンピューティング

Google で「エラー忘却型コンピューティング」という技術が用いられていると言う話。

Radium Software : Failure-Obliviousness in Googleより

read more

Programming

VS2005 をセットアップ

Visual Studio .NET 2003 (VC7.1) から Visual Studio 2005 Professional (VC8.0) へアップグレード。
read more

Programming

Flashコンテンツとローカルアプリケーションの連携を考える

今日は Flash コンテンツとローカルアプリケーションの連携を色々と試行錯誤してみた。備忘録代わりにメモしておく。
read more