Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2007-08-07達見を述べたつもり

WScript.Argumentsオブジェクト (2)

| 01:53 |  WScript.Argumentsオブジェクト (2) - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  WScript.Argumentsオブジェクト (2) - Ci.nsIZIGOROu

次は本来の目的であるコマンドライン引数の取得

まずはソースから。

var args = WScript.Arguments;

WScript.Echo("Arguments Count : " + args.Count());

WScript.Echo("Unnamed");
for (var i = 0, l = args.Unnamed.length; i < l; i++) {
    WScript.Echo(i + " = " + args.Unnamed(i));
}

WScript.Echo("Named");

var keys = ["foo", "bar", "baz"];

for (var i = 0, l = keys.length; i < l; i++) {
    var key = keys[i];
    if (args.Named.Exists(key)) {
        WScript.Echo(key + " = " + args.Named.Item(key));
    }
}

Count()メソッドはlengthプロパティと同じ。Unnamed, Namedプロパティは関数として使う事も出来て、さらにはオブジェクトとしても振舞う。中々面白い性質を持っている。

つまるところ、

var foo = function(s) {
    arguments.callee.say(s);
}

foo.say = function(s) {
    WScript.Echo(s);
}

foo("zigorou");
foo.say("ZIGOROu");

こんな感じって事ですわな。

で、実行した結果ですけど、

[zigorou wsh]$ cscript /Nologo args3.js "foo" "bar" /foo:"baz"
Arguments Count : 3
Unnamed
0 = foo
1 = bar
Named
foo = baz

なるなる!

これでとりあえずはコマンドライン引数を自由に扱う為の手段は揃った感じかな?

WScript.Argumentsオブジェクト (1)

| 01:20 |  WScript.Argumentsオブジェクト (1) - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  WScript.Argumentsオブジェクト (1) - Ci.nsIZIGOROu

話は打って変わってWSHの件。(ぇ

いつかCOMとXPCOMについて、出来れば同様に学べないかなーと思い、ついカッとなってWSHを始めてみた次第で、場所をわきまえず書いてる件については深く反省しております。

以上、謝罪終わり。

WSHのリファレンス

Microsoft WebMatrix 2 からリンクされている、scd56jp.exe がリファレンスになります。

これ持っとくだけでWSHとかJScriptなどのMSなScript系のドキュメントがほぼ入っているので便利です。

WScript.Argumentsオブジェクト

いわゆるコマンドラインに渡した引数を管理するオブジェクトのようです。

MSDNを見る限りだと、

  • プロパティ
    • Item プロパティ
    • Length プロパティ (WshArguments オブジェクト)
    • Count プロパティ
    • Named プロパティ
    • Unnamed プロパティ
  • メソッド
    • Count メソッド
    • ShowUsage メソッド

があると書かれています。(参考: Microsoft API and Reference Catalog)

WScript.Argumentsに対してfor inしてみる

WScript.Echo(typeof WScript.Arguments);

(function(obj) {
    for (var p in obj) {
        WScript.Echo(p);
    }
})(WScript.Arguments);

で実行結果は、

[zigorou wsh]$ cscript /Nologo args1.js
object

typeofの結果しか取れず、for inでは何も取れない。

少なくともプロパティが存在するならば、全てDontEnum属性付きって考えて良さそう。*1

WScript.Argumentsに対して辞書アタックしてみる

MSDNには全てのプロパティ、メソッド共に大文字から始まるが、toLowerCase()した物も対象にしてみた。

var args = WScript.Arguments;
var props = ["Item", "Length", "Count", "Named", "Unnamed", "ShowUsage"];

function test(obj, prop, type) {
    try {
        if (typeof obj[prop]["toString"] == "function") {
            WScript.Echo("prop: " + prop + ", type: " + type + ", value: " + obj[prop].toString());
        }
        else if (typeof obj[prop]["valueOf"] == "function") {
            WScript.Echo("prop: " + prop + ", type: " + type + ", value: " + obj[prop].valueOf());
        }
        else {
            WScript.Echo("prop: " + prop + ", type: " + type);
        }
    };
    catch (e) {
        // WScript.Echo(e.message);
        WScript.Echo("prop: " + prop + ", type: " + type);
    }
}

for (var i = 0, l = props.length; i < l; i++) {
    var prop = props[i];
    var type = typeof args[prop];

    test(args, prop, type);
    test(args, prop.toLowerCase(), typeof props[prop.toLowerCase()]);
}

で結果。

prop: Item, type: unknown
prop: item, type: undefined
prop: Length, type: number, value: 0
prop: length, type: number, value: 0
prop: Count, type: unknown
prop: count, type: undefined
prop: Named, type: object
prop: named, type: undefined
prop: Unnamed, type: object
prop: unnamed, type: undefined
prop: ShowUsage, type: unknown
prop: showusage, type: undefined  

なるほど。

最速の人の大昔のエントリに書いてあるんですけど、

IEのActiveXObjectっていうのはちょっと特殊で、メソッドなんかがJavaScriptのfunctionではない。

var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
alert(typeof xmlhttp.open); // unknown

こうなる。xmlhttp.openはfunctionではなくて謎オブジェクト。

IEでXMLHttpRequestを使えるようにする

つまりunknownってのはメソッドだと思って良いハズ。

さらに言えば、WScript.ArgumentsオブジェクトはJScript内ではActiveXオブジェクトだと言えそう。

それとlengthプロパティのみ大文字でも小文字でもOKだった。

ってかJavaScriptな人々からすれば、せめてこれくらいは小文字であって欲しい次第である。

まとめ

今の所は仮説ですが、

  • WScript.ArgumentsはActiveXオブジェクト
  • ActiveXオブジェクトのプロパティは全てDontEnum属性つき

って事なんじゃないのかなー。

ロギングについて

| 16:53 |  ロギングについて - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  ロギングについて - Ci.nsIZIGOROu

デバッグ時のロギングって皆さんどうしてますかね。

  • dump
  • ErrorConsole

辺りになると思うんですけど、dumpだと出力が切な過ぎるし、ごちゃごちゃして分かりにくいし、ErrorConsole開いてるとMozReplの動作がおかしくなるので、とりあえずこんなん作ってみた。

var Log4Moz = {
  fph: null,
  init: function(file) {
    if (!this.fph) {
      this.fph = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
      this.fph.init(file,  0x02 | 0x08 | 0x20, 0644, 0);
    }
  },
  log: function(level, message) {
    message = (new Date()) + " [" + level.toUpperCase() + "] - " + message + "\n";
    this.fph.write(message, message.length);
    this.fph.flush();
  },
  info: function(message) {
    this.log("info", message);
  },
  warn: function(message) {
    this.log("warn", message);
  },
  debug: function(message) {
    this.log("debug", message);
  },
  error: function(message) {
    this.log("error", message);
  },
  fatal: function(message) {
    this.log("fatal", message);
  }
};

init時のfileは既にinitWithPathしてあるnsILocalFile形のオブジェクトを渡してくだしあ。

指定したファイルにlog4jっぽぃログを吐いてくれます。

これちゃんと整備して作りたい。

追記

Components.stack.caller.filenameは明らかにミスった。

これは削除w

nsIFileProtocolHandlerによる環境依存パスとURL表記の相互変換

| 15:53 |  nsIFileProtocolHandlerによる環境依存パスとURL表記の相互変換 - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  nsIFileProtocolHandlerによる環境依存パスとURL表記の相互変換 - Ci.nsIZIGOROu

すぐ忘れるからメモっとく。

var fph = Cc["@mozilla.org/network/protocol;1?name=file"].createInstance(Ci.nsIFileProtocolHandler);
var file = fph.getFileFromURLSpec("file:///Users/zigorou/test.js");
repl.print(file.path); /// /Users/zigorou/test.js って出る
repl.print(fph.getURLSpecFromFile(file)); /// file:///Users/zigorou/test.js

*1:WSHでのJScriptは今の所DontEnum属性ばっかりな希ガス、良く分からん

NavinNavin2012/04/28 17:03Your answer lifts the inetlilgnece of the debate.

cjpadiltmscjpadiltms2012/04/29 00:52T5TYax <a href="http://oeebcjlffjmi.com/">oeebcjlffjmi</a>

vxfcbdqchvxfcbdqch2012/04/29 23:00gXYmaK , [url=http://ncyprphqdrcy.com/]ncyprphqdrcy[/url], [link=http://vnuhqrpwjjik.com/]vnuhqrpwjjik[/link], http://ruwlgsgmtkou.com/

nypmtunqunypmtunqu2012/04/30 03:55QIQOMy <a href="http://onhunabhthck.com/">onhunabhthck</a>

hqpjivhqpjiv2012/05/01 03:51KgHWdU , [url=http://qepzhcrexpmh.com/]qepzhcrexpmh[/url], [link=http://wlnywrefqhju.com/]wlnywrefqhju[/link], http://tnckpkizsecy.com/