アーカイブ

2006年 3月 9日 のアーカイブ

Alphaのサイトで主な機能を見たが、サッパリ理解できない。
我々のような底辺レベルの人間だと、使う前に頭から煙があがるぜ。
だからダウンロードしたことがなかったんだろうな。
でもちょっと興味を持ったことがある。
>ASCII 制御文字の代替表示
>メモ帳に似た [Unicode 制御文字の表示]
これ。制御文字。
たしかTEditorにも制御文字の色を決めるみたいなパラメーターがあったが、
結局何の色だかわからなかったっていう事が昔あったかも。

メモ帳では、右クリックメニューでUnicode制御文字の挿入ってあるんだけど、
それを挿入して、表示するって設定しても、表示されるのもされないのもあるような気も。
その記号の前の文字と後ろの文字は密着して表示され、グリフの幅は0って事だな。
真魚ではグリフの最低幅は2pixなので、等幅フォント指定してる時とかマズい事になるな。
なるほど、これをAlphaでは表示できるという事ね。

もう一つ、順番が逆になったがASCII制御文字。
バイナリエディタで、0x01から0x1Fまで並べてAlphaで表示してみたら、
^A^Bって感じだった。じゃぁ0x00は^@だな。
グリフがないよりはわかりやすい。
でも、Tahomaはこの部分のグリフがあるみたいだぞ。
EmEditorもこの部分はグリフを表示している。Tahomaかどうかは不明だが。
いや、Tahomaはいろんなフォントとリンクしてるので、グリフがTahomaのものかは知らないが。

真魚は、ユニコードのブロックごとにフォントを指定する事は将来も出来ないことにしたいから、
Alphaみたいに制御文字の代替表示をしようと思う。
そこだけTahomaでも良いんだけどね。

あ、気軽にパクるって書いてるけど出来れば訴えないでください。

4274201244
4274201244

落ちる話からは離れて、いったい今実装している正規表現の何が不満かという話。
あたしゃ正規表現自体普段使わないし詳しくないので、一口に正規表現と言っているが、
実際はどんな書き方が通るのかが、物によってもバージョンによっても違うらしい。
今使ってるTRegExprが、一般に正規表現と言われるものに比べて、
十分な実装がされているのかされていないのか、その判断すら難しいほど無知なんだが、
ウチにある正規表現について書かれた本を見ると、ここが違うなぁとか感じるわけ。
いや、本当に違っているのか、あたしの勘違いなのかすら判断出来ないレベルだけどね。
検索は良いんだけど置換がどうも違う気がするんだよね。

そこで、例によってEmEditorフリー版で動作を検証しようとしたら、
正規表現は検索には使えるけど置換には使えない模様。
「正規表現を使用する」ってオプションはあるのに、チェック入れてもヒットしない。
有料版のみの機能なのか、残念。
で、Alphaで動作検証してみてるんだが、「○○を××に置き換えますか?」が欲しい。
どこをどう置き換えていったのか、確認できなくて検証しにくい。
って、別に検証するために作られた物じゃないし、こんな話しても仕方ないが。

納得いかないのはbackreferencesについて。
TRegExprのヘルプには¥1~¥9で後方参照が出来ると書いてある。
例として、(.+)¥1+で123123にマッチできるんだと。
カッコでくくった部分にマッチした文字列を¥1で呼び出して繰り返せという指示だ。
ここまではちゃんと動作していて矛盾もない。
書籍によると、置換文字列にも¥1~¥9を入れることでカッコを示す事が出来るらしく、
Alphaでもそのように動くので、きっと標準的な動作だと思う。
だがTRegExprではこれが効かない。
かわりに、$0で全体を、$1~$9でカッコを指すことは出来る。
Alphaは$でも¥でも動く。
この辺の対応をしたい。

他にも置換文字列に入れた物がどう扱われるかはナゾが多く、
当初、¥nや¥tに置換しろと入れても改行やタブになってくれなくて、
この部分だけを自前で実装したりしたんだよね。

たぶん検索するだけなら機能は十分なライブラリだと思うが、
置換はよくわからない状態で作りかけなんじゃないかなぁって感じている。
ともかくその辺を直していこうかと。
検索を修正するのは意味わからないとつらいけど、置換文字列のパースぐらいは出来そう。
仕組みがわからなくても出来そうな修正のみで、正規表現はおしまいにしたいな。

B00030EVFM
B00030EVFM

さて、8000文字テストで落ちないエディタを三つあげたわけだが、
その三つとも、80000文字テストを乗り切ることは出来なかった。
EmEditorの限界は74483文字で、それ以上だと「見つかりませんでした」が出るか、
条件は不明だが「Too Big」とかなんとかっていうダイアログが出るかする。
落ちるよりはヒットしない方が全然マシ。
萌ディタは、80000文字の貼り付けが出来なかくて「がっかり」ダイアログ。
仕方ないので8000文字を10回貼り付けようとしたが、やはり9回目で「がっかり」。
どうやら、改行なしでもてる文字数の限界が6万くらいのようなので、
(8000文字+改行)*10にしてみたら「がっかり」なしで貼り付け出来た。
データ構造の問題で「がっかり」出たが、正規表現の方は問題ないみたいで、
改行を10回含んでいるにもかかわらず、テキスト全体セレクトに成功。
EmEditorは改行を1回までしか含む事が出来ないので、この方法では16000文字で停止。
GreenPadは8000文字*2を貼り付けて検索した時点では問題ないが、
8000文字*3を貼り付けて検索すると黙って落ちる。
正規表現に限界がある物も、テキストバッファに限界があるものも含めて、全滅した。

普通はここで秀丸も試すんだろうけど、アレは実質フリー見たいなものだけど、
一応、シェアウエアであり、何年も前に試用期間を終えているあたしが、
最新版を落としてインストールするってのもどうかと思うので試していない。

煮るなり焼くなり好きにする事にしたAlphaは、80000文字貼り付けたのに画面が出ない。
パッチ前はその後範囲選択もあやしい感じだったが、
パッチ後はパッチ前とはまた違って画面表示があやしい。
キャレットがどこにあるかもよくわからなくなっちゃうので、この方法は断念。
日記に書いてあるとおり、(5000文字+改行)*10で試し、正常に動作したが、
EmEditor同様、改行は1回しか挟めないようだ。
2行ヒットすることもあれば1行ヒットすることもある。
こちらの期待通りの動作をなかなかしないので、ウソを書くことになるかも知れないが、
Alphaも8000文字は乗りきるが、20000文字ぐらいで検索できなくなる。
黙って落ちるよりはだいぶマシ。

こんな状況なので、あやしいかも知れない強引なgotoで限界を超えても、
誰もそんな検索はしないって事で、無駄な処理よりスピードを重視した方がいい気もする。
やっちまったものを元に戻す気はないが、やらなくても誰も気にしないはず。

たしか、正規表現を高速化するとか思い通りに変更するとか言ってたよな。
落ちるのを直す話題を書くはずじゃなかったよな。

追記:
いつもなら致命的バグを修正したら急いでアップデートなんだが、
誰もやらないような事への対応と言うことと、gotoに自信がないということで、
今回は非公式アップデートのみということに。
落ちるとか落ちないとか、出来るとか出来ないとか検証したい人向けに。

B000A6ODWA
B000A6ODWA

最初は、ヘルプに遅いと書いてあるから速くできるんじゃないかとか、
まだ対応してない物を自前で対応できないかとか、
そういうつもりで正規表現ライブラリの中身を検証していたはずだったが、
途中からはアプリが落ちるか落ちないかの話題に変ってしまったな。

で、一応解決したよ。現在は、8000どころか80000文字でも落ちないようになった。
もちろん、32bitを超える数字のケアはしてないので、そこであふれるだろうが。
32bit以上のケアしないことがもちろんかどうかは知らないが、
どうせそれ以上のファイルを扱おうとしても激遅で使い物にならないから別にいい。
正規表現だって、そんな数千文字にヒットさせなきゃ落ちないわけで、
今回行った対応が必要かどうかは疑問が大いにある。
真魚はコッソリと、使い方すら書かずに正規表現を実装しているわけだが、
ものによっては正規表現でいろんな事が出来ることがウリになってるものだってあり、
そういったエディタでも落ちるライブラリを使い続けているということは、
こんな正規表現の使い方をする人はいないから対応しなくていいって事じゃないかと。
そんな言い訳を考える前に夜更かしして修正できたが。

今回やったのは、TRegExprのMatchPrimメソッドが再帰で処理をしている場所で、
メソッド内で使う変数を全て自前のスタックに入れてgotoで先頭に行かせるというもの。
gotoを使うことに抵抗はないので、ここはこれで大丈夫だが、
ちょっと問題あるかも知れないのが、用意したスタックを復帰する部分。
スタックから取り出したブツには、どこからgotoしたかの情報も入っていて、
whileやcaseが深く入り組んだ中にgotoで戻る。
ちょっと古いバージョンのDelphiについてきた言語ガイドにも、
gotoは脱出用であり、ループの中に入るために使うとヤバい可能性があると書いてある。
でもこれ以外やり方が思い浮かばないし、実際に80000文字大丈夫になったし。
本当は再帰より効率的なやり方でまるっきり変更すべきなんだろうけど、
再帰と全く同じ事をあふれにくいスタックでやらせただけにしてしまった。
Delphiのコード自体は読めるが、正規表現の仕組みがわからないんだから、
解決法もこれしかないじゃんって感じ。

ところで、AlphaのXXXX(読めません)な日記からリファラがたくさんついている。
k2topよりさらに多くの人が来てて、ログがどんどん流れちゃっている。
名前は知ってるがダウンロードしたこともないエディタで、マイナーだと思ってたが、
リファラの数だけみるとk2以上のユーザーがいるのかも知れない。
煮るなり焼くなり好きにしてみるか。

B000ARCKN8
B000ARCKN8