本家の最新の鬼車の秀丸エディタからの利No.39752
fzok4234 さん 22/05/21 14:29
 
いつもお世話になっております。fzok4234 です。


さて、秀丸エディタの正規表現エンジンとして、K.Kosako 氏の本家本元の 鬼車
  https://github.com/kkos/oniguruma
の最新版 6.9.8 を試してみたいのですが、どうすれば使用可能になるのかが分から
ず困っています。

一応、Visual Studio Tool 2019 を使用して make_win64.bat から x64 版の onig.d
ll をビルドすることは
できるのですが、その API は
  https://github.com/kkos/oniguruma/blob/master/doc/API
で示されているように HmJre.dll とは全く互換性がないため、そのままでは秀丸エ
ディタの正規表現 DLL としては
使用できません。また、ネット上をくまなく検索しても、onig.dll を秀丸エディタ
で使用するための
ラッパー DLL などは見当たりませんでした。

当方では現在、主に標準添付の HmJre.dll と h-tom 氏による 鬼雲 の実装である h
monig.dll を使用して
います。HmJre.dll は前方参照 (?<=) / (?<!) に * や + などの可変長パターンが
使用可能である利点が
ある一方で、\p{Lu} や \p{Han} などといった Unicode クラスの指定や、(?>) や *
+ などのアトミックグループによる
無駄なバックトラック防止策が無いなど機能的に貧弱な面があります。一方、hmonig.
dll のベースである
鬼雲 は Unicode クラス指定やアトミックグループ、高速な部分式呼び出しも備えて
いるが、最終更新の
6.2.0 から 3 年間の間全く更新が無く、最近の 鬼車 で実装された前方参照の可変
長パターン
  https://github.com/kkos/oniguruma/blob/master/doc/SYNTAX.md#11-onig_syn_variable_len_look_behind-a
も未だ実装されておらず、また、
  https://www.maruo.co.jp/hidesoft/2/x39708_.html#39708
および
  https://www.maruo.co.jp/hidesoft/2/x39719_.html#39719
で取り上げたようなエラーやフリーズを伴う不具合も存在します。

そのような事情から、現在活発に更新が行われて 3 週間前に 6.9.8 としてリリース
されたばかりの本家 鬼車 を
秀丸エディタの正規表現エンジンとして使用してみたいと思った次第でございます。
onig.dll を秀丸エディタから
正規表現 DLL として使用する具体的な手順をご教示いただければ幸いです。どうか
よろしくお願いします。




[ ]
RE:39752 本家の最新の鬼車の秀丸エディタNo.39753
h-tom さん 22/05/21 21:33
 
h-tom です。

>秀丸エディタの正規表現エンジンとして使用してみたいと思った次第でございます。
>onig.dll を秀丸エディタから
>正規表現 DLL として使用する具体的な手順をご教示いただければ幸いです。どうか
>よろしくお願いします。
一体何がわからないのかわかりませんが、jre の SDK もあなたの要望でダウンロー
ドできるようになっているので、
SDK と公開されている情報からラッパーDLL作って、onig.dll を呼び出すだけですよ。

[ ]
RE:39753 本家の最新の鬼車の秀丸エディタNo.39754
fzok4234 さん 22/05/22 00:09
 
回答ありがとうございます。


> 一体何がわからないのかわかりませんが、jre の SDK もあなたの要望でダウン
>ロードできるようになっているので、
> SDK と公開されている情報からラッパーDLL作って、onig.dll を呼び出すだけです
>よ。

実際に秀丸エディタが HmJre.dll 互換 API をどのように呼び出しているのか分から
ない点がございます。


まず、秀丸エディタが DLL に渡す文字列値のエンコードについてですが、これは UT
F-16LE とかの固定の
Unicode ベースのエンコードになっているのか、ということです。つまり、秀丸エデ
ィタは DLL の
  BOOL WINAPI Jre2SetCodePage( LPJRE2 pJre , UINT cp ) ;
を最初に呼び出す際、cp には専ら 1200 とかを指定して、検索パターンの指定時の
  BOOL WINAPI Jre2Compile( LPJRE2 lpjre , LPSTR lpszRe ) ;
でのパターン文字列値 lpszRe や、検索実行時の
  BOOL WINAPI Jre2GetMatchInfo( LPJRE2 lpjre , LPSTR lpszStr ) ;
または
  BOOL WINAPI Jre2GetMatchInfo_HmJre( LPJRE2 lpjre , LPSTR lpszStr , int xEn
d ) ;
での検索対象文字列値 lpszStr には UTF-16LE にエンコードしたバイトシーケンス
の先頭ポインターを渡すのか、
またその場合 BOM は必要なのか、ということです。

これがもし、
  http://htom.in.coocan.jp/macro/macro_dll.html#N4.6

  https://help.maruo.co.jp/hmjre/html/0008_API_MACRO.html#about_unicode
に出てくる、Shift-JIS を拡張した「秀丸独自コード」であった場合には、これを o
nig.dll などで受け取れる
UTF-8 などの「真正」の Unicode バイトシーケンスに変換する手段がどこにも見当
たらないため、完全にお手上げと
なってしまいます。

Shift-JIS などの各国語にローカライズされた「レガシーコード」が DLL に渡され
る可能性を排除できるのか、
ということも、ラッパー DLL に iconv などの文字コードコンバーターを実装する必
要があるのかどうかを
判断するうえで重要となってきます。


次に、HmJre.dll 互換 API の内、秀丸エディタから正規表現 DLL として使うために
必ず実装しなければ
ならないものと、必ずしも実装する必要のないものはそれぞれどれか、ということで
す。

例えば、検索実行の関数には、
  BOOL WINAPI Jre2GetMatchInfo( LPJRE2 lpjre , LPSTR lpszStr ) ;
  BOOL WINAPI Jre2GetMatchInfo_HmJre( LPJRE2 lpjre , LPSTR lpszStr , int xEn
d ) ;
  BOOL WINAPI Jre2GetMatchInfo_V318( LPJRE2 lpjre , LPSTR lpszStr , int xEnd
 , BOOL fWordFuzzyMatch , JREFUZZYDATA* pFuzzyData ) ;
  BOOL WINAPI Jre2GetMatchInfo_V500( LPJRE2 lpjre , LPSTR lpszStr , int xEnd
 , BOOL fWordFuzzyMatch , JREFUZZYDATA* pFuzzyData , int xEndHitable ) ;
の 4 つがあるが、あいまい検索を使わないときに秀丸エディタが正規表現 DLL とし
て必ず使用するのは
このうちどれか、ということです。

また、あいまい検索に非対応のラッパー DLL には
  BOOL WINAPI Fuzzy_Open( JREFUZZYDATA* pFuzzyData , BOOL fDummy ) ;
などは一切実装しなくてもよいのか、ということも無駄な実装を避けるために重要で
す。


いずれも、完成品としての HmJre.dll や hmonig.dll の API リファレンスは公開さ
れているが、第三者が
互換 DLL を作成するのを支援することを目的とした、あくまで秀丸エディタ主体の
正規表現 DLL 呼び出しの
方法が公開されていないため、これらの不明点を申し上げた次第でございます。




[ ]
RE:39754 本家の最新の鬼車の秀丸エディタNo.39755
でるもんたいいじま さん 22/05/22 07:21
 
でるもんた・いいじまです。

うーむ。ここは初心者ユーザーさんも利用する hidemaru.2 なので、できればこうい
う内部構造の話は turukame.3 に移りたいところですが、往年の fj.* と違ってここ
には、スレッドの続きを別の会議室に引っ越す機能がありません。どうしたものか…

☆ ☆ ☆

というわけで、Unicodeがらみのところだけコメントします。

>   BOOL WINAPI Jre2Compile( LPJRE2 lpjre , LPSTR lpszRe ) ;
> でのパターン文字列値 lpszRe や、検索実行時の
>   BOOL WINAPI Jre2GetMatchInfo( LPJRE2 lpjre , LPSTR lpszStr ) ;
> または
>   BOOL WINAPI Jre2GetMatchInfo_HmJre( LPJRE2 lpjre , LPSTR lpszStr , int x
>End ) ;
> での検索対象文字列値 lpszStr には UTF-16LE にエンコードした
> バイトシーケンスの先頭ポインターを渡すのか、
> またその場合 BOM は必要なのか、

結論からいえば「最初に指定したコードページでのANSI文字列」のはずです。型名が
LPWSTRではなくLPSTRになっています。

当たり前の事実の再確認になりますが、手元のMinGW-w64だと、winnt.hに次のような
記述があります。
  typedef char CHAR;
  typedef wchar_t WCHAR;
  typedef WCHAR *NWPSTR,*LPWSTR,*PWSTR;
  typedef CHAR *NPSTR,*LPSTR,*PSTR;

#ついでに余談ですが、UTF-32用にこんな記述もありますね…初めて知りました。
#  #if _WIN32_WINNT >= 0x0600 || /* 略 */
#    /* 略 */
#    typedef unsigned long UCSCHAR;
#  #define UCSCHAR_INVALID_CHARACTER (0xffffffff)
#  #define MIN_UCSCHAR (0)
#  #define MAX_UCSCHAR (0x0010ffff)
#  /* 略 */
#  #endif

☆ ☆ ☆

で、こちらもご承知かと思いますが、さらに歴史的背景の確認を。
このAPIが最初に設計されたのはWindows3.1時代のjre.dllです。

その時代はまだUnicodeの方向性自体が揺れていた時期で、漢字統合(Han Unificati
on)反対論が世の中を席巻していたり、おとなり韓国が「ハングル大移動」を敢行し
たりで、Unicodeはとてもじゃないがまだ実用にならない、という時代でした。

そのあとWindowsNTがOSの内部コードとしてUTF16-LEを採用し、Windows95が32bitア
プリ用のAPIとしてNTのものをそのまま採用したことで一気にUTF-16への敷居が低く
なり、そして1996年にUnicodeの規格にサロゲートペアが盛り込まれたことでやっと
問題解決の光が見えてきた、という状況です。

そして最終的に、WindowsXP(2003年)からは一般家庭用のWindowsOSでも NantokaKa
ntokaW() というAPI群が気軽に使えるようになって現在に至ります。

☆ ☆ ☆

> これがもし、
>   http://htom.in.coocan.jp/macro/macro_dll.html#N4.6
>   https://help.maruo.co.jp/hmjre/html/0008_API_MACRO.html#about_unicode
> に出てくる、Shift-JIS を拡張した「秀丸独自コード」であった場合には、

残念ながらその通りであろうと予想します。

> これを onig.dll などで受け取れる UTF-8 などの「真正」の
> Unicode バイトシーケンスに変換する手段がどこにも見当たらない

サイトー企画さんとしては公式には非公開のままにする予定、というコメントが以前
 vscode-life さんとの対話中にありましたが、自作のDLLでちょっと実験してみれば
独自コードとUTF-16(もしかしたらUTF-32かも)との換算方法は解読可能です。

そのためにはまず、自作DLLから STARTUNIMACRO という関数を export します。
とりあえず turukame.3:10332 が良いまとめになっていますので、そこからスレッド
を遡ってみてください。

そのうえで、こんな関数を作ってみてください。

- - - - キリトリセン - - - -
#define MAX_INPUTLEN 10000 // テキトーに決め打ちでいい
static char result[MAX_INPUTLEN*3 + 1];

__dllspec(dllexport) __cdecl char* HexDumpA(unsigned char* pInput) {
 size_t len = strlen(pInput);
 if ( len > MAX_INPUTLEN ) {
  // 今時の言語ならcastせずとも %zu と %zX が使えるはずだけどね
  sprintf(result, "Error: too long (%llu = 0x%llX bytes).",
   (unsigned long long)len, (unsigned long long)len );
  return result;
 }

 // ----コード省略----
 // pInputの中身を適宜の方法で16進ダンプして、result[] に書き込む
 // ----/コード省略----
 return result;
}
- - - - キリトリセン - - - -

要は、秀丸マクロから
$s = dllfuncstr(#hMyDLL, "HexDumpA", "abc123");
のように呼び出したら $s に "61 62 63 31 32 33" のような文字列(私ならスペー
ス区切りにしますが、必ずしもそうしなくていいです)が返ってくるように HexDump
A() を実装してください。

それを踏まえて、

// $u="簡漢,ハングル,(青いハート)"
$u = unichar(0x7B80)+unichar(0x6C49)+','+unichar(0xD55C)+unichar(0xAE00)+','
+unichar(0x1F499);
$s = dllfuncstr(#hMyDLL, "HexDumpA", $u);
message "HexDumpA('" + $u + "') => '" + $s +'.";

のように色々と試してみてください。

> ラッパー DLL に iconv などの文字コードコンバーターを
> 実装する必要があるのかどうか

自前で実装する必要はありません。Jre2SetCodePage() でコードページの情報をクラ
イアントからもらっているので、秀丸独自エンコードの部分とコードページ準拠の部
分とに切り分けて、後者を MultiByteToWideChar() に渡すだけでUTF-16に変換でき
るはずです。
#というか、逆にMultiByteToWideChar() を使わないで
#迂闊に独自実装してしまうと、将来的にいろいろ
#爆弾を抱え込むことになりかねません。

さらにいうと、その後のUTF-8への変換すらも自前で用意する必要はなくて、WideCha
rToMultiByte() でコードページ65001に変換してやればそれで終わりのはずです。
#ただしこちらは、どこまで古いOSが対応しているのか未確認です。

> いずれも、完成品としての HmJre.dll や hmonig.dll の
> API リファレンスは公開されているが、第三者が
> 互換 DLL を作成するのを支援することを目的とした、
> あくまで秀丸エディタ主体の正規表現 DLL 呼び出しの
> 方法が公開されていないため、

確かにこれはその通りですが、これもサイトー企画さんとしては「将来に渡って永久
に仕様を縛ってしまうことになりかねないので、公認つきでの情報公開はしたくな
い」という見解だと思います。

なので、すべてのAPIを形だけでも実装するしかないと思います。とはいえ、「少な
くともAPIではあいまい検索指定の指示を受け付けない」と決め打ちするのであれば、
pythonか何かのスクリプトでダミーの関数を量産してもいいような気がしますが。

[ ]
RE:39754 本家の最新の鬼車の秀丸エディタNo.39756
h-tom さん 22/05/22 18:14
 
h-tom です。

>まず、秀丸エディタが DLL に渡す文字列値のエンコードについてですが、これは U
>TF-16LE とかの固定の
>Unicode ベースのエンコードになっているのか、ということです。つまり、秀丸エ
>ディタは DLL の
ログを検索すれば出てきますが、前に試したけどUTF-16LEではダメ。
https://log.maruo.co.jp/turukame/turukame_2/x0901584.html

文字列は全て LPSTR なので、Shift_JIS範囲外のUnicode文字を含む場合は、
> Shift-JIS を拡張した「秀丸独自コード」
になります。

>次に、HmJre.dll 互換 API の内、秀丸エディタから正規表現 DLL として使うため
>に必ず実装しなければ
>ならないものと、必ずしも実装する必要のないものはそれぞれどれか、ということ
>です。
最低限、jre32.dllと同じものがあれば動きます。
(バージョン1API や IsMatch、GlobalReplace は不要ですが)
・Jre2SetCodePage、JreGetTagPosition は追加しておいた方がいいでしょう。

今だと  BRegIf.dll の ソースが参考になるのでは。

[ ]
RE:39755 本家の最新の鬼車の秀丸エディタNo.39757
fzok4234 さん 22/05/23 00:14
 
> それを踏まえて、
>
> // $u="簡漢,ハングル,(青いハート)"
> $u = unichar(0x7B80)+unichar(0x6C49)+','+unichar(0xD55C)+unichar(0xAE00)+',
>'+unichar(0x1F499);
> $s = dllfuncstr(#hMyDLL, "HexDumpA", $u);
> message "HexDumpA('" + $u + "') => '" + $s +'.";
>
> のように色々と試してみてください。

どうやら「秀丸独自コード」に対するリバースエンジニアリングをユーザー自身で行
わないと
いけないようですね。十万個以上もある全ての Unicode 文字を 1 個ずつ調べるのは
相当時間と
労力を費やしそうでかなり大変な作業になるとみられます。

たとえ「秀丸独自コード」の解析が上手くいってその仕様を当方が把握できたとして
も、
サイトー企画さん自身が
  https://www.maruo.co.jp/turukame/3/x10318_.html#10330
にて
> 独自の方法は独自の計算を加えたもので、その方法は公開されていなくて、できた
>ら使って
> ほしくないです。
と述べていることから、実際にこれをラッパー DLL に実装して運用することには躊
躇いたします。

あるいは、全ての Unicode 文字の「秀丸独自コード」<=>「真正の Unicode コード
ポイント」の
対応表をハッシュテーブルとかでハードコードした場合も、ハッシュテーブルの検索
のオーバーヘッドが
全体の実行速度の低下を引き起こしそうです。そもそも、Unicode の規格自体が年々
アップデートして
いるため、それに伴うハードコード済みハッシュテーブルの更新とかも大きな作業負
担になるものと
みています。


> なので、すべてのAPIを形だけでも実装するしかないと思います。とはいえ、「少
>なくともAPIでは
> あいまい検索指定の指示を受け付けない」と決め打ちするのであれば、pythonか何
>かのスクリプトで
> ダミーの関数を量産してもいいような気がしますが。

あいまい検索の JREFUZZYDATA 構造体の中身についてですが、これは全て 0x00 で埋
めたダミーにして
構わないのでしょうか。例えば、
  BOOL WINAPI Fuzzy_Open( JREFUZZYDATA* pData , BOOL fDummy ) ;
を実装する際にはゼロ埋めしたダミーの pData を返してよいのか、あるいは
  BOOL WINAPI Fuzzy_ConvertFindString( JREFUZZYDATA* pData , const char* psz
Src , BOOL fRegular ) ;
などの本来の HmJre.dll なら pData に結果を書き込む関数は、pData に対して何の
処理も施さないような
ダミー実装にしてよいのかちょっとわからないです。

ラッパー DLL がネイティブコードである以上、秀丸エディタ本体の保護違反などの
原因になりうるため、
制作に対してかなり慎重になってしまいます。検索や強調表示を実行したら直ちに保
護違反となるような
明確な場合はともかく、後からバッファーオーバーフローなどで秀丸エディタ本体が
おかしくなってから
不具合に気づいたために原因の特定が困難になるような状態は避けたいです。このた
め、ダミー実装 1 つに
しても相当気を使います。




[ ]
RE:39756 本家の最新の鬼車の秀丸エディタNo.39758
fzok4234 さん 22/05/23 00:15
 
> ログを検索すれば出てきますが、前に試したけどUTF-16LEではダメ。
> https://log.maruo.co.jp/turukame/turukame_2/x0901584.html
>
> 文字列は全て LPSTR なので、Shift_JIS範囲外のUnicode文字を含む場合は、
> > Shift-JIS を拡張した「秀丸独自コード」
> になります。

やはり、懸案事項である非公開仕様の「秀丸独自コード」を正規表現 DLL に渡して
いることは事実の
ようですね。

サイトー企画さん側が「秀丸独自コード」の仕様を非公開にしてしまっているために、
当方のように
最新の 鬼車 のようなモダンな正規表現エンジンのラッパー DLL を作ることを始め、
第三者が現在の
秀丸エディタで使用できる「ちゃんと Unicode に対応した」正規表現 DLL の開発へ
の参入を大きく
妨げてしまっている状況だと思えます。現に、現在まともに「 Unicode 対応」で使
い物になる正規表現 DLL を
ネット上で検索しても、同梱の HmJre.dll と 貴殿の hmonig.dll 以外に全く見当た
らない状態です。

このようなことから、サイトー企画さん側が「秀丸独自コード」の仕様を非公開にす
る以上、ユーザーや
開発者が不利益を被ることが無いよう、ソースコード非公開で構わないのでサイトー
企画さん自身が
「秀丸独自コード」<=>「真正の Unicode コードポイント」の「相互変換関数」を、
hidemaru.exe 本体の
DLL 側からの呼び出し関数とかあるいは独立した別 DLL の形で、ちゃんと責任をも
って用意するべきで
あったのではないでしょうか。

もしサイトー企画さんが「秀丸独自コード」の仕様を公開する方針であったなら、わ
ざわざ変換関数を提供する
責任はないでしょう。しかし、仕様を非公開とするプロプライエタリな製品とすれば、
ユーザーがわざわざ
これをリバースエンジニアリングしたり、hmonig.dll のように開発者がソースコー
ドを非公開にせざるを
得なくなってしまいます。このため、サイトー企画さんは仕様がブラックボックスで
あるがゆえにユーザーなどに
もたらされるこのような不利益を最小限にする解決策を提供するある程度の責任と義
務を、多数のユーザーなどが
依存するベンダーとして負わなければいけないと思われますがどうでしょうか。

そしてこの変換関数はできるだけ早く提供されるとともに、
  ・なぜ「秀丸独自コード」の仕様を今まで非公開にし続けたのか ?
  ・なぜ変換関数を今まで提供しなかったのか ?
を「サイトー企画さん自身の手で」秀丸エディタのヘルプファイルなどにちゃんと説
明したほうがよいのではないかと
思う次第です。



[ ]
RE:39757 本家の最新の鬼車の秀丸エディタNo.39760
でるもんたいいじま さん 22/05/23 02:21
 
でるもんた・いいじまです。

> どうやら「秀丸独自コード」に対するリバースエンジニアリングを
> ユーザー自身で行わないといけないようですね。

ここまではその通りです。

が、

> 十万個以上もある全ての Unicode 文字を 1 個ずつ調べるのは相当時間と
> 労力を費やしそうでかなり大変な作業になるとみられます。
...
> あるいは、全ての Unicode 文字の「秀丸独自コード」<=>「真正のUnicode
> コードポイント」の対応表をハッシュテーブルとかでハードコードした場合も、

一つ一つ調べてハッシュテーブルなんて、全く必要ないはずですよ。
私もまだ調べていないのですが、UTF-8とよく似た、割と簡単な換算式で計算してい
るはずです。

Shift_JISの範囲内の文字もUTF-16のコードポイントを元に独自の4バイトコードにエ
ンコード可能であり、ただし実際には、Shift_JISに(正確に言えば、あらかじめ指
定したコードページでのANSIコードに)エンコード可能な文字はそちらのエンコード
か優先される、というだけ状況のはずです。

それに、そもそも私がご提案した関数は一度に何文字でも(ただしプログラム内に
ハードコードしたバイト数の上限まで)まとめて渡せるので、調べるにしてもたとえ
ば16文字くらいを一括で渡して反応を見るのが定石です。

なので実際には、たとえば
・前座として、U+FF01〜U+FF0Fの15文字をまとめて渡してみて、
 U+FF02 以外はShiftJISエンコードが有線されることを確認する。
・調査の手始めに、U+00A0〜U+00AFを16文字まとめて調べてみる。
・次に、U+00B0〜U+00BFを16文字まとめて調べてみる。
・そうすると、少なくともU+0080〜U+00FFについては規則性が予想できるので、
 間を飛ばしてU+00F0〜U+00FFを調べてみて、予想が正しいかどうか確認する。
・次に、U+0100〜U+010FとU+01F0〜U+01FFを調べてみる。
 それだけで規則性が分からない場合は、たとえばU+0170〜U+017Fと
 U+0180〜U+018Fを追加で調べてみる。
・以下同様に上位のコードポイントを順に調べていき、規則性を発見する。
・最終段階としてBMP外の文字については、サロゲートペアを使うのか
 UTF-32ベースで直接エンコードするのかの確認もしておく。
という、割と簡単な作業で終わるはずです。

ついでに言うと、

> そもそも、Unicode の規格自体が年々アップデートしているため、
> それに伴うハードコード済みハッシュテーブルの更新とかも
> 大きな作業負担になる

という心配も一切無用で、既にU+0000からU+10FFFFまでのすべてのコードポイントに
対応する4バイトエンコーディングは確定済みです。既存のコードポイントとの重複
を避けるためにイレギュラーなことをしたGB18030とは違います。

[ ]
RE:39758 本家の最新の鬼車の秀丸エディタNo.39761
でるもんたいいじま さん 22/05/23 03:02
 
うーむ。

大仰なことを言っていますけど、ハッキリ言って「一介の零細企業」に過大なものを
求めすぎです。

> 現に、現在まともに「Unicode 対応」で使い物になる正規表現 DLL を
> ネット上で検索しても、同梱の HmJre.dll と 貴殿の hmonig.dll 以外に
> 全く見当たらない状態です。

hmjre.dll以外のDLLを使用すること自体、そもそも秀丸のサポートの対象外。

DLL選択のインターフェイスは、jre32.dllからhmjre.dllの移行期にユーザがどちら
を使うか選択できるようにした仕様をそのまま維持しているだけであり、今となって
は99.999%のユーザにとっては不要な機能なので、将来的には廃止されても全く文句
は言えない。

それだけのことです。

> ユーザーや開発者が不利益を被ることが無いよう、

不利益を被っているのは具体的に誰ですか?
私の知る限り、fzok4234さん一人だけです。
vscode-lifeさんは今まで部分的に開示された情報だけで解決した模様です。
とすれば、fzok4234さんが自腹で数十万円、工数によっては数百万円という開発委託
費をサイトー企画さんに払って特注で機能追加を依頼すべき案件です。

> ちゃんと責任をもって用意するべきであったのではないでしょうか。

責任なんて存在しません。秀丸はたとえば政府の補助金などを使って「公共インフラ
として万人が広く使えるエディタ」の開発を手掛けているわけではありません。ある
いは逆に、何か法的権利を行使するために秀丸エディタの使用が強制されるわけでも
ありません。あくまで秀丸は多数ある選択肢の中の一つ、使いたい人だけが使えばよ
い代物です。

ついでに言うと秀丸は「4000円+税の定価で買い切り」の製品です。Adobe CCやOffi
ce365のようなサブスクリプションではありません。なので極論すれば、支払時点の
特定のバージョンに既に存在していた不具合の修正以外、サイトー企画さんは何の義
務も負いません。

そして、「hmjre.dllでユーザが利用可能」とサイトー企画さんが公認している機能は
「公開されているAPIを使って、ユーザが秀丸マクロからDLLを呼び出すこと
 (この場合はUnicode対応が保証される)」
「公開されているAPIを使って、秀丸以外のアプリからDLLを呼び出すこと
 (この場合はANSI文字列の利用しかサポートされない)」
これだけです。それ以外に何らの機能があることも保証されませんし、何らの機能を
追加する義務も追っていません。

そもそも秀丸エディタ自身、自前でhmjre.dllを用意してそれを使うことが前提にな
っているのであって、それを外部のDLLで差し替えること自体がサポート対象外です。

たとえばpythonなりperlなりを御自身の環境にインストールして使っていたとして、
その正規表現の仕様が不満だからといって正規表現モジュールを勝手に差し替えて、
動かないから作者が何とかしろと要求する人がどこにいますか?

> このため、サイトー企画さんは仕様がブラックボックスであるがゆえに
> ユーザーなどにもたらされるこのような不利益を最小限にする解決策を
> 提供するある程度の責任と義務を、多数のユーザーなどが依存する
> ベンダーとして負わなければいけないと思われますがどうでしょうか。

繰り返しますが、ここで「ユーザーなど」と大上段に振りかぶている実体はfzok4234
さんただ一人です。
「多数のユーザーなどが依存するベンダー」としての責任は「既に秀丸に存在する機
能を維持すること」だけであって、無制限に機能追加を続ける義務、しかもそれを無
償で行う義務は一切存在しません。


> そしてこの変換関数はできるだけ早く提供されるとともに、
>   ・なぜ「秀丸独自コード」の仕様を今まで非公開にし続けたのか ?
>   ・なぜ変換関数を今まで提供しなかったのか ?
> を「サイトー企画さん自身の手で」秀丸エディタのヘルプファイルなどに
> ちゃんと説明したほうがよいのではないか

断固反対します。

変換関数があるに越したことはないですが、提供を要求する権利はあなたにはありま
せん。自分で作れるはずなので作ってください。この程度の物すら作れないとすれば、
そういう人が公共インフラ(たとえば公共機関で使用される業務用ソフト)の開発に
携わること自体が社会悪ですから、とっととIT業界から足を洗ってください。

サイトー企画さんが過去の経緯や今後の方針を説明する責任も、一般論として一切存
在しません。

上場企業が株主総会で追及されたとか、国民の血税をつぎ込んだ製品なのだから公金
の使い方を公の検証に付せとか、裁判で「一般公開せよ」という判決が出たとか、そ
ういう事情があれば別ですが、現状そのようなことは一切ありません。

☆ ☆ ☆

ここまでの無理強いを何度も何度も見ていると、fzok4234さんが秀丸を捨てればそれ
で万事解決なんじゃないかとすら思えてきます。

いかがですか?

[ ]
RE:39761 本家の最新の鬼車の秀丸エディタNo.39762
fzok4234 さん 22/05/23 07:29
 
> とすれば、fzok4234さんが自腹で数十万円、工数によっては数百万円という開発委
>託費を
> サイトー企画さんに払って特注で機能追加を依頼すべき案件です。
>
> 変換関数があるに越したことはないですが、提供を要求する権利はあなたにはあり
>ません。
> 自分で作れるはずなので作ってください。

ここでいう「変換関数」は、秀丸エディタ本体の「秀丸独自コード」の内部処理ロジ
ックをそのまま操作する
「 DLL 側から秀丸エディタの関数呼び出し」用関数 ( Hidemaru_****() ) として公
開すれば、極めて
少ない工数で実装可能なのではないでしょうか。既に内部で実装済みのロジックに外
部からアクセスする
API を設けるだけの話なので、「数十万円、工数によっては数百万円」に相当する実
装コストで 1 から
「作る」ようなものではないと思われます。

また、当方で解析したものを自前で実装した「私製関数」を用意した場合、後からサ
イトー企画さん側で
「秀丸独自コード」の仕様が変更されたらこちらの「私製関数」もその都度 1 から
作り直さなければ
いけなくなってしまいます。

何より、この「私製関数」は、サイトー企画さんが非公開にする意向のある「秀丸独
自コード」の内部仕様を
外部に映し出すものとなるため、将来 GitHub などでソースコードを掲載して多くの
人に広く使ってもらうことは
おそらく不可能となる見込みです。また、この「私製関数」を実装した 鬼車 のラッ
パー DLL も先の
hmonig.dll と同じくソースコード非公開の扱いにせざるを得なくなって、将来 Vect
or などでバイナリだけを
公開したときに別のユーザーから
  「なぜ『秀丸独自コード』の仕様を非公開にするのか ?」
と問い詰められる事態となることは火を見るよりも明らかです。




[ ]
RE:39762 本家の最新の鬼車の秀丸エディタNo.39764
でるもんたいいじま さん 22/05/23 09:05
 
やれやれ。

> 「なぜ『秀丸独自コード』の仕様を非公開にするのか ?」
> と問い詰められる事態

サイトー企画と守秘契約を結んでいるから。以上。
…それで済むのではないですか?

☆ ☆ ☆

もう一度言います。
そもそもhmjre.dll以外を秀丸の標準DLLとして使うこと自体、サポートの範囲外です。

サイトー企画さんに「法的に」どんな権利義務があるのか、そしてfzok4234さんが40
00円を払ったことで「法的に」とんな権利を得たのか、きちんと検討してください。

「オープンソースコミュニティへの責任」という、法的義務でも何でもないものを私
企業に押し付けないでください。

[ ]
RE:39764 本家の最新の鬼車の秀丸エディタNo.39765
fzok4234 さん 22/05/23 10:11
 
> もう一度言います。
> そもそもhmjre.dll以外を秀丸の標準DLLとして使うこと自体、サポートの範囲外で
>す。

そうはいっても、件の 鬼車 に見るが如く、メジャーな正規表現エンジンは対応構文
を増やして
どんどん進化していきます。以前
  https://www.maruo.co.jp/hidesoft/2/x39727_.html#39731
にて話題になった構文定義方法の「tmLanguage」も、標準の正規表現エンジンをこの
 鬼車 と
しています。

正規表現のお膝元ともいうべき perl の正規表現も、現在の 5.34 の段階でも実験的
構文を
用意するなど、「perl がオワコン」と囁かれる今でも進化が止まらない状態です。

このような情勢下で、現在の HmJre.dll の対応構文はいささか見劣りするようにな
ってきたが、
鬼車 や perl などのソースコードを参考にすればもう少し早く対応構文を増やせそ
うなところを、
完全に「車輪の再発明」で対応しようとしているみたいで進化が遅々として進まない
ように
見て取れます。

こうなってくれば、どうしても秀丸エディタの正規表現エンジンをもっと高性能なも
のに
置き換えたくなるというのが、ある一定数のユーザーの心情となるのではないでしょ
うか。小生も
h-tom 氏もその内の 1 人に含まれていると思います。



[ ]
RE:39765 本家の最新の鬼車の秀丸エディタNo.39768
でるもんたいいじま さん 22/05/23 11:35
 
でるもんた・いいじまです。
ここにまとめて返信します。

hidesoft.2:39762
> また、当方で解析したものを自前で実装した「私製関数」を
> 用意した場合、後からサイトー企画さん側で「秀丸独自
> コード」の仕様が変更されたらこちらの「私製関数」も
> その都度 1 から作り直さなければいけなくなってしまいます。

変換関数とそれに関連する部分だけ別モジュールに分離して、流通は本体と抱き合わ
せにする、という対応で何とかなりませんか?

> 何より、この「私製関数」は、サイトー企画さんが
> 非公開にする意向のある「秀丸独自コード」の内部仕様を
> 外部に映し出すものとなるため、

これについては、「できれば使ってほしくない」という意向表明はありましたが、
「正体を突き止めても一般公開しないでほしい」、というほどには強い口調ではあり
ませんでした。

最終的には秀まるおさんからの公式回答をお待ちしたいところです。

> 将来 GitHub などでソースコードを掲載して多くの人に広く
> 使ってもらうことはおそらく不可能となる見込みです。

これは最悪でも、ANSI⇔Unicodeの変換関数を「独自拡張非対応版」「独自拡張対応
版」の2種類用意して、前者のソースだけを一般公開して、後者を原則非公開(請求
があった人にだけ個別にサイトー企画さんの了解を得て、両者のソースの差分を送
付)とすればいいだけのことではないですか?

hidesoft.2:39765
> > そもそもhmjre.dll以外を秀丸の標準DLLとして使うこと自体、
> > サポートの範囲外です。
>
> そうはいっても、件の 鬼車 に見るが如く、メジャーな正規表現
> エンジンは対応構文を増やしてどんどん進化していきます。
....
> 正規表現のお膝元ともいうべき perl の正規表現も、
> 現在の 5.34 の段階でも実験的構文を用意するなど、
> 「perl がオワコン」と囁かれる今でも進化が止まらない状態です。

そこまでは私も当然理解しています。
手元の環境で
  $ perldoc perlre
するだけでも、私の知らない構文が山ほど出てきます。

ところが実務では、誰もが自由に最新版のperlをサーバにインストールできるわけで
はありません。そもそもroot権限がない、個人スペースにインストールしようにも容
量が足りない、ということはよくあります。

たとえば私が今この投稿を書いているWindow環境には ActivePerl v5.24.1 が入って
いますが、今は新しいバージョンを入手するには開発元に会員登録する必要があるの
で、よほどのことがない限りバージョンアップする予定はありません。現状何も困っ
ていないので、ActivePerl以外のバイナリに乗り換えるつもりもありません。

また、私が借りているレンタルサーバ2箇所で調べてみたら、片方は v5.14.4 になっ
ていました。(こちらは複数のバージョンが用意されていて、コントロールパネルで
1つを選択できる)。もう片方は最近サーバのリプレースがあって、それでも v5.26.
3 です。リプレース前は v5.8.?? でした。

つまり、ある特定の「最低条件」を定めて、(スクリプト中に require 5.10; とか
書いて)その範囲内の正規表現で対応するしかないのです。

> このような情勢下で、現在の HmJre.dll の対応構文は
> いささか見劣りするようになってきたが、

このこと自体は分からなくもありません。ただ、

> 鬼車 や perl などのソースコードを参考にすればもう少し早く
> 対応構文を増やせそうなところを、完全に「車輪の再発明」で
> 対応しようとしているみたいで

これはまず最初に、借用元のコードに万一セキュリティホール(ヌルポインタ、バッ
ファオーバーラン、無限ループなど)があったらどう対処するのか、という問題があ
ります。実際、少し前にもhmjre.dllに「マズいバグ」(秀まるおさん曰く)があっ
て、何がどうマズかったのかは非公開のまま、次のリリースでこっそり修正された、
という事例があります。

次に、ライセンス的に大丈夫なのかという懸念があります。

perlのArtistic Licenseは大丈夫なはずです。
あるいは、今まで話題に上がっていまい製品ですが、PCRE2はBSDライセンスなので、
これもクレジットを明記してあれば大丈夫です。

なのでこのあたりなら、ヘルプファイルの中にクレジットを書いて、秀丸本体の[メ
ニューバー→ヘルプ(H)→秀丸エディタについて(A)]の中で「利用させていただいた
フリーのライブラリについてはヘルプ参照」という誘導を書けば法的にはOKです。

ただ、うっかり「プロプライエタリなコード」「GPLなコード」「CC BY-(SA and/or
NC) のコード」あたりが紛れ込んでしまうと厄介なことになります。

もうひとつ、コンパイラの制約もあります。
秀丸はまだV8.99.xのサポートを打ち切っていないので(ただし原則としてバグフィ
ックスのみ)、32bit版のhmjre.dllはWin98対応のVC++(最終版はVC2005かな?)で
コンパイルする必要があります。その時代のVC++の仕様内で記述しきれるかどうか。

#ちなみに64bit版はXP以降だけ考えればいいので、
#もう少し新しいVC++が使えます。

> 秀丸エディタの正規表現エンジンをもっと高性能なものに
> 置き換えたくなるというのが、ある一定数のユーザーの心情と
> なるのではないでしょうか。小生も h-tom 氏もその内の
> 1 人に含まれていると思います。

「ある一定数」とはいっても、残念ながら割合としてはごく少数でしょう。
新しい構文をどんどん提供して喜ぶ人よりも、仕様変更や万一のエンバグで困る人の
ほうが圧倒的に多いのです。
もし、あなたの言うように秀丸が社会の公器なのであれば、そういう人への対応がど
うしても優先になります。

結局、無いものはご自分たちで何とかするしかありません。(だからDLLを差し替え
たい、という最初のポイントに戻ってくるわけですが。)

[ ]
RE:39768 本家の最新の鬼車の秀丸エディタNo.39770
秀まるお2 さん 22/05/24 10:45
 
 秀丸エディタ内部の独自仕様は公開してもいいです。

 公開方法はもうちょっと考えますので、少々お待ちください。

 ちなみに僕(斉藤秀夫)の方で対応させていただきます。

[ ]
RE:39770 本家の最新の鬼車の秀丸エディタNo.39773
fzok4234 さん 22/05/24 11:54
 
> 秀丸エディタ内部の独自仕様は公開してもいいです。
>
> 公開方法はもうちょっと考えますので、少々お待ちください。

公開の検討ありがとうございます。

一応、先ほど行き違いで
  https://www.maruo.co.jp/hidesoft/2/x39771_.html?a=1#39771
にて申し上げましたが、「秀丸独自コード」<=>「真正の Unicode コードポイント
値」の相互変換関数を
hidemaru.exe 本体の「DLL 側から秀丸エディタの関数呼び出し」用関数として実装
する、ということは
どうでしょうか。実装方法は、秀丸エディタ自身が変換処理で実際に使用している内
部ロジックをそのまま
外部から利用できるようにするだけの関数とする方法です。

というのは、現在の Unicode 規格のバージョンは 2021年09月22日 付の 14.0.0 で
すが、今後の
Unicode 規格のアップデートに伴う「秀丸独自コード」のアップデートが行われたと
きに、もしユーザーが
自前で相互変換ロジックを書き起こしている状態だとアップデートに伴う書き直しを
一々行わないといけなく
なってしまいます。また今後、御社の事情で「秀丸独自コード」の仕様自体が大きく
変更されるようなことも
考えられます。

このような仕様の変化に柔軟に対応するためには、秀丸エディタ自身が使用している
変換ロジックをそのまま
利用することが最も賢明な方法だからです。秀丸エディタ自身の変換ロジックがアッ
プデートされればユーザーは
何もしなくてもこれに追従できるからです。

具体的には、「秀丸独自コード」=>「真正の Unicode コードポイント値」は、
  uint32_t* WINAPI Hidemaru_HidemaruCodeToUcs4( LPSTR hidemaruCodeString , i
nt32_t* outputCharCount ) ;
で、「真正の Unicode コードポイント値」=>「秀丸独自コード」は、
  LPSTR WINAPI Hidemaru_Ucs4ToHidemaruCode( uint32_t* ucs4String , int32_t i
nputCharCount ) ;
という感じで、UCS-4 と「秀丸独自コード」の相互変換を行う形です。UCS-4 コード
が取得できれば、後はユーザーが
自由にこれを UTF-8 なり UTF-16LE なりに変換して利用可能です。



[ ]