[BlueLeaf1336]> PROBLEMS> EdictScanner>

EdictScanner - What's this?

historyTOP

2004/01/16:作成
2004/01/17:更新(突然日記風にしてみたり)
2004/01/18:更新
2004/01/20:更新・途中経過(EXE/SRC)アップ

overviewTOP

2004/01/16

The EDICT Projectというサイトがあって、ここで、edictという和英辞書ファイルをゲットできます(個人使用ではフリーらしいですな)。で、この辞書に非常に使いやすい。

というのは、細かいこと言わずに単純に日本語と英語の対応表という感じなんですね。つまりちょっと意味が知りたい時にすごく便利で、現在かなり適当に作ったこの辞書ファイルを利用した検索プログラム(この呼び方がこっ恥ずかしい...)が、なんやかやで自分の作ったプログラムの中でもっともよく使ってるんじゃないかというところからもそんな気がしてきます。

あと、必要あんのか?と思われるマニアックな気のする語句が登録されてたりして不可思議な感じがします。たとえば、

[031531]観音様 [かんのんさま] /(1) Kannon (Kwannon)/Goddess of Mercy/(2) (sl) clitoris/
[094733]放物焼き [ホルモンやき] /(ksb:) (n) (uk) fried beef or pork giblets/
みたいなのが山盛りです。1つ目は最後の訳語が気になるのと、なんで外人がそれを知っとんねんという軽い感動。2つ目は、へー、ホルモンてそういう漢字書くんかぁそういえば「捨てるもの=放るもの=ほうるもん=ホルモン」て聞いたことあるなぁ、でもホンマか?みたいなちょっとした弁証論法の海へダイブ。

それはそれとして、今使っているプログラムというのが次の図のようなものです。


こんなのん。(「edict」を検索した状態です。)

で、この辞書は1行がひとかたまりになっていて、検索方法も、辞書ファイル(テキスト形式/5MB以上)を全部メモリに読み込んでおいて、検索語が指定されたら最初の行から最後の行まで1行ずつ、この語を含んでますか?どうですか?を調べて、含んでいたらテキストボックスに表示するという思いっきりなものです。

ただ、意外と検索時間も早く(さすがに「あ」とかを検索すると嫌になるぐらいヒットするのでとりあえず100件ヒットしたら止める、という制限はかけてますが)、重宝しています。

というわけで、既に動くプログラムがあるんですが、ここでモチベりながらもっと良い感じのものにしたいと考えているわけです。たとえばタイトルが「テンプレート」ってどうよから始まり、辞書の最新版のダウンロード機能をつけてみたり検索語の強調表示をしてみたり検索結果で選択した語句で検索かけたりあるいはGoogleで検索してみたりということです。

プログラムの動作TOP

2004/01/16

とりあえず大枠としては、今現在のプログラムと同じになりそうです。つまり、

ということです。で上のリストのほとんどが準備というか1回やればほとんど必要ないんじゃないかといわれているダウンロード機能だったり。で、今既に遅々として進まないながらもだらだらと進めているのが、大きなファイルをどうにかする処理をスレッドでしたいなぁという所です。本来なら検索のところをもっと早くするとかかっこよくするとかしたいところですが、あえてというか最初に思いついてしまったので仕方なくというか。内容としては の4つです。とくに最初の2つはどうでもよいような気がしますが、今やっているのはまさしく1つ目のダウンロードだったりします。で、上の4つの処理中はプログレスバーを出したり残り何秒で終わるよと教えてみたりキャンセルさせてみたりさせたいわけです。2回目になりますが、今やっているのはまさしく1つ目のダウンロードだったりします。

2004/01/17

ちょっと考えると、わざわざEUCからShift-JISへの変換に辞書ファイルを丸ごと変換してしまわなくても、検索直前に検索後だけをEUCに変換してEUCで検索し、ヒットした結果だけを表示する直前にShift-JISに変換すればよいような気がします。というかそうするでしょう普通。

とはいえ、そんなところはまだですが。ダウンロード関数と辞書ファイル読込関数までは作成しているので、これを(何故か)スレッド化して同時にダイアログをモーダルで表示したりして(バックグラウンドでないあたりヘボ...)キャンセルはもちろんのこと、一時停止とかしてそれっぽく見せたいなぁという妄想中です。まだまだってとこですか。スレッド化自体は辞書ファイル読込関数を先にやってますので、今日あたりできないかと思ったり、すでに後20分で明日と気付いてみたり。

「...してみたり」「...思ったり」「...というか...」「...したりして...」...が多過ぎて暗そうで阿保そうです。そういえば「のぞき屋」という漫画(たしか小学館のスピリッツだったかで連載していた探偵?漫画)で、オタク(死語?)が出てくる回で「...というか...」を連発させることで「オタク」であることを強調していたような気がします。...確かになぁ。まぁこのページあるいはこのサイトでの意図としては、"全く自信がねぇ。とりあえず動くし。"という程度の意味です。

2004/01/18

もはやタイトルを無視してますが...とりあえずダウンロードと辞書ファイル読込のスレッド化が完了しました。途中キャンセル・一時停止・読み込み速度表示・経過時間表示・残り想定時間表示・読込バイト数表示・対象のファイルサイズ取得/表示をやります。キャンセルとか一時停止があるので(というよりもややこしくないようにが主な理由ですが)モーダルなフォームを同時に表示しています。で、このフォームの格好がもう一つ悪いのと、読み込み中に結構頻繁に前述の情報を書き換えているので表示用のTLabelがちらついてちらついてどうにもこうにも。

でもまあ、これで検索機能に行ってみる気になっています。

2004/01/18

Shift-JIS変換済みファイルを用意せずにやってみたところ、古い方の適当な方のプログラムに比べて検索結果の表示がぎこちないことに気付きました。方法はすでに書いたとおりですが、具体的には桜島子宮よりダウンロードした"JEuc"というユニットファイルに含まれるShift-JIS<->EUC変換関数を使わせていただいて、検索語をEUCに変換して、EUC辞書ファイルをTStringListに読み込んだものと1行ずつ比較していきます。で、ヒットすれば該当の行を、Shift-JISに変換してTMemoに表示するというものです。

それで最初に戻るんですが、ぎこちないんですね。変換処理が入るわけなので、当然といえば当然ともいえるのですが、気持ち悪いのは此処からで、変換済みの辞書ファイルを利用してEUC処理を一切除外してもやっぱりぎこちない。全く同じように比較しているにも関わらず。確かに最初はPos関数を使用していたので、旧プログラムと同様にAnsiContainsText(StrUtils.pas内)を使用するようにしたら少しだけ改善したのですが、体感速度が全然違う(旧プログラムの方がシャキシャキと動いているように感じる)。GetTickCountとかでそれぞれ何秒かかっているかをチェックしたわけではないのですが、何ででしょう。

まあ、とりあえずは周辺から行きますか。起動時の自動読込とかなかったらダウンロードしますかと聞くとか検索語履歴をとるとかクリップボード検索するとか、か。...でも何でこんなに違うんだろう。

2004/01/20

ということでとりあえずここまでをアップロードすることにしました。サイズが大きいのですが実行ファイルとソースを全てこめています。もちろんソースはDelphi6 Personalでコンパイルできます(のはずです。ちなみにDelphiにはアップデータを全て適用しています)。

20040113EdictScanner.zip(301,199bytes)※ソースコードと実行ファイルです。

EXEを起動すると、「辞書ファイルがないのでダウンロードしますか?」と聞くようにしています。でインターネットにつながっている場合は(開発環境ではADSLで常時接続なので他のことは分かりません)「はい」を押してもらったら微妙な間隔で更新されるプログレスバーとかのそれっぽい情報が表示されながらダウンロードします。もちろんEdictサイトがいなくなってたらごめんなさい。
で、「解凍とかやったりしてくださいね」というメッセージが表示された後に「Hi!」というメッセージが表示され、自分でもびっくりしたのですが、これは「辞書ファイルがねぇよ」ということを意味しているような気がしています。当然ダウンロード直後は解凍なんてしているわけがないのにも関わらず...じゃなくてソースを確認したら、ダウンロード後にプログラムのあるフォルダ=圧縮辞書ファイルを保存したフォルダを開こうとしてShellExecuteのラッパー関数を呼んでいるのですが、その関数内で例外が発生しているみたいです。まあアレです。置いときます。

シンプルに行こうとしたのに結局7個もpasファイルを使うことになってしまって心苦しいですが、飽きてしまいそうなのでこの辺でアップロードしておこうかと考えたわけです。

基本的な使い方は辞書ファイルを読み込んだ後、ComboBoxに語句を入れてリターンキーを押すと検索結果を表示するというものです。起動時に辞書ファイルを読み込みますが、ダウンロードした回は当然起動時に読み込んでませんので、メニューから「LOAD」を選択して手動で読み込んでください。

今日つけた機能は、iniファイルにいろいろと保存したり、検索結果を表示しているTMemoで適当な文字列を選択してリターンキーを押すと選択している文字列を検索語として扱ったり、同じくTMemoで何も選択せずにリターンキーを押すと付近の単語を検索語として扱ったり、そんなとこです。

(まだまだ続きます...かも)

EOFTOP