2014年12月11日木曜日

英辞郎をLinuxで

英辞郎のver79を買ったのはいつのことだったのか。
まだネット上での支払サービスが一般的でなく、
Niftyのシェアウエアの支払いサービスを利用仕掛けて
結局口座振込を使った記憶があるので、
恐ろしく前なんだと思います。
その後のバージョンアップは辞書サイズの肥大化がいやで行わず、
未だに古いバージョンをWindowsで
PDICとDokopopとの組み合わせで使い続けています。
最近はなぜかきちんと連携できるアプリケーションが減って、
特にサクラエディタ(Unicode版)との組み合わせで右クリック検索できないのは辛いですが。

さて最近Ubuntuをデスクトップに使う機会が増え、
Linuxで英辞郎は使えるのかと調べて見たところ、
StarDictなるソフトウェアに行き着きました。
が、英辞郎を使えるようになるまでがかなり大変そうで、
しかも私の使っている超古いバージョンの変換に四苦八苦するのも面倒なので、
この際ウェブアプリケーションにしてローカルから使えるようにしようと思いつきました。

Ubuntu 14.04にてウェブサーバの設定から始めます。
まず以下を実行します。
# apt-get install apache2
# apt-get install php5
次いで設定ファイル"/etc/php5/apache2/php.ini"の
short_open_tag = Off
の行を
short_open_tag = On
に変更します。これはPHPのスクリプトの開始を示す"<?php"を
"<?"に省略できるようにする設定です。
また設定ファイル"/etc/apache2/envvars"の
#. /etc/default/locale
の行のコメントアウトを外し
. /etc/default/locale
に変更します。
こうしておかないとescapeshellcmd()関数で日本語が処理できません。
最後に
# /etc/init.d/apache2 restart
を実行してウェブサーバを再起動しておきます。

今度はコンテンツの準備です。
私の手元にある辞書データファイル"waeiji79.txt"、"eijiro79.txt"は
文字コードがSJISになっています。
SJISはファイルサイズが小さくできるので昔は重宝しましたが、
最近のウェブはutf-8がデフォルトなのでこちらに合わせます。
一応あとでわかりやすいように最初にファイル名を変更しておきます。
$ mv waeiji79.txt waeiji79.sjis.txt
$ mv eijiro79.txt eijiro79.sjis.txt
で、
$ iconv -f SJIS -t UTF8 < waeiji79.sjis.txt > waeiji79.txt
を実行してみると、何と辞書データに悪いところがあるらしくエラーで止まってしまいます。
辞書データを直すのはしんどいので、昔ながらのnkfで変換してみます。
# apt-get install nkf
$ nkf -Sw waeiji79.sjis.txt > waeiji79.txt
$ nkf -Sw eijiro79.sjis.txt > eijiro79.txt
これだと成功しました。
ちなみに
nkf -g <ファイル名>
でそのファイルの文字コードが"Shift_JIS"や"UTF-8"と判定できます。
変換後ファイルはウェブサーバから見えるように
"e/eijiro79.txt"、"j/waeiji79.txt"として置いておきます。

単語検索には以下の4つのファイルを置きます。

英和検索単語入力ページ"e/index.html"
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Cache-Control" content="max-age=2592000" />
<title>e2j</title>
</head>
<body>
<form action="s.php" method="post">
<input type="text" name="s" value="" format="*m" />
<select name="t" size="1">
<option value="0" selected>init</option>
<option value="1">match</option>
<option value="2">include</option>
</select>
<input type="submit" value="search" />
</form>
</body>
</html>

英和検索スクリプト"e/s.php"
<?
 header("Content-Type: text/html; charset=utf-8");
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
<meta http-equiv="Cache-Control" content="no-cache" />
<title>result</title>
</head>
<body>
<?
 $f="eijiro79.txt";
 $t=escapeshellcmd($_POST[t]);
 $c=escapeshellcmd($_POST[s]);
 if($t==0) // init
  $r=`grep -e '^■\<$c\>' $f | perl -pe 's/\n/<br \/>\n/'`;
 if($t==1) // match
  $r=`grep -e '\<$c\>' $f | perl -pe 's/\n/<br \/>\n/'`;
 if($t==2) // include
  $r=`grep -i $c $f | perl -pe 's/\n/<br \/>\n/'`;
 print "$r";
?>
</body>
</html>

和英検索単語入力ページ"j/index.html"
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Cache-Control" content="max-age=2592000" />
<title>j2e</title>
</head>
<body>
<form action="s.php" method="post">
<input type="text" name="s" value="" format="*M" />
<select name="t" size="1">
<option value="0" selected>init</option>
<option value="1">match</option>
<option value="2">include</option>
</select>
<input type="submit" value="search" />
</form>
</body>
</html>

和英検索スクリプト"j/s.php"
<?
 header("Content-Type: text/html; charset=utf-8");
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Cache-Control" content="no-cache" />
<title>result</title>
</head>
<body>
<?
 $f="waeiji79.txt";
 $t=escapeshellcmd($_POST[t]);
 $c=escapeshellcmd($_POST[s]);

 if($t==0) // init
  $r=`grep -e '^■$c ' $f | perl -pe 's/\n/<br \/>\n/'`;
 if($t==1) // match
  $r=`grep -e '[ ■]$c ' $f | perl -pe 's/\n/<br \/>\n/'`;
 if($t==2) // include
  $r=`grep -i $c $f | perl -pe 's/\n/<br \/>\n/'`;
 print "$r";
?>
</body>
</html>

これで"http://localhost/e"で英和辞書が、"http://localhost/j"で和英辞書が使えます。
スクリプトについては勝手に使っていただいて構いません。
改造するのも難しくないので都合がよいように仕立て直してください。
ただし、最近の英辞郎の辞書データがどうなっているのか
私は知りませんので、その辺はうまくアレンジください。

0 件のコメント:

コメントを投稿