2007年 10月 20日

僕はオタクではありません。

「興味を持てるものがありません」とか「うちこめるものがなにもありません」とかと同じで、恥ずかしいと思うなぁ。できるだけオタクでありたいなぁ。オタクっていえるほどまだまだやりきっていないけど、プログラミング言語ヲタでありたい。 (これを自分の口から「そうです」っていうのはかなり勇気のあることだと思う。あらゆる言語をまぁ知っていますよってことだし……)。

はてスタ

一日経ったら削除できなくなる、とか

memo

秋大根は柔らかい/春大根はかたい。春大根は隠し包丁をいれよ

水 -> 大根 -> くしがとおるまで -> しょうゆ/シーチキン -> 15min -> さます

  • やわらかくなるまでは調味料を加えない

Vim のキーワード補完

ヒットしたキーワードが書かれているファイル名が preview されるけど、意味ないから引数とか表示させたいなぁ……
でも簡単にはできないっぽいなぁ。

Io-2007-10-10.tar.gz addons のロードメモ

libs/iovm/source/IoVMInit.c (.c だけど実際は Io でほとんど書いてある) に書いてあるけど、

searchPaths := list("io/addons", System installPrefix .. "/lib/io/addons")"

から searchPaths/#{addon-name}/build.io があるやつをよむみたい

Io> AddonLoader addons map(name)
==> list("AVCodec", "AppleExtras", "AsyncRequest", "BigNum", "Blowfish", "Box", "CFFI", "CGI", "Cairo", "ContinuedFraction", "Contracts", "Curses", "DBI", "Flux", "Fnmatch", "Font", "GLFW", "Image", "LZO", "LibSndFile", "Libxml2", "Loki", "MD5", "MySQL", "NotificationCenter", "ODE", "ObjcBridge", "OpenGL", "PortAudio", "PostgreSQL", "Postgres", "Python", "QDBM", "Random", "Range", "Rational", "Regex", "SGML", "SHA1", "SQLite", "SQLite3", "SampleRateConverter", "SkipDB", "Socket", "SoundTouch", "SqlDatabase", "Syslog", "SystemCall", "TagDB", "TagLib", "Thread", "UUID", "User", "Zlib")

使えるかどうかはロードしてみるまでわからない。トップレベルで参照しようとするとロードされる。

なので、

mkdir -p io/addons/FooBar
touch io/addons/FooBar/build.io 

とかやって FooBar を評価すると

Io> FooBar
  Exception: unable to read file 'io/addons/FooBar/depends'
  ---------
  contents                            AddonLoader.io 27
  Object FooBar                        Command Line 1

とかでて、なんかやってるのがわかる。

Io squareBrackets ちんこ演算子その他の雑多メモ

[1, 2, 3] は squareBrackets(1, 2, 3) と同じっぽいのだけど、デフォルトだと何にも割りあてられてない。

Io> squareBrackets := getSlot("list")
==> # io/A2_Object.io:401
method(
    call message argsEvaluatedIn(call sender)
)
Io> [1, 2, 3]
==> list(1, 2, 3)
Io> list(1, 2, 3)[0]

  Exception: List does not respond to 'squareBrackets'
  ---------
  List squareBrackets                  Command Line 1

Io> List squareBrackets := List getSlot("at")
==> List_at()
Io> list(1, 2, 3)[0]
==> 1
Io> [1, 2, 3][1]
==> 2

Io ではいろいろメッセージセンドになってる (てきと)。:= は setSlot の言いかえである。すなわち

Io> setSlot = method( "This is penis operator.\n" print )
==> method(
    "This is penis operator.\n" print
)
Io> seme := uke
This is penis operator.
==> This is penis operator.

Io> seme

  Exception: Object does not respond to 'seme'
  ---------
  Object seme                          Command Line 1

ということができる。もちろん上書きしているので変数への代入 (に見えるスロットへのセット) は行なわれない。ついでに uke も評価されないため、エラーが発生しない。仮引数を書かなければ暗黙的な評価はされない。

評価されるケース (仮引数を書いた場合)

Io> setSlot = method(a, b, "This is penis operator. Uke: #{b}\n" interpolate print )
==> method(a, b, 
    "This is penis operator. Uke: #{b}\n" interpolate print
)
Io> seme := "aaa"
This is penis operator. Uke: aaa
==> This is penis operator. Uke: aaa

Io> seme := uke

  Exception: Object does not respond to 'uke'
  ---------
  Object uke                           Command Line 1
  Object setSlot                       Command Line 1

あるいは call evalArgAt(n) で明示的に評価できる。( call sender doMessage(call message argAt(1)) の簡易版 )

Io> setSlot = method(uke := call evalArgAt(1); "This is penis operator. Uke: #{uke}\n" interpolate print )
==> method(
    uke := call evalArgAt(1); "This is penis operator. Uke: #{uke}\n" interpolate print
)
Io> seme := uke

  Exception: Object does not respond to 'uke'
  ---------
  Object uke                           Command Line 1
  Object setSlot                       Command Line 1

Io> seme := "uke"
This is penis operator. Uke: uke
==> This is penis operator. Uke: uke

interpolate というメソッドがでてきたけど、これは #{name} をローカル変数で置換するメソッド (式は書けないっぽい)


ブロックあるいはメソッドは、そのコンテキストに入るときにオブジェクトが一つ割りあてられる。これは JS でいうところの Activation Object (Io でも変数オブジェクトとして使われる) で、やはり直接それをとりだすことはできない?

Io> block( slotNames ) call
==> list("updateSlot", "call", "self")

とやると、上の call evalArgAt(1) で出てきた Call オブジェクトが入った call スロットがあることがわかる。



ちんこ演算子が使える言語なのでおもしろいですね。

2007年 10月 19日

なぜやればいい、という単純なことができないのか

なんなんだろう。こいつ死ねばいいのになぁ……自分っていう人間とは一生つきあっていかなきゃいけない。やだなぁ……

というまた安易な逃げに走る、という、悪循環

眠い

よくわからないのだけれど、昨日、今日と、なんだかめちゃくちゃ眠くてしかたがない。昼からコーヒー飲みまくっているにも関らず、そしてごちゃごちゃとプログラムを書いているにも関わらず、眠い。でも寝ると頭が痛くなる。よくわからない。寝ないと眩暈がする。

HTML/XHTML on Vim

タグ自動で閉じるやつ入れてから書くのが苦じゃなくなったなぁ。xyzzy のときぐらいいい感じ。surround.vim もあるからそれより楽かも

2007年 10月 18日

ngram 類似度 Ruby

無駄なことやりまくる

require "enumerator"

def ngram(data, n)
	ret = []
	data.split(//u).each_cons(n) do |a|
		ret << a.join
	end
	ret
end

def sim(a, b, n)
	agram = ngram(a, n)
	bgram = ngram(b, n)

	all  = (agram | bgram).size.to_f
	same = (agram & bgram).size.to_f

	same / all
end


require "rexml/document"
require "open-uri"
include REXML

entries = []
doc = Document.new(open("http://d.hatena.ne.jp/cho45/rss").read)
doc.elements.each("//item") do |e|
	title = e.elements["title"].text
	link  = e.elements["link"].text
	text = e.elements["content:encoded"].text
	text.gsub!(/<[^>]+>/, "")
	text.gsub!(/¥s+/, " ")
	entries << {
		:title => title,
		:link  => link,
		:text  => text,
	}
end

results = {}
entries.each do |a|
	entries.each do |b|
		next if a[:link] == b[:link]
		key = [a[:link], b[:link]].sort
		next if results[key]
		results[key] = {
			:a => a,
			:b => b,
			:sim => sim(a[:text], b[:text], 3)
		}
	end
end
results.sort_by {|k,i| i[:sim] }.each do |k,v|
	puts "%s: %s" % [v[:a][:link], v[:a][:title]]
	puts "%s: %s" % [v[:b][:link], v[:b][:title]]
	puts v[:sim]
	puts
end