HmNodeJS チャンネル単位で状態が継続されている

  • 概要

    ここでは、HmNodeJSの利用において、チャンネル単位でデータが継続されている、
    ということを体感するための、サンプルとなります。

  • 概念を理解するためのサンプル

    • 1回目の実行

      #V8 = loaddll( hidemarudir + @"\hmV8.dll" );
      
      #_ = dllfuncw( #V8, "DoString", R"ES6(
      
      host.lib(clr, "HmNodeClient" );
      
      var currentmacrodirectory = hm.Macro.Var["currentmacrodirectory"];
      
      var client = new clr.HmNodeClient(50001, currentmacrodirectory + "/HmNodeSample.js");
      client.Start();
      
      var NameValueCollection = clr.System.Collections.Specialized.NameValueCollection;
      var param = new NameValueCollection();
      param.Add("word1", "C:/abc/♬e.mac");
      param.Add("myppp", "そそそそそ");
      var res = client.GetResponse(param);
      
      console.log(res.Data);
      console.log(res.CallCount);
      
      hm.Macro.Var["$data"] = res.Data + res.CallCount;
      
      )ES6"
      );
      
      message $data;
      
      freedll( #V8 );
      
      
    • 2回目の実行。別の秀丸プロセスで実行してみる。

      「1回目の実行」とは別の秀丸のプロセス(秀丸の別のタブなど)から、以下のようなマクロを実行してみましょう。
      同じ50001番チャンネルに対して処理をしていますので、状態が継続されています。

      #V8 = loaddll( hidemarudir + @"\hmV8.dll" );
      
      #_ = dllfuncw( #V8, "DoString", R"ES6(
      
      host.lib(clr, "HmNodeClient" );
      
      var currentmacrodirectory = hm.Macro.Var["currentmacrodirectory"];
      
      var client = new clr.HmNodeClient(50001, currentmacrodirectory + "/HmNodeSample.js");
      client.Start();
      
      var NameValueCollection = clr.System.Collections.Specialized.NameValueCollection;
      var param = new NameValueCollection();
      param.Add("word1", "C:/abc/♬e.mac");
      param.Add("myppp", "おおおおおおお");
      var res = client.GetResponse(param);
      
      console.log(res.Data);
      console.log(res.CallCount);
      
      hm.Macro.Var["$data"] = res.Data + res.CallCount;
      
      )ES6"
      );
      
      message $data;
      
      freedll( #V8 );
      
      
    • 3回目の実行。さらに別の秀丸プロセスで実行してみる。

      「2回目の実行」とは、さらに別の秀丸のプロセス(別の秀丸のタブなど)から、以下のようなマクロを実行してみましょう。
      同じ50001番チャンネルに対して処理をしていますので、状態が継続されています。

      GetLastResponse()を使うことで、該当チャンネルの最後のレスポンスデータを取得することが出来ます。

      #V8 = loaddll( hidemarudir + @"\hmV8.dll" );
      
      #_ = dllfuncw( #V8, "DoString", R"ES6(
      
      host.lib(clr, "HmNodeClient" );
      
      var currentmacrodirectory = hm.Macro.Var["currentmacrodirectory"];
      
      var client = new clr.HmNodeClient(50001, currentmacrodirectory + "/HmNodeSample.js");
      var res = client.GetLastResponse();
      
      console.log(res.Data);
      console.log(res.CallCount);
      
      hm.Macro.Var["$data"] = res.Data + res.CallCount;
      
      )ES6"
      );
      
      message $data;
      
      freedll( #V8 );
      
  • 永続性とnode側のサンプル

    チャンネルごとに「処理が維持」されているわけですから、
    以下のような「カウンタ」や「ジェネレータ」は、マクロ側から該当チャンネルにリクエストする度に、 カウンタが増えていく、といったことが理解できることでしょう。

    このように、チャンネル単位で、どのような複雑で不定形なデータでも(データどころか、関数の途中までの実行状態なども含め)
    維持しておくことが簡単なのも、node.js/HmNodeJSの利点の1つと言えるでしょう。

    リクエストする度に、カウンタが増えていく(グローバル変数編)
    var http = require('http');
    var fs = require('fs');
    url = require('url');
    
    var port = process.argv[2]
    
    var server = http.createServer();
    server.on('request', doRequest);
    server.listen(port);
    
    console.log('Server running!');
    
    global.count = 0;
    
    // リクエストの処理
    function doRequest(req, res) {
    
        res.writeHead(200, { 'Content-Type': 'text/html' });
    	global.count++;
        res.write(global.count + "");
        res.end();
        console.log("ノード側:OK");
    }
    
    console.log('Readline running!');
    
    リクエストする度に、カウンタが増えていく(ジェネレータ編)
    var http = require('http');
    var fs = require('fs');
    url = require('url');
    
    var port = process.argv[2]
    
    var server = http.createServer();
    server.on('request', doRequest);
    server.listen(port);
    
    function* idMaker(){
        var index = 0;
        while(true) {
            yield index++;
        }
    }
     
    global.gen = idMaker();
    
    // リクエストの処理
    function doRequest(req, res) {
    
        res.writeHead(200, { 'Content-Type': 'text/html' });
    	var count = global.gen.next().value;
        res.write(count + "");
        res.end();
        console.log("ノード側:OK");
    }
    
    console.log('Readline running!');