/ 最近 .rdf 追記 設定 本棚

脳log[2017-03-15~]



2017年03月15日 (水) WSH(JScript)で COBOLアプリケーションのデータファイルを読んで XMLとして書き出して XSLTでソート&HTML化して JavaScriptでフィルタリングして、Firefoxで印刷するなどしていた>20170307, 20170227。フィルタリングは早いうちに特にソートよりも前にしたいのだけど、URLを通して XSLにフィルタリングパラメータを渡す方法がなかったのでしかたなく。パソコンにデータがあるのに手書きでフォームを埋めるとか嫌だよね。フォームごと印刷したれ。■JScriptでやるっていうのは、まあ、.NETがある今は「特にインストールする必要がないっていうのも重要な要素」だとしても意味のない縛りなんだけど、JScript.Netは後付け言語仕様にこれじゃない感があるし、C#はコンパイルが必要だし(他の方法もある?)、PowerShellは実行するまでが面倒くさい>「Windows PowerShell スクリプトを実行する」。それにランタイムは入っていても jsc.exeや csc.exeはないだろう……と思ったけど、例えば C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ にあるのだから、やっぱりどこでも入ってるのかも。今では実行時にコードをあれこれ操作したり作り出したりすることもできるみたいだから、コンパイラのコアもランタイムの一部で、コンパイラはただの UI(ガワ)だったりするだろうか。■データファイルはヘッダ+固定長レコードだった。Shift_JISで読み込むと文字数とバイト数が比例しないし文字コードとバイナリも素直に対応しないので、2バイト単位になるけど Unicodeテキストとして読み込むことでバイナリデータにアクセスできる。こういうときサロゲートペアが2文字扱いになる仕様が重要。ECMAScriptがそうかは知らないけど、よく聞く仕様ではある。■データの型は(桁数を無視すると)3種類だった。Shift_JISの文字列と、Shift_JISの半角数字(※ASCII数字ともいう)と、唯一混ざり込んだバイナリっぽいものが10進1桁を4ビットで表現して最後を 0xC(正符号)でターミネイトした packed decimalだった。これがあるせいで、このバイナリっぽいものがたまたま Shift_JISの先行バイトだったときに、文字数とバイト数の対応や文字コードとバイナリの対応が崩れるせいで、全体を Shift_JISテキストとして読み込んで切り分けることができなかったのだった。■固定長だということや Shift_JISや ASCII文字だということや、16進1桁をそのまま 10進1桁として使用することが、どれもエディタで見てわかることに繋がっていて非常に助かる。可変長だったらヘッダの特定のバイトを読んで長さを確定しないといけないし、テキストデータだからって圧縮されていたら展開しないといけないし、10進3桁(1000通り)を表現するには2進10桁(1024通り)もあれば十分だぜなんて効率を考え出したらバイナリエディタで開いただけで数字が読めたりはしなくなるので。■■■意外に難しい。「4nビットを用いて整数を表現するとき,符号なし固定小数点表示法で表現できる最大値をaとし,BCD(2進化10進符号)で表現できる最大値をbとする。nが大きくなるとa/bはどれに近づくか。」さっきも書いたけど、BCDって言われて10ビットで10進3桁を表現することを考え出すと答えから遠ざかってしまう。■これをダブルクリックしたら入力済みのフォームが表示されるからメニューから印刷したらいいよと一人に説明したら、パソコンに手入力したものを印刷してたのだと思ってたとのこと。そうね、パソコンって使いにくいワープロかもしれないね。

最終更新: 2018-06-09T23:02+0900

[javascript] ビット演算子多めのヘルパーメソッド群

用途はタイトル欄(↑)を参照のこと。JavaScriptのビット演算は事前に整数化が必要なため遅いらしいですよ。

あと、これは JavaScriptではなく JScriptです。関数名でインチキしてるので、って書くまでもなく new ActiveXObject してるのだから明らかだった。

function String.prototype.trim()
{
	return this.replace(/^[\s ]+|[\s ]+$/g, "");
}

function String.prototype.atoi(offset, width) // 引数の単位はバイト。Unicodeにマッピングされた ASCIIではなく、UTF-16の符号単位2バイトを2つの ASCII数字として解釈する。符号は非対応。省略したら文字列の端から端まですべてが対象。
{	// 0x30(0),..., 0x39(9)
	var Offset = offset != null && 0 <= offset && offset < 2*this.length ? (offset>>>0) : 0;
	var Width = width != null && 0 <= width && Offset + width < 2*this.length ? (width>>>0) : 2*this.length - Offset;
	if (Width == 0) {
		return 0; // NaN もありか?
	}
	var x = 0, i = (Offset + 1)>>>1, I = (Offset + Width)>>>1;
	if (Offset & 1) {
		x += (this.charCodeAt(i-1)>>>8) & 0xF;
	}
	if (x == 0) {
		// ありがちな場合のショートカット
		while (i < I && this.charCodeAt(i) == 0x3030) {
			i += 1;
		}
	}
	for (; i < I; ++i) {
		var Ch = this.charCodeAt(i);
		x = x * 10 + (Ch & 0xF);
		x = x * 10 + ((Ch>>>8) & 0xF);
	}
	if ((Offset + Width) & 1) {
		x = x * 10 + (this.charCodeAt(I) & 0xF);
	}
	return x;
}

function String.prototype.asPackedSigned(offset, width) // 引数の単位はいずれもパックされた10進1桁(=4bit)。省略したら文字列の端から端まですべてが対象。
{
	// assert(0 != this.length);
	offset = 0 <= offset ? offset>>>0 : 0;
	width = 1 <= width && width <= 4*this.length-offset ? width>>>0 : 4*this.length-offset;

	var decstr = "";
	for (var i = offset>>>2; i < (offset+width)/4; ++i) {
		var LLHH = this.charCodeAt(i);
		decstr += String.fromCharCode((LLHH>>>4)&0xF|0x30, LLHH&0xF|0x30, (LLHH>>>12)&0xF|0x30, (LLHH>>>8)&0xF|0x30);
	}
	offset &= 3;

	var Sign = {
		"<"/*0x3C*/:+1, "3"/*0x33*/:+1,
		"="/*0x3D*/:-1, "7"/*0x37*/:-1
	}[decstr.charAt(offset+width-1)] || 1;
	return Sign * decstr.substr(offset, width-1); // decstrが 0-9以外の文字(:;<=>?)を含んでると NaN。
}

function String.prototype.endWithSJISLead()
{
	if (! this) {
		return false;
	}
	var Ch = this.charCodeAt(this.length-1) >>> 8;
	return 0x81 <= Ch && Ch <= 0x9F || 0xE0 <= Ch && Ch <= 0xEF;
}

function String.prototype.asSJIS(Mask) // 先頭1バイトを捨てる(Mask=0xFF00), 末尾1バイトを捨てる(Mask=0x00FF), 両方捨てる(Mask=0x0000), そのまま(Mask=0xFFFF,null,undefined)
{
	var Share = {
		old: arguments.callee,
		path: FSO().BuildPath(
			FSO().GetSpecialFolder(2/*TemporaryFolder*/),
			FSO().GetTempName()
		),
		temp: null
	};
	Share.temp = {
		fou: FSO().OpenTextFile(Share.path, 2/*ForWriting*/, true/*creat*/, -1/*Unicode*/),
		fin: FSO().OpenTextFile(Share.path, 1/*ForReading*/, true/*creat*/, 0/*Shift_JIS*/)
	};
	Share.temp.fou.Write(""); // write BOM
	Share.temp.fin.ReadAll(); // drop BOM

	var asSJIS = function(Mask) {
		if (! this) {
			return "";
		}
		if (Mask == null) { // 速度面で意味のあるショートカット。
			Share.temp.fou.Write(this);
			return Share.temp.fin.ReadAll();
		} else {
			var s = this;
			s = String.fromCharCode(s.charCodeAt(0)&(Mask|0xFF00)) + s.slice(1); // s.length == 1 のときを忘れないように。
			s = s.slice(0,-1) + String.fromCharCode(s.charCodeAt(s.length-1)&(Mask|0x00FF)); // s.length == 1 のときを忘れないように。
			Share.temp.fou.Write(s);
			s = Share.temp.fin.ReadAll();
			return s.slice(!(Mask&0x00FF), s.length-!(Mask&0xFF00)); // 後ろから2バイト目が Shift_JISの先行バイトだった場合、捨てるべき1バイトと結びついて1文字になってるだろうから捨てすぎてしまうだろうね。
		}
	};
	asSJIS.clean = function() {
		Share.temp.fou.Close();
		Share.temp.fin.Close();
		FSO().DeleteFile(Share.path);
		String.prototype.asSJIS = Share.old;
	};

	return (String.prototype.asSJIS = asSJIS).call(this, Mask);
	// 循環参照とかありそうでやばくない? 長く実行するわけじゃないけども。
}
function String.prototype.asSJIS.clean()
{
/*
	asSJISを呼び出したのと同じ回数だけ
	ファイルを作成して、削除するのなら、cleanメソッドはいらない。
	一時ファイルが蓄積するのを気にしないのなら、cleanメソッドはいらない。
	どちらも気になるのでテキトーなタイミングで cleanメソッドを呼んで
	一時ファイルを削除する。
	その次の asSJIS呼び出しでまた一時ファイルが作成される。

	この空のメソッドは上記のコメントのために存在しているのではなく、
	一度も asSJISを呼び出さないうちに asSJIS.clean()を呼び出しても
	エラーにならないように置かれている。
*/
}

function Date.prototype.format(Fmt)
{
	var Map = {
		"%": "%"
		,Y : ""+this.getFullYear()
		,m : ("0"+(this.getMonth()+1)).slice(-2)
		,d : ("0"+this.getDate()).slice(-2)
		,H : ("0"+this.getHours()).slice(-2)
		,M : ("0"+this.getMinutes()).slice(-2)
		,S : ("0"+this.getSeconds()).slice(-2)
	};
	return Fmt.replace(/%(.)/g, function($0, $1) {
		return Map[$1] || $0;
	});
}

function Date.prototype.isOlderThan(Other)
{
	return this.valueOf() < Other.valueOf();
}

function FSO()
{
	var FSO_ = new ActiveXObject("Scripting.FileSystemObject");
	return (FSO = function() { return FSO_; })();
}

JScriptの function Declarationはたぶん事前実行される点が違うだけで function Expressionのシンタックスシュガーなんだよね。だからドットでつないだ関数名でプロパティ代入ができる。便利。関数の順番を気にしないで済む。

 @2018-06-09 バグ修正

50行目、String.prototype.asPackedSigned

-	}[decstr.charAt(width-1)] || 1;
+	}[decstr.charAt(offset+width-1)] || 1;

offset が4の倍数でない時に間違った場所を読んでいた。ときどき個数としてありえない負の数が現れて発覚した。2万数千件に対して10数件の割合だったので2か月以上気がつかなかった。無念。

最終更新: 2017-03-17T03:48+0900

[javascript] ビット演算に伴う整数化。符号付き整数化。符号無し整数化。

今まで意識してなかったけど、ビット演算を使って数値を整数化するとき、その結果が符号付き整数か符号無し整数かは重要。ビット演算の前準備としての整数化では32ビット幅への切り詰めが行われるから、すごく大きな正数が切り詰められた結果の32ビット目がたまたま 1 だったときに負数が返ってきたりする。それに驚きたくないなら符号無しのビット演算を使う。

999999999999|0     //=> -727379969
999999999999>>>0   //=> 3567587327
999999999999>>>0|0 //=> -727379969

2017年03月07日 (火) [Vista] 昨日知ったこと。Scripting.FileSystemObjectでバイナリファイルを Unicodeファイルとして読んだとき、それは UTF-16LEと UTF-16BEのどちらとも解釈されうるが、先頭の2バイトを見てもそれはわからない。それならいっそ「UTF-16LEにしか対応していません」の方がよっぽどましなんですよ。どうして UTF-16BEとして解釈されたのかがわからないから、バイトを並べ替える必要があるのかないのか判断がつけづらい。■Scripting.FileSystemObjectが返す Fileオブジェクトのタイムスタンプ(DateLastModifiedとか)が組み込み型の Dateではない謎の型なのって結構な罠。new Date(File.DateLastModified) みたいに Date型のコンストラクタに渡す以外の使い道が見つけられないのに、その唯一の使用法が載っていない。■今日知ったこと。WScript.Arguments.Namedが返す WshNamedオブジェクトは名前付きのコマンドラインオプションに名前でアクセスするために用意されてるんだけど、名前のリストを列挙するメンバーがドキュメントには存在していない。数字を引数にしたり添え字にしたりしても何も引き出せないし、JavaScriptらしく for...in しても列挙できない。この、JavaScriptになじまない感じ、DateLastModifiedを Dateでラップする感じ、フォルダやファイルのコレクションを Enumeratorでラップするのと同じ感じ……。new Enumerator(WScript.Arguments.Named) でキーを列挙できるんだね。初めて知ったよ。WSH5.6の HTMLヘルプの更新日時が 2001年だっていうから、16年目の発見!■まだわかっていないこと。Dateのコンストラクタのひとつが year, month, date,...というパラメータのリストを受けとるんだけど、手元に "2017-03-07".split("-") したような配列がある場合、Functionオブジェクトの applyメソッドを使って引数リストを配列で与えたくなる。だってそうすると変数に入った文字列が時分秒まで含んでいた場合もひっくるめて "2017-03-07 23:34:00".split(/[- :]/) で処理できるから。でも new演算子ってちょっとなじみが悪くて、この場合に組み合わせて使えない感じ。■あ、だめだ。monthは 0-11の範囲の数字なんだった。splitしたそのままでは使えない。


2017年02月28日 (火) 「インスタンス化」■instantiateの訳語だと思うがどうだろう。「インスタンス化」と聞くと「インスタンスにする」と読み下され、当然のように「何を?」という疑問が湧いてくるのだけど……。もちろん答えは、ヒープやスタックから切り出してきた特定のサイズのメモリを、であり、それに特定の解釈を与えてある型・あるクラスのインスタンスに仕立て上げることをインスタンス化と言うのだろうけど、「何を?」というのは注目すべき点ではないので「インスタンス化(=~をインスタンスにする)」という用語を使用することに抵抗を感じる。「(ある型・あるクラスをお手本・鋳型にして)インスタンスを作成する」というのがしっくりくるかな、と。さらに言えばやってることは型抜きなんだから「型抜き」って呼ぶことにすれば……まず伝わらないな。それにクッキーのあれを抜き型と呼びはしても型抜きといえば縁日の何かを指すことが多いらしく、検索に引っかかるのはそればかり。工業的には打ち抜き加工と言うらしいし。■20161214CAppNodeGroupHandle__PostMessageToAllEditors(member-template ver.).txtで書いた「SendMessage/PostMessage版の明示的インスタンス化」というコメントは「SendMessage/PostMessage版のインスタンスを明示的に作成する」にしとけばよかったな。■というようなことをお風呂で(20170215)頭を洗っていて手が塞がっているときに考えていた。■確認したらコメントでは「インスタンス化」ではなく「実体化」という用語を使っていた。受ける印象が違ってこれはこのままでいいんじゃないかと思ってしまうのは、自分の「インスタンス(instance)」という語に対する理解、具体的イメージが乏しいからなんだろうな。なんだ最初から難癖だったのか。an instance=実例、(論拠となる)例。具体的・即物的なイメージをもっとインスタンスという語に対して持てていれば「インスタンス化」と「実体化」という同じことを指す2つの用語から受けるギャップが縮まって、インスタンスとクラス、実体と型を同列に並べる愚を避けることができて、それらあり様の違う対比される二者の間の変換を~化と呼ぶことを自然に受け入れられたのではないか。■とりあえず「インスタンス化」より「実体化」の方が概念を掴みやすくてわかりやすいので使っていこう。


2017年02月27日 (月) [SakuraEditor] bregonig.dllの ver.4.11ってサロゲートペアがペアになってないと、以降のマッチを見逃す……ことがあるんじゃないだろうか。サロゲートのペアを構成しない LOW, HIGHどちらかだけより後ろの方にある \x{0}A がマッチしない。後ろにあるのが \x{0}\x{0} だとしっかりマッチするんだけど。■比較したのは ver.2.00となんだけど、こちらも、HIGH SURROGATEの直後にパターン \x{0}A で表される文字列がくる場合に限りマッチしない。直後でなければマッチするし、直後でもそれが \x{0}\x{0} で表される文字列とパターンであればマッチするし、HIGH SURROGATEが LOW SURROGATEであってもやはりマッチする。■ということを VC++の L"\xD8D8\xDCDC\0A" みたいなリテラル文字列をちょっとずつ修正しながら確かめたんだけど、コンパイルされるから実際の文字コード・バイト列はよくわからんよね。Windowsでワイド文字っていうと Unicodeであり、Windowsで Unicode(符号化文字集合だが符号化方式を指したりもする)っていうと UTF-16LEなんだろうけど。←ここでは BOMの有無を規定していない。こんな勝手なお約束をグローバルルールにしようなんて考えてるとしても無理筋ですよ>「UTF-16LE符号化スキーム/16ビット整数をリトルエンディアンで直列化する。バイト順マーク (BOM) は使用不可。」 使用不可! 無理に決まってんじゃん。そんな期待予測予断を誰かに抱かせようという試みが既に有害だわ。LEは little endianの略で、さっきのは目に見えない情報を UTF-16というエンコーディング名の後にメモ書きしただけですからね。■2種類のパターンの選び方に特に意味はなくて、「U+0000 U+0000 U+0041(大文字A) U+0000」の4文字を多数含むバイナリファイルを置換・整形してるときに気づいたってだけ。エディタは UTF-8で解釈してるからファイルにあるのは 00 00 41 00 の4バイトで(※Stirlingで確かめた)、エディタの内部表現とコンパイラのワイド文字列リテラルが wchar_t列で 0000 0000 4100 0000 だと思う(※たぶん UTF-16LE。LEのバイトオーダーってたぶんこうだよね。sizeof (wchar_t) == 2 なのは処理系依存で VC++だからだってね)。■ところで、サクラエディタがファイルを UTF-8のバイトストリームとして読み込んだとき、文字を構成しない不正なバイトは CCodeBase::BinToText によって「バイナリ1バイトを U+DC00 から U+DCFF までに対応付け」られるらしいことが、ちょろっとソースを読んだ限りでは窺われるんだけど、マッチを見失わせるペアを構成しないサロゲートってこうして生まれるんだね……。


2017年02月24日 (金) 20170212に書いたことで思い出して昔々に読んでいたサイトを再読してるんだけど、これ思いつかないなー>「Tips 71.  点と矩形との領域判定の高速化」■一番最後のコード。x が r.leftより小さいときに比較が意味を成さなくて無条件に成り立つんじゃないかと思って悩んだんだけど、(unsigned int) ってキャストしてることに意味があったのね。その操作はどの命令を選ぶかに影響するだけでコストはかからないんだろうね。コンパイラを黙らせる以外の static_cast/reinterpret_castの使い道を俺は知らなかったよ。アセンブリで考えられないのが弱いんだなあ。■古い記事なんだけど昔のまま残ってるのがいいね。そこからリンクされてる外部のページはやっぱりなくなってたりするんだけど、その中で「Cプログラミング診断室」と「猫でもわかる~」が同じ場所で昔の雰囲気を残したままに残ってるのがさすがだなと思った。■どっちも有名だけど、こんなところで繋がるのか……>「Yanesdk.NETのライセンスについては、NYSLライセンス(http://www.kmonos.net/nysl/)を採用します。


2017年02月23日 (木) 内閣府の「国民の祝日」のCSVがひどい。」■別に CSVで全然問題ないんよ。むしろ間に合ってるならよりプリミティブな方が無駄がないし扱いやすい>20170206。でもその CSVが……。謎の1行目。ヘッダとも言えない2行目。3行目以降は1レコードに3年分のデータが並んでる。日付がプライマリキーだって誰か教えてあげて。■URLすごいな。shuと syuの混用。バージョニングする気のない名前。数年後に差し替えられるのならまだましで、いかにもやっつけ仕事、これっきりで終わりそう。■都道府県別の郵便番号データっていうのが日本郵便から CSV形式でダウンロードできるんだよね。それもまあ、人間が読んでひと加工する必要がありそうなものだけど(※人間が読んでわかるコメントがデータの中に入ってるのは親切なのだと思います……)、住所っていうのが歴史を引きずった一筋縄ではいかないもののせいもあるかもしれない。そういうデータが欲しいと思ったとき当たり前に手に入るって結構いい。たとえひと手間必要でも、ひと手間で済むのだから。これが、住所から郵便番号を引いて付加するマクロから抜き出したものだったりする>「行単位で加工するマクロのための定型(20161216p01)」。■ブコメですごく有用な URLが紹介されていた>「整然データとは何か|Colorless Green Ideas」。■あくまで祝日を中心に据えたいのなら、祝日ごと、名称ごとに列を割り当てるべきだよね。くれぐれも列の再利用はなしで。でもそうするとデータが下に伸びていくというのが固定観念なんだろうか。「midnight-railgun 去年の分のcsv持ってたから見てみたけど普通に2016年から始まってたからどんどん列が増えてく形式みたいね。」右に伸びていくぐらいはちょっと転置してやれば下に伸びていくのと同じなわけで。その(デン)でいくとしても祝日名が何度も現れることの言い訳はできないけどなー。<天皇誕生日がみどりの日が昭和の日がと言い出す人のために張った予防線が「名称ごと(の列)」「列の再利用はなし」です。名前が違えば別の祝日なので潔くスキーマを拡張してください。■振休を気にする人がいるけど、それは国民の祝日を定めたあとで曜日との兼ね合いで起こる派生現象であって、上流のデータに混ぜるべきものではないって解釈でいいんでないかな。好意的に受けとめるなら。■振休は(たぶん)簡単でも「国民の休日 - Wikipedia」は無理だわ。長々と書き連ねられたアドホックな決まり方を読めば、派生現象だとか、国民の祝日と国民の休日と振替え休日は別のものだとか言ってられない。そんな区別はどうでもいいからまとめてデータをよこせと言いたくなる。<でもそのばあい、国民の休日と振替え休日の IDに迷うから(※国民の休日1とか2とかださいしただの方便で嘘だし、シリアルナンバーを本物の IDとして付与するのも形式的で無意味だし)、祝日に個別の列を割り当てるのは諦めて、やっぱり日付を唯一のプライマリキーにしてだね、祝日の連続性は名称からの推測か別データでいいじゃない。■■■@2017-04-22 3月の初めにはそのままの名前でファイルが差し替えられてたみたい。「国民の祝日月日,国民の祝日名称[改行]2016-01-01,元日[改行]...」みたいな、期待通りの中身。たいへんよいですね。最後の行に改行がないのがいいのか悪いのかは知らない。あと月日と年月日は区別して使ってるんだけどなあ。■@2017-08-17 CSV的には「ファイル末尾のレコードの終端には、改行はあってもなくてもよい。」ということに一応なってるらしい。でもテキストファイルとしては……「なぜ gcc はファイルの最後に改行がないと警告を出すのか? - Schi Heil と叫ぶために」■@2017-11-29 やっぱり異端だってことだよ。「12.Enhanced the CSV virtual table so that it accepts the last row of input if the final new-line character is missing.


2017年02月22日 (水) これを読んでいて「Optimizations in Syntax Highlighting, a Visual Studio Code Story」本題とは違うんだけど、はっとさせられたこと。ある行を変更したことで次の行の色分け開始状態が変化したとして、それ以降のどこかの行で変更の前後で状態が変わらなかったら色分けのやり直しを中断できる。■確認手順。1.「脳log[20090808p03] サクラエディタの正規表現キーワードを SHJS相当にしたい。」の SHJS方式の色分けをするサクラエディタを起動する(事前に設定が必要)。2.例えば TypeScriptは自身が JavaScriptで書かれているらしく lib/tsc.jsは 2.6MB・54065行の巨大な JavaScriptファイルだからこれを貼り付けて、ファイルの先頭にカーソルを移動してから JavaScriptのタイプ別設定を適用する。3.Ctrl+Endでファイル末端へ飛ぶことで強制的にすべての色分けを完了させる。およそ10秒待ちます。4.そうすると今は Ctrl+Homeと Ctrl+Endでファイルの先頭と末尾を行き来しても特別な待ち時間はかからない。5.ファイルの先頭の1文字(スラッシュ=複数行コメントを開始するトークンの一部)を削除するとコメントが終了する14行目までの色分けが変化する。それ以降の行は元のままのようだ。6.さてお立ち会い。ここで Ctrl+Endでファイル末尾へ飛ぶとどうなるか。見えていない部分にまで実質の変化をもたらさない変更が伝播していたら、また10秒待たされるだろう。■初回の色分けのプロファイルを取ったら10秒待ちが20秒待ちになったけど、主に何を待っているか>highlighting profile (top 13 of exclusive time consumption for about 20 seconds running).txt. およそ3割の時間を使ってトップの BoSubstWは他の関数の間違いじゃないかと思うけど、bregonig.dll内の関数であることは間違いないだろう。本質とは無関係な部分で時間を空費しているわけではなさそうでひと安心。といっても、他は newとか freeとか atとか nullとか activeなので、メモリと、鬼のように呼ばれまくる軽量アクセサ・軽量状態取得関数なんだけど。


2017年02月17日 (金) Salt and Sanctuary. 2D版ダークソウルともっぱらの評判。奥行きがないぶん立ち回りの幅が限定されるので難易度は低いかな。死ぬけど。■説明が欲しい。ゲーム画面のアイコンの意味さえわからない。サンクチュアリに呼んだ人がエリアに及ぼすステータスアップ効果とか、装備品によるステータスアップ効果とかはようやくわかってきたけど、レベルの数字の下に伸びる3色のバーの意味はまだわからない。■防具の強化は 1%複利。元になる数字が大きいほど鍛え甲斐がある。防具のステータス欄「耐漸撃」と「耐毒」の表記が入れ替わってる。防具の数値がそのままキャラクターの耐性に加算されるわけではない。防具の性能の差は圧縮されてキャラクターに反映される。■特殊な武器は鍛えるのに特殊なアイテムがいるので、変成前に店売りアイテムで強化しておくのがよい。■パラディンで開始してひたすら精神力と体力を上げている。死なないキャラ作り。袋だたきにあってあっさり死ぬけど。■画面左上の体力とスタミナのバーは、長さが変わらないで密度が上がる仕組み。■隠し通路を見つけるのは○ボタン。そこにあるとわかってるのに、斬ったりジャンプしたり体当たりしたりたいまつを掲げたりしても見つけられなくて困った。○ボタンの使い道は、話しかける、アイテムを拾う、致命攻撃をするのに加えて、隠し通路を発見する。


2017年02月16日 (木) 最近たて続けにそういう動画に行き当たって初めて存在を知ったのだけど、足で宝箱を開けるタイプのゲームが少なくとも2つはある。だめ。受け付けない。流血や殺しあいは好まないにしても平気だけど、驚くほど足で蹴り開けるアクションを見続けることに耐えられない。どういうことなんだろう。


2017年02月15日 (水) 手を出してると冷えがつらいのでページを押さえる必要がない Sony Reader がこの時期のお風呂読書に便利。結露は怖いけど。■昨日は持ち込まなかったので思いつくままテキトーなことを考えていた。■子供に体を洗わせるとき、その意義を教えるには、結果としてきれいな体を得るには、体が汚れていることに気づかせなければいけない。それが開始条件で、きれいになったことが終了条件。どこで確認する? 頭のふけ。足の指のまた。また玉袋というのも毎日けっこうな量の垢を産生する活発な部位らしく、一日中下着に覆われていて臭いもこもりやすいので念入りに洗う必要がある。皮膚というのは大事にメンテナンスして長く使うものではなくて次々新しいものに交換していくスタイル。空気清浄機のフィルター交換においては、10年間交換不要なタイプと、2年ごとに交換するフィルターを10年分つけて販売しているタイプがある。どちらを使いたいか。俺は適当に短い周期でリフレッシュしたい。空気清浄機とはファンとフィルターである。ファンとは扇風機の羽根を最初に想像する。実際にはシロッコファンというハムスターの回し車みたいな形のものが付いている。浴室換気扇も、交換前のものはプロペラ型だったが新しいものはシロッコファンだった。空気の流れが直角に変わるからだろうか。フィルターは不織布。不織布と紙の違いとは。布には2種類あるらしく、不織布とそうでない布。普通の布っていうのは織ってある布のことなのか。織るっていうのは糸をタテヨコ格子状に並べることで、機織り機っていうのは布を織る機械なのね。鶴の恩返し。ん? ハタオリのハタってなんだ? 織機(しょっき・おりき)で織ることを機織りって言うんであって、機織り機は一周しておかしなことになってないか、これまで疑わなかったけど。織機とは。TVで自分で織ったものをおみやげにできる海外の旅行先を見た。数十本の縦糸を固定しておいて、横糸を手で移動させる。横糸は縦糸の上下を縫うように移動するわけだけど、縦糸の偶数番目と奇数番目を上下に分けておけば横糸をまっすぐ通すだけで同じ結果になる。なんと画期的なことか。折り返す横糸の処理はどうやるんだろう。次に縦糸の上下を入れ替えると、横糸に対する縦糸のひと縫いが完了するわけだけど、この上下の入れ替え機構がわからない。2本の木の棒に縦糸を結びつけておいたら木の棒が糸の間を通らない(←このレベル)。たしか子供のころのちょっと高級なおもちゃにミニチュアの織機みたいなものがあった気がするけど、今はもうないだろうな。時代だな。……いやいやアマゾンで手織りのための機械が売られてるし、4歳の女の子にプレゼントしたとの最近のレビューもある。変わってない。そして、手織り機なるものが存在するなら、手織り機を使う手織りに対して機織りとは? 機織り機もやっぱりあるんでは。布の模様って織るプロセスに規定されるところがあるよね。例外的に超絶技巧(または手間)を要する模様もあるかもだけど。糸の段階で染めるのではなくあとから染めるのは、一枚の布をキャンバスにできてわりと自由。でも絵を書くように染められるわけではない。そういうのは刺繍か。柄プリントっていうのは夢の画期的技術なんだなあ(棒読み)。なぜなのか。強度か。伝統か。非効率と裏返しの贅沢・希少性か。脳という組織に織り込まれていないソフトウェアとしての意識に強度はあるか……までいくと飛躍が過ぎる。おしまい。■なんでもは知らないけどだいたいなんでも知っている羽川さんにはできない時間つぶしだった。何日か前に「すべては最適化の結果なのです。自分に関係がないもの(基本はすべてこれ)に向ける注意はないのです」と書いたことの帰結だけど、よくないね。布とは、から思考が始まるっていうのはね。そして布を規定するものが anti-布たる不織布。「最近、名前に意味がある、意味を込めようとする人が多い、ということに気付いてきている」と書いたのがたったの9年前だというからその無関心に驚く。いくつでそれに気がついて、お前いくつになったの。■「関西人は「ちゃうわ」「なんやったっけ」などの独り言が多くて誤解されやすい?「めっちゃわかる…」「自分と対話してる」 - Togetterまとめ」■■■@2017-05-16 (3か月経ってから)ググりました。「布(ぬの)とは多数の繊維を薄く広い板状に加工したものを指す。作り方によって織物、編み物(メリヤス生地)、レース、フェルト、不織布に分けられ」(布 - Wikipedia)


2017年02月14日 (火) たしか、ちょっと前に「ないべき」は変だけどどう書き直したらいいのか悩んだのだった>20110319(6年前)。「「ないべき」の話についてちょっとだけ補足(+否定に関する読書案内第2弾) - dlitの殴り書き」■ぬべきのぬは完了の助動詞なので違う。ざるべきはシェイクスピアなのでちょっと仰々しい。結局、べきでないが自然なのだった。■あと注意したいのが、べきは連体形なのであって、終止形はべしだってこと。これに関してはちょっと前に朝日新聞のミニコラムで取り上げられていた。その欄の前回は、疑問文でないところに現れる疑問符についてだった。たしかにイントネーションを理由にして使ってる。■ブコメで挙がってる「ないです」も要注意なんだよね。つまりつい口にしてしまってから、ありませんと言い直したくなることがしょっちゅう。尊敬語や謙譲語にすると語尾ではなく元から形が変わってしまう動詞が、声に出す前に頭の中で先回りしておかないと対応できないのと同じ。


2017年02月12日 (日) すごくありそうな話で、それがまた怖い。「SIerの下請け開発者ってレベル低すぎない? - UXエンジニアになりたい人のブログ」■例によって茶々だけを入れますけれど、このループ for (int i = 0; i < (int) ((bigArray.length + 99) /100); i++) に対してこのコメント「配列を100個ずつに分割するコードなんですよ。えええええ。なんだこれ。99っていったいどこから出てきた?しかもこのコード、コメントなしなんですよ?このコードがコメントなしで伝わるコードなわけないだろと」。書き直させたのがこのループ for (int i = 0; i < bigArray.length; i+=100)(x+N-1)/N (ただし 0<=x, 0<N) っていうのは切り捨て除算で端数を切り上げる定型なのであって、書き直し前と後のループの違いは、ループカウンタが分割後の配列のインデックスになってるか分割前の配列のインデックスになってるかであり、どちらに着目しても結局両方のインデックスを使うのだから大差はない。どちらのループも書ける下請けの人の方が上等ですな。■思い出話。この定型を初めて見たのってビットマップ配列を処理するコードでのこと。ビットマップの横幅は4バイトアラインのためパディングが入ることがあって端数を切り上げたものが実際のバイト幅……みたいなことをよっちゃんいかの人(今はひよこ将棋とかやねうら王の人?)の古いサイト(BM98'S ROOMつう)のどこかで読んだと思う(※嘘を書いてたらそれは俺の記憶違い)。■「たとえば、関数を書くとなると、なにをするにしても、int process() { String str; int i, j; ・・・ return 0; } という書式で書きたがる。まるでそういう決まりがあるかのように。ここで、変数str、i、jは処理の最中にどんどん意味合いが変わる。intでは表現できない情報を返す必要がある場合は戻り値はStringになる。複数の情報を返す場合は、Stringの中にカンマ区切りで情報を記載すし、呼び出し側でカンマ分割して復元する、なんてことを平気でやる。構造体ってなんのためにあるか知ってますか。」 Stringを使ってる時点で言い逃れはできない感じだけど、構造体はレジスタに入らないから関数の戻り値にはできないとか、そういう制限のあるコンパイラがあったと思うんだよね。まさしくそういう決まりがあった。変数の使い回しはスタックの節約とか? 一度たたき込まれたことを律儀に守ってるんじゃあないでしょうか。■「for (int i =0; i < length; i++) { } 繰り返しもこう書かなくてはいけないという明確な意思があるようだ。」 eachだ forEachだ mapだ someだ anyだ everyだ reduceだ selectだと目的ごとにメソッドを選ぶのがわかりやすいか、たったひとつの道具(forループ)を使うのがわかりやすいかは見かたにより判断が分かれる。知識レベルが大きく違っていたり平均レベルが低かったりする多人数が理解できる最大公約数的存在がどちらかといえば……。自分の身の丈をよく知っている。■しかしこの節操のなさは擁護できない。「急にモダンなスタイルのコードが出現した場合、それはどっかからのコピペである。」■「要素に対して加工処理を実行します - function elementProcess(elm)」 あかん、笑う。つくづく思うけど、今どきの言語は識別子に大概の Unicode文字が使えるから、低レベルでドメスティックな現場では日本語を使わないとダメよ。しかしそれであっても、母語であっても、理路整然と矛盾のない文章をすべての人間が書けるというわけではないのだけど(それでも英語で書かせるよりはまし)。■「なぜかパラメータ名に10とかShiftJisとかの値が入ってる。この、パラメータ名とそこに入れる値が区別ついてないっていうパターンは驚くことにかなり頻発する。」 園児や発達障害者ではあったと思うけど、こういう間違い方の事例を集めたものが面白そう。自分を例にして間違えたわけではない理由を考えると、パラメータが取り得る値のひとつを代表値として名前に使用することで、その変数の具体的イメージが掴みやすくはなる。変数名を「文字コード」という総称にするより「シフトJIS(など)」とした方が具体的でわかりやすいという傾向があるのでは? 数学者に関する笑い話のようなエピソードを読んだ。「済みませんが,もう少しわかり易く抽象的に説明して頂けませんか」 自分らは数学者ではないので……。■「「有効状態のものだけを取得」したい場合、isEnabledFalseにはなにを指定すれば良いのだろうか。だれにもわからない。多分本人ですらわからないんじゃないか。繰り返して言うけど、頭がおかしいんだとおもいます。」 あかん、腹がよじれる。車の運転だけじゃない。たぶんコンピュータの方が(平均すると)よっぽどましなプログラミングをする。■ところで仁王っていうゲームの実況動画を見ていたら「装備の重さの、上限に対する比率が100%を超えています」というメッセージが出てきていた。日本語に不自由していますか? 「装備の重さが上限を超えています」ではいかんの? ひょっとして 100%、75%、50%とかの数字に意味があるの? ←「上限」というのと「比率」というのがステータス画面で使用されているキーワードだった。じゃあ……まあ……。


2017年02月11日 (土) 馬鹿な au。以前からのサポートURL(kddi.com)にアクセスするとログインのために au.comに飛ばされ、すぐに kddi.comに戻される。どうしてそんな移動をいちいち気にするのかというと、たかだかログインのためだけに au.comにスクリプトの実行許可を求められ、請求書を確認するためにも(こちらはもう前からなので諦めているが) kddi.comに対してスクリプトの実行を許可しなければいけないからだ。以前は au.comへのアクセスはなかった。利用者の利便ではなく実装者の利便のために認証の委譲をやってるんだろうか。どうして IDとパスワードを送信するだけのために JavaScriptを要求するような無駄をするのだろうか。携帯電話を初めて持った当初から毎月の紙の請求書の送付は無駄だとメール通知を利用していたが、こんなていたらくでは、オンラインでの確認がデフォルトになり紙の請求書が有料化された今こそ毎月無駄紙を送付させなければいけないだろう。無駄が無駄を呼ぶ愚かしさ。■au.comに関しては、CSSを切ればサポートIDを使う方のログインフォームを表示させられることがわかったので、CSSもスクリプトもなしだ。スクリプトで表示したいなら、最初にスクリプトで隠すんだよ。ページ構築がチラ見えするぐらい機能しないよりよっぽどましだし、嫌なら隠さんでいい。サポートIDと auIDという俺には区別のできない2つの IDが併存していることが諸悪の根源。だから片方を隠したくなる。auIDなんていらんよ。■auは www.au.com/supportを新しいサポートページのフロントにしたいみたいだけど、そのページは役に立たないファサードだし、もっといえば新しくログインを受け持つ au.com自体が無用の存在だ。だって結局俺の用があるのも、au.comを経由して行き着く先も、cs.kddi.comであり cs3.kddi.comなんだから、最初から目的地にアクセスさせろと。以前はそうだったろと。■■■「KDDIが2文字ドメイン「au.com」を買収していた | スラド IT