Ermitejo - エスペラント語日本語翻訳

#BLOGO
メール辞書引き機能を公開 >
2007/11/28

メール辞書引き機能を近日公開

分類: 公開, 開発記 / タグ: , , ,

2007年第4四半期の公開を予定していた「メール辞書引き機能」を近日中に公開出来る目処が立ちましたので、ご報告申し上げます。

この「メール辞書引き機能」とは、メール本文にエスペラント単語を書いて送信すると、その辞書引き結果が返信されるサービスです。或る事柄についての質問内容のメールを送信すると、その回答をメールで受け取れるサービスとしては、他に以下のようなものがあります。

  • Googleモバイル検索メールへ検索キーワードをメールで送信すると、ウェブ検索結果が返信される。
  • ニワンゴへ質問文をメールで送信すると、質問の内容に応じてニュース・辞書引き・天気予報・乗換情報・地図等の情報が返信される。

本サイトではエスペラント日本語翻訳システムを開発中ですが、その副産物として公開している辞書引き機能と同等の検索結果を得られます。出先でちょっとした確認をしたい場合には気軽に、また自宅でもパソコン等を起動する手間無く、PHS・携帯電話で辞書引きが出来るようになります。勿論、移動体通信(PHS・携帯電話)以外のメールアドレスからでもご利用いただけます。

また、これまでの辞書引きウェブページへのアクセスと違って必要な文字情報のみを取得出来ますので、パケット通信料の低減にも繋がります。WILLCOMの「ウィルコム定額プラン」はウィルコム同志の通話だけでなく、(ウィルコム外の宛先を含めた全ての)メール送受信が無料ですので、さらに安心してお使いいただけます。

なお、本サービスの提供と併せて、より高速で安定したホスティングサービスへの契約変更を行います。

以下では、本サービスの技術的な実装方法の概要をご紹介します。

メール辞書引き機能の技術論

必要なのは「あんこの皮」

まず、これまでの辞書引き機能の概要を以下に示します。

  1. ユーザは各々のユーザエージェント(ブラウザ)を起動し、vortaro.ermitejo.comのウェブサーバ上にある辞書引きページのURI(URL)へHTTPでアクセスする。ウェブページが画面に表示される。
  2. ユーザは検索文字列(クエリ)を画面上の所定の入力欄に記入し、HTTPのGET(単語辞書引き)またはPOST(文章内単語訳)メソッドで内容をウェブサーバへ送信する。
  3. CGIの仕組みを介して送信内容をウェブサーバ上の辞書引きアプリケーションへ渡して起動する。
  4. 辞書引きアプリケーション(翻訳ソフトのうち、形態素解析部分を流用したもの)が稼働する。
  5. 辞書引きアプリケーションの結果をウェブページの書式に成形し、CGIの仕組みを介してユーザの画面へ返信する。
  6. ユーザは辞書引き結果を閲覧出来る。

さて、上述の通り、これまでの辞書引き機能とは辞書引き機能の内部処理自体は同一としています。すなわち、概要の3.についてはこれまでの内容をそのまま流用することが出来ます。

そこで、メール辞書引き機能の概要はどのような姿になるでしょうか。

  1. ユーザは各々のメールアプリケーションを起動し、ermitejo.comの指定のメールアドレスを宛先に設定する。
  2. ユーザは検索文字列(クエリ)を本文に記入し、メールを送信する。
  3. “何らかの仕組みによって”ermitejo.comのメールボックスの内容をウェブサーバ上の辞書引きアプリケーションへ渡して起動する。
  4. 辞書引きアプリケーション(翻訳ソフトのうち、形態素解析部分を流用したもの)が稼働する(相違点無し)。
  5. 辞書引きアプリケーションの結果をメールの文に成形し、“何らかの仕組みによって”ermitejo.comからメールを返信する。
  6. ユーザはメールを受信し、辞書引き結果を閲覧出来る。
  7. 「検索文字列(クエリ)を渡して辞書引き結果を返す」 という処理は、これまで提供している辞書引き機能と同じ結果を返すことから、

ユーザ側の処理は当たり前といえば当たり前なので、上記で敢えて“何らかの仕組みによって” と述べているような、ユーザ側の意図とサーバ側の実装を仲立ちする仕組みさえ整えば良いことが分かります。

こういうものを称して、IT業界では「あんこ」 に対する「皮」という概念を用いることがあります。肝要な処理すなわち「あんこ」は共通で使うので、後は外側の「皮」次第でいくらでも見た目の違う(けれどもあんこの味は同じ)大福餅を作れるというわけです。

では、メール辞書引き機能の皮には何を用いるのでしょうか。

送信は悩まない

簡単な方から論じましょう。送信はとても簡単です。プログラムからメールを送信することは、広く一般的な技法といって良いでしょう。SMTPに準拠した内容でMTA(いわゆるメールサーバ)へメール送信処理をするだけです。具体的には、宛先にメールを送信いただいたユーザの返信アドレスを設定し、本文・題名等を設定して、送信するだけです。

単純に考えるならsendmail(qmailやPostfixにも互換コマンドがあります)コマンドにパイプでデータを渡してしまえば楽なのですが、一からそういう処理をゴリゴリ書くのはいただけませんね。本サイトの翻訳機能は車輪の再発明をいとわずに勉強を兼ねてゴリゴリ書いているのですが、流石に周辺機能については広く使われているプログラムを使わせていただくことが妥当です。

そこで、どうせPerlの場合なら、Net::SMTPモジュールか、より良い選択肢としてはMail::Mailerモジュールを使った方が良いでしょう。

ともあれ、送信には悩まされません。本サイトをホストしているXREA Plusのサービスでも、上に掲げた手法を使って簡単に送信することが出来ます。

受信時にはprocmailかmaildropがお勧めだが……

さて厄介なのは受信側です。ユーザから送信いただいたメールは、ermitejo.comのメールサーバ上のメールボックスに届きます。この内容をPerl(やらRubyやらCやら)のプログラム(後続のジョブ)に渡せば良いのです。

一般的に、こうした要件ではメール振り分けフィルタを用います。フィルタというのは一般ユーザへも膾炙していると思われます。受信したメールの送信者・件名・本文等の情報ついて、特定の条件に合致しているものを、他のアドレスに転送したりメール振り分けフォルダに振り分けたりという処理をおこなう働き者のことです。

上記の例はPOPないしIMAPのクライアント(いわゆるメールアプリケーション:Mozilla ThunderbirdやMicrosoft Outlook等)内の処理ですが、MTA(いわゆるメールサーバ:qmailやSendmail等)にも似たような仕組みがあります。

具体的には、procmailやmaildropという名称の仕組みです。.forwardという設定ファイルないし.qmailいう設定ファイルに必要な記述を行うと、メールボックスへの着信を引き金として、その内容を他のジョブに投げる処理が出来ます。まさに要件ぴったりの内容ですね。

が、しかし。XREA, XREA Plus, CORESERVER.JPでは、この振り分けフィルタは使えません。CORESERVER.JPについてはウェブ上に言及がなかったためにサポートにお伺いしましたが、同様に現在は使えないとの回答をいただいています。

別に意地悪でそういう制限を掛けている訳では勿論ありません。一般的なホスティングサービスでは、大勢のサイトオーナ(数百人)が1台のサーバ機に同居している都合上、同居人に迷惑が掛かるような行動は厳禁です。インターネット上では性善説に則るわけにはいきませんので、(さくらインターネット等を除いては)大抵はこの機能に制限が掛かっているという次第です。

これを打破するには、同居人の気兼ねがない一国一城の主になる手が手っ取り早いのですが、当然のことながら数百人の利用料で賄っていたサービスの数百倍のお値段が必要になることも想像に難くありません。

さあ困りました。どうしましょうか。

cronで定期的にメールボックスを見に行こう

メール送信は簡単でした。同様にメールを受信しに行く処理は、簡単に実装出来ます。黙っていてもプログラムはメールを受信しに行かないので、ユーザがメールを送信したら、すぐにその内容を取りに行くようにプログラムをしつける必要があります。

この要件は、半ば達成可能です。XREA Plusでも利用可能なcronというサービスを使うと、定期的にプログラムを実行することが可能です。ユーザがメールを送信し、それがメールボックスに着信したことを引き金にすることは出来ません。しかし、定期的にメールボックスを見に行く回数が頻繁であれば、例えば(極端な話ですが)1秒に1回プログラムを実行すれば、着信してすぐの状態をプログラムが見に行けることと同義になります。

1秒に1回もプログラムが稼働していては、同様にサーバの負荷増大に多大な貢献をしてしまうので、極論は勿論駄目です。それでは、cronで(crontabへ)設定することが出来る最短間隔は何分なのでしょうか。

答えは、XREA Plusでは1時間。ぎゃー。

CORESERVER.JPに淡い恋心を抱いてサポートにお伺いしたところ、回答はやっぱり1時間。ぎゃー。

……辞書引きを行おうとしてメールを送って最大1時間後(平均では30分後)に返事が来るのではお話になりません。さあ困りました。どうしましょうか。

文通の果てに開かれた地平  

デジロック社との仲睦まじいやりとり

上記で「ぎゃー」と悲鳴を上げるまでは、実は簡単ではありませんでした。FAQやサポートサイトではCORESERVER.JPの詳細な仕様が明らかとなっていませんでしたのでサポートにお伺いしたのですが、同サービス提供元のデジロック社はご多忙中であったのか、待てど暮らせどご回答をいただけないのでした。

これは無理からぬことで、同社の提供するXREA, XREA Plus, CORESERVER.JPの高品質・低価格のサービスは、「分かる人」を相手とした商売とする経営方針のもと、管理を極力機械化して人件費を削減した経営努力の結果によってはじめて実現するものであるからです。

従って、別途存在する有料サポートを使わずに無料サポートの枠内でお伺いしたこともあって、或る程度の放置は当たり前のこととして甘受すべきなのですが、流石に何かの伝言ゲーム間違いではないかとの不安をいだく以下のような経緯を辿りました。

  • 2007年9月8日未明に、procmail利用可否・cronスケジュール間隔最小値をお伺いした。
  • 同日朝、cron間隔最小値が1時間である旨のご回答をいただいた。併せて、procmail利用可否について専門のご担当者様からご回答いただける旨のご連絡をいただいた。
  • その後ご連絡無し。 
  • 2007年9月24日に、上記の回答見込みを教えていただきたいとお伺いした。このサポートの仕組み上、1ヶ月以上やりとりがないと自動的に完了扱いとなる旨の記述があったため、見込みだけでもお伺いしようとした。
  • その後ご連絡無し。
  • 2007年10月8日に、上記の回答見込みを教えていただきたいとお伺いした。
  • その後ご連r・(略
  • 2007年11月18日に、上記の回t・(略
  • 2007年11月19日に、専門のご担当者様へ再度ご連絡いただいた旨のご回答をいただいた。
  • 2007年11月27日に、procmailが利用不可能であること(ただし検討中ではあること)のご回答をいただけた。 

ですが、そのスルー力対スルー力の柳と風の交わりの果てに、上記のご回答内容に光明を見いだせるに至ったのです。

cron対象を何個も設ければ万事解決

cron自体は1つの設定エントリだけではなく、複数のエントリを設定出来ます。1つ毎のエントリでは最小実行時間が1時間であるものの、多数の設定を行うことで、実質的には短時間で実行することが可能となります。例えば「毎時0分・毎時6分・毎時12分……毎時54分」のように10エントリとすれば実質的には6分間隔になるというあんばいです。無限ループの中でsleep 60すれば1分ごとに確認出来ます(実際には起動時以降、強制終了される実行時間より低めの閾値で自分でループを抜けた方が良いでしょう)。

無論(XREA+の500アカウントよりは少ないとはいえ)共有サーバであるために高負荷を掛けることは御法度ですが、CORESERVERはXREA Plusの上位サービスということもあって、負荷量の限度の目安もXREA Plusの2.5倍となっており、懐が深いサーバ設定であることが分かります。

結果、以下のような点を考慮して、CORESERVER.JPにermitejo.comのホスト先を変更させていただく決意を固めたという次第です。 

  • 想定している処理は重い処理ではない(仮に重い処理だとしたら、同じ「あんこ」を使っている通常のウェブページでの辞書引き機能も断念せざるを得ない)ので、cronを常識的な範囲で回すことが出来る。
  • XREA PlusではCPU TimeではなくElapsed Timeが30秒を超えるCGIが強制終了されてしまうが、CORESERVER.jpでは300秒となる。辞書引きでさえ長い文章の「文章内単語訳」では1秒を超えていることから、翻訳システムを実現する上で形態素解析の後に控えている構文解析・意味解析・訳語生成等々の重厚長大な処理を行えないのではないかと危惧していたが、これが雲散霧消した(註:流石に300秒ユーザをお待たせする情けないプログラムは作りません)。
  • 同時接続数や転送量の制限が制限が緩いため、翻訳システム完成後、まかり間違って大人気を博してしまった場合でも対応可能な幅が広がる
  • ディスクスペースがXREA Plusの3GBに比べて5倍の15GBとなる(註:実のところ今はウェブログやその他諸々全部合わせても50MB程度しか使っていないので手持ちぶさたではありますが)。

こうして、CORESERVER.JPを契約してcronを沢山設定するという皮で、大福餅を作れることが分かりました。

ご多忙の折に新設にご回答くださいましたデジロック社のご担当各位に、この場でもお礼を申し上げます。引き続き、引っ越し先のCORESERVER.JPでもお世話になります。

#69 (2007/11/28 03:43:30), Gardejo

コメントはまだありません »

コメントはまだありません。

このコメント欄の RSS フィード トラックバック URL

ご意見・ご感想をお寄せください

メール辞書引き機能を公開 >
< 脇書非表示 > 脇書表示