2008年 04月 28日

清く正しく

CARNIVAL

低ビットレートエンコしてノイズ入れて大音量で聴くと気分がとてもいいですね。あとこの曲の PV の後半はなにがなんだかわからないけど腹の底が強く圧縮される感覚があって素敵だと思う。ピロウズまじでかっこいいなぁ。

一貫性

コーディングルールについて、僕はかなり神経質に考えている。プロジェクト全体の一貫性のなさが一番の悪だと思うからだ。そういうものは全く美しくない。汚いコードが、プログラミングをはじめたときから一貫して嫌いだ。コードだけじゃない。GUI のデザイン、特に昔よくあった、何故かボタンとかに無駄に色をつけて Windows の標準 UI を逸脱するようなものとか、そういうのがめちゃくちゃ嫌いだ。

僕はコーディングルールを定めて (というか書いてたら勝手に定まるものだけど)、書きくだしてる。でもそれはいつも守っているとは限らない。もっといい方法をいつも探している。より強い一貫性を探している。読みやすさと、一貫性が最重要なルールなので、それを守っていればそれより下のルールは変えていける。逆に、他人のコードを編集するときは周りのコードからルールをできるだけつかんで、自分が好まなくてもそっちのルールにあわせる。一貫性がなくなるのが嫌だからだ。

とにかく一番嫌なのは、一貫性がないこと、汚いこと。ルールを他人に決めてもらって、その範囲で「できるならなんでもやっていい」は間違っていると思う。

何のためか、誰のためかを忘れないようにするのが重要だと思う。僕は未来の自分が読みやすいようにコードを書いてるから (すなわちそれは、今の自分よりもスキルがある誰かを想定してる)、そのためのコーディングルールを持ってる。

目的を円滑に遂行するために作ったルールなのだから、ルールを守ることを目的にしてはいけない。ただそれだけだ。ルールを作らなくていいという意味じゃない。

コードを読むときは、読めないコードが出てきたときに、読めないことを恥じ、コードを書くときは、読めないコードを書かないようにし、読めないコードを書いてしまったときにはそれを恥じる。そういうバランスが、御互いに必要っていう、あたりまえのことだ。そこにコストを感じすぎるなら、たぶん一緒にやる相手を間違ってる。

2008年 04月 27日

fotolife は画像のサイズを設定できるのと、縮小法が汚くないのがいいっぽい。でもオリジナルを保存するっていう用途では別の使ったほうがよさそう。

言語覚えるのは十分に暇じゃないと無理だ。最初のうちは誰の役にも立たないものしか作れないし、そういう期間は結構長い。ある言語の面白さを熟知するには、暇じゃないといけない。

2008年 04月 26日

日付っぽいもの全てに、現在からの相対時間を付与する

	var walker = document.createTreeWalker(
		document.body,
		NodeFilter.SHOW_TEXT,
		{
			acceptNode : function (node) {
				return NodeFilter.FILTER_ACCEPT;
			}
		},
		false
	);

	var hits = [];

	while (walker.nextNode()) {
		var node = walker.currentNode;
		var str  = walker.currentNode.nodeValue;
		var m    =  /(\d{4})-(\d\d)-(\d\d)|(\d+)年(\d+)月(\d+)日/.exec(str);
		if (m) {
			var time = new Date(
				+(m[1] || m[4]),
				+(m[2] || m[5]) - 1,
				+(m[3] || m[6])
			);

			hits.push({
				match: m,
				node: node,
				date: time
			});
		}
	}

	for (var i = 0, len = hits.length; i < len; i++) {
		var m    = hits[i].match;
		var node = hits[i].node;

		var surround = document.createElement("span");

		var range = document.createRange();
		range.setStart(node, m.index);
		range.setEnd(node, m.index + m[0].length);
		range.surroundContents(surround);

		var info = document.createElement("span");
		var style = info.style;
		style.position = "relative";
		style.top      = "-0.5em";
		style.fontSize = "80%";

		var diff = (new Date()).getTime() - hits[i].date.getTime();
		day = Math.floor(diff / 1000 / 60 / 60 / 24);
		info.appendChild(document.createTextNode("("+day+"日前)"));
		surround.appendChild(info);
	}

obsolete フラグ を見ていて、とりあえず相対時間表示がほしいなぁとおもったので userscript かいた。けど、なんか日本語が Greasemonkey でうまいことマッチしなくてめんどくなった……

TreeWalker で nextNode よんでるところと、実際 DOM を操作しているところを別にしているのは、DOM で子要素にまたマッチするノードを追加したりすると、nextNode() でそれがヒットしてっていう無限ループになるからです (なんか回避策あるのかな)。あとは普通に Range つくってるだけ…… クロスブラウザとか考えたらこんな簡単には書けないだろうなぁ

nextNode よぶ位置だけかえてワンパスにしてみた

	var walker = document.createTreeWalker(
		document.body,
		NodeFilter.SHOW_TEXT,
		{
			acceptNode : function (node) {
				return NodeFilter.FILTER_ACCEPT;
			}
		},
		false
	);

	var node = walker.nextNode();
	while (node) {
		var str  = node.nodeValue;
		var m    =  /(\d{4})-(\d\d)-(\d\d)|(\d+)年(\d+)月(\d+)日/.exec(str);
		var next = walker.nextNode();
		if (m) {
			var time = new Date(
				+(m[1] || m[4]),
				+(m[2] || m[5]) - 1,
				+(m[3] || m[6])
			);

			var surround = document.createElement("span");

			var range = document.createRange();
			range.setStart(node, m.index);
			range.setEnd(node, m.index + m[0].length);
			range.surroundContents(surround);


			var info = document.createElement("span");
			var style = info.style;
			style.position = "relative";
			style.top      = "-0.5em";
			style.fontSize = "80%";

			var diff = (new Date()).getTime() - time.getTime();
			day = Math.floor(diff / 1000 / 60 / 60 / 24);
			info.appendChild(document.createTextNode("("+day+"日前)"));
			surround.appendChild(info);
		}
		node = next;
	}

[niconico:sm3063884] いいうただなー

gerry++