秀丸マクロシェバンNo.08372
天翔記jp さん 16/10/01 14:40
 
■秀丸マクロにシェバンの機能を入れてみてはどうか、といった提案となります。

シェバンとは、Linuxなどによくある
-------------------------------------------------
#!/usr/bin/ruby
-------------------------------------------------
みたいな記述で、「自分自身のスクリプトをシェバンに記載されているプログラムで
解釈して実行する」みたいな意味ですね。

全く新しいようでいて、実は比較的小さな実装要件で
ほぼこれを同じことが出来るのではないかと思い投稿します。


■経緯
今回Hidemaru_EvalMacroが入りました。
マクロステップのjumpが伴ってしまうものや、環境が変わるもの、
プロセスが他へと移るものを除いては、ほぼ実行が可能ですので、
全機能の98〜99%程度は、(インプロセスなら)どんなプログラムからでも
秀丸マクロが実行可能となりました。


そうすると、次に出てくるのは、
「秀丸マクロのエントリーファイルのレベルからして、好きな言語で書けばよいので
は?」

ということです。


これは大改造なようでいて、実は少量の「決め事」で実装可能なのではないかと思い
ます。


■実装例
秀丸マクロの1行目の以下のようにシェバン書かれているとします。
hmOriginalLang.dllは誰かが作ったdllであり、秀丸サイドで用意するものではあり
ません。
(hmPy.dllやhmRb.dllみたいなものです)
この場合は、2行目以降は、間違いなく秀丸マクロでは理解できない文字列が記載さ
れています。
-------------------------------------------------
#!hidemarudir+"\\hmOriginalLang.dll"

//1行目にシェバンがある時点で、秀丸マクロパーサーは、2行目以降は、全部無視。
aaa = 3
bbb = 10

def aaa(a, b)
    return a+b
end

-------------------------------------------------

秀丸マクロは1行目のシェバンだけの情報を元に、これを以下のように内部解釈し、
実行します。
-------------------------------------------------
// mytmp_1343はloaddllの度に変化するtmp名
#mytmp_1343 = loaddll(hidemarudir+"\\hmOriginalLang.dll";

// 束縛変数の伝達(これ結構必須)
##__myretrun_ = dllfuncw( #mytmp_1343, "DllAttachFunc_After_Hm866", "#mytmp_
1343" );

// 自分自身のファイルをdllに渡す。よって元ファイルに書かれたいる内容を解釈す
るのは、あくまでも hmOriginalLang.dll に全部ゆだねる
##__myretrun_ = dllfuncw( #mytmp_1343, "DllDoFile_After_Hm866", currentmacro
filename );

// 処理の終了前の関数(DllDetachFunc_After_Hm866が実装されていれば、自動で呼
ばれる。すでに現在の最新βで実装済)
freedll(#mytmp_1343);


■メリット
@仕組み的には、あくまで秀丸マクロ上に乗って動いているので、
 互換性や各種制限等の辻褄などを取り直す手間が極小で済みそう。

A秀丸マクロの仕組みの上に乗っているにもかからわず、
 好きな言語による記述が可能。
 秀丸マクロにしか搭載していない変数や関数も99%が利用可能。
 (hmOriginalLang.dllの作者がそのように実装していればですが…)

AhmOriginalLang.dllは、
 インプロセスでファイルを読み込んで、対象ファイルを内容を解析し、
 実行可能なプログラム
 であれば、なんでも良いことになります。

 (通常はなんらかのスクリプト言語解釈機のようなものになるかとは思いますが…)
 


以上です。
長い目で検討いただければと思います。
 

[ ]
RE:08372 秀丸マクロシェバンNo.08374
でるもんたいいじま さん 16/10/02 06:21
 
でるもんた・いいじまです。

まずこちらから提案。
このへんの新機能のご提案は、今後turukame.3に移りませんか?

evalの挙動にしてもまだまだベータ版で細かい問題点を絞り出さなきゃ
いけない段階ですし、DLLをユーザが用意することを想定している
時点で明らかに上級者(秀丸ユーザ全体からすれば多く見積もって
0.1%以下でしょう)向きの話題ですし。

それでいて、ここ2か月での天翔記さんおひとりの要望件数が、ざっと
手元でメールスプールを読み返した限りでは今年1月からの他のすべての
利用者さんからの要望総数を軽く上回っています。いろいろ言いたい
ことがあるのは結構なことなのですが(私だって、別の某フリーソフトに
要望を20件くらいまとめて提出しようといま画策中です)、やはり場所は
選ぶべきかと。

☆ ☆ ☆

さて、本題。

> ■秀丸マクロにシェバンの機能を入れてみてはどうか、
> といった提案となります。
>
> シェバンとは、Linuxなどによくある
> #!/usr/bin/ruby
> みたいな記述で、「自分自身のスクリプトをシェバンに記載されて
> いるプログラムで解釈して実行する」みたいな意味ですね。

ふーむ、本丸はそこでしたか。
何をやりたいのかはわかりましたし、示していただいたコードで
実現可能だろうということも理解できましたけど、思いついたから
ハイどうぞ、といきなり実装してもらうのは時期尚早と考えます。

一つ目。
まず今は、evalの実装を早いうちに安定させることが先決です。
そうしないと、いつまでたってもV8.66正式版が出せません。
…とすれば、hidesoft.2:35309 で指摘されたエンバグを解消した
正式版のリリースが徒に遅れることになります。

二つ目。

> 全く新しいようでいて、実は比較的小さな実装要件で
> ほぼこれを同じことが出来るのではないか

とありますが、バイナリとして作り込むのであれば、その「比較的
小さな実装要件」に物凄く慎重を期さなければいけないと考えます。

例えば最近だと、
$a = "
とだけあってダブルクォートが閉じていなくてもエラーにならない、
というバグを天翔記さんご本人が発見したばかりですよね。

これを担当さんは「このバグのおかげで偶然に正常動作していたマクロが
あるかもしれないから」ということで修正保留としました。私なんかは
「とっととエラーにしてしまえばいいじゃん、そのマクロの作者なり
ユーザなりが直せばいいじゃん」と思うのですが、それができない人に
までサイトー企画さんは気を使っておられるわけです。

そもそも論ですが、こういう新機能を、個人的な追加負担なしで秀丸本体に
組み込んでもらうためには、その機能が自分本人だけではなく広く他の
ユーザの利便に寄与すること、今回の場合なら広く一般ユーザのために
DLLを作って配布してくれる人が複数あらわれて、それをみんなが利用
できるようになることが大前提になります。

その前提に立つと、DLLを提供する人はごく少数ですし、中にはソース
コードが非開示のものもあるでしょうから、DLLと秀丸本体との間の
インターフェイスがコロコロ変わって、それによってバイナリ互換性が
失われるというのは望ましくありません。そこは慎重にテストする
必要があります。

#DLLのほうで HMSHEBANG_API_VERSION なんていう変数をエクスポート
#して秀丸側がそれを読む、といった実装も考えられますが、それを
#やっても長期的には、現状のLinux界隈のような混乱が必至です。

秀丸よりずっと古い例でも、ANSI C89/ISO C90の汚い仕様あたりは
後々まで禍根を残しましたよね。

> これは大改造なようでいて、実は少量の「決め事」で
> 実装可能なのではないかと思います。

具体的な内部動作例を示していただいていますが、「決め事」が
本当にその内容でいいのかどうかを検証するために、まず「DLLを
呼び出すマクロ」と「独立のファイルに記載したスクリプト」の
組み合わせで徹底的に問題点・要検討点を洗い出すべきかと思います。

とりあえず、秀丸マクロには「複数のキーに同じマクロを割り当てて、
マクロの側で iskeydown() などを使って振り分けるということが
可能ですから、shebangがない今の段階でも、踏み台にするマクロ
ファイルをひとつだけ用意して、そこで振り分けるようにすれば、
少ない労力でご希望の動作がある程度まで検証可能なはずです。
まずはそれで論点を絞り出してみてはいかががですか?

$script = "";

$ctrl = iskeydown(0x11);
if ($ctrl && iskeydown('O')) $script="Ctrl+O.xyz";
else if ($ctrl && iskeydown('P')) $script="Ctrl+P.xyz";
...
else
{
    message "このキーには対応していません。";
    exitmacro;
}
#hDllShebang = loaddll( hidemarudir + "\\xyz.dll" );
##__tmp = dllfuncw( #hDllShebang, "DllAttachFunc_After_Hm866",
"#hDLLShebang");
##__tmp = dllfuncw( #hDLLShebang, "DllDoFile_After_Hm866",
$script);
freedll(#hDllShebang);

☆ ☆ ☆

以下は細かいツッコミ。

> #!hidemarudir+"\\hmOriginalLang.dll"

サンプルなのはわかるのですが、ここに任意の式を書けるようにする
のは手間がかかってダメでしょう。下記のようにするのが本筋です。

1.パスが書かれていない場合(つまり、#!hmOriginalLang.dll とのみ
 書かれている場合)には、hidemarudirなりPATHが通っている先なり
 からDLLを読み込む
 (ちょうど、Windowsでwebサーバを構築する際に、shebang対応の
  言語で拡張子 .cgi のスクリプトを書いて、httpdにインタプリタを
  捜してもらうのと同じ要領です)
2.hidemarudir、ProgramFiles、UserProfile、AppDataといった特定の
 変数は必要になるでしょうから、そのへんだけは何らかのルールで
 先頭行に書けるようにしておく
 (私案としては %hidemarudir% のような記法。)

> // mytmp_1343はloaddllの度に変化するtmp名
> #mytmp_1343 = loaddll(hidemarudir+"\\hmOriginalLang.dll";

これは毎回ランダムなものにする必要はありますか?
上記の私のサンプルコードのように、呼び出す側では何か決め打ちの
名前にしてしまってもいいように思います。

というのは…現状、秀丸マクロは複数のスレッドを同時に走らせることが
できません。仮に将来可能にするとすれば、それらの変数空間は当然、
分離しなければなりません。そのことと、「現状、DLLからevalを呼び出す
際には変数空間を指定する仕様になっていない」ということを一緒にして
考えると、ひとつのDLLが使う(使ってよい)変数空間はひとつに固定
されるはずで、だとすれば、マクロ側のコードでは決め打ちにしても
問題ないはずです。

一方でDLL側はマクロ側のように簡単に修正ができませんから、そちらでは
マクロから明示的に名前を受け取る形のほうが後々融通が利くでしょう。

> ##__myretrun_ = dllfuncw( #mytmp_1343, "DllAttachFunc_After_Hm866",
> "#mytmp_1343" );

ダミーの左辺にツッコミを入れるのも野暮ですが、意図しているのは
##__myreturn_ でしょうか?

☆ ☆ ☆

本論に戻ります。

> ■メリット
> @仕組み的には、あくまで秀丸マクロ上に乗って動いているので、
>  互換性や各種制限等の辻褄などを取り直す手間が極小で済みそう。

新しいことを可能にするために、「過去の秀丸との」互換性や各種
制限等の辻褄などを取り直す、という点でいえばその通りですが、
「今後長い将来にわたって」互換性や各種制限等の辻褄などを維持する、
という点からは、まだまだ材料の絞り出しが終わっていないと考えます。

あと、shebangを本格的に実現するのであれば、内部的に最初にマクロ
インタプリタが起動して必要な初期化をするにしても、ユーザの観点
からは、拡張子を既存の秀丸マクロ(.mac)とは別のものにしたほうが
いいと思います。.macx とか(笑)。

そうすれば、マクロをダウンロードして自分の環境にインストール
する人が、zipファイルを解凍した時点でマクロの拡張子を見て、
「.mac だから自分でチューニングできそう、採用しよう」「.macx
だからDLLが別途必要でコードの書き換えも難しい、避けよう」と
いった判断ができます。

> A秀丸マクロの仕組みの上に乗っているにもかからわず、
>  好きな言語による記述が可能。
>  秀丸マクロにしか搭載していない変数や関数も99%が利用可能。
>  (hmOriginalLang.dllの作者がそのように実装していればですが…)

この点はちょっと効果に疑問。

そもそも「好きな言語」があって、秀丸用に「そのように実装」された
DLLを用意できる人って、どのくらいいるんでしょう?

天翔記さん本人がそういうクチだということは分かるのですが、そもそも、
「好きな言語」があって、Web上のサンプルコードに頼らずに独力で十分に
使いこなせるというレベルの人自体が、何百万人という秀丸ユーザ全体の
中ではごく少数だと思います。

(天翔記さんがいまDLLを提供しているPythonやRubyにしても、秀丸を内側
 から操作するサンプルコードは、天翔記さん自身やDLLの利用者が何か
 書いているかもしれませんが、それ以外の人の手によるものはまずない
 はずです。)

…要するに「誰得?」ということです。
私が以前の議論でしつこく噛みついたのも、本質的にはここが理由です。

> 長い目で検討いただければと思います。

そうですね。
成果を急がないで、時間をかけてじっくりと問題点を洗い出したほうが
いいでしょうね。

[ ]
RE:08374 秀丸マクロシェバンNo.08375
天翔記jp さん 16/10/02 11:31
 
>サンプルなのはわかるのですが、ここに任意の式を書けるようにする
>のは手間がかかってダメでしょう。下記のようにするのが本筋です。

マクロの先頭に「#!」がある時点で、2行目以降は全部「無い」ということにするの
で、
(投稿にある通り)
1行目は、文字列変数として受け取れる式かどうかで良いと思いますよ。
(事前にそのファイルがあるかどうかチェックしてもよいとは思いますが)
どの道パスとして存在しなければ、loaddll の時点でエラーとなるので。

他は検証するまでもなく、loaddll等々具体的に記述すれば、
すでに動いている話です。(関数名が違うだけなので)

もちろんEvalMacroの(いかにも不具合になりそうな不具合)はありますが、
それは根本とではシェバンとは別次元の話なので。

#dllというシンボルで決めうちでも良いかもしれないですね。
私が懸念したのは、「execmacro先もシェバン」が書かれている際に、
dll側から区分けが付かないぐらいでしょうか。

(グローバル変数と同じ名前のローカス変数で、
 シンボルが同じだと
 その「#dll」シンボルに入っているのは、自身なのか、
 execmacroの シェバンで呼ばれたものなのか、
 区分けするのが大変だよ、ということですね。)

このあたりの細部は、秀丸マクロの環境の細部を握ってるサイトー企画さんに
任せます。


あと言語dllを多くの人が作る必要性などは感じていません。
(そもそもメジャーといえる現役でよくGithubにもあがりまくってるスクリプト言語
自体5個ほどしかないのだし…)

JavScript/Python/Ruby/PHP/Lua
ぐらいが移植されれば十分ではないですか?


あと、具体的にloaddllなど展開記述された場合に動作するのかしないのかですが、
これはもちろん動作します。
(動作すると裏を取っているから要望しているのです)


[ ]
RE:08375 秀丸マクロシェバンNo.08376
天翔記jp さん 16/10/02 13:36
 
あと、「サンプルコードに頼らずに」というのがよくわからないです。

秀丸マクロのサンプルコードは、Web上にもヘルプにもありますよね?

有名汎用言語スクリプト言語自体のサンプルコードも、
秀丸マクロとは比べ物にならないぐらいありますよね?

「秀丸マクロの『各々の変数や関数』を汎用スクリプトに移植した」とかであれば、
これはサンプルコードが無いと大変ですが、
多分誰もそんなことはしないでしょう。
(未来への互換性が保てないので)

pythonであれば、単純に
-------------------------------------------------
#! hidemarudir + @"\hmActivePython3.dll"

// python使う人はpythonは知ってる。
def abc():
    pass

def somefunc():
   hm.EvalMacro("""
      // この中身は秀丸マクロの文法。秀丸マクロのヘルプみれば良い
      debuginfo 1;
      ##a = 3;
      messsage(str(##a));
      showvars;
   """)

-------------------------------------------------

みたいになるだけです。
(hmPyやhmLoadCLRではもうなった状態で公開されてますが…)

これとは別に、秀丸マクロ変数とpython変数をやりとりする所だけ、
別途メソッドを用意するのが普通でしょう。
(同一プロセスですが、環境が異なるので値のやりとりが直接はできないので)



私の目指すところは1点ですね
「Visual StudioはデフォルトインストールオプションとしてC++を外した。

  即ち、C++で.dllを作成するなどというのは、個々人にはあまり期待できなくなる。
 現在プログラムを組んでいる人間に対してすら、
 Windowsでは期待できなくなっていくだろう。

  今のうちに、巨大なバッテリー(デフォルトライブラリ)を持つスクリプト言語を秀
丸マクロで使いやすくしておくべきだ。

 そうすれば、C++で.dllを作成することなく、
 誰もが変更できる、見通しが良いテキスト(=スクリプト)でありながらも、
 Windowsの大抵の機能がそもまま利用できるようになるだろう。

 では、どうあるべきか。



[ ]
RE:08375 秀丸マクロシェバンNo.08377
でるもんたいいじま さん 16/10/02 18:16
 
でるもんた・いいじまです。

まずは実務的なところだけ。

> >サンプルなのはわかるのですが、ここに任意の式を書けるようにする
> >のは手間がかかってダメでしょう。下記のようにするのが本筋です。
>
> マクロの先頭に「#!」がある時点で、2行目以降は全部「無い」という
> ことにするので、(投稿にある通り)
> 1行目は、文字列変数として受け取れる式かどうかで良いと思いますよ。

これは迷うところですね。

要するに、実運用になったときに件のDLLをどこに置くのかという
ことになりますが、loaddllがデフォルトで見に行くディレクトリ
(試していないけど、具体的にはどこだろう…)に置いた場合には
  #!xyz.dll
だけで動いてほしいと思います。

> (事前にそのファイルがあるかどうかチェックしてもよいとは思いますが)
> どの道パスとして存在しなければ、loaddll の時点でエラーとなるので。

そのチェックを前提にするなら、

  1.まず、1行目をファイル名のリテラルとみなして存在確認を行う。
   このとき、" が混じっていれば取り除く。
   例)#!C:\"Program Files"\"Hidemaru Editor"\xyz.dll
   →そのファイルが存在すればそれで確定。

  2.次に、1行目を式とみなして評価し、文字列が得られればその
   存在確認を行って、存在すればそれで確定。

  3.上記2で得られたファイル名に当てはまるDLLがなかったり、
   あるいは式評価で文字列型の結果を得るに至らなかった場合は、
   起動不能としてエラーにする。

あたりが順当かなと思います。

あるいは、言語DLLの拡張子を .dll じゃなくて何かユニークなもの、
たとえば .hmx(Hidemaru Macro eXtension の略のつもり)にして
おいて、先頭行の末尾が \.hmx"?$ に該当した場合は式としての評価を
行わずにリテラルとみなす、という実装も可能ですね。

そのへんはおいおい検討していただきましょう。

> もちろんEvalMacroの(いかにも不具合になりそうな不具合)はありますが、
> それは根本とではシェバンとは別次元の話なので。

やっぱり不具合はありますか。

確かにevalの不具合とshebangの実装作業とは別次元の話ですが、今のβの
段階でshebangを導入してそこで不具合が出たらいつまで経っても正式版を
出せませんから、今はevalの不具合を洗い出してとりあえずV8.66正式版を
出し、それから満を持してshebang関連の改修に着手する、という順序の
ほうが分かりやすいと思います。

まあ、このへんはサイトー企画さんの中でのソースコード管理体制がどう
なっているのかに帰着するので、論拠の半分は余計なお節介なのですが。

> #dllというシンボルで決めうちでも良いかもしれないですね。
> 私が懸念したのは、「execmacro先もシェバン」が書かれている際に、
> dll側から区分けが付かないぐらいでしょうか。

う〜む。
Shebangの中から別のshebangを呼び出すとかなり混乱するような…

まあ、これも結局は
> このあたりの細部は、秀丸マクロの環境の細部を握ってる
> サイトー企画さんに任せます。
ということになりますね。

> あと言語dllを多くの人が作る必要性などは感じていません。
> (そもそもメジャーといえる現役でよくGithubにもあがりまくってる
> スクリプト言語自体5個ほどしかないのだし…)
> JavScript/Python/Ruby/PHP/Lua
> ぐらいが移植されれば十分ではないですか?

Pythonとかは2.xと3.xで言語仕様が色々と違うようなので、何らかの
形で複数のDLLを作りたくなりますね。もちろん、shebang用のDLLは
言語屋さんが提供する処理系本体と秀丸との間を中継するだけの小さな
ものですし、その小さなDLLにしても、うまく書けば共通部分を1本の
ソースにすることができそうですが。

#これは釈迦に説法ですが、バージョンごとに違いのある部分を
#共通部分とは別のC++ソースファイルに切り出しておいて、その
#それぞれと共通部分とを最後にリンクすればいいはずです。


P.S.
つらつら書いていますが、将来的にshebangを実現すること自体を
否定するつもりはありません。
ただ、shebangで動かすスクリプトの拡張子が普通のマクロと同じ
.mac というのは抵抗がありますね。秀丸マクロネイティブの
スクリプトと、外部言語で処理されるスクリプトとは別物として
区別したい、というのがあります。.macx でも何でもいいので、
とにかく別の拡張子をつけてほしいと希望しておきます。

[ ]
RE:08377 秀丸マクロシェバンNo.08378
でるもんたいいじま さん 16/10/02 18:22
 
でるもんた・いいじまです。

> あるいは、言語DLLの拡張子を .dll じゃなくて何かユニークなもの、
> たとえば .hmx(Hidemaru Macro eXtension の略のつもり)にして
> おいて、先頭行の末尾が \.hmx"?$ に該当した場合は式としての評価を
> 行わずにリテラルとみなす、という実装も可能ですね。

取り急ぎ、ここだけ訂正。 \.hmx"?$ というパターンはマズいですね。
式を書く場合も、最後にセミコロンは打たないので、このパターンに
マッチしてしまいます。末尾で判別するなら、「ファイル名のリテラルを
書く場合はスペースのあるパス名でもダブルクォートは無用」という
仕様にして、\.hmx$ で判別すべきです。

[ ]
RE:08377 秀丸マクロシェバンNo.08379
天翔記jp さん 16/10/02 20:03
 
>言語屋さんが提供する処理系本体と秀丸との間を中継するだけの小さな
>ものですし、その小さなDLLにしても、うまく書けば共通部分を1本の
>ソースにすることができそうですが。
まぁ、実際作ってみればわかりますが、結構な感じにはなりますけどね…

何か別のスクリプトをevalして終わりなら、そうでもないですが、
秀丸との間の値のやりとりを、ある程度広い型に対して送受信できるように
しておかないと、実用には堪えないので、そこでソースが増えますかね。

ステートそのものが値を持つ言語と、ステート自体は値を持たない言語など
あと、hmRbやhmPyやhmLoadCLRのように「インタプリタのインストールは不要。」
みたいなのは、そこそこテクニックが要ります。



[ ]
RE:08374 秀丸マクロシェバンNo.08380
でるもんたいいじま さん 16/10/02 20:32
 
でるもんた・いいじまです。連投失礼。

せっかく論題を投げたのに無視されているので、再度質問します。

> まずこちらから提案。
> このへんの新機能のご提案は、今後turukame.3に移りませんか?

これはいかがですか?

> それでいて、ここ2か月での天翔記さんおひとりの要望件数が、ざっと
> 手元でメールスプールを読み返した限りでは今年1月からの他のすべての
> 利用者さんからの要望総数を軽く上回っています。いろいろ言いたい
> ことがあるのは結構なことなのですが(私だって、別の某フリーソフトに
> 要望を20件くらいまとめて提出しようといま画策中です)、やはり場所は
> 選ぶべきかと。

これについてのご感想は?

> バイナリとして作り込むのであれば、その「比較的小さな実装要件」に
> 物凄く慎重を期さなければいけないと考えます。
>
> 例えば最近だと、
> $a = "
> とだけあってダブルクォートが閉じていなくてもエラーにならない、
> というバグを天翔記さんご本人が発見したばかりですよね。

このあとの投稿にあったように、将来的には汎用スクリプト言語で書く
のが主流になるべきだ、と考えておられるのですよね。

そうだとして、当該投稿で例示していただいた5言語(実質的には深刻な
バージョン違いがいろいろあるし、Perlあたりもまだ使われているので、
最終的には10前後になるでしょうか)のDLLを天翔記さんと有志で実装
するとしましょう。

で、それが普及したとして、そのあとから、秀丸がバージョンアップして
shebangのAPIが変わって古いDLLはもう動かないので差し替えが必要です、
言語処理系の仕様が変わってスクリプトの修正が必要になりました、という
ときに、ひとりで混乱なく末端の利用者(サードパーティのDLLが使われて
いることを知らない、それどころか秀丸の組込機能とマクロとの区別すら
ついていない人を前提に!)を誘導できますか?

…残念ながら、天翔記さんにはこの後段の仕事は無理でしょうね。

> 要するに「誰得?」ということです。

最終的に、私がやたら噛みついているのはこの一点に帰着します。
「誰得」なのかを再度、冷静に考えてみてください。

[ ]
RE:08376 秀丸マクロシェバンNo.08381
でるもんたいいじま さん 16/10/02 20:32
 
でるもんた・いいじまです。

傍論になりますが、議論が噛み合わないまま放置するのは後味が悪いので、
つらつらと書いていきます。

> あと、「サンプルコードに頼らずに」というのがよくわからないです。

利用者の技術レベルをどの位置に想定するか、という問題です。

いきなりお説教をするのは気が引けるのですが、どうも天翔記さんは
「自分の普通」が「世間一般の普通」と大半において一致すると思って
いる節があります。下には下がいるんです。だから私は何度も、開発
だけやっていないでユーザーサポートの仕事もしなさい、と繰り返して
いるのです。

☆ ☆ ☆

たとえば、今年の4月には
    Subject: hidesoft.4:08096| クリップボードの使い方
    Subject: hidesoft.4:08103| RE 08102 追加質問
という2つのスレッドがありました。これを読み返してみてください。

秀丸のヘルプには、文字列を + で結合できるとはっきり書いてあります。
一方で、"..." の中に変数名、たとえば $a をそのまま書いたらどうなる
のかについては、実は記載がありません。

で、この2つのスレッドの質問者さんたちは、たぶんPerlあたりからの
類推でマクロを書いているのでしょう、実は秀丸マクロの文法をきちんと
理解してはいなかったわけです。私は、そういうレベルの人でも既存の
マクロをコピペして使う程度のことは十分に可能性があるし、そういう
可能性を十分に想定すべきだという点から議論をしているつもりです。

☆ ☆ ☆

> 秀丸マクロのサンプルコードは、Web上にもヘルプにもありますよね?

確かにありますね。サイトー企画さんも公式に、「マクロライブラリ」
というサイトを運営しておられます。

> 有名汎用言語スクリプト言語自体のサンプルコードも、
> 秀丸マクロとは比べ物にならないぐらいありますよね?

確かに山のようにありますけど、入門級のサンプルのほとんどは
コンソールでの簡単な操作で、そのあとはUNIX系OS+Apacheでの
CGIプログラミングに進むのが通例ですよね。

スクリプトからWindows OSを操作するとなると、ある一定範囲の事柄
ならば別途用意したバイナリコード(レジストリ関係などは処理系に
標準添付されていたりしますね)をスクリプトから呼び出せば実現
できますが、「Windowsの大抵の機能」を「そのまま利用できる」と
いうことを実証する完動品のサンプルアプリ(問題部分を記述した
モジュールだけのサンプルではダメです)、しかも日本語でコードの
書き換えかたについて丁寧な説明つき(英語ではダメです)、となると、
絶望的に少ないと認識しています。

> 「秀丸マクロの『各々の変数や関数』を汎用スクリプトに移植した」
> とかであれば、これはサンプルコードが無いと大変ですが、
> 多分誰もそんなことはしないでしょう。
> (未来への互換性が保てないので)

これはその通りです。

> pythonであれば、単純に
...
> みたいになるだけです。
...
> これとは別に、秀丸マクロ変数とpython変数をやりとりする所だけ、
> 別途メソッドを用意するのが普通でしょう。

分かっている人には当然、その情報があれば十分でしょう。

でもね、繰り返しますけど、サンプルのコードに書いてある
「python使う人はpythonは知ってる。」というコメントは
事実認識が甘いです。そりゃ、最初にマクロを完成させる人は
当然Pythonをそれなりに使える人でしょうけど、それを上記の
ようなド素人さんが改造することになるんです。

そういう人だとたとえば、

| #! hidemarudir + @"\hmActivePython3.dll"
|
| def somefunc():
|   x = 3
|   hm.EvalMacro("""
|      debuginfo 1;
|      ##a = x; //ここが罠です
|      messsage(str(##a));
|      showvars;
|   """)

とか書いちゃって、「message 文では『3』と表示されるはずなのに、
実際に動かしてみるとランダムな値が表示される」と延々思い悩む
ことになります。
#「x」だと文法エラーにもならないので、余計にややこしい。

☆ ☆ ☆

で、一番下に書いてある問題提起の部分。

> Visual StudioはデフォルトインストールオプションとしてC++を外した。

ふむふむ。でも、VSのインストール画面を見て、C++が外されている
ことに気づかずに、すべてデフォルトのままでインストールする、
という人は割合としてどのくらいいるんですかね。最近はフリー
ソフトと抱き合わせで余計なおまけを入れるインストーラーが
珍しくないので、VSをインストールするレベルの人なら「何か邪魔な
ものがデフォルトで入るようになっていないか」と疑ってかかる
ほうがむしろ自然だと思いますが。

もちろん、「ウチのプロジェクトではC++を使わないことにしたから、
職場の開発用PCには入れなくていい」という選択をすることは当然
あるでしょう。でも一方で、Windows・Mac・UNIX系OSの3つともに
対応しているライブラリ類は今でもC/C++が標準語なので、カスタム
インストールで入れる人も確実に存在するはずですよ。

> 即ち、C++で.dllを作成するなどというのは、
> 個々人にはあまり期待できなくなる。
> 現在プログラムを組んでいる人間に対してすら、
> Windowsでは期待できなくなっていくだろう。

どうなんでしょう。何も知らない新人社員をゼロからプログラマに育て
上げる、という職場なら「現場で使っている言語にひたすら習熟せよ」
で通るかもしれませんが(たとえば、Android向けのアプリを作っている
なら現状C++はどうでもよくて、今のところJavaとJavaScriptですね)、
大学や専門学校のカリキュラムではC/C++をそれなりに習うのが一般的
だと思います。

で、そのレベルのC++がそれなりに分かっていて、なおかつC#とかで
最近のWindowsの事情をそれなりに知っていれば、ごく薄いテキストと
サンプルコードとを読んでC++でDLLを作る(あるいは最低限、既存の
DLLのソースに手を入れる)のはそんなに難しくないはずです。

>  今のうちに、巨大なバッテリー(デフォルトライブラリ)を持つ
> スクリプト言語を秀丸マクロで使いやすくしておくべきだ。

「今のうちに」と言い切る理由が理解できません。
今すぐ手を打たないと手遅れになるとお考えでしょうか?
業界全体を見れば、C++プログラミングの需要は確かに頭打ちでは
あるでしょうけど、しばらくは横ばいでしょう。Windowsとスマホだけ、
しかもそれらのアプリ層だけがIT業界というわけではありません。

> そうすれば、C++で.dllを作成することなく、誰もが変更できる、
> 見通しが良いテキスト(=スクリプト)でありながらも、
> Windowsの大抵の機能がそもまま利用できるようになるだろう。

Pythonなどはテキストのインタプリタ言語(少なくとも見かけ上は)
だから見通しがいい、C++はコンパイラ言語だから見通しが悪い、
というのは完全なステレオタイプです。どちらを使うにしても、
見通しがいいか悪いかは結局、コーディング作法の問題です。

極端な例を一つ上げると、最近はHTMLのソースの中にJavaScriptで
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]
||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new
Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];…
というコードを仕込んであるサイトが結構あります。Googleのアクセス
解析サービスを利用するコードのようですが、上記のコードがいったい
何をしているのかは、少なくとも私には全く解読不能です。というか、
おそらくGoogleの社内には綺麗な読みやすいコードが存在していて、
それをわざと読みづらく加工して配布しているんでしょうね。

話を戻すと、「Windowsの大抵の機能」の大半を「そのまま利用」する
スクリプトなんて、そのスクリプト言語については本体のことを人並み
に知っているだけ(=Windowsの内部構造には明るくなく、処理系に
ついてくるWindows専用のライブラリの使い方も詳しくは知らない)
人から見れば、C++以上に複雑怪奇だと思いますよ。

☆ ☆ ☆

それにそもそも、「たかがエディタ」のはずの秀丸がWindows上の
すべてのリソースを一元的かつ直接的に制御する利点なんてどこにも
ありません。「餅は餅屋」ですから、必要に応じて別のアプリを使って、
必要に応じて、そういったアプリの間の橋渡しをする専門ツールを使う、
というのが、大半の人、つまり、本人が天翔記さんのような腕利きの
プログラマでなくて、そういうプログラマを専属で雇うだけのコスト
メリットのない人にとっての現実解ではないのですか?

たとえば、どうしても秀丸の編集ウィンドウ内で動画を観られなきゃ
嫌だ、という人はほとんどいないでしょう。録画・録音データから
スピーチの文章起こしをする仕事でも、Windows Media Playerなどの
「その分野に長けた一般的なアプリ」で再生して、文章の入力・編集
作業だけエディタなりWordなりで書き起こすほうが、トラブル発生
時の保守コストは安くなります。途中で再生を止めて数秒巻き戻し
たい、でもキーボードから手を離したくない、ということであれば、
秀丸マクロで一から実装するよりは、キー操作一発でWMPにPostMessage
できるツールを常駐させておくほうが、初期コスト、長期的な維持
管理コストの両面で明らかに安くつきます。

冒頭で述べたことの繰り返しになりますが、天翔記さんの諸々の想定は、
DLLなりスクリプト言語なりで高度なことができる人に客層を絞り込み
すぎです。秀丸ユーザの少なくとも99%まではそういう高度なことが
できない人だということをしっかり認識してください。

[ ]
RE:08380 秀丸マクロシェバンNo.08382
天翔記jp さん 16/10/02 21:43
 
>> まずこちらから提案。
>> このへんの新機能のご提案は、今後turukame.3に移りませんか?
そちらは、β版への投稿場所のことですか?
こちらは、「マクロ作者会議室」ですよね?

どちらも外れてはいませんが、こちらで特に外れているとは思いません。
β版は、マクロに絞られず多岐にわたりますが、
ここは、マクロやその関連実装に絞られます。
(β版のルームに関しては、β版で実装された内容を受けてのバグや、
  β版で実装された内容に直接関連するかなり小さな変更要望を書くのが最もふさわ
しいと思っています。
但し、ルームの定義が明確ではないのでわかりませんが。)


秀丸マクロヘルプにも、dll関連のインターフェイス部の説明はあるように、
秀丸及び、秀丸マクロとの「dll関連インターフェイス部」も
マクロの取り扱いに含めるのが最も妥当でしょう。
(dll内部の個々実装は異なりますが)


あと、要望はどしどしした方が良いと思いますよ。
要望とは即ち、「開発者が思い至っていないかもしれないことの伝達」に他ならない
ので、
あればあるほど良いのです。
(1日100件とか投稿してて、サイトー企画さんが読める量を
 明らかに超えていれば別ですが、現在のところ、そんなことはないですし)

取捨選択はサイトー企画さんが判断して、適切に行ってくれます。
伝達した結果、「あぁ、なるほど」と思われれば採用
それはちょっとと思われれば不採用や保留。

でるもんたいいじまさんが、懸念する話ではないです。



[ ]
RE:08381 秀丸マクロシェバンNo.08383
天翔記jp さん 16/10/02 22:12
 
>たとえば、どうしても秀丸の編集ウィンドウ内で動画を観られなきゃ
>嫌だ、という人はほとんどいないでしょう。録画・録音データから
なにを言ってるんですか?

普通にフォームを表示して、好きな位置にボタン配置して、
そのボタンを押したら
「フォームはあくまで表示したまま」で、
今開いている秀丸のテキストに文字挿入。

こんなことすら今までで困難を極めたじゃないですか。


[ ]
RE:08382 秀丸マクロシェバンNo.08384
でるもんたいいじま さん 16/10/03 01:29
 
でるもんた・いいじまです。

> > このへんの新機能のご提案は、今後turukame.3に移りませんか?
> そちらは、β版への投稿場所のことですか?
> こちらは、「マクロ作者会議室」ですよね?

はい。念のため、と思ってWebで改めて確認してみたら、
    hidesoft.4「秀丸エディタ マクロ作者会議室」
    turukame.3「秀丸エディタβ版」
となっています。

以前は「秀丸エディタβ版&常連さんフォーラム」といったタイトルに
なっていたと思います。私は普段はWebではなくメールで読み書きしている
(Webでアクセスするのは投稿を取り消す時だけ)ので、turukameのほうの
各会議室が再編されていたことに今まで気づきませんでした。

> (β版のルームに関しては、β版で実装された内容を受けてのバグや、
> β版で実装された内容に直接関連するかなり小さな変更要望を書くのが
> 最もふさわしいと思っています。
> 但し、ルームの定義が明確ではないのでわかりませんが。)

そうですね、2chのように各板のトップに運用指針が表示されるわけでは
ないので、確かに新入りさんには曖昧に見えるかもしれません。

ただ、以下で示す通り、hidesoft.4の投稿は実は、
  ・「こんな数行のマクロを作ってみたけど希望通りに動きません。」
  ・「こういうことをしたいので、誰かマクロを書いてくれませんか?」
という内容のものが多いのです。

一方でturukame.3のほうは、β版で実装された機能の不具合報告は当然
あるのですが、そのほかに、ベテランの人たちが「できるかどうかわから
ないけど、あったらいいかも」という程度のネタを頻繁に振っています。

そもそもβ版にしても、事前に誰も指摘しなかった変更がサイトー企画
さんの発案でいきなり実装されるということはまずなくて、turukame.3で
ベテランさんが振ったネタが数多く採用されています。
(もちろん、hidesoft.2やhidesoft.4に上がった不具合の修正もあります。)

具体的なデータを出しましょう。7月に天翔記さんがhidesoft.4にやって来て、
そのあと私との間で「売り言葉に買い言葉」になって紛糾してしまったので、
その直前、4-6月にhidesoft.4で開始したスレッドをぜんぶ拾ってみると、

04/08 hidesoft.4:08091| EUCでのURLエンコードについて
04/16 hidesoft.4:08096| クリップボードの使い方
04/16 hidesoft.4:08099| RE 08097 クリップボードの使い方
04/18 hidesoft.4:08101| マクロでの一時的なフォント指定について
04/18 hidesoft.4:08103| RE 08102 追加質問
05/16 hidesoft.4:08108| HmJre.dll の ReplaceRegular と変換モジュールについて
05/17 hidesoft.4:08111| HmJre.dll の FindGeneral 関数について
05/18 hidesoft.4:08115| leftstr, rightstr, midstr 関数のハングアップの件
06/01 hidesoft.4:08119| ListReplace.macについて聞きたいのですが?
06/07 hidesoft.4:08124| お教え下さい!
06/24 hidesoft.4:08127| 現在のウィンドウ幅を取得・設定する方法は?
06/26 hidesoft.4:08130| 田楽 "DengakuDLL.dll" が読み込まれません。
06/30 hidesoft.4:08133| 田楽、BREGEXP.DLLと「十」

全部書き出すと以上のようになっていて、実際、半数強がマクロ初心者からの
質問です。その次に多いのが不具合らしき現象の報告やundocumented features
の問い合わせ、ヘルプの不備の指摘などで、これらを除くと、本当にポツポツと
しか残らないのです。

実はこの中で私もひとつ質問しているのですが(06/24のスレッド)、
これにしても、「こういうキーワードがちゃんとある(=ヘルプにも
書いてある)よ」というレスが即座について、それで終わりになりました。

つまり、いま私と天翔記さんとの間で議論しているようなディープな話題は、
マクロ作者会議室の平均的な「来客」層と比べるとかなり異質なんです。
Webで読んでいる人は「まだモメているのか」とスレッド単位で無視すれば
いいのですが、メールで読んでいる人にはご迷惑をおかけしてしまったと
思います。
(一応、メールのヘッダに In-Reply-To: がついているので、環境によっては
 スレッド単位でのミュートができるはずですが、メール読者の全員がそう
 いう環境だとは限りません。)

で、なんで私がβ版会議室への移動を提案したかというと、「常連さん」の
文言が今も残っていると思い込んでいたのもありますが、最大の理由として、
秀丸の内部に深入りするような機能追加要望をする場合、どうしても何回か
β版をリリースしてもらって、それを試して要望内容を修正して、という
ステップを踏まざるを得ない、という認識が根底にあります。初号試作品が
できたあとのチューンナップは当然ながらβ版会議室のほうがふさわしい
でしょうし、ここの掲示板には2chのような「途中でスレッドを別の板に移動」
という機能はないので、それならば最初からβ版の会議室に要望を出した
ほうがスムーズなのではと思うのです。

ちなみに、最近の追加機能の目玉のひとつ「sprintf」も、初出は
    2015.06.19 turukame.3:08631| ネタ: マクロ強化
で、β版会議室です。これはそのあと、9月までバグ出しが続いています。

> あと、要望はどしどしした方が良いと思いますよ。
> 要望とは即ち、「開発者が思い至っていないかもしれないことの伝達」に
> 他ならないので、あればあるほど良いのです。
> (1日100件とか投稿してて、サイトー企画さんが読める量を
> 明らかに超えていれば別ですが、現在のところ、そんなことはないですし)

原則論としてはそうですね。

ただ、今回の時系列をたどっていくと、
07/20 hidesoft.4:08136 ヒアドキュメントを使いたい
08/09 hidesoft.4:08171 freedllでは不完全、後片付け用の関数を自動で呼んでほしい
08/15 hidesoft.4:08194 入力補完時に自動でDLLを呼んでほしい
08/15 hidesoft.4:08196 マウスを単語にポイントしたときに自動でDLLを呼んでほしい
08/20 hidesoft.4:08259 (秀まるおさんの返答)GetTotalTextを検討する→天翔記さ
ん応諾
08/21 hidesoft.4:08262 テキストのコードページを取得するキーワードがほしい
08/29 hidesoft.4:08308 PathQuoteSpaces()がほしい
09/06 hidesoft.4:08327 マクロファイルのコードページをDLLから問い合わせたい
09/07 hidesoft.4:08331 アウトプット枠DLLの仕様について問い合わせ
09/13 hidesoft.4:08338 マクロ自動起動のタイミングに「ファイル名変更時」を追
加要望
09/23 hidesoft.4:08346 DLLから選択範囲を取得したい
09/23 hidesoft.4:08347 BOX選択・複数選択の内容を配列で一括取得・一括書き換
えしたい
09/26 hidesoft.4:08349 DLLで何でも表示できるドッキング枠の機能を要望
09/26 hidesoft.4:08353 eval機能の要望(マクロ・DLL両方で)
09/30 hidesoft.4:08365 loaddll()の返り値を代入した変数名を自動でDLLに伝えて
ほしい
10/01 hidesoft.4:08372 Shebangを要望
と、ひとつ終わるのをわざわざ待ってから追加の要望をまたひとつ、ということを
繰り返しています。これは非常に残念なことです。

もしかしたら「いちどに大量に要望するのは申し訳ないから、サイトー企画さんに
負荷をかけないように少しずつ」とお考えだったのかもしれませんが、私の考えは
正反対です。サイトー企画さんは心の広いお方の集まりなのでその点については
何も苦情を言っておられませんが、私が担当さんの立場だったら「こんなことを
続けられたら、いつまで経っても終わりが見えない」と音をあげていますし、
実際、頼まれてもいないのにここで喧嘩を仕掛けるに至りました。

ひとつ実験データをご紹介しましょう。出典や正確なシチュエーションを覚えて
いないのですが、軍隊で長距離の行軍をする場合、最終目的地と到達期限とを
最初からぜんぶ知らされていた部隊と、目的地も期限も一切知らせずに「とにかく
歩け」とだけ指示された部隊とでは、実際の経路が全く同じでも、明らかに
前者のほうが士気が高く、肉体的・精神的疲労も少なかったというデータが出て
いたはずです。

あるいは、ユーザーサポート的な掲示板なりMLなりに相談する場合も、
「考えている要望、把握している情報を小出しにするな」というのはよく
言われる話ですよね。

要するに何事も、「最初に全体像をはっきり示すこと」が重要なんです。
今回の場合は全くその逆で、私の眼には、まず外堀から埋めて、次に内堀を
埋めて、そして全ての条件が揃ってからshebangの件を持ち出して、やおら
「チェックメイト!」と高らかに宣言して勝ち誇っている、という印象を強く
受けました。正直言って、私はこういうやり方を非常に不愉快に感じています。

一方、上で索いたsprintfの要望の場合、投稿を確認していただければ
わかりますが、これはsprintf単独の要望ではありませんでした。あるいは、
sprintfが採択されてから「じゃあもうひとつ」といって追加の要望を出すと
いうこともしていません。
そうではなくて、「eval、include、sprintfの3つを追加してくれたら嬉しい」
という3つのネタを一度にまとめて出して、その1通で綺麗に完結しています。

つまり、何か気が付いたときに反射的に即座に文章を書き起こして、ろくに
推敲もせずにいきなり投げるのではなくて、とりあえずは手元に書き溜めて
おいて、いくつかネタがまとまってから、関連性のあるネタを整理して
まとめて投稿したほうが、サイトー企画さんとしても全体の設計方針や時間
計画が立てやすいはずです。そういう、「効果的に相手方に伝わって、
円満に話が進むような主張のしかた」を今のうちに覚えてください。

☆ ☆ ☆

以下、年寄りのお節介。

大事なことだから何度でも言います。とにかくいちど開発部門を離れて、
ユーザーサポートをみっちり経験してください。あなた自身の未熟な部分を
痛いほど思い知らされるはずです。少々の失敗が「若気の至り」で許される
今のうちに、しっかりと思考回路の軌道修正をしてください。

もし今のまま10年くらい経って職場で部下を動かす立場になったら、誰かを
過労自殺に追い込むか、周囲の人に逃げられて自分が発狂するか、という
二者択一しかありません。そうならないことを切に願います。

[ ]
RE:08383 秀丸マクロシェバンNo.08385
でるもんたいいじま さん 16/10/03 01:31
 
> >たとえば、どうしても秀丸の編集ウィンドウ内で動画を観られなきゃ
> >嫌だ、という人はほとんどいないでしょう。
>
> なにを言ってるんですか?
> 普通にフォームを表示して、好きな位置にボタン配置して、
> そのボタンを押したら
> 「フォームはあくまで表示したまま」で、
> 今開いている秀丸のテキストに文字挿入。

あなたは「できる」と「やりたい」の区別がつかないのですか?
…と煽ってみるテスト。

[ ]
RE:08384 秀丸マクロシェバンNo.08386
天翔記jp さん 16/10/03 01:41
 
年寄りのおせっかいって、50代なのかな?
30代だとすれば、私よりは若いですが。

[ ]
RE:08386 秀丸マクロシェバンNo.08387
天翔記jp さん 16/10/03 01:52
 
あと、ハッキリいいますと、

あなたが一人で勝手に場を荒らしまくってるんですよ。
誰の目から見ても。

[ ]
RE:08372 秀丸マクロシェバンNo.08388
秀丸担当 さん 16/10/03 12:52
 

秀丸マクロでほかの言語も扱えるようにするのは、本体側の実装そのものは簡便
になりそうなのは理解できます。
ただ秀丸マクロとしてやるには少々飛躍しているように思うのと、現状でも既に
やられているように、別ファイルであったりloaddllとdllfuncを数行書くとほぼ
できると思います。
導入するためにいくつかのDLLが必要になってくると思うので、その時点で1フ
ァイルではなく、どうしてもマクロファイルを1ファイルに収める必要性も無い
ように思います。

会議室については、マクロ作者会議室はマクロを知りたいユーザーや作者様同士
のやりとりが多いので、秀丸エディタそのものの開発についてはβ版のほうがい
いかもしれません。

[ ]
RE:08388 秀丸マクロシェバンNo.08390
天翔記jp さん 16/10/04 09:08
 
了解しました。

では、dllおよび、新規マクロ関数の要望等は、β版の方にまわし、
現状のマクロ機能で出来ることの質問をこの会議室にて行います。

私としては、Shebangu系の機能は秀丸本体には(少なくとも当面は)実装しないこと
明示していただけただけでも指針が立てやすくなりました。


[ ]