暴風ガールズファイトの 3巻は出ない。
いったいファミ通編集部は何を考えているのか。
『暴風ガールズファイト』を読んでいないラノベ読者は何を読んでいるのか。
今や読むのが楽しみなラノベとして "文学少女"シリーズと双璧をなすシリーズだったというのに。
理由がわからない。前回の失敗から今日までに、該当しそうな* Windows Updateはないし。
その期間にあったことといえば、再起動時にディスクチェックを強く薦められて
One of your disks needs to be checked for consistency. You may cancel the disk check, but it is strongly recommended that you continue.
Windows will now check the disk.
結果、いくつかのエラーが訂正されたこと。
CHKDSK is recovering lost files.
Correcting errors in the master file table's (MFT) BITMAP attribute.
Correcting errors in the Volume Bitmap.
Windows has made corrections to the file system.
これしかないという気はするが、バックアップが失敗していたのは去年の二月に Vistaをインストールした当初からで、chkdskも今までに何度か実行している。最近になってエラーが発生して訂正されたことがバックアップ成功の理由?
* こういう素人判断が原因の見落としにつながるのだ、と思われる前に書いておくと、「Definition Update for Windows Defender」が 2/22と 2/28にインストールされただけ。
http://sho.tdiary.net/20080222.html#p01
ここで W31SAと D705iμの例が出ていたので、にっくき(笑)ソニーエリクソンではどうなっているのかを紹介。
補足など。
split()の第一パラメータ separatorが空文字列にマッチするかどうかで結果が異なる。
"".split(" ").length; // 1 (空文字列にマッチしないから) "".split("").length; // 0 (空文字列にマッチするので) "".split(/\s+/).length; // 1 (空文字列にマッチしないから) "".split(/^$|\s+/).length; // 0 (空文字列にマッチするので) function getClasses(element) { return element.className.split(/^$|\s+/); }
上の functionでは classNameが空っぽの時には空文字列の要素を作らないが、頭や尻尾に空白が付いていると空文字列の要素が残る (IEを除いて)。事前にトリミングする手間をかけるくらいなら一個二個の空文字列を気にせず(だけど連続する空文字列の要素は気にしてる) className.split(/\s+/) とする方が好みだな。
IE7と Firefox2で異なる。Firefox2の方が正しいが無限ループに陥りやすい。
var re = /\b/g; // 単語境界にマッチする、幅0のメタ文字。 var str = "012 456 89A"; re.lastIndex = 0; for(var i = 0; i !== 5; ++i) { alert("("+ re.exec(str).index +","+ re.lastIndex +")"); // IE7: (0,1) (3,4) (4,5) (7,8) (8,9) ... // Fx2: (0,0) (0,0) (0,0) (0,0) (0,0) ... }
空文字列にマッチしていれば(IE7でスキップされるマッチがでてくる) exec()の前後で lastIndexの値が変わっていなければ(Fx2でのマッチ回数が IE7より増える) indexと lastIndexが同じならば lastIndexを 1インクリメント、としておくとどちらでも間違いが起こらない。
var re = /\b/g; var str = "012 456 89A"; re.lastIndex = 0; for(var i = 0; i !== 5; ++i) { var index = re.exec(str).index; alert("("+ index +","+ re.lastIndex +")"); // IE7: (0,1) (3,4) (4,5) (7,8) (8,9) ... // Fx2: (0,0) (3,3) (4,4) (7,7) (8,8) ... if(index === re.lastIndex) { ++re.lastIndex; } }
ループで
if(index === re.lastIndex) { ++re.lastIndex; }
なんて分岐を増やすより、文字列末尾にマッチする /$/ を例外として*、正規表現から空文字列にマッチする可能性を排除する方が良さそう。
* /$/.exec("str") の後の lastIndexプロパティは IE7、Fx2とも、最後の文字の次を指す。
コメント欄がないのでここでひっそりつっこんでおきます。
Stringと Boolean(と Numberと Date)だけこのように比較方法を === から == にしたりする必要はなくて、
String.prototype.equals = Boolean.prototype.equals = function(arg){ return this == arg; };
こう。
Object.prototype.equals = function(that) { return this.valueOf() === that.valueOf(); }
これでオブジェクトに関しては同一性をチェックし、プリミティブでは値が等しいかどうかをチェックする。
ところで、配列の場合、
valueOf メソッドの動作は、オブジェクトの種類に応じて異なります
配列の要素は、カンマによって連結される文字列に変換されます。Array.toString メソッドや Array.join メソッドと同じように動作します。
Microsoft JScript 5.5 リファレンス (chm)
と書かれていて同一性のチェックができなさそうに思えるけど、JScript5.7、Firefox(javascript1.5)ともにチェックできていた。
Array.prototype.valueOf() は String、Boolean、Number、Dateのそれと違って特別に用意されてはいなかった。
参照: 15.4 Array オブジェクト (Array Objects)
ということは Object.prototype.valueOf()が呼ばれるはずで、これは thisを返す。
var a = [1]; alert(a.valueOf() === a); // true
JScript5.5のいいかげんなリファレンスを書いた人、出てきなさい。(はじめての言語だった JScriptと HSPのヘルプには、変数の概念から始まる丁寧な説明を受けました。大変感謝しています)
リストを使うと途端にそこから文章に構造がなくなってしまうのが困りもので、できるだけ !!(h4)や !!!(h5)を使うようにしていたのだけど、とうとうリストアイテム内で段落を書けるようにいじってしまった。(少し前の変更で取り除かれた \ エスケープが復活している……)
HikiDoc(r90)のリストアイテムに文章構造(段落)を持ち込むための変更
*li1-p1\ \ li1-p2A\ li1-p2B *li2
li1-p1
li1-p2A li1-p2B
<ul> <li><p>li1-p1</p> <p>li1-p2A li1-p2B</p> </li> <li>li2</li> </ul>
行末の \ は見落としやすいので *-、**-、***- を、前行のリストアイテムを継続する、という意味にするのはどうだろう。
HikiDoc(r90)のリストアイテムに文章構造(段落)を持ち込むための変更2 (以前の変更からの差分なので順番に適用する必要がある)
* li1-p1 *- *-li1-p2A *-li1-p2B *li2
li1-p1
li1-p2A li1-p2B
<ul> <li><p>li1-p1</p> <p>li1-p2A li1-p2B</p> </li> <li>li2</li> </ul>
なぜ *+ でなく *- にしたんだろう……。
最終更新: 2010-03-21T03:27+0900
SHJSの sh_main.jsを高速化したことを以前書いた。(20080204p01)
SHJSのページには動作を確認したブラウザとして以下が挙げられている。
sh_main.jsの修正版は Firefox2と IE7と Opera9で正しく動作することの確認と速度の比較を行っている。
IE6での確認は IE7から戻すのが面倒なので省略する。
Sarari3は Vistaで動くものがダウンロードできるので確認してみたところ動いた。(表示も正常)
いじったことで対応ブラウザが減っていなくて良かった。(IE6は?)
SHJSの作者は Code Conventions for the JavaScript Programming Language や jslint: The JavaScript Verifier かそれに類似した文書を読んでいるに違いない。(これらのページを今日発見した)
というのも、sh_main.jsを JSLintでチェックしてみたが、こういうエラーしか出なかった。
Error: Implied global: document 362, sh_languages 347, window 332
このエラーは JSLint向けにコメントを埋め込めば取り除けるものだし、そうしないと不可避だともいえるもの。
Error: Implied global: document 207 360, sh_languages 332, window 329 Problem at line 73 character 48: Use the array literal notation []. matchCaches = language.matchCaches = new Array(language.length); Problem at line 86 character 17: 'i' is already defined. for(var i = matchCaches.length-1; i !== -1; --i) { Problem at line 97 character 22: 'i' is already defined. for (var i = state.length-1; i !== -1; --i) { Problem at line 110 character 17: 'i' is already defined. var i = (pair[0] & 0x3F); Problem at line 280 character 15: Use '!==' to compare with '0'. while(0 != this._currentStyles.length) { Problem at line 389 character 14: 'node' is already defined. var node = this.free_;
「var array = new Array(length);」を「var array = []; array.length = length;」や「var array = Array.prototype.slice.call({length:length}, 0);」 と書き換えることは拒否する。
(new Array(length)が一番簡潔で自然な書き方)
(JavaScript 1.7の配列内包に書き換えるのには吝かでない)
(一つを除いて) 無視できる警告*ばかりで良かった。
* 無視したら警告の意味がない。forループの変数なんて(古い VC使い以外には)スコープの誤解を招きやすいという理由で、避けなければいけないものの筆頭ともいえる。