/ 最近 .rdf 追記 設定 本棚

脳log[2017-03-20~]



2017年03月20日 (月) [COSMOS] いつものようにスタートメニューの電源ボタン(※Win7と違ってテキスト無しアイコンだけ)で電源を切ったらスタンバイではなく休止モードになった。なぜだ。コンパネの電源オプションを見たら高パフォーマンス設定が選ばれていて、それに従った動作だった。なぜだ。バランスや省電力設定を選んでもすぐに知らない間に高パフォーマンス設定に切り替わること数日。ハードウェアもソフトウェアも固定化して安定化しきったこのパソコンでそういう邪な変更を持ち込むのは Windows Updateか Avastと相場が決まっている。どちらも前科持ちだ。そういえば Avastといえば、ゲームモードにすると自分とこの宣伝まで抑制して「ゲーム」の邪魔をしないでいてくれるのが偉いのだけど、ゲームだから高パフォーマンス設定にしておいてやったぜってなキングボンビーばりのお節介なんだろうか……。その通り。それで、なんで MPC-BEか Hamana(※DirectXを使用してる(=dllにリンクしてる? LoadLibraryだったら検知できない?)かどうかを基準にして自動登録された?)がアクティブになるたびに高パフォーマンス設定にして、それっきりなの?


2017年03月19日 (日) 収穫1件。文盲(モンモウ)。■「リアルワイ「ぼんよう性高いなwwwwwwwwwwwwwwww」 : 暇人\(^o^)/速報 - ライブドアブログ


2017年03月18日 (土) 前々から疑問なんだけど、「プログラミングするエンジニアに向けたトレンドメディア」であるらしい POSTDはなんでコードを隠すんだろう。読ませたくないの? コードはどうでもいいの? Why does POSTD hide code snippets on it behind fogs.png


2017年03月17日 (金) 面白そうなんやってた。「html5j電子出版部 勉強会「JLREQとCSS」まとめ - Togetterまとめ」■■■[Vista] CPUの温度がいつもより10℃高いから何かと調べたらコアが1つフル稼働していて、原因が svchost.exeだった。svchost.exeの中でもネットワーク関連のサービスをほとんど一手にホストしてるもので、まあこれだろうなと Windows Updateを停止したら落ち着いた。せっせと何時間も意味のあることをやっていたとは考えられないね。


2017年03月16日 (木) 昔はファミ通とか立ち読みしてたけど、今は面白そうなゲーム、実際に買ったゲームの情報が事前にまるで入って来ていない。発売されて、YouTubeのチャンネルをブックマークしてる3人(ぽっち)の実況者の誰かがプレイしてるのを見て、へーこんなのがあるんかー、と知るというのが一番多い。最近発売後に知って次買いそうなのが「HORIZON: ZERO DAWN」。PCモニタに PS2も PS3も PS4も繋がっていて電源を入れるだけという程度にスタンバイしていてこの状況。PS4のシェアボタンは必然だよね。ちなみにソニーのメールマガジン(news@psn.jp.playstation.com)は最近受信が多くてうざいから切ろうかと思ってる。取り上げるタイトルが全然参考にならないんだよね。売りたいゲームとか売れてるゲームとかは俺に向けた情報ではないから刺さらない。■■■右スティックでカメラを動かすらしいのだけど、リバース設定(※)ができないらしい。※右上を見たいときにスティックを左下に倒す設定。これは致命的。たとえばドラクエ7のこだわりのマップ回転操作も、最後まで慣れなかったのだから。最初の実装者は間違えたんじゃないんですよ。2種類の人間がいるってだけなんです。慣れない操作に煩わされて仮想世界を自由に見回せない人間を生まないためには、違いを認めてキーコンフィグを用意するしかないのです。■画面上のカーソルを動かすようにキャラを動かしたり、空中に浮遊しているカメラをスライドさせるのなら「反リバース」設定も自然かもしれない。だから左スティックでのキャラ移動操作には不自然さを感じない(※バイオのラジコン操作もいけるよ!)。でも、仮想世界の覗き窓としてプレイヤーの主観と一致するカメラを、狙った方向に向けるのに自然なスティック操作はどっちかってことですよ。スティックだってのが重要で、スティックを通じて中心にある球体を回転させているわけです。球体の表面にあるレンズを狙った方向に向けるためにスティックをどちらに倒せばいいのか、カメラの三脚を操作するつもりで考えてみてほしい。あるいは首や眼球の筋肉の働きを。■「反リバース」←誰が何を基準にリバースをリバースと決めたのか。反リバース設定こそリバース設定の反対として規定されるものではないのか、という抵抗。■「バージョン1.10 メニュー『SETTING』にX軸を反転する設定を追加」。これだろうか。でも X軸だけ? 左スティックはそのままにできる?


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%複利。元になる数字が大きいほど鍛え甲斐がある。防具のステータス欄「耐漸撃」と「耐毒」の表記が入れ替わってる。防具の数値がそのままキャラクターの耐性に加算されるわけではない。防具の性能の差は圧縮されてキャラクターに反映される。■特殊な武器は鍛えるのに特殊なアイテムがいるので、変成前に店売りアイテムで強化しておくのがよい。■パラディンで開始してひたすら精神力と体力を上げている。死なないキャラ作り。袋だたきにあってあっさり死ぬけど。■画面左上の体力とスタミナのバーは、長さが変わらないで密度が上がる仕組み。■隠し通路を見つけるのは○ボタン。そこにあるとわかってるのに、斬ったりジャンプしたり体当たりしたりたいまつを掲げたりしても見つけられなくて困った。○ボタンの使い道は、話しかける、アイテムを拾う、致命攻撃をするのに加えて、隠し通路を発見する。