練炭ブログ

萌え壁紙、Irvine、DMonkey、Proxomitron などの情報を扱ってます。

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

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

Android: 『スマホ最適化アプリの決定版』の発生源が『QRコードリーダー EQS』だった

コメントなし»

android_eqs_1

しばらく前から、Nexus 7 2013 (Android 4.4.4) の通知領域に☆アイコンが表示されるようになりました。
一度消しても時間が経つとまた表示されて鬱陶しい。

android_eqs_2

通知領域を開くと

スマホ最適化アプリの決定版
スマホの「困った」を速攻解決

という広告が表示されます。

android_eqs_3

通知を長押しすれば「アプリ情報」というボタンが表示されるので、タップすると通知を発生させたアプリの管理画面が表示されます。

android_eqs_4

というわけでアンインストールしました。

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 エンコードしてしまうんでしょうね。

Proxomitron: オーガストのサイトのコメントを表示するのに使ってたスクリプト

コメントなし»

過去にコメントにネタ仕込んでたことがあったので作ったけど
結局意味があったのは一回だけだったかな……。

多分もうそういうネタはないんじゃないかと思うので廃棄。

UserScript のヘッダがあるけど実際に使えたかどうか覚えてません。

Read the rest of this entry »

正規表現技術入門 ――最新エンジン実装と理論的背景

コメントなし»

webdb_regexp

読みました。
勉強になりました(小並感

正規表現の入門書というより、正規表現エンジンの実装のための入門書。
正規表現エンジンを書きたいと思っているけどどうすればいいのか分からない、っていう人におすすめ。

一部のページは、Software Design 2013年5月号の正規表現特集に掲載された新屋氏自身の記事(sd_engine.pdf)がベースになっているっぽいです。

第2章
歴史が面白い。
Ken Thompson すごい。
Kleene はクリーネと読むのでしょうか。

p64
「合計が閾値θ(ノード内部)を超えると」は「θ以上」と書くべきではないか気になりましたが、ニューロン業界だとそういう表現をするらしい?

p75
『以降、本書では「POSIXの正規表現」と言えば「ERE」を指す』とあるので心して読み進めましたが、p246とp253でしか言われてない上にどちらもどの仕様かは関係ない意味合いで使われてました。

第3章
p99
TRE はこれでしょうか。
TRE — The free and portable approximate regex matching library.

p105
妥協するという選択肢っていいですね。
メールアドレスの正規表現はもう HTML5 方式だけでいいでしょ。

第4章
p127
「ε遷移の除去」という見出しですがε遷移のやり方を説明しつつ、中盤の「しかし、実はどんなε-NFAでもε遷移を取り除くことができます。……」という段落だけは除去の話をしているのでちょっと分かりにくかったです。

p131

しかし、現代の正規表現エンジンで有限オートマトンベースのマッチングをするもので、
NFA だけを用いるエンジンはほとんどありません。
NFA ベースのマッチングを実装しているエンジンは同時に DFA ベースのマッチングにも
対応しているのです。そのため、本書では有限オートマトンベースのマッチングを用いる
正規表現エンジンを DFA 型の正規表現エンジンと呼んでいます。

これはつまり

  • DFA に変換せず NFA のまま直接処理するエンジン(ごく少数)
  • NFA を DFA に変換して処理するエンジン
  • NFA のまま処理するコードと、NFA を DFA に変換して処理するコードを併せ持つエンジン

を DFA 型と呼んでいるということなのでしょうか。

NFA を DFA に変換して処理するという定義に限定すべきでは。

第4章は

  1. 分岐のない NFA の説明とコード
  2. ε-NFA の説明とコード
  3. 部分集合構成法の説明とコード
  4. DFA の説明とコード

というような順番で説明して欲しかったです。

第5章
p163,173
後方参照に使われるキャプチャにバックトラックが必要なのはなぜ?
いつか鬼雲のソースを読もう。

第6章
p221
固定文字列検索の分野も面白そう。

第7章
p241
(\D+|<\d+>)*[!?]
(\D++|<\d+>)*[!?] が同じというのが分かりません。
手元で試しても違うように見えます

p249
固定文字列検索でもオーバーラップしないという仕様はありえるし、正規表現にかぎらず文字列検索一般に該当する問題で、ただ正規表現の場合はオーバーラップしない仕様でも先読みを使えばオーバーラップさせられる、ということでは。

正規表現でもオーバーラップするものとしては、Mery 2.2.2.4953 | Haijin Boys Online とか Perl6 の overlap とか。

p257
可変長後読みはどこからマッチを開始するのかどうやって決めるのか、パターンを逆向きに構築して一文字ずつ後ろ向きにマッチしていく手法はどうか?とか、いろいろと大変だと昔なにかで見た気がします。

p257
空文字列の繰り返しをVM型エンジンでマッチしようとすると、無限ループになりいずれスタック溢れで止まると思うのですが、そういう問題ではないのでしょうか。

他の章で触れられてはいますがそちらでは最適化の一手としての説明ですし。

JavaScript のこの挙動は、
ECMA-262 Edition 5.1 15.10.2.5 Term

NOTE 4 Step 1 of the RepeatMatcher's d closure states that, once the minimum number of repetitions has been satisfied, any more expansions of Atom that match the empty String are not considered for further repetitions. This prevents the regular expression engine from falling into an infinite loop on patterns such as:

によるものだと思いますが、空文字列にマッチするかどうかは実際にマッチを試して成功してからでないと分からないのに「0回のマッチ(1回もマッチしていない)」として扱われるのが謎。

第8章
p264
VerbalExpressions より Regexp::Assemble を紹介した方がよかったかも。

Appendix
この本のメインディッシュ。
第1~8章のいろいろなところで「○○については Appendix で」という案内が書かれていたりします(各節冒頭のあらすじを除いても14か所くらい)。

もちろん第1~8章だけでも役に立ちます。

・組版的なところ

スペースを網掛け+ルビで表記しているのは分かりやすいです。

第1章以外で正規表現が等幅フォントになっていないのは構わないけど、* が上付きになっているのは注釈記号に見えて紛らわしいので、それだけはなんとかして欲しかった。

図が多くて分かりやすいです。
ただ、この本に限らない一般的な作法ではありますが、図をページの一番下、紙面に余裕がない場合は次ページの一番下に落としてあるのが、本文と図が離れすぎて読みづらいです。正直廃れて欲しい風習……。

スクリーンショットに書き込まれているコメントが、背景色とほとんど同じ色で見づらいです。

ノンブルが文字ごとに上端下端が違うフォントなので、ページをパラパラとめくった時に数字が上下に動いているようで見づらいです。

・以下些細な点。

p43 - 下の方のコードはスクリーンショットなので黒地に白抜きでは。

p64 図2.1 -
(3) 1=x1&x2v=(略) では。
(4) v=¬x1 字が小さくて見えづらいけどマイナスじゃなくて否定記号であってる?

p109 図3.4 - このように塗ったほうがよかったのでは。

p113 - 正規表現が 0*(10*10*)*` と書いてあるように見えるけど、自分の本の印刷の汚れ?

p175 リスト5.16 - 2354行のコメントが薄字になっていない。

p194 -・(?(condition)yes|no)(?(condition)yes)条件式
見出しレベルが違うのと、説明がよく分からない。

p204 図5.21 - a*+a のバイトコード

p217 図6.5 - #1 と #0 を繋ぐ線が矢印になっていない。

p235 - スクリーンショット 6、7行目の正規表現に ^ $ がない。

p242 - 一番上のスクリーンショット 3行目の正規表現に ^ $ がある。

p243 - スクリーンショット 3行目の正規表現に ^ $ がある。1、3行目が [!] になっている。

p265 リスト8.3 - 16行目のコメントが薄字になっていない。

p274 リスト8.6 - 「ですし」がおかしいのと、「数式」が別の意味で二つ使われていて紛らわしい。

p278 - 「これはintegerのdigitが1つ以上存在する」は「integerは数字が1つ以上存在する」あたりの方がよいのでは。

p279 リスト8.8 - integer だけラベルがついていて、上記の表現と相まって余計分かりづらくなっている。

p315 - A A A から C C C までだから 3^3=27 が正しい?

p334 - 索引にハ行がない(ハ行がないとは言ってない)

Catalyst Omega入れたら画面がピンクになった

コメントなし»

RADEON のドライバを入れたのが結構昔なので、たまにはアップデートしてみるかーと Catalyst Omega をインストールしたら画面がピンク色がかって表示されるようになってしまいました。

ドライバがぶっ壊れたかと肝を冷やしましたが、設定を修正して元に戻せました。

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

コメントなし»

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

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

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

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

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

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

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