遅い→起動時

http://d.hatena.ne.jp/pmint/

ATOKダイレクトプラグインを作ってみた

d:id:pmint:20081030:p1の続き。


実際のところ、ATOKダイレクトは仮想的な辞書を作るものらしい。*1ウェブから言葉を取り込める。
でもユーザーの知らない言葉がいくら使えるようになっても意味がないことに変わりはない。


そもそも…

  • ATOKの辞書は読み物じゃないし。読めないし。
  • 読みを入力しないと出てこないし、知らない言葉を発見するということは誤変換が起きたということだし。
    ATOKのバージョンアップによって今後そういうことは減る(はず)だし。
    偶然知らない言葉を見つけるというのはATOKの機能ではないわけで。




…と思いつつも、ATOKダイレクトAPIを使ってみた。
読みをはてなで検索して、検索結果をスクレイピング

ATOKダイレクトプラグインはてな検索で数えてみた」
ATOK_kazoetemita-plugin.zip

ライセンスではプラグインの配布形態を指定していないので、ZIP形式で載せてみた。
Perlスクリプトが動かないと、このプラグインも動かない。

気づいたこと

プラグイン内から他のプログラムも呼び出せるらしい。
ということで、(PerlRubyスクリプトが1つ必要だけど)VBでもなでしこでもどんな言語でもプラグインを作れるということになる。
機能を考えると…読みを記録して集計するとか、ググって関連した画像を蓄積するとか。
ランチャーとしても使えるけど、UIがかな漢字変換専用なのでどう呼び出すかが考えもの。


プラグインを置いたフォルダーは丸々Program Filesの下のほうにコピーされる。
サブフォルダーもコピーされる(らしい)。
必要なファイルがあればパッケージに入れられそう。でもコピー先がProgram Files系だからアプリからの書き込みは無理。他の手にしないと。


バックグラウンドで何かをするプラグインだと利用者に使うかどうか選ばせたいこともあるだろうと思う。
プラグインでは「プラグインを指定して…」実行することができるけど、基本は「すべてのプラグインで…」で使ってもらうことにして、プラグイン側で接頭辞(プレフィクス)を認識したらどうだろう。
入力された読みに特定の接頭辞があるときだけ動作するように。

ソースコード(Perl)

サンプルに追記したもの。

#################################################
#
# Perlモジュール用のプラグインインターフェイス
#
# ※このテキストは必ずUTF-8で記述すること
#   扱う文字列は全てUTF-8前提であるとする
#
#################################################

package Atok_plugin;

#################################################
# 宣言

use strict;
use utf8;
use Encode;
use LWP::Simple qw/get/;
use URI::Escape qw/uri_escape/;

#################################################
# 取得処理を実行する
# ・設定した候補を返すことが可能
# ・最大で100個の候補を返すことができる
# ・候補には、
#   1.表記
#   2.コメント
#   3.ツールチップ(確定文字列かURLジャンプ文字列)
#   を設定できる
# ・何もセットしなかった場合、処理結果は何もないと判断される
# ・引数で渡される情報に含まれる文字列は、全てUTF8フラグが付いている
# ・返す情報に含める文字列は必ずUTF8にする必要がある
#   (UTF8フラグは付いていなくても問題ない)

sub run_process
{
 my( $a_request_data ) = @_;

 my %result_data;

 my @candidate_array;

 my $a_encoded_request_data = uri_escape(encode 'eucjp', $a_request_data->{composition_string});
 my $a_response_from_hatena_web_search = decode 'eucjp', get("http://search.hatena.ne.jp/search?word=$a_encoded_request_data");
 print STDERR encode 'shiftjis', $a_response_from_hatena_web_search;
 my($a_number_of_found_pages) = $a_response_from_hatena_web_search =~ m{ウェブ全体から <strong>.+?</strong> の検索結果 約 <strong>([\d,]+)</strong> 件};

 push( @candidate_array , { 'hyoki'            => $a_number_of_found_pages ? '('.$a_number_of_found_pages.'件 見つかりました)' : '( ゚∀゚)o彡゜エラー!エラー!' ,
                            'comment'          => 'はてな検索で数えてみた' ,
                            'alternative'      => '> ウェブ全体から '.$a_request_data->{composition_string}.' の検索結果 約 '.$a_number_of_found_pages.' 件' ,
                            'alternative_type' => 'definite_string' } );

 $result_data{ 'candidate' } = \@candidate_array;

 return( %result_data );
}

#################################################

1; # 重要:モジュールは必ず真と解釈される値を返さなければならない

*1:変換結果がURLの場合だけランチャーのように振る舞うけど