2011年 09月 12日

理科系の作文技術 (中公新書 624) - 木下 是雄

木下 是雄

3.0 / 5.0

文章作法学ぶなら (理科系に限らず) とりあえずこれを読んでおけというぐらいの本だそうで、「何か文章を書くコツが書いてある本でも欲しい」と書いたら、すすめられたり、社内の編集の方が他の人に薦めているのを見たりしたので、さっそく買って読んだ。

一度読んだ限りだと、段落をどう構成するかというのが一番参考になった。今まで段落をなんとなくで分けていたけど、トピックセンテンスを意識して必要ないことはひとつの段落に入れるなということで、(もちろん知っている人にとっては当然なんだろうけど) なるほどなあと思った。

他にも、普段気を付けていること (毎日このクソみたいな日記をつけることによって学びとった基本的なこと) も簡潔に纏めてあった。やってきたことに関して、とりあえずそんなに間違ったことを考えているわけではないと分って良かった。こういう本は場合によっては「お前は全く間違ったことをしているぞ」と言われかねないので、おそるおそる読むのだけれど、今回はそうひどいことは言われなかったように思う。

まだ十分生かしきれるほど飲み込めていないので、今後何度も読みかえす必要がある。というかもっと早く読んでいれば… と思った。

プログラミング言語については強く興味を持ち言語仕様を調べたりするのに、自然言語、例えば日本語についてはそんなに仕様を調べたりしないのは変だなとふと思った。

たぶん、間違いに気付きにくいことが大きな違いだと思った。プログラミング言語はコンピュータが解釈するから間違えているのが即座にわかるけれど、自然言語の場合、他人に読んでもらわないと間違いに気付かない。他人に読んでもらうというのはすごく敷居が高いしコストがかかる。そのうえ他人からの間違いの指摘というのは、コンピュータからの指摘と違って、大きく自尊心を傷付けられることがある。

さらに自然言語で特に母国語の場合、言語仕様について特に知らなくても運用できてしまう。なんとなくで使えて、なんとなく理解してもらえてしまうものだから、コンピュータ言語ほど厳密に書こうという動機が生まれない。

また、人間同士の場合、片方が理解しようとしている限り、コミュニケーションのコストをその片方に押し付けてしまうことができる。片方が伝える努力をしなくとも、片方が理解しようとする努力をしている限り、理解しようとしているほうに甘えてしまうことができる。コンピュータ相手であれば、コンピュータは理解しようという気がまるでないので、こちらが一方的に伝える努力をする必要がある。

人工言語であろうが自然言語であろうがコミュニケーション言語には変わりないので、もっと自然言語の仕様について敏感でもいいし、もっと伝えようと努めてもいいなと思った。

文章間の論理の繋りについての感覚がいまいちない。これは日記を書きはじめた当初からずっと感じていることで、なかなか改善しない。読みなおしてあれ?と気付ける範囲であればまだ改善ができるかもしれないけど、読みなおしてもわからないことがある。

「間違いがない」ことを証明できないと、間違いがあるかもしれないという不安からは解放されない。当然そんな証明はできっこないので、文章を書くときはいつも不安である。

Universal Block Protocol

2011年 09月 10日

サービス開発とか向いてないんじゃないか。

思い返してみたけど、事実として成功体験が少なく、別に過剰な思い込みによる勘違いではなかった。

2011年 09月 08日

ACE のシンタックスハイライトルールを独立で使う

function dependon (check, src) {
	return function () {
		var ret = Deferred();
		check = new Function('try { return !!(' + check + ') } catch (e) { return false }');
		if (check()) {
			Deferred.next(function () { ret.call() });
		} else {
			var script = document.createElement('script');
			script.charset = 'utf-8';
			script.src = src;
			document.body.appendChild(script);
			setTimeout(function () {
				if (!check()) {
					setTimeout(arguments.callee, 100);
				} else {
					ret.call();
				}
			});
		}
		return ret;
	};
}

var Supported = {
	'perl' : 'Perl',
	'javascript' : 'JavaScript',
	'css' : 'Css'
};

function highlight (container) {
	container.find('pre.code').each(function () {
		if (/lang-(\S+)/.test(this.className)) {
			var lang = Supported[RegExp.$1.toLowerCase()];
			if (!lang) return;
			var pre  = $(this);
			var code = pre.text();

			Deferred.chain(
				dependon('ace', '/js/editor/ace/ace-uncompressed.js'),
				dependon('require("ace/mode/' + lang.toLowerCase() + '_highlight_rules")', '/js/editor/ace/mode-' + lang.toLowerCase() + '.js')
			).
			next(function () {
				var Tokenizer = require("ace/tokenizer").Tokenizer;

				var rules = require("ace/mode/" + lang.toLowerCase() + "_highlight_rules")[lang + 'HighlightRules'];
				var tokenizer = new Tokenizer(new rules().getRules());

				var parent = document.createDocumentFragment();

				var state = 'start';
				var lines = code.split(/\n/);

				return Deferred.repeat(lines.length, function (i) {
					var line = document.createElement('span');
					line.className = 'line';

					var tokens = tokenizer.getLineTokens(lines[i], state);
					for (var j = 0, it; (it = tokens.tokens[j]); j++) {
						if (it.type == 'text') {
							line.appendChild(document.createTextNode(it.value));
						} else {
							var span = document.createElement('span');
							span.className = it.type;
							span.appendChild(document.createTextNode(it.value));
							line.appendChild(span);
						}
					}

					line.appendChild(document.createElement('br'));
					parent.appendChild(line);

					state = tokens.state;
				}).
				next(function () {
					pre.empty().append(parent);
				});
			}).
			error(function (e) {
				alert(e);
			});

		}
	});
}