misima RESTful Web Service Perl クライアント

昨日は misima 旧字・旧仮名遣い変換 RESTful Web Service サーバの実装について記した。今日はクライアントを書いてみよう。サーバアプリを書くのに使用した Apache-Wink には,REST クライアントをプログラミングするための Java API も備わっている。けれども,ここでは Perl 言語で試してみることにする。Perl においても REST::Client モジュールが公開されていて,これを使えばいとも簡単にクライアントアプリケーションを作成できる。

REST::Client モジュール

端末で以下のように REST::Client モジュールをインストールしておく。

$ sudo cpan -i REST::Client

RESTful Perl クライアント・コード

端末から操作するコマンド misimaRestClient.pl の Perl プログラムを以下に掲載する。標準入力から変換対象テキスト(UTF-8 エンコーディングでなければならない)を読んで,引数に指定した misima 変換オプションにより,misima RESTful サーバに要求を発行し,変換結果を標準出力に書き出す。misima そのものは様々な変換オプションをサポートしているが,ここでは旧字,旧仮名遣い,用語用字,単純置換,繰返符号,仮名反転,簡体字-繁体字の変換指定が可能である。オプションが何も指定されていなかったり,入力テキストが空の場合,サーバに要求を出しても無駄なので,エラーを出して終了する。

#!/usr/bin/perl -w
# -*- coding: utf-8; mode: cperl; -*-
# misima RESTful Web Service Client
# 2014(c) isao yasuda, All Rights Reserved.
 
use strict;
use REST::Client;                       # RESTful Web Service Client
use Getopt::Std;                        # コマンドライン引数処理
use File::Basename;                     # ファイル名の取得
 
# コマンドライン・オプション・チェック (see usage)
my %opts = ('s'=>'0', 'y'=>0, 'k'=>0, 't'=>0, 'i'=>0, 'n'=>0, 'l'=>0);
# オプション
Getopt::Std::getopts('s:yktnil', \%opts) || usage();
# 旧字オプション
usage() unless ($opts{'s'} =~ m/[cjhua]/);
 
# 処理対象データ
my $copt = "";                          # misimaオプション
foreach my $key (keys(%opts)) {
    if ($opts{$key}) {
        if ($key eq 's') { $copt .= '-s ' . $opts{$key} . ' '; }
        else             { $copt .= '-' . $key . ' '; }
    }
}
($copt) || die "No options specified.\n";
 
my $ucde = "noxinsomniae201402";        # ユーザコード
my $itxt;                               # 変換対象テキスト
$itxt .= $_ while (<STDIN>);            # 標準入力を蓄積
($itxt) || die "No texts\n";
 
# 送信XML組立
my $pxml = '<?xml version="1.0" encoding="UTF-8"?>' .
    '<misimaRESTful><misimaParam>' . $copt . ' -q</misimaParam>' .
    '<misimaTarget>' . $itxt . '</misimaTarget>' .
    '<misimaUsercode>' . $ucde . '</misimaUsercode></misimaRESTful>';
 
# RESTful post
my $host = 'http://yasuda.homeip.net:8080';
my $url  = '/misimaRest/misima/convert';
my $client = REST::Client->new({host=>$host});
$client->request('POST', $url, $pxml, {'Content-Type'=>'text/xml'});
if ($client->responseCode() eq '200') {
    print $client->responseContent();
} else {
    print STDERR "Error occured: ", $client->responseCode(), "\n";
}
 
# Usage
sub usage {
    my $prog = basename($0);
    die <<"EOM";
Usage: $prog [-k|-y|-i|-t|-n|-l|-s {c|h|u|a}]
  -k: 旧仮名遣い変換  -y: 用語用字変換    -i: 繰返符号変換  -t: 単純変換
  -n: かな反転        -l: 簡体字to繁体字
  -s: 旧字変換 (-s x として x に以下いずれか指定する)
        c UTF-8 文字;  h HTML数値参照;  u TeX \\UTF; a TeX \\CID;
EOM
}

上記の 39-48 行目が REST::Client 関連処理である。REST::Client->new({host=>$host}) でサーバホスト指定で REST クライアント・オブジェクトを生成し,request('メソッド', URLパス[, 送信データ, ヘッダ配列]) メソッドで要求を発行する。受け取ったデータは responseContent() メソッドで取り出すことが出来る。詳細は perldoc REST::Client でドキュメントを参照のこと。

試験

変換実行の操作イメージは以下のとおりである。test.txt は変換対象テキストファイルである。

$ cat test.txt 
森鴎外はこう言い,内田百間を団扇であおいだ。
僕は黙っています。
$ misimaRestClient.pl -kyit -s c < test.txt
森鷗外はかう言ひ,內田百閒を團扇であふいだ。
僕は默つてゐます。

GNU Emacs からの利用

misimaRestClient.pl を端末コマンドとしてだけではなく,GNU Emacs からも使えるようにしよう。Emacs Lisp パスの通ったところに,以下の Emacs Lisp プログラム misimaws.el を格納する。

;;; misimaws.el
(defvar misimaws-path "/usr/local/bin/misimaRestClient.pl"
  "Path for misimaws. Default: /usr/local/bin/misimaRestClient.pl")
(set-default-coding-systems 'utf-8)
(defun misimaws-region (start end)
  "Replace UTF-8 characters of specified region to old orthography.(UCS)"
  (interactive "r")
  (call-process-region start end misimaws-path
   t (list t nil) nil
   "-ykit" "-s" "c")
  )
(provide 'misimaws)

そして,.emacs 初期設定ファイルに以下を記述して,Emacs に評価させる(再起動してもよい)。misimaws-pathmisimaRestClient.pl のパスで,デフォルトでは /usr/local/bin/misimaRestClient.pl である。

;; misima RESTful Web Service Client
(require 'misimaws)
(setq misimaws-path "~/bin/misimaRestClient.pl")

GNU Emacs の編集バッファで,変換したいテキスト・リージョンを選択し,M-x misimaws-region RET で当該リージョンが変換される。ここで使用している Emacs Lisp 関数 call-process-region については,Emacs Lisp - call-process, 旧字・旧仮名変換に書いたので,そちらも参照いただきたい。

emacs-rest-1.png
GNU Emacs 変換前
emacs-rest-2.png
GNU Emacs 変換後

misimaRESTful Web Service はそのうち限定公開とするので,悪しからずご了承ください。

参考文献

RESTful Webサービス
Leonard Richardson Sam Ruby
オライリー・ジャパン

[ 2015/02/02 付記 ]
misima RESTful Web Service は 2014/12 より友人のためだけの限定公開といたしました。上記ユーザ認証コードでは動作しません。

Emacs から misima RESTful Web Service を使うのなら,本記事の Perl クライアントを使うよりも Emacs-lisp だけで実装したものをお勧めする。本ブログ記事『misima RESTful Web Service for GNU Emacs, LaTeX』を参照いただきたい。