Hatena::Groupatokdirect

高見知英のATOKダイレクトプラグイン日記

2009-04-26

プラグインを自動インストールするUWSCスクリプトを作成してみました

| 19:17

ATOKダイレクトプラグインを作成中、実際にプラグインATOKインストールして試すというケースは良くあると思います。

そのとき毎回毎回SETUP.EXEを起動してインストール処理を行うというのはとても面倒。なのでUWSCスクリプトを書いてみました。

# 考えたあと、ファイルだけコピーすればはやいんじゃない?という気もしましたが、まあATOKライブラリローディングのタイミングがどこであるかもわからないし、とりあえずこれで。

DIM _dir = COPY(PARAM_STR[0], 1, POS("\", PARAM_STR[0], -1))
EXEC(_dir + "SETUP.EXE")
DIM _iddlg = GETID("使用許諾契約")
IF _iddlg <> -1 THEN SCKEY(_iddlg, VK_ALT, VK_A)
_iddlg = GETID("ATOKダイレクト プラグインのセットアップ")
SCKEY(_iddlg, VK_SHIFT, VK_TAB)
SCKEY(_iddlg, VK_SPACE)
SCKEY(GETID("ATOKダイレクト プラグイン セットアップ"), VK_ALT, VK_Y)
_iddlg = GETID("ATOKダイレクト プラグインのセットアップ")
SCKEY(_iddlg, VK_ALT, VK_S)
_iddlg = GETID("ATOKダイレクト プラグイン セットアップの完了")
SLEEP(1)
SCKEY(_iddlg, VK_RETURN)

これを適当な場所に保存、テキストエディタのツール呼び出しから、編集中のスクリプトディレクトリパスを引数として渡すようにすればOKです。

たとえばうちで愛用のGinnieの場合

ツールの場所
UWSCのパスを指定します
作業フォルダ
空で構いません
パラメータ
(保存したUWSファイルのパス) %d

という感じです(Ginnieで%dは編集中ドキュメントのフォルダパスに変換される)。

# お使いのテキストエディタにそういう機能がない場合は、2行目あたりのSETUP.exe呼び出し処理あたりを適宜調整して下さい。

トラックバック - http://atokdirect.g.hatena.ne.jp/TakamiChie/20090426

2009-04-21

ATOKダイレクトプラグインでは「同一ディレクトリのファイルを読む」ということはできない?(2009/04/21時点)

| 22:43

現在作成中のプラグインを作成していて気づいたことなのですが、ATOKダイレクトプラグインインストール時に「スクリプトと一緒にATOKの実行用ディレクトリにコピーするファイル」を指定できない(はず)なので、あらかじめ作ったテンプレートファイルを読み込んで処理するということは出来ません。

そのため、ATOK2009で追加されたcomment_xhtmlをテンプレートを使ってERBでさくさく ということは出来ないのです。

個人的にはなんとしても実行コード内にHTMLを混ぜたくなかったので分割方法を探しましたが、とりあえず以下の方法があるらしい。

つまり、ファイルの__END__の下にErbのテンプレートを書いてしまえばよい ということになります(ちなみに、上記ページのコメントでわたしが指摘しているように、File.readの引数は__FILE__にしておくと良いです)。

ただこの方法では、読み込めるファイルは一つ(comment_xhtmlを使う場合はXHTMLテンプレートで埋まってしまうでしょう・・・)というのと、他の非標準Rubyライブラリを持ってきて使うということが出来ないので、根本的な解決ではありませんね。

まあ、セットアップツールを使わない という手もなくはないですが。


出来ればセットアップツール側で何とか出来るとうれしいのですが。何か良い方法はないのでしょうか。

ATOKダイレクトプラグインのデバッグ方法について

| 22:30

ATOKダイレクトプラグインは、ATOK.comで公開されているatok_direct_debuggerで出力を確認することが出来ます。

しかし、これだけだと期待したパターンを全て確認するのは骨が折れます(わたしは折れます)、デバッガを使わないでも最低限の出力テストはしておきたいもの。


そこでわたしは、Rubyの機能、__FILE__定数を使って、最後に以下のような記述を書いています。

if __FILE__ == $0 then
 ・・・・テストコード・・・・
end

こうすることによって、このif文の中はこのスクリプト直接実行したときのみ実行されます。つまりはATOKダイレクトプラグインとして実行したいときには呼び出されない という意味。まあ、ここまでならたぶん、Rubyの入門書にも記載されていることでしょうが。

ここに、以下のような感じで、モジュールのテストコードを書き連ねていく。

  def regexp_test(pattern, test, request = true)
    ans = request == (pattern === test)
    puts "#{test} => #{ans ? 'OK' : 'NG'}"
  end

  regexp_test(Atok_plugin::IDPatterns[0][:pattern], "id:TakamiChie")
  regexp_test(Atok_plugin::IDPatterns[1][:pattern], "@TakamiChie")

↑の場合は以下のように出力されることが期待されますね。

id:TakamiChie => OK

@TakamiChie => OK

一般的なユニットテストとは違います*1が、出力文字列をそのまま表示できるので、ATOKプラグインのようなものの判断には割と適しているといえるでしょう。

わたしはこれを、Ginnieを使ってみるで言及したGinnieのスクリプトを使って、F5から常にスクリプトを実行できるようにして使ってます。


なお、WindowsコマンドプロンプトはShift-JIS文字列しか表示できないので、日本語の文字列を表示するときには、nkfライブラリが必須です。

NKF.nkf('-sxm0', d['comment'])」というような感じで出力結果を常にShift-JISに変換してから表示するようにしましょう。

なお、配列などの構造化データを出力するのに便利なppは、そのままでは文字コード変換が出来ませんが――。

pp - Rubyリファレンスマニュアルに記載のとおり、ppをrequireした時点で「Object#pretty_inspect」というメソッドが追加されているので、これを使いましょう。

NKF.nkf('-sxm0', d.pretty_inspect)」みたいな感じで。

*1:ここでいう一般的なユニットテストとは、nUnitのようなあらかじめ指定した期待値とマッチするかどうか出判断するタイプのものをさしています

ATOKDirectATOKDirect2009/04/22 09:58よろしくお願いいたします!

kujirahandkujirahand2009/04/22 18:27ATOKプラグインでテンプレートなど使いたい場合は、初回実行時に、そのユーザーのマイドキュメントやAppDataフォルダなどに、テンプレートファイルを展開しておく方法を使えば可能と思います。(アンインストールの時にゴミが残るのがいやならば、テンポラリフォルダの適当なフォルダを素材置き場とすれば、一定期間経過後によきに削除してくれます。)

ATOKDirectATOKDirect2009/04/22 20:23id:just_hirabayaがアップした「フォルダリスト」のプラグインで、プラグイン以外のファイルをセットアップに含める方法を紹介しています。ご確認ください。
http://atokdirect.g.hatena.ne.jp/just_hirabaya/20090422

t_daichot_daicho2009/04/23 00:41> 同一ディレクトリのファイル
僕は電卓プラグインでrbファイルを2つ転送していますが、ちゃんと使えていますよ。
requireなどするなら、ATOKダイレクトのディレクトリがロードパスに含まれてないから絶対パス指定する必要がありましたが。

TakamiChieTakamiChie2009/04/26 19:06皆様コメントありがとうございます。確認しました。
サブディレクトリにファイルを配置する方針で行こうと思います。