練炭ブログ

X680x0、Irvine、DMonkey、Proxomitron などの情報を扱ってます。

DMonkey: ループのアンロール

コメントなし»

1バイトずつ key [0]key [7] と排他的論理和を取っていくループ。

var k0 = key [0];
var k1 = key [1];
var k2 = key [2];
var k3 = key [3];
var k4 = key [4];
var k5 = key [5];
var k6 = key [6];
var k7 = key [7];

var sb = new StringBuffer (http.data);
var len = sb.length;

sb.append ('*'.multiply (32));
for (i = 0; i < len;) {
  sb [i++] = sb.charCodeAt (i) ^ k0;
  sb [i++] = sb.charCodeAt (i) ^ k1;
  sb [i++] = sb.charCodeAt (i) ^ k2;
  sb [i++] = sb.charCodeAt (i) ^ k3;
  sb [i++] = sb.charCodeAt (i) ^ k4;
  sb [i++] = sb.charCodeAt (i) ^ k5;
  sb [i++] = sb.charCodeAt (i) ^ k6;
  sb [i++] = sb.charCodeAt (i) ^ k7;
  sb [i++] = sb.charCodeAt (i) ^ k0;
// 中略
  sb [i++] = sb.charCodeAt (i) ^ k7;
  sb [i++] = sb.charCodeAt (i) ^ k0;
  sb [i++] = sb.charCodeAt (i) ^ k1;
  sb [i++] = sb.charCodeAt (i) ^ k2;
  sb [i++] = sb.charCodeAt (i) ^ k3;
  sb [i++] = sb.charCodeAt (i) ^ k4;
  sb [i++] = sb.charCodeAt (i) ^ k5;
  sb [i++] = sb.charCodeAt (i) ^ k6;
  sb [i++] = sb.charCodeAt (i) ^ k7;
}
sb.delete (len);

ここは19世紀か。

まったくループを展開しない場合に比べて、ちょっとだけ速くなります。ちょっとだけ。
まじめに速くしたいなら外部プロセスに投げるべき。

Irvine: Dorothy2R をいろいろいじった

コメントなし»

アップデートした場合は Dorothy2R 設定でユーザー設定を行った上で上書き保存して下さい。

従来の仕様の

  • ダミー URL がハードコーディングされている。
  • Dorothy.nulUrl が定義されている場合のみダウンロードしたダミーファイルを削除しない。

というのが柔軟性に欠けて気になっていたので、

  • ダミー URL は Dorothy.dummyUrl で定義する。
  • ユーザー設定で変更可能。
  • Dorothy.dummyRemovetrue ならダミーファイルを削除する(既定値 true)。
  • Dorothy.removeThis() を新設。

という構造に変更してみました。

rutil_dorothy2r.dms で追加される Dorothy.removeThis() の方はダミー URL はハードコーディングです。変更可能にするとファイル読み込みが増えるのと、そこまでしなくてもいいかなと。

あと関係ないけど今日気がついたことをついでに。
ダウンロードスレッドで VCLForm を使ってモーダルダイアログを表示すると、ポップアップメニューを定義してても表示されないっぽい?

DMonkey: 'string'.indexOf('') == -1

コメントなし»
alert ('foo'.indexOf (''));    // -1

空文字列を検索すると -1 が返ります。
(JavaScript では 0)

alert ('foo'.indexOf ());    // undefined

特に意味はありませんが、引数を省略すると undefined が返ります。
(JavaScript では -1)

'string'.lastIndexOf ('') も同様です。

DMonkey: RegExp.$0~$9 の書き換えの影響範囲

コメントなし»

RegExp.$0~$9 と、正規表現リテラル /…/ で生成した全ての regexp インスタンスの $0~$9 は共有されている。

したがって、
RegExp.$1 = 123;
のようにすると全ての regexp インスタンスの $1 も変更される。

new RegExp() で生成した RegExp インスタンスでマッチングを行うと当該インスタンスの $0~$9 が更新される。

また同時に RegExp.$0~$9 も更新されるが、これは全ての regexp インスタンスの $0~$9 とも共有されているのでそちらの値も更新される。

一方、
var r = new RegExp ('a'); r.$1 = 123;
のようにすると当該インスタンスの $1 だけが書き換わる。

このように、RegExp インスタンスでは、正規表現マッチングによる $0~$9 の更新と代入式による $0~$9 の書き換えでは影響範囲が異なる。

ちなみに、regexp インスタンスに対して
/a/.$1 = 123;
/a/ ['$1'] = 123;
といった方法はエラーになり、書き換えはできない。

RegExp.$1 = 123;
alert (/a/.$1);    // 123

new RegExp ('(a)').test ('a');
alert (RegExp.$1);    // a
alert (/a/.$1);    // a

new RegExp ('(a)').$1 = 123;
alert (/a/.$1);    // a

Irvine: getuploader_r.dms のタイムスタンプ機能の件

コメントなし»

スクリプト内でダウンロードしてファイルに保存して touch.exe で変更してみるテスト。
Timestamp=true で有効に。

Dorothy2R_resp.dms で Last-Modified ヘッダを上書きしてみるテスト。
Timestamp=ThreadStorage で有効に。

pixiv などの、スクリプト内で複数のアイテムを新規追加する場合は ThreadStorage が使えないので、コメント経由で Last-Modified ヘッダを上書きする機能を追加。
getuploader_r.dms には関係ないが、テストとして Timestamp=Getter で有効に。

という計画性のない実装歴により、Timestamp= の設定がぐちゃぐちゃになっております。

pixiv_api.dms の方は touch.exe と ThreadStorage の方法は実装せず、Timestamp=true で 最後の方法が有効になります。

コメント方式ができて ThreadStorage 方式の意味がなくなったような気もしますが、コメント欄はどんな使われ方をするか分からない怖さがあるので、やむを得ない場合をのぞいては ThreadStorage を使ったほうが安心できます。

今後もアイデアがあれば試行錯誤すると思います。

DMonkey: 関数を返すと元の関数と==にならない

コメントなし»

http://peace.2ch.net/test/read.cgi/win/1437882775/388 より引用。

388 :名無し~3.EXE:2015/11/03(火) 18:09:45.24 ID:J6VV5WH0
function test(f){return f;}
var fn = function(){};
alert(fn == test(fn)); //false

DMonkeyだと何故これがfalseになるんだろう?

確かに……。

分解して調べてみます。

function x () { }
function xx () { return x; }

(function (f) {
  alert (f == x);  // true
}) (x);

alert (xx () == x);  // false

引数として渡す時は問題なく、戻り値として受け取った値が == にならないようです。

Irvine: ActiveDorothyX

コメントなし»

うちの Windows 7 x64、IE11 環境では成功せず。
インストールフォルダは C:\bin\Irvine 。
管理者として実行しても変わらず。

Part31 で「URLを展開して貼り付け」による方法がでたときも不可でしたが、その報告者さんは Windows 8 で、かつ IE11 が公開される前だったので IE10 だったと思われます。

うちは当時 Windows 7 x64、IE8 だったはずなので、やはり IE10 というのが鍵っぽい……?

Irvine: chunkデコードに失敗?

2 個のコメント»

下記サイトの画像を Irvine でダウンロードすると、途中でデータが破損して正しく表示されません。
(小さい画像は問題ありません。)

2015『C88夏コミ』新作アルバム Nostalgie :: SoundCouture

irvine_ng_photoviewer

Internet Explorer で保存したファイルと比較すると一部に違いがあります。

サーバからは Transfer-Encoding: chunked でデータが送信されてきますが、ダウンロードしたファイルには、chunk デコード時にブロックの頭に 0x0a が挿入されてその分末尾の1バイトが失われている、と思わしき領域がいくつかありました。

送信データそのものは正常で、IE 等のブラウザでは正常に表示されますし、common\http.dms の chunk デコード機能でも正常にデコードできます。

今のところ原因不明で、こちらの環境の問題かもしれないし、Irvine の chunk デコード機能のバグかもしれません。

Irvine のバグだとしたら今までに見つかってないのはおかしい気もしますが、長いデータでないと発生しない挙動ならありえるかも。
普通は chunk エンコードされるのは HTML データでかつ短いデータの上、HTML をダウンロードすることは割合としては少ないので。

このサイトは CMS の仕様で静的な画像ファイルも chunk エンコードしてしまうんでしょうね。

Irvine: 『別名で保存』を指定すると同名のファイルがリネームされない

コメントなし»

フォルダ設定の「同名のファイルが有ればリネーム」にチェックを入れると、同名のファイルが存在する(=既に一度ダウンロードが完了している)場合にリネーム([0]、[1]、……の付加)が行われます。

ただし、アイテム設定の「別名で保存」にファイル名を入力した場合はリネームが行われません。

この際フォルダ設定の「リジュームを行う」にチェックが入っていないと
リジュームを行いません → ダウンロードに失敗しました
となります。

一方、「リジュームを行う」にチェックが入っていると、サーバの仕様にもよりますが
プロトコルエラー(416 Requested range not satisfiable) → リジューム開始エラー
となります。
(サーバ上のファイルサイズを超えてデータを要求してしまうため)

いずれにせよダウンロードは失敗したという扱いになります。

しかも、フォルダ設定の「完了していないファイルを隠す」にチェックが入っているとダウンロード完了しているファイルに隠し属性が設定されるというオマケ付きです。

pixiv_r.dms のような Dorothy2 用スクリプトでは「別名で保存」に入力した形でアイテムを登録するので、この挙動が問題になります。
どう対処するのがいいんだろ……。

DMonkey: 関数プロトタイプは同名の関数間で共有される

コメントなし»

スコープとか関係なしに、関数名が同じなら prototype は同じものが使用されます。
匿名関数は匿名関数同士で共有されます。

function a () {
  function f () { }
  f.prototype.foo = 'bar';
}

function b () {
  function f () { }

  alert (f.prototype.foo);  // bar
}

a ();
b ();

alert (
  (function () { }).prototype === (function () { }).prototype
);  // true

ちなみに { }.prototypeObject.prototype を参照してしまいます。