03月27日(火) ロングマン現代英英辞典をEPWINGとして使う・改

この一年で電子辞書を積極的に使うようになったので、それらについてメモを書いておこうと思ったが、まずロングマン現代英英辞典[3訂新版]のCD-ROMをEPWINGとして使うようにできたので、それをメモとして書いておく。

非ネイティブ向けの英語辞典としてはロングマンはとてもよくできているし、気に入っている。そのうえ、最新版は4,200円で全データが入ったCD-ROMも付いているのですばらしい。

しかし、このCD-ROMの専用検索ソフトのできがきわめて悪く、その上HDDにもコピーできず、仮想CDなどにもコピーできず(これはプロテクトか板が悪いのかわからない)、ひどい。実際、板が悪いようで、すごい音で回転する。よく見ると縁のカッティングがそうとう粗い。で、しばらく使っていたらたまにCDの読み取りが悪いらしくWin98がブルースクリーンになるようなった。

(そういうわけでデータを吸い出したが、あくまで以下の記述はそういう状況下で必要にかられて個人的に行ったことなので、法的にも技術的にも何の保証もない。)

それで、困っていたのだが、インターネットでたまたまこのCD-ROMのデータを吸い出して、EPWING辞書として使う方法を見つけた。これは、まさにコロンブスの卵で、要はWindowsスクリプトを利用して、カット&ペーストで専用ソフトからテキストデータを取り出そうと言う方法だった。それが矢吹さんの次のページ(私にはこの発想が思いつかなかった)。

bullet

ロングマン現代英英辞典をEPWINGとして使う

で、さらに吸い出したデータを加工して発音記号などをちゃんと表示できるようにする方法を、稲富さんの次のページで教えてもらった(矢吹さんのページからのリンク)。

bullet

「ロングマン現代英英辞典をEPWINGとして使う」・・・をさらに見やすく

お二人には感謝します。

 

ちょっと(ファイル書き込みに)工夫

で、データを吸い出すところをちょっと工夫してみた。矢吹さんのJScriptでは、秀丸にカット&ペーストして、バッチファイルでテンポラリーファイル→吸い出しファイルという手順だった。これを、秀丸とバッチファイルを使わない方法を考えてみた(実は最初は面倒なので、矢吹さんのやったとおりにやってみたのだが、なぜか秀丸へのアクティブ化がどうしても安定しなかった)。

Windows Scripting Host環境でActiveXコントロール機能を拡張してくれる、AutoItX(フリー)を使ってみた。Longmanから単語をひとつずつコピーするところは矢吹さんのスクリプト(をちょっと変えて)使用し、ペーストしてファイルに書き込むところをAutoItXのClipGetというクリップボードから文字列を取ってくるメソッドを利用し、その後OpenTextFileメソッドでテキストファイルに追加書き込みをすればよい。

JScriptだと、矢吹さんのスクリプトの秀丸を呼び出してからペーストし保存して、バッチファイルを呼ぶ出す部分を次のように書き換えればいいと思う(一例、環境によって要編集)。

(以下の方法はあくまで一例なので、そのままでは使えない。JScriptやWSHについての知識が少しないと危険。)

var WShell = WScript.CreateObject("WScript.Shell");
var Aix = WScript.CreateObject("AutoItX.Control");
var ForAppending = 8;
var file_name = "d:\\tmp\\longman\\test.txt";
var word1;

for(i=0;i<10000;++i){

// とりあえず、10000見出し分

// 矢吹さんのコピー&ペースト・スクリプトを挿入。
// Sleepを環境に合わせて調整。CDならなるべく長く。
// ここで、クリップボードに1見出し分がコピーされるので、
// 次にClipGetでペーストされたテキストを読み出し、
// ファイルを追加書き出しopenし、書き出し、閉じる。

word1 = Aix.ClipGet();
var fso, tf;
var fso = new ActiveXObject("Scripting.FileSystemObject");

tf = fso.OpenTextFile(file_name, ForAppending);
tf.WriteLine(word1);
tf.WriteLine("**********");

tf.Close()

}

WSH5.5AutoItXがインストールされていて、Longmanソフトが起動されていれば、これでシコシコとファイルに書いてくれるけど、40000単語以上やろうとすると、1日ぐらいかかるかな?コツとしては、実行するときLongmanソフトとMS-DOSプロンプトだけ起動し、動作中はいっさいマシンに触れないこと(すでにWSH5.5をインストールしていたので、2000や98SEの素の環境で動くかどうかは不明)。

その後、稲富さんが提供してくれている外字などを仕込むとちゃんと見栄えよくDDwinで使えるようになる(実際、データの吸出し後は稲富さんのページの通りにやってうまくいった)。すばらしい。

ここまでの作業に以上のソフトにプラス、awkとActivePerl、EBStudioが必要。EBStudioのみ、フリーの場合は使用制限あり。幸い、AutoItX以外は以前からインストールしていたので簡単に済んだが、全部イチからそろえて作業するのはちょっとたいへんかもしれない。

 

補足

私の板(CD-ROM)は前述のように動作に問題があったが、LongmanソフトでコピーするJScriptの箇所をだいたい1コピーに2秒ぐらいかかるようにし、CD-ROMのキャッシュを最大にすることで、読み取り時のエラーは発生しなかった。ということは、やはり1分に30見出しぐらいしかコピーできないことになる。いまどきのマシンならば、もっと速くしてもいいかもしれないが、CD-ROMからの読み取りということで2秒ぐらいかかってしまうのはしかたがないかもしれない。

さらに補遺

DDwinにて喜んで使っていたのだが、うかつなことに100以上の読み落とし(読み取りできなかった単語)があることに気付いた。これは、CDからの読み取りなので、2秒の余裕を取っていても表示できなかった(そのためクリップボードにコピーできなかった)単語があったことになる。

読み落としていたのを手動でコピーすることも考えたが、やはり面倒なので次のようにJscriptを改変して再度読み取りを行った。ミソは、条件判断でコピーできなかった単語を再度コピーするようにした(ふたたび、コピー部分はほぼ矢吹さんのスクリプトのコピー)。

var WShell = WScript.CreateObject("WScript.Shell");
var Aix = WScript.CreateObject("AutoItX.Control");
var ForReading = 1;
var ForWriting = 2;
var ForAppending = 8;
var file_name = "d:\\tmp\\ldc\\test.txt";
var word1;

for(i=0;i<7;++i){

Aix.ClipPut("");

WScript.Sleep(100);
WShell.AppActivate("Longman Dictionary of Contemporary English");
WScript.Sleep(100);
WShell.Sendkeys("%(W1)");
WScript.Sleep(50);
WShell.Sendkeys("{DOWN}");
WScript.Sleep(50);
WShell.Sendkeys("~");
WScript.Sleep(100);
WShell.Sendkeys("~");
WScript.Sleep(100);
WShell.Sendkeys("~");
WScript.Sleep(300);
WShell.Sendkeys("%(ES)");
WScript.Sleep(50);
WShell.Sendkeys("%(ES)");
WScript.Sleep(50);
WShell.Sendkeys("%(EC)");
WScript.Sleep(50);
WShell.Sendkeys("%(EC)");
WScript.Sleep(50);

word1=Aix.ClipGet();

if (word1 == "")
{
WShell.AppActivate("Longman Dictionary of Contemporary English");
WScript.Sleep(100);
WShell.Sendkeys("%(W1)");
WScript.Sleep(100);
WShell.Sendkeys("{UP}");
WScript.Sleep(100);
}
else
{
var fso, tf;
var fso = new ActiveXObject("Scripting.FileSystemObject");

tf = fso.OpenTextFile(file_name, ForAppending);
tf.WriteLine("**********");
tf.WriteLine(word1);

tf.Close()
}

}

条件分岐を入れることで、逆に読み取りのタイミングは短くできた。

これで、完璧と思ったが、実際にやってみると、まだ問題があった。Jscriptの変数の制限か、AutoItXのメソッドのほうの制限かはわからないが、コピーすべき説明文が長い単語はコピーできないのだ(たとえば、go 1とかsay 1とか)。しかたないので、それらは手動でコピーした(10個ほど、たぶん)。

結局、CDから読み込む場合はこの条件分岐を入れた上で、矢吹さんのスクリプトどおり秀丸−バッチファイル経由のほうがいいかもしれない。私の場合は、秀丸へのアクティブ化が不安定だったので、できなかったが(AutoItXのせいで長い説明文がコピーできないなら、結局ダメだけど)。