2008年 07月 21日

約5ヶ月間ほど週に5日ぐらい、1時間半から2時間かけて鎌倉に通うニート生活をしていた。うまいこと書けないので [1年後ぐらいに書く]

頭の中に住んでいる、仮想的な敵、最悪のケースの最悪の人の像、というのがあって、彼は日常の中の些細な言葉や行動を増幅して、その言動の原因の最悪のケースを僕に伝えてくる。悪いことがないことはありえない。程度の問題だ。程度の問題だから、増幅されると困る。

なんかやたらめったら自信のある眼をしている大学生と、どんなことにも興味を示さない大学生と、どっちも本当に嫌だ。やたらめったら自信だけあって結局なんもせん、なんもできん、みたいな人にどれだけ殺されそうになったかわからないし、どんなことにも興味を示さない人に、どれだけの僕のやる気を剥されたかわからない。「考えてる」って言葉にするけど、何を考えているか言葉にできない人は実際は全く考えていない。それはかつての僕そのものだ。考えている、と信じこんでるだけで全く何も考えてない。しかも「自分が考えていないこと」に気付きたくないから余計何も書かなくなる。

2008年 07月 20日

ゆの in Ruby エラーメッセージ

クソ長いです

#!/usr/bin/env ruby -Ku
# vim:set ft=ruby:
# ひだまりスケッチ× というファイル名で保存する必要があります
X = 365


















































































































































































































































































































































t = Time.now
t += 7 * 24 * 60 until t.wday == 4
n = t.strftime("X365次は%m月%d日25時25分からです><")
eval "class #{n} < Exception; end"



alias _ raise
$! = Kernel.const_get(n).new(File.read(__FILE__)[/< (.+!)$/, 1])













X / _ / X < 来週も見てくださいね!

出力はこんな風になります。

ひだまりスケッチ×:365: 来週も見てくださいね! (X365次は07月24日25時25分からです><)

方針としては

  • 365行目で raise させる

ってだけです。

Ruby のエラーメッセージはトップレベルの場合

filename:line: message (ErrroClassName)

になります。トップレベルではない場合は in`methodname` が入ってくるのでダメです。そこで _ を raise の alias にすることで、raise と書かなくても例外をゆのっち内で起こせるようにしました。_ には引数がないので、引数なしの raise となり、直前の例外が raise される効果になります。「直前の例外」は $! に入っており、代入することもできるので、例外を生成して直接 $! へ代入しています。

$! へ代入するクラスの名前が、エラーメッセージの括弧内に入るので、オマケで次週の TBS での放送日を入れることにしました。const_name として valid な名前にするのが結構めんどいうえに綺麗にならないですがこんなもんでしょうか。

短かいバージョン ファイル名も行数も関係なし。上のコードは _ でプログラムを抜けて「来週も見てくださいね!」が評価されないのですが、これだとされます。

#!/usr/bin/env ruby -Ku
# vim:set ft=ruby:

class X < (_ = Exception)
	class << self
		def /(o)
			self
		end

		def <(o)
			raise X, o.to_s
		rescue Exception
			$!.set_backtrace(["ひだまりスケッチ×365"])
			raise
		end
	end

end

class Object
	def method_missing(name, *args)
		name
	end
end

X / _ / X < 来週も見てくださいね!
ひだまりスケッチ×365: 来週も見てくださいね! (X)

あぶねー日記にメモらなかった忘れてた

mixi ニュース経由で日記読んでみたらほんと想像力がない人が多くてびっくりする。おれもああなってしまうのかなぁ……もうなってるのかなぁ……

2008年 07月 19日

gerry++

ガムくいすぎ?

Pure DOM なツリービルダー (べんり版 & 総合的には jQuery よりはやいこともあるよ版)

http://subtech.g.hatena.ne.jp/cho45/20071117/1195309573 の便利版

<div class="entry">
	<h2 class="title">#{title}</h2>
	<div class="body">
		#{body}
	</div>
	<div class="info">
		<span class="datetime">#{datetime}</span>
		<span class="author">#{author}</span>
	</div>
</div>

みたいな文字列が template1 に入ってて

var t = dom(template1, parent, {
	title    : "aaa<aaa>",
	body     : "foobar",
	datetime : "2008-07-19(0日前)T20 : 26 : 54+09 : 00",
	author   : "cho45"
});

ってやると #{foobar} がフィルされます。

ってだけだと別に普通にエスケープしながら置換したらいいじゃんって感じですが、返り値が便利です

t.root     //=> div.entry
t.title    //=> h2.title
t.body     //=> div.body
t.info     //=> div.info
t.datetime //=> span.datetime
t.author   //=> span.author

みたいにクラス名に対応する要素が入ってます (ルートは root に)。

ベンチマーク:

- "jQuery only $"        -> $(template1) しているだけ
- "jQuery pre-replaced"  -> #{} を置換してから $(template1)
- "jQuery"               -> $(template1) してから find/end を駆使してテキスト設定
- "dom()"                -> 上記関数使って一括設定

jQuery の find/end は (中身想像すればあたりまえですが) コスト高いです。でも jQuery 使っていて、先に HTML をばーーーって作ってしまってから、操作したい要素を取得したいケースは結構あって、find を使ってしまいがちです (というかそうしないと綺麗に書けない)

dom() だとパースして要素を追加するのと、欲しい要素の列挙を同時にやっているので、その分有利です。それと Pure DOM なのでテーブル関係のBKなハックを入れなくても parent を直接指定すれば問題ないです。

実体/数値参照を展開してないのでそのコード入れたらもっと遅いかもですね。