-
Notifications
You must be signed in to change notification settings - Fork 163
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
メールアドレスの色替え判定を高速化すると同時にRFCに準拠させる #421
メールアドレスの色替え判定を高速化すると同時にRFCに準拠させる #421
Conversation
しました。が、元ファイルが単独ではビルドできないファイルなので、 |
|
該当部分を別ファイルに移動して単独でコンパイルできるようにして対応できないですか? |
↑ 訂正 |
おお、取消線が! あざっす> @beru さん
了解です。やってみます。 |
2bd80f2
to
0bd7882
Compare
変更をpushできたっぽいです 😄 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
処理速度がかなり改善されているので問題ないと思います。
あざーっす。 |
いちおうappveyorのビルド待ち・・・ |
/* 現在位置がメールアドレスならば、NULL以外と、その長さを返す | ||
@date 2016.04.27 記号類を許可 | ||
*/ | ||
BOOL IsMailAddress_20160427( const wchar_t* pszBuf, int nBufLen, int* pnAddressLenfth ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
旧コードを単体テストコード内の別ファイルに移動できないですか?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
技術的に不可能ではありませんが、
依存関係をだましだまし組み込んだものなのでバランスを崩したくない感じです。
何故別ファイルに分ける発想になったか教えていただけますか?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
単純に読みやすさのためです。
でも難しければ、別 PR でもかまいません。
// このテストファイルローカルのテストモード切替フラグ | ||
// 0 で新旧比較モード | ||
// 1 で新の検証モード | ||
#if 0 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
コメントわかりにくないですか?
#if 0
→ #if 1
にすると 新旧比較モードになって
#if 0
のままにすると新の検証モードになります。
#if MODE_ISMAILADDRESS
とかして上記の説明ならわかるのですが。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
今後の検討課題としたいです。
当初これを書いたときは #if 0
のテストはある程度時間が過ぎたら削除してしまうつもりでいたので、「現新比較と新規分の検証さえできればいいや」でテキトーに書いてました。旧関数取込部分で指摘されている通り「ファイルを分けて永久保存」のが自然だと思うので、ファイルを分ける作業のときに分岐条件と説明を書きなおそうと考えています。
TEST20180909(TRUE, szTest, ::wcslen(szTest), NULL); | ||
} | ||
|
||
// 動作変更あり。新実装では条件を厳しくして高速化している |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
動作変更あり
というのは、変更前後で結果が異なることを意味していますか?
その場合は TEST20180909
を使わずに、結果が違うことを前提にしたチェックに
したほうがよくないですか?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
↑ を適用して、古いバージョンも新しいバージョンも常に実行できるようにしたほうがいいと思います。実行時間的には大したことないからです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
了解。競合があるかもなので未確定ですがこんな感じを考えています。
MY_ASSERT_SAME(expected, szTarget, cchTarget, pchMatchedLen); // 結果変わらない
MY_ASSERT_CHANGE(expected, szTarget, cchTarget, pchMatchedLen); // 結果変わる
sakura_core/util/string_ex.cpp
Outdated
const ptrdiff_t MAX_DOMAIN = 63; | ||
|
||
// 関数仕様 | ||
assert(pszAtmark + 1 < pszEnd); // @位置と終了位置は逆転してはならない |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
a@[EOF]
という2文字のテキストが引っかかります。リリース版では a@
部分がリンクになりました。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ひー。結局当たりだったので対応しました。
PRへのレビューでは無いですがこんなページを見つけました。 |
雑な日本語訳でいっとき話題になった記事ではないですか? 「99.99%マッチする」と書いてしまったために、100%のメールアドレスにマッチするパターンなんて簡単に作れるぜ、という反応を釣ってしまったという。(雑談失礼) 99.99% のレベルは損益分岐点を割り込んでいる気がします。そのくせケータイメールの一部の逸脱したアドレスにはマッチせず、現実の利益を失います。 |
もうひとつ気がついた点です。RFCによる文字数上限を、処理量の上限を定めて打ち切るためではなく、RFCに準拠しているかどうかという判断にのみ使用しているように読めました(見落としでなければ)。 これは faster_ismailaddress.txt では、上限より1文字だけ長いメールアドレス(候補)をいったんメールアドレスとして受け入れられるようにしておき、あとで非メールアドレスとして弾いていました。 とはいえ PR 版の判定関数がボトルネックになるという事実は確認できませんでした。 |
別件扱いで検討しときたい感じの話題がいくつか出てるので、マージはissue立ててからにしようと思います。 |
assert に引っかかる件( #421 (review) )はただのコメントではなく修正要求にすべきでした。マージの前に対応をお願いします> @berryzplus さん |
いま作業中で「え?」と思ったトコです。 想定では |
原因確認して対応します。 |
|
||
// テスト対象関数があるcppファイルを埋め込みで取り込む | ||
// 他ファイルで同じファイルを取り込んではいけない | ||
#include "util/string_ex.cpp" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
このインクルードの代わりに CMakeLists.txt に追加で対応できないですか?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
util/string_ex.cpp
をテストするための exe を作る、という対応であればそのほうがincludeより簡単です。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ちなみに include で対応しようとして苦戦中w
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
util/string_ex.cpp をテストするための exe を作る、という対応であればそのほうがincludeより簡単です。
util/string_ex.cpp、というか debug/debug2.cpp に激しい依存関係があるのをすっかり忘れておりました。cppファイルを単独でcmakeプロジェクトに追加してビルドしようとすると未定義の独自型のせいでエラーになります。あと、windows.hを普通にインクルードするとstd::minが使えなくて、それもエラーになってしまいます。
そうした方がいいのは指摘の通りなのでいつかそうしたいです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
あと、windows.hを普通にインクルードするとstd::minが使えなくて、それもエラーになってしまいます。
これは
#define NOMINMAX
#include <Windows.h>
こうすると回避できます。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
プロジェクト設定でdefineしてしまう、という手も・・・
sakura_coreはこの方式です。
makeが吐くコマンドラインが長くなるのでできるだけ回避したいです。
ここは少しずつ改善していける部分だと思っています。
いまは一旦includeによる間接取り込みを推したい感じです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
AppVeyor がうまく動いてませんが多分問題無いと思うので Merge してしまいます。 |
constexpr ptrdiff_t MIN_TLD = 2; | ||
|
||
// ドメインの最小文字数 | ||
constexpr ptrdiff_t MIN_DOMAIN = 3; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ccTLDの最小文字数とドメインの最小文字数は関数内定数にせずにファイル内定数にして、
https://github.com/sakura-editor/sakura/pull/421/files#diff-df29b4c2306b128b12d04d40f62ad60bR1052
のように 6 を即値で書かないで、式で作ると値を統一出来て良かったかもしれないですね。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@
以降の判定をもう少し簡略化したいなーと思っています。
「文字列がFQDNかどうか?」を終端で抜けるとき1回だけ調べるようにして、
その部分をIsURLと共有化できないかな、と。
あざーっす! 累積残課題が結構あるんですが、これで遅延問題は解決できたと思ってます。 |
終わったことですが、疑問点はつぶしておきたい性分です。
その構文規則は読んでいましたが、 dot-string は「ドット区切りの 3桁8進数」の定義ではなさそうです。quoted-string 以外のすべての local-part が dot-string なのだから、通常見かけるメールアドレスのローカル部が dot-string であるはずなのです。 |
|
コードのコメントとずれてますが、正しい判定結果だと思います。 |
後ろが[EOF]である場合にだけ起こるバグ(判定ミス)だと思います。 もうひとつ、 |
そういわれると正直あやしいので、解釈の流れを説明してみます。 まず、メールアドレスのBNFがこれです。
C言語の世界ならば 8進数 は 077 のように書くのが普通だと思います。 何故「1 始まりの任意のテキスト」と解釈したかというと、
ここで「1 始まりの任意のテキスト」に何か特定の意味を当てはめようとしてみます。 一番肝心な部分が「想像だった」ってオチなんですけどね。 |
これはバグですね。次リリースまでには直すべきものと認識しました。 |
と定義されています。「ドット区切りの 3桁8進数」ではありません。 |
ありがとうございます。 |
This reverts commit fb81a39555d486d801eeb3488f0f37d795a0d350.
#792 で revert された。 |
…_mailaddress_check メールアドレスの色替え判定を高速化すると同時にRFCに準拠させる
This reverts commit fb81a39555d486d801eeb3488f0f37d795a0d350.
#398 の対策 PR です。
高速化とRFCへの対応を済ませたバージョンができたのでとりあえず上げときます。
まだちゃんとテストができてない状態です
が、たぶんもう変わらないと思います。テストまで完了したので WIP 外します。
実行速度とRFC5321準拠に気を遣った結果、いくつかの点で挙動を変えています。
どのように変更があったかは単体テストに記載しています。