ACFinder 120519test版

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 | 投稿日時 2012.05.19 22:32
kabe  長老   投稿数: 231
フルパッケージテスト版を公開しました、
http://acfinder.kabe.info/

プリキシ認証機能を付けていますが、まだ機能しているかどうかは未確認です。

SQLエディタの -- 行コメントの色分けのみ付けてみました。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012.05.20 16:09
OhYeah!  管理人   投稿数: 983 オンライン
引用:SQLエディタの -- 行コメントの色分けのみ付けてみました。-- を削除しても、文字色が緑色のままになってしまいます。また、-- がある行は、改行マークが表示されなくなり、-- を削除しても改行マークが消えたままです。

あと、SQLite キーワードの太字チェックについては、ACFinder 再起動後でも ini ファイルの設定内容が優先されることを確認しました。これで、毎回太字チェックを外す必要がなくなりました。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2012.05.21 20:29
kabe  長老   投稿数: 231
プロキシ認証については、機能していないという報告をいただいています。

PC内にプロキシ認証の環境って作れるんだろうか。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2012.05.21 20:59
kabe  長老   投稿数: 231
作物名選択時に以下の不具合が発生します。
多分前から同じだったと思いますが、本日発見しました。

作物タブ、作物名の入力ボックスで 豆類(未成熟
と最後のカッコを削除して検索

その後、作物名選択ダイアログで上位分類含むでツリービューを選択(例えば未成熟そらまめを選択)した後、追加、置換をしないで「閉じる」ボタンを押すと

TperlRegEx.Compile() - Error in regex at offset 70:missing )
というエラーが出る。
この後は、再起動しない限り どんな検索をしてもSQL エラーが出る。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2012.05.21 23:29 | 最終変更
OhYeah!  管理人   投稿数: 983 オンライン
う~ん、だめですか…。Windows のインターネットオプションで一時的に Proxy を使わない設定にして試してもらい、Proxy を経由しなくても外に出られるようなら、InternetOpen の dwAccessType を INTERNET_OPEN_TYPE_DIRECT にして実行するというのが一番手っ取り早そうです。Proxy を経由しない限り外に出られないなら、ちょっとお手上げかも

>PC内にプロキシ認証の環境って作れるんだろうか。
PCが2台あるなら、1台に squid か delegate あたりを認証付きで起動しておいて、もう1台は squid/delegate が立ち上がっている PC を経由してインターネットに接続するようにするってのが、一番簡単な確認方法だと思います。
PC が1台の場合は、VirtualBOX を使っても難しそう…。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2012.05.24 13:21
OhYeah!  管理人   投稿数: 983 オンライン
いろいろと確認してみましたが、'なす(露地栽培' とか 'きゅうり(しせつさいばい' のように最後の ')' を省略した場合のみ発生して、'なす(ろじ' とか '豆類(未' のように ')' の前の文字も含めて省略した場合はなぜか OK なんですね。閉じ括弧が見つからないってんなら、どちらも同じだろうに…。

しかも、作物選択ダイアログボックスで「上位分類含む」のチェックを外したときは OK てことは、上位分類含むのチェックの有無で処理が異なる部分に注目すれば、原因が見えてきそうです。特に、TPerlRegEx 周りの使い方に違いがあるでしょうか?
それと、'missing )' エラーが、作物選択ダイアログボックス終了時に発生しているのか、ダイアログボックス終了後(テキストボックスの文字列を処理するとき)に発生しているのか、ご確認ください。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2012.05.24 15:25 | 最終変更
OhYeah!  管理人   投稿数: 983 オンライン
とりあえず、対症療法としては、検索語の前処理で「なす(露地栽培」なんかも含めて正規化してしまうという手もありますね。php だと、下記のようになります。「露地なす」のように「未成熟豆類」でも検索可能になります。この正規表現だと、極端に省略したばあいは、「未豆」「まめみ」なんかでも OK です。
ACFinder の前処理だと、置換文字列側の () を \ でエスケープしない方が良いのかな?

  $str = preg_replace('/([^\(]*)?\(?((露地|ろし)(栽培|さいはい)?)\)?(.*)?/', '\1\5\(ろしさいはい\)', $str);
  $str = preg_replace('/([^\(]*)?\(?((施設|しせつ)(栽培|さいはい)?)\)?(.*)?/', '\1\5\(しせつさいはい\)', $str);
  $str = preg_replace('/([^\(]*)?\(?((水耕|すいこう)(栽培|さいはい)?)\)?(.*)?/', '\1\5\(すいこうさいはい\)', $str);
  $str = preg_replace('/(未|み)(成熟|せいじゅく)?(豆|まめ)(類|るい)?/', 'まめるい\(みせいじゅく\)', $str);
  $str = preg_replace('/(豆|まめ)(類|るい)?\(?(未|み)(成熟|せいじゅく)?\)?/', 'まめるい\(みせいじゅく\)', $str);
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2012.05.28 14:32 | 最終変更
OhYeah!  管理人   投稿数: 983 オンライン
引用:しかも、作物選択ダイアログボックスで「上位分類含む」のチェックを外したときは OK てことは、上位分類含むのチェックの有無で処理が異なる部分に注目すれば、原因が見えてきそうです。特に、TPerlRegEx 周りの使い方に違いがあるでしょうか?Log に見える範囲では、上位分類含むのチェックの有無による違いはなさそうなので、Log に出ない部分で何か違うのかな?
それはそれとして、テキストボックス直接入力と、ダイアログボックス選択では、展開される正規表現が異なるんですね。テキストボックス直接入力だと前方一致検索用に展開され、'(' も '\(' とエスケープされます。が、ダイアログボックスを経由すると、追加も置換も無しで終了しても、完全一致用に展開され、NOT REGEXP の条件で '(未' の開き括弧がエスケープされていないため、閉じ括弧がひとつ足りません。
本来なら、ダイアログボックスを経由して追加/置換無しで終了した場合、上位分類含むのチェック状態や最後の ')' だけが省略されたかどうかに拘わらず、閉じ括弧がないエラーにならないとおかしいといえます。少なくとも、2 のケースで、 NOT REGEXP の条件を '\((.*、)?(豆(類)?\(未)(、.*)?を除く' のように開き括弧をエスケープして展開するように修正する必要がありそうです。

1.「豆類(未」とテキストボックスに直接入力した時の作物検索
SELECT sakumotsu FROM m_sakumotsu WHERE  concat('、', sakumotsu, betsumei) REGEXP '(^|、|\()(豆(類)?\(未).*?(\)|、|$)' AND concat('、', sakumotsu, betsumei) NOT REGEXP '\((.*、)?(豆(類)?\(未)(、.*)?を除く'


2. テキストボックスが上記の状態でダイアログボックスを開き、追加/置換なしで終了した時の作物検索
SELECT sakumotsu FROM m_sakumotsu WHERE  concat('、', sakumotsu, betsumei) REGEXP '(^|、|\()(豆(類)?\(?未)([\(\)]|、|$)' AND concat('、', sakumotsu, betsumei) NOT REGEXP '\((.*、)?(豆(類)?(未)(、.*)?を除く'


また、1 のケースでは、NOT REGEXP の条件が '\((.*、)?(豆(類)?\(未)(、.*)?を除く' のため、「野菜類(豆類(未成熟)を除く)」を拾ってしまいます。最初の REGEXP の条件のように、検索語の末尾に '.*?' をつけて「'\((.*、)?(豆(類)?\(未).*?(、.*)?を除く」と展開する必要があります。さらに、今のままでは検索語が「豆類(未成熟)」の時に「豆類(未成熟、ただし○○を除く)」が拾えないので、下記のように REGEXP, NOT REGEXP いずれも閉じ括弧を「(\)|、)」または「\(?」と展開する必要があります。後者の方が汎用性が高いですね。開き括弧も「\(?」と '?' 付きに展開した方が良さそうです。
SELECT sakumotsu FROM m_sakumotsu WHERE  concat('、', sakumotsu, betsumei) REGEXP '(^|、|\()(豆(類)?\(?未成熟\)?).*?(\)|、|$)' AND concat('、', sakumotsu, betsumei) NOT REGEXP '\((.*、)?(豆(類)?\(?未成熟\)?).*?(、.*)?を除く'
これで、豆類(未成熟)は問題なく検索できるようになりますが、もしかすると他の検索パターンで副作用が出るかもしれません。とりあえず、AcfUtil の作物名→正規表現展開ルーチンを修正してみてください。

本題ですが、作物選択ダイアログボックスを追加/置換せずに閉じた場合、再検索をしないというのが一番良い解決策だと思います。あと、「豆類(未」のように不完全な作物名を手入力した後にダイアログボックスから追加する可能性を考慮すると、追加の場合は手入力時と同じ前方一致用の正規表現に展開する必要がありそうです。これまた、他の検索パターンで副作用が発生する可能性を否定できませんが…。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2012.05.28 16:21 | 最終変更
OhYeah!  管理人   投稿数: 983 オンライン
ちょっと分かりにくいので、整理すると下記のようになります。これで、もしかしたら何か副作用が発生するかもしれませんが、閉じ括弧が見つからないエラーは発生しなくなり、「豆類(未成熟)」と手入力した場合の検索漏れもなくなります。

1. 前方一致/完全一致いずれの場合も、また検索条件/検索除外条件に拘わらず、検索文字列中の '(', ')', '[', ']' はそれぞれ '\(?', '\)?', '\[?', '\]?' に常に変換する。

2. 前方一致の場合、検索除外条件も '\((.*、)?(検索語).*?(、.*)?を除く' のように検索語の後ろに '.*?' を追加する。

3. ダイアログボックスで置換がクリックされた場合は完全一致の検索条件、置換が一度もクリックされなかった場合は、前方一致の検索条件に変換する。

なお、1 の処理については、検索語を検索条件用正規表現に変換する部分に処理ルーチンがあるはずなので、それを前処理部分に移動すれば OK だと思います。「類」を「(類)?」に変換するのルーチンは後処理部分に入っているはずですが、もし前処理で変換している場合は、類を変換する前に '()[]' を変換するようにしてください。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012.05.28 18:00 | 最終変更
OhYeah!  管理人   投稿数: 983 オンライン
Proxy 認証は、InternetOpenUrl をコールする際に、lpszHeaders パラメータに 'Proxy-Authorization' ヘッダを指定すれば良いようです。
パラメータで渡した文字列を BASE64 エンコードする関数 Base64Encode という関数があったとすると、下記のような感じになります。認証方法は、本来 'Proxy-Authenticate' レスポンスヘッダを参照して決定しますが、とりあえずは BASIC 認証決め撃ちでも良いかと…。BASE64 エンコードは、Win API の CryptBinaryToString を使用するか、Delphi 用に公開されている関数を探してください。

var header: string;
header = 'Proxy-Authorization: Basic ' + Base64Encode(ProxyUsername + ':' + ProxyPassword);
service = InternetOpenUrl(session, PChar(url), PCchar(header), DWORD(-1), .....)
投票数:0 平均点:0.00

なし Re: ACFinder 120519test版

msg# 1.3.1.2.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012.05.28 23:28
OhYeah!  管理人   投稿数: 983 オンライン
引用:1. 前方一致/完全一致いずれの場合も、また検索条件/検索除外条件に拘わらず、検索文字列中の '(', ')', '[', ']' はそれぞれ '\(?', '\)?', '\[?', '\]?' に常に変換する。あれ? 私の手元の AcfUtil だと、この変換を行うようになっている…。でも、定型処理タブで確認すると、'\' でエスケープするだけで '?' は付かないですね。また、定型処理タブでは除外条件の括弧がエスケープされていますが、作物タブでは除外条件の括弧がエスケープされないので、作物タブの除外条件では CsvToRegexp 関数を使用していないということなのかな?
投票数:0 平均点:0.00

なし 検索語の前処理

msg# 1.3.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2012.05.29 09:31
OhYeah!  管理人   投稿数: 983 オンライン
「ろじなす」は検索できるけど、「露地なす」は検索できないです。前処理の段階で、漢字も使用可能にしていただけるとありがたいです。
それと、「ろじなす,なす」のように入力すると、「ろじなす」が「なす(ろしさいはい)」に変換されないようです。',' で区切られている場合を想定した前処理が必要ですね。
投票数:0 平均点:0.00

なし Re: 検索語の前処理

msg# 1.3.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012.05.29 18:20 | 最終変更
OhYeah!  管理人   投稿数: 983 オンライン
前処理は、PHP で書くと、下記のようにすればいいかな。
  $str = str_replace('しかまき', 'ちよくは', $str);
  $str = str_replace('ちかまき', 'ちよくは', $str);
  $str = str_replace('おおつふ', 'たいりゆう', $str);
  $str = str_replace('こつふ', 'しようりゆう', $str);
  $str = str_replace('かつか', 'かくか', $str);
  $str = preg_replace('/(?<!ら)たねなし|種無(し)?/', 'むかく', $str);
  $str = preg_replace('/たねあり|種有(り)?/', 'ゆうかく', $str);
  $str = str_replace('非結球', 'ひけつきゆう', $str);
  $str = str_replace('半結球', 'はんけつきゆう', $str);
  $str = str_replace('西洋', 'せいよう', $str);
  $str = str_replace('食用', 'しよくよう', $str);
  $str = str_replace('ろち', 'ろし', $str);
  $str = preg_replace('/([^\(\,]*)?\(?((露地|ろし)(栽培|さいはい)?)\)?([^\,]*)?/', '\1\5(ろしさいはい)', $str);
  $str = preg_replace('/([^\(\,]*)?\(?((施設|しせつ)(栽培|さいはい)?)\)?([^\,]*)?/', '\1\5(しせつさいはい)', $str);
  $str = preg_replace('/([^\(\,]*)?\(?((水耕|すいこう)(栽培|さいはい)?)\)?([^\,]*)?/', '\1\5(すいこうさいはい)', $str);
  $str = preg_replace('/(未|み)(成熟|せいしゆく)?(豆|まめ)(類|るい)?/', 'まめるい(みせいしゆく)', $str);
  $str = preg_replace('/(豆|まめ)(類|るい)?\(?(未|み)(成熟|せいしゆく)?\)?/', 'まめるい(みせいしゆく)', $str);
このあと、'()[]' をエスケープして、最後に短い文字列の処理(PHP で書くと下記の部分)をすれば、問題なくなるのではないかと…。
  switch ($str) {
    case 'とまと': return '(?<!に)とまと';
    case 'さくら': return 'さくら(?!そ|ん|す)';
    case 'いね': return '(?<!か)いね(?!か|科|こ)|すいとう|りくとう';
    case 'むき': return '(?<!と)むき';
    case 'きひ': return '(?<!う)きひ';
    case 'うめ': return '(?<!ゆ|よ)うめ';
    case 'かき': return '(?<!さ)かき(?!る)';
    case 'くり': return '(?<!す|み|つ|よ)くり(?!さ|ん|ふ)';
    case 'なし': return '(?<!る|ち|ね)なし';
    case 'もも': return '(?<!す|ま|い|ら)もも';
    case 'ゆす': return 'ゆす(?!き)';
    case 'うと': return '(?<!お|か|ふ|よ)うと(?!う)';
    case 'かふ': return '(?<!り|た|ね|や)かふ(?!た)';
    case 'ける': return '(?<!つ)ける';
    case 'せり': return '(?<!は|う)せり';
    case 'なす': return '(?<!た|な|ま|ひ)なす(?!な)';
    case 'ねき': return '(?<!ま|と)ねき';
    case 'はす': return 'はす(?!い|か|も)';
    case 'ふき': return '(?<!い|わ)ふき';
    case 'きく': return '(?<!ん|あ|う)きく(?!に|ち|な)';
    case 'はら': return '(?<!す)はら';
    case 'ゆり': return '(?<!ち)ゆり(?!の)';
    case 'らん': return '(?<!か|く|し|す|と|ま|ふ|ん|お)らん';
    case 'かし': return '(?<!め|ら)かし(?!す|つ|ゆ|よ|ら|ろ|わ)';
    case 'きり': return '(?<!つ)きり(?!え|は)';
    case 'すき': return '(?<!あ|お|み|ゆ)すき';
    case 'つけ': return '(?<!け|ぬ|め|き)つけ(?!も)';
    case 'ふう': return '(?<!う|ん)ふう(?!と)';
    case 'ふな': return '(?<!み)ふな';
    case 'まき': return 'まき(?!い|さ|ち|つ|な|ま|ろ|\(|\))';
    case 'まつ': return '(?<!か|そ|と|ら|ろ)まつ(?!し|な|は|も)';
    case 'やし': return '(?<!ち|ひ|ら)やし';
    case 'しは': return '(?<!ろ)しは(?!い)';
    case 'ちや': return '(?<!ほ|ん)ちや(?!い|ひ|と)';
    case 'こま': return '(?<!え)こま(?!つ)';
  }
投票数:0 平均点:0.00

  条件検索へ