2007年 05月 01日

マウス

Bluetooth マウス欲しい。

Bit by bit!

Good Dog Happy Men は良いなぁ……
彼らはたぶん夏バンドだから、これからもっと良くなるに違いない。

参照渡しを誤解してた

2007年 05月 02日

Lua のオブジェクト指向

できるだけ同じ名前を出さないという方向で書きかたを考えてみる。

#!/usr/bin/lua

List = {
	new = function ()
		return setmetatable({
			-- instance variables
			firstIndex = 0,
			lastIndex  = -1,
		}, { __index = List.prototype })
	end,

	prototype = {
		unshift = function (self, value)
			self.firstIndex  = self.firstIndex - 1
			self[self.firstIndex] = value
			return self
		end,

		push = function (self, value)
			self.lastIndex = self.lastIndex + 1
			self[self.lastIndex] = value
			return self
		end,

		shift = function (self)
			local first = self.firstIndex
			if first > self.lastIndex then
				return nil
			end
			local value = self[first]
			self[first] = nil
			self.firstIndex = first + 1
			return value
		end,

		pop = function (self)
			local last = self.lastIndex
			if self.firstIndex > last then
				return nil
			end
			local value = self[last]
			self[last] = nil
			self.lastIndex = last - 1
			return value
		end,

		clear = function (self)
			for i,v in ipairs(self) do
				self[i] = nil
			end
			self.firstIndex = 0
			self.lastIndex  = -1
		end,

		size  = function (self)
			return self.lastIndex - self.firstIndex + 1
		end,

		first = function (self)
			return self[self.firstIndex]
		end,

		last = function (self)
			return self[self.lastIndex]
		end,
	},
}


l = List.new()
print(l)

-- basic tests
l:push(1)
l:push(2)
assert(l:pop() == 2)
assert(l:pop() == 1)

l:push(1)
l:unshift(2)
assert(l:size()  == 2)
assert(l:first() == 2)
assert(l:last()  == 1)
assert(l:shift() == 2)
assert(l:shift() == 1)

assert(l:size() == 0)
l:push(1)
assert(l:size() == 1)
l:clear()
assert(l:size() == 0)

-- multi-obj tests
l1 = List.new()
l1:push(1)
l:push(1)
l1:push(2)
l:push(2)
assert(l1:pop() == 2)
assert(l:pop()  == 2)
assert(l1:pop() == 1)
assert(l:pop()  == 1)

-- prototype 書きかえてみる
List.prototype.hoge = function ()
	return "hoge"
end
assert(l:hoge() == "hoge")

-- プロトタイプとってきたいとき
assert(getmetatable(l).__index == List.prototype)
print "Tests are completed"

new の中ででてきてしまう。うーん。


Lua は基本的にオブジェクト指向がどうこうっていう話はあんまりなくて、テーブルとメタテーブルをごにょって自分でやるらしい。
あるテーブルはメタテーブルを持てて (そしてメタテーブルもまたテーブルなので、さらにメタテーブルを持てるはず?)、そのメタテーブルに定義された __hoge なキーの値が特別な意味をもってたりする (演算子のオーバーロードもこれでやるみたい。ためしてない)。__index キーには元のテーブルでキーが見付からないときに使われるテーブルをセットする。

self を暗黙的に使うシンタックスもあるけど、名前が何回もでてきてうざくなる。

Lua の OOP , クラスベース

function Class(obj)
	-- metatable も __index も同じにする (再帰参照)
	-- 演算子オーバーロードも直感的に書けるように
	obj.__index = obj
	-- superclass の設定
	setmetatable(obj, { __index = obj.super})
	return setmetatable({
		new = function(...)
			local newObj = {}
			setmetatable(newObj, obj)
			newObj:initialize(unpack(arg))
			return newObj
		end
	}, obj)
end

List = Class { super = nil,
	__tostring = function ()
		return "#<Class List>"
	end,
	
	initialize = function (self, ...)
		self.firstIndex = 0
		self.lastIndex  = -1
		for i,v in ipairs(arg) do self:push(v) end
	end,

	unshift = function (self, value)
		self.firstIndex  = self.firstIndex - 1
		self[self.firstIndex] = value
		return self
	end,

	push = function (self, value)
		self.lastIndex = self.lastIndex + 1
		self[self.lastIndex] = value
		return self
	end,

	shift = function (self)
		local first = self.firstIndex
		if first > self.lastIndex then
			return nil
		end
		local value = self[first]
		self[first] = nil
		self.firstIndex = first + 1
		return value
	end,

	pop = function (self)
		local last = self.lastIndex
		if self.firstIndex > last then
			return nil
		end
		local value = self[last]
		self[last] = nil
		self.lastIndex = last - 1
		return value
	end,

	clear = function (self)
		for i,v in ipairs(self) do
			self[i] = nil
		end
		self.firstIndex = 0
		self.lastIndex  = -1
	end,

	size  = function (self)
		return self.lastIndex - self.firstIndex + 1
	end,

	first = function (self)
		return self[self.firstIndex]
	end,

	last = function (self)
		return self[self.lastIndex]
	end,
}

l = List.new()
print(l)

-- basic tests
l:push(1)
l:push(2)
assert(l:pop() == 2)
assert(l:pop() == 1)

l:push(1)
l:unshift(2)
assert(l:size()  == 2)
assert(l:first() == 2)
assert(l:last()  == 1)
assert(l:shift() == 2)
assert(l:shift() == 1)

assert(l:size() == 0)
l:push(1)
assert(l:size() == 1)
l:clear()
assert(l:size() == 0)

-- multi-obj tests
l1 = List.new()
l1:push(1)
l:push(1)
l1:push(2)
l:push(2)
assert(l1:pop() == 2)
assert(l:pop()  == 2)
assert(l1:pop() == 1)
assert(l:pop()  == 1)

l2 = List.new(1, 2, 3, 4, 5)
assert(l2:pop() == 5)
assert(l2:pop() == 4)
assert(l2:shift() == 1)
assert(l2:shift() == 2)
assert(l2:pop() == 3)

-- prototype 書きかえてみる
getmetatable(l).hoge = function ()
	return "hoge"
end
assert(l:hoge() == "hoge")

List2 = Class { super = List,
	__tostring = function ()
		return "#<Class List2>"
	end,

	initialize = function (self, values)
		self.super.initialize(self, values)
	end,

	test = function (self, str) 
		print(str)
		self:push(str)
	end
}

l2 = List2.new()
print(l2)
l2:test("hoe")
l2:push(1)
l2:push(2)
assert(l2:pop() == 2)
assert(l2:pop() == 1)

print "Tests are completed"

どうだろ

2007年 05月 04日

Lua try catch

pcall とかいう安全な関数呼出なんていう関数があるんだけど、つかいにくい。

ok, err = pcall(function ()
end)
if not ok then exit end

みたいな。

function try(tryFun)
	local suc, err = pcall(tryFun)
	return {
		catch = function (catchFun)
			if not suc then
				catchFun(err)
			end
		end
	}
end


try(function ()
	print "hoge"
	error("error")
end).catch(function (e)
	print(e)
	print "Catched"
end)

とかやってみる。Io の try catch に似てる構造

2007年 05月 05日

GetActersをクラスメソッドに
モブのクラス化

2007年 05月 06日

Ragnarok Online のホムンクルス AI

Lua 云々はこれのためにやっていたやつです。
公式配布のもの (ROのインストールディレクトリの AI 以下) は最小限の機能が最小限の実装で書かれていて、そのままだと読みにくく、書きかえにくい。

なので、とりあえずデフォルトのAIの機能を移植するかたちで、書きやすように OOP 化しはじめてみた ( http://lab.lowreal.net/trac/browser/c/ro/AI/ )

デフォルトの Util.lua にある List テーブルがなぜかクラスではないので List.lua として分離し、ruby っぽいメソッドをいくつか追加した。

l = List.new(1, 2, 3)
l:join() --> "1, 2, 3"

l1 = List.new(4, 5, 6)
l2 = l + l1
l2:map(function (i)
    return i * i
end) --> 1, 4, 9, 16, 25, 36

クラスの実装は http://subtech.g.hatena.ne.jp/cho45/20070502/1178092846 のまま。


GetDistance 系はダサいので、Actor クラスを作ってラップしてある (Actor.lua)。Actor クラスはモンスターやホムやプレイヤーに対して使えるクラス。

a1 = Actor.new(id)
a2 = Actor.new(other_id)

a1:distanceFrom(a2) > 3
a1:isInSight(a2) --> a2 が 20 セル以内にいるとき true
a1:isInAttackSight(a2) --> a2 が攻撃可能な範囲にいるとき true (今は単に 1 セル以内)

a1:isStand() --> a1 が立っているとき true

これによって GetV を使わなくてすむはず。定数を何回も書くのがめんどいのでちょっと楽かなぁと思う。


Homun クラス (Homun.lua) は飼っているホムに使うクラス。Actor のサブクラスになっていて、Actor のメソッドはよべる。

h = Homun.new(myid)
h:owner() --> オーナーキャラ (つまり操作している自分のキャラ) を Actor インスタンスで取得
h:move(x, y) --> x, y に移動
h:attack(target) --> target を攻撃 (attack できる範囲にはいっていないと何もおきないと思う)

スキル使うのはこれから実装する (AIばっかり書いててまだスキルがとれてない)


RO からは AI.lua が呼びだされる。こいつにはデバッグメッセージの出力と、本体でエラーをはいたときに RO のほうに伝達しないようにしてる (RO に伝達すると、ダイアログが表示されまくって Alt-F4 するしかない。さすが! 重力クオリティ!) AI.lua は Main.lua をロードして、Main 関数を実行する。

Main.lua には Main 関数と HogeAI クラスと reload 関数が定義されてる。

Main 関数では HogeAI クラスをインスタンス化して、RO から呼びだしがくるたびに、インスタンス化した AI クラスの act メソッドを呼びだしている。CurrentAI とかいうグローバル変数に突っ込んでいるのは、そのうち切りかえとかできたらなぁとか考えているからだけど、実装できるか謎い。

HogeAI は今つくってる劣化デフォルトAI で、やってることはデフォルト AI とそんな違いはないはず (実装してないのがいくつかある)。デフォルト AI の処理をとりあえず移植したら DefaultAI クラスにでもして、それのサブクラスを作ったらいいかなぁとか思ったけど、まだやってなくてわからない。

Try と xpcall

xpcall とかいう関数ふたつとってエラーキャッチする関数をみのがしてた!!
Try をつかいつづけるか悩む

2007年 05月 07日

気軽

自分は気軽ではないようだ。

GDHM の新譜

ネギが入ってなくて全部新曲だ。それはいいんだけど、ほんとにネギ入れてほしかった。泣く

tex

tex でレポート書いてみるとできあがりが綺麗で内容が割とどうでもよくなって、どうでもいいことをだらだら書いて「見ため的な」内容を水増ししたりしていることになっていたりして、

LDR

レート5 だけ読んだ。

2007年 05月 06日

RO AI

2007年 05月 07日

RO

ホムの状態表示ツールとかで過剰反応して「ツールだ!」とかいう人がいるんだなぁ。ああいう人に言わせたら tail -f もツールなんだろうか。
くだらないことなんかみんな自動化すればいいのに

Lua coroutine で「くるくる」を実装

http://lab.lowreal.net/trac/browser/c/ro/AI/Main.lua?rev=735#L347
してみた。コルーチンの使いかたがよくわかってなくて、callcc みたいに使ってるけど、なんか面白い使いかたないかなぁ。

「コマンドを予約」しておくと、次の AI ループ (RO がわから 140ms ごとによびだされる) のときにコマンドに対応した関数がよばれるようにしてある。http://lab.lowreal.net/trac/browser/c/ro/AI/Main.lua?rev=735#L34

で、

COMMAND[101] = "StepMotion"

でコマンドを定義して、self.resCmds:push({101}) でキューにつっこんでる。なんかダサい。

でもって onStepMotion がよばれるので、onStepMotion には coroutine を resume する関数をいれとく。coroutine.wrap をするとまさにその関数をつくってくれるのでそのまま代入。あとはループ中で条件判断をしつつ呼び出しを RO にかえしてあげて、処理を継続させてる。ループで書けるのはわかりやすいけど、コルーチン自体がわかりにくい感じだ。

Lua における「環境」

Lua では getfenv, setfenv (function env?) という関数を使って環境を取得したり、セットしたりできる。
これは JavaScript における「変数オブジェクト」にアクセスできるイメージかな

a = loadstring([[
function hoge ()
	print("hoge", fuga)
end
]])
local env = {}
-- copy env
for i, v in pairs(_G) do
	env[i] = v
end
setfenv(a, env)

a() -- セットした環境で実行する
env.hoge() -- hoge, nil
env.fuga = "fuga"
env.hoge() -- hoge, fuga

こうすると閉じたところで実行できる。サンドボックスみたいなのが作れそうなのでつくってみよう。

あるいは、

function foo (aaa, bbb)
    local localvariable = "aaa"
    for i, v in pairs(getfenv(1)) do
        print(i, v) -- この関数の変数とその値を列挙
    end
end
foo()

copy env って書いたけど、コピーされずに参照がそのままつっこまれてる。というか再帰的にテーブルをコピーしないとだめだ。

Lua

でも Lua は os.cd とかないから、ファイル書きこみとかされるとうまくいかないなぁ。io.open をフックしたらできるかな。

io._orig_open = io.open
io.open = function (filename, mode)
	return io._orig_open("/tmp/"..filename, mode)
end

でふつうにうまくいった。

Ragnarok Online Lua Shell

似非シェルを作ってみた。
http://lab.lowreal.net/test/RO_AI_shell.PNG
ファイルの読みかき以外はできないので、コマンドを送るようのファイルと、結果を書くファイルふたつを使って ruby プロセスと通信

e は生の eval みたいなもの。i は return をつけただけ。
でも Lua はグローバルで評価されてしまうっぽい。(setfenv は上位変数は見れない?)

でもこれ便利っぽい。うんこソースになってしまったけど実装してよかった

> i  Actor.players():map(function(i) return i.id end):join()
1111, 2222, 3333

とか見れるようになる。

2007年 05月 08日

Lua

os.execute ができるなら、cscript とか ruby ( cscript のが標準だからよさげ) よんでなんかするかはできそう。
スタンドアロンの Lua だと os.execute("dir /B > tmp") とかやると tmp に保存される。os.tmpname() と組みあわせればできそう。でも RO 組みこみの Lua がこれをいつまでやらせてくれるかは謎。

RO AI

2007年 05月 09日

Lua イテレータをコルーチンで実装する。

これはなんか Ruby と似た感じで実装できる。

local itr = coroutine.wrap(function ()
    local i = 1
    while true do
        coroutine.yield(i)
        i = i + 1
    end
end)


for i in itr do
    print(i)
    if i > 10 then break end
end

for in にはイテレータ関数を与える。coroutine.wrap はファンクションを与えるとコルーチン (thread) を生成してそれを resume する関数を返す。

yield の引数が呼び出し元に返って、in の前の変数に代入される。(多値かえして多重代入もできる)

2007年 05月 10日

やっぱ他人のブログ読むのは重要だな。
ブログ書いてるので読んでると、ちょっとその人への考えかたが変わる気がする。

なんか

なんか今日は腹の底のほうにもにょもにょした感じのがたまっていて、気分が悪い。憂鬱だなぁ。いろんなことが不安すぎる。

mac socks

Mac で svn/svk を socks 化する方法がない…… tsocks うごかないしなぁ

MacPorts インストールしなおしたらうごいた。
けど、DNS をやっぱりローカル解決しててだめだ。hosts かけばいいかなぁ

hosts に SSH サーバ先から見たレポジトリの IP 書いて sudo lookupd -flushcache したらいけた

2007年 05月 11日

学校

半期の生物特殊講義が面白い。なんかこう、知識を吸収してるって感じがある。テストができるかは謎だけどw
セントラルドグマの DNA -> RNA -> タンパク質のあたりがおもしろい (DNA と入力しようとすると DNS とうってしまうのをどうにかしたい)
というか今までタンパク質が何なのかさえ知らなかった。アミノ酸がなんなのかとか。DNA の中の遺伝子が保持されている場所はどうやって記録されているかとか

404

取り戻す青春が見つかりません。

器用貧乏な女の子

だいたいのことを平均より少しできる(できるようになることがすぐにできる)女の子について

ヘッドフォン娘の良さは無機質なものとのギャップがメインではない

と思う。そんなんだったら別にヘッドフォンじゃなくていい。

2007年 05月 12日

Lua 末尾再帰最適化

Lua は末尾再帰最適化を行う。ってマニュアルに書いてあるんだけど、ホントカヨーって思って調べてみた。

function pow(x, n)
	if n == 1 then return x end

	return x * pow(x, n-1)
end

function pow_tail(x, n)
	local function pow_f (c, r)
		if c == 0 then
			return r
		else
			return pow_f(c - 1, x * r)
		end
	end

	return pow_f(n, 1)
end

-- print(     pow(2, 1000000000))
-- print(pow_tail(2, 1000000000))

pow は普通の再帰で pow_tail が末尾再帰ばーじょん
pow のほうを実行すると

lua: math1.lua:7: stack overflow
stack traceback:
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        ...
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:7: in function 'pow'
        math1.lua:22: in main chunk
        [C]: ?

でエラー

pow_tail を実行中に途中で C-c で止める

^Clua: interrupted!
stack traceback:
        math1.lua:15: in function <math1.lua:11>
        (tail call): ?
        (tail call): ?
        (tail call): ?
        (tail call): ?
        (tail call): ?
        (tail call): ?
        (tail call): ?
        (tail call): ?
        (tail call): ?
        ...
        (tail call): ?
        (tail call): ?
        (tail call): ?
        (tail call): ?
        (tail call): ?
        (tail call): ?
        (tail call): ?
        (tail call): ?
        math1.lua:23: in main chunk
        [C]: ?

と tail call でスタック情報が消えて ? になってることがわかる。

Lua math ライブラリが遅い?

math ライブラリが遅いって聞いたけど

#!lua
# math1.lua
for i = -5000000, 5000000 do
	math.abs(i)
end
#!lua
# mathrep.lua
function abs(i)
	if i < 0 then return -i else return i end
end

for i = -5000000, 5000000 do
	abs(i)
end
#!lua
# math2.lua
abs = math.abs
for i = -5000000, 5000000 do
	abs(i)
end
$ repeat 5 time lua -v math1.lua
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v math1.lua  2.68s user 0.02s system 99% cpu 2.719 total
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v math1.lua  2.68s user 0.01s system 99% cpu 2.710 total
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v math1.lua  2.68s user 0.01s system 99% cpu 2.712 total
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v math1.lua  2.68s user 0.01s system 99% cpu 2.711 total
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v math1.lua  2.68s user 0.01s system 99% cpu 2.711 total
$ repeat 5 time lua -v mathrep.lua
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v mathrep.lua  2.51s user 0.02s system 98% cpu 2.562 total
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v mathrep.lua  2.52s user 0.02s system 99% cpu 2.548 total
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v mathrep.lua  2.51s user 0.01s system 99% cpu 2.545 total
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v mathrep.lua  2.52s user 0.01s system 99% cpu 2.547 total
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v mathrep.lua  2.51s user 0.01s system 99% cpu 2.547 total
$ repeat 5 time lua -v math2.lua
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v math1.lua  2.17s user 0.01s system 99% cpu 2.195 total
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v math1.lua  2.17s user 0.01s system 99% cpu 2.192 total
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v math1.lua  2.17s user 0.01s system 99% cpu 2.198 total
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v math1.lua  2.17s user 0.01s system 99% cpu 2.191 total
Lua 5.1.1  Copyright (C) 1994-2006 Lua.org, PUC-Rio
lua -v math1.lua  2.17s user 0.01s system 99% cpu 2.193 total

結論:(少なくとも Mac 上の 5.1.1 の math.abs については) テーブルのキーをひくのがおそいだけで、関数自体は math のほうが高速

2007年 05月 14日

全館禁煙の建物の最後の扉直前のところからタバコに火をつけている学生に萎えた。大学ってなんて気持ち悪いのだろう。
そして次の授業がコミュニケーション系でテンションあげないといけない。あがんない。

ベイズ推定

改訂をくりかえす (あの(どの)式一発でもとまるものじゃない) ってのがわかってなくてくるしんだ。

2007年 05月 16日

並列

並列処理面白いなぁ。どうでもいいけどCapistorano shell みたいなのが作りたくなった。

gerry

gerryyyyyyyyyyyyyyyy

brainfuck で FizzBuzz

>+++++++[-<+++++++>]<.>+++++++++++++[-<--->]<.>+++
++[-<++++++++>]<.>+++++[-<-------->]<.>++++++++++[
-<++++++>]<.>+++++++[-<+++++>]<.+++++++++++++++++.
.>++++++++++++++[-<-------->]<.>+++++++[-<++++++>]
<.>+++++++[-<------>]<.>+++++++[-<++++++++>]<.>+++
++++++++++++++[-<+++>]<.+++++..>++++++++++++++[-<-
------->]<.>++++++++++[-<++++++>]<.>+++++++[-<++++
+>]<.+++++++++++++++++..>++++++++++++++[-<--------
>]<.>+++++[-<+++++++++>]<.>+++++[-<--------->]<.>>
+++++++++++[-<++>]<+[-<++>]<.>>+++++++++++[-<++>]<
+[-<-->]<.>++++++++++[-<++++++>]<.>+++++++[-<+++++
>]<.+++++++++++++++++..>++++++++++++++[-<-------->
]<.>+++++++[-<++++++++>]<.>+++++++++++++++++[-<+++
>]<.+++++..>++++++++++++++[-<-------->]<.>++++++++
+++++[-<+++>]<..>+++++++++++++[-<--->]<.>+++++++++
+[-<++++++>]<.>+++++++[-<+++++>]<.++++++++++++++++
+..>++++++++++++++[-<-------->]<.>+++++++++++++[-<
+++>]<.++.>+++++[-<-------->]<-.>+++++++++++++[-<+
++>]<.+++.>+++++++[-<------>]<.>++++++++++[-<+++++
+>]<.>+++++++[-<+++++>]<.+++++++++++++++++..>+++++
++[-<-------->]<.>+++++++++++++++++[-<+++>]<.+++++
..>++++++++++++++[-<-------->]<.>+++++++++++++[-<+
++>]<.+++++.>+++++++++++[-<---->]<.>+++++++++++++[
-<+++>]<.++++++.>+++++[-<--------->]<.>++++++++++[
-<++++++>]<.>+++++++[-<+++++>]<.+++++++++++++++++.
.>++++++++++++++[-<-------->]<.>+++++++++++++[-<++
+>]<.++++++++.>>+++++++++++[-<++>]<+[-<-->]<-.>+++
++++[-<++++++++>]<.>+++++++++++++++++[-<+++>]<.+++
++..>++++++++++++++[-<-------->]<.>++++++++++[-<++
++++>]<.>+++++++[-<+++++>]<.+++++++++++++++++..>++
++++++++++++[-<-------->]<.>+++++[-<++++++++>]<..>
+++++[-<-------->]<.>+++++[-<++++++++>]<.+.>+++++[
-<-------->]<-.>++++++++++[-<++++++>]<.>+++++++[-<
+++++>]<.+++++++++++++++++..>++++++++++++++[-<----
---->]<.>+++++++[-<++++++++>]<.>+++++++++++++++++[
-<+++>]<.+++++..>++++++++++++++[-<-------->]<.>+++
++[-<++++++++>]<.++++.>+++++++++++[-<---->]<.>++++
++++++[-<++++++>]<.>+++++++[-<+++++>]<.+++++++++++
++++++..>++++++++++++++[-<-------->]<.>+++++[-<+++
+++++>]<.++++++.>>+++++++++++[-<++>]<+[-<-->]<.>++
+++[-<++++++++>]<.+++++++.>>+++++++++++[-<++>]<+[-
<-->]<-.>++++++++++[-<++++++>]<.>+++++++[-<+++++>]
<.+++++++++++++++++..>+++++++[-<-------->]<.>+++++
++++++++++++[-<+++>]<.+++++..>++++++++++++++[-<---
----->]<.>+++++[-<++++++++>]<+.--.>+++++++++++++[-
<--->]<.>+++++[-<++++++++>]<+.-.>+++++[-<-------->
]<.>++++++++++[-<++++++>]<.>+++++++[-<+++++>]<.+++
++++++++++++++..>++++++++++++++[-<-------->]<.>+++
++[-<++++++++>]<+.+.>+++++++[-<------>]<.>+++++++[
-<++++++++>]<.>+++++++++++++++++[-<+++>]<.+++++..>
++++++++++++++[-<-------->]<.>++++++++++[-<++++++>
]<.>+++++++[-<+++++>]<.+++++++++++++++++..>+++++++
+++++++[-<-------->]<.>+++++[-<++++++++>]<+.++++.>
+++++[-<--------->]<.>+++++[-<++++++++>]<+.+++++.>
>+++++++++++[-<++>]<+[-<-->]<.>++++++++++[-<++++++
>]<.>+++++++[-<+++++>]<.+++++++++++++++++..>++++++
++++++++[-<-------->]<.>+++++++[-<++++++++>]<.>+++
++++++++++++++[-<+++>]<.+++++..>++++++++++++++[-<-
------->]<.>+++++++[-<++++++>]<.---.>+++++++++++++
[-<--->]<.>++++++++++[-<++++++>]<.>+++++++[-<+++++
>]<.+++++++++++++++++..>++++++++++++++[-<-------->
]<.>+++++++[-<++++++>]<.-.>+++++[-<-------->]<-.>+
++++++[-<++++++>]<..>+++++++[-<------>]<.>++++++++
++[-<++++++>]<.>+++++++[-<+++++>]<.+++++++++++++++
++..>+++++++[-<-------->]<.>+++++++++++++++++[-<++
+>]<.+++++..>++++++++++++++[-<-------->]<.>+++++++
[-<++++++>]<.++.>+++++++++++[-<---->]<.>+++++++[-<
++++++>]<.+++.>+++++[-<--------->]<.>++++++++++[-<
++++++>]<.>+++++++[-<+++++>]<.+++++++++++++++++..>
++++++++++++++[-<-------->]<.>+++++++[-<++++++>]<.
+++++.>>+++++++++++[-<++>]<+[-<-->]<-.>+++++++[-<+
+++++++>]<.>+++++++++++++++++[-<+++>]<.+++++..>+++
+++++++++++[-<-------->]<.>++++++++++[-<++++++>]<.
>+++++++[-<+++++>]<.+++++++++++++++++..>++++++++++
++++[-<-------->]<.>+++++++[-<++++++>]<+.---.>++++
+[-<-------->]<.>+++++++[-<++++++>]<+.--.>+++++[-<
-------->]<-.>++++++++++[-<++++++>]<.>+++++++[-<++
+++>]<.+++++++++++++++++..>++++++++++++++[-<------
-->]<.>+++++++[-<++++++++>]<.>+++++++++++++++++[-<
+++>]<.+++++..>++++++++++++++[-<-------->]<.>+++++
++[-<++++++>]<+.+.>+++++++++++[-<---->]<.>++++++++
++[-<++++++>]<.>+++++++[-<+++++>]<.+++++++++++++++
++..>++++++++++++++[-<-------->]<.>+++++++[-<+++++
+>]<+.+++.>>+++++++++++[-<++>]<+[-<-->]<.>+++++++[
-<++++++>]<+.++++.>>+++++++++++[-<++>]<+[-<-->]<-.
>++++++++++[-<++++++>]<.>+++++++[-<+++++>]<.++++++
+++++++++++..>+++++++[-<-------->]<.>+++++++++++++
++++[-<+++>]<.+++++..>++++++++++++++[-<-------->]<
.>+++++++++++[-<++++>]<.-----.>+++++++++++++[-<---
>]<.>+++++++++++[-<++++>]<.----.>+++++[-<-------->
]<.>++++++++++[-<++++++>]<.>+++++++[-<+++++>]<.+++
++++++++++++++..>++++++++++++++[-<-------->]<.>+++
++++++++[-<++++>]<.--.>+++++++[-<------>]<.>++++++
+[-<++++++++>]<.>+++++++++++++++++[-<+++>]<.+++++.
.>++++++++++++++[-<-------->]<.>++++++++++[-<+++++
+>]<.>+++++++[-<+++++>]<.+++++++++++++++++..>+++++
+++++++++[-<-------->]<.>+++++++++++[-<++++>]<.+.>
+++++[-<--------->]<.>+++++++++++[-<++++>]<.++.>>+
++++++++++[-<++>]<+[-<-->]<.>++++++++++[-<++++++>]
<.>+++++++[-<+++++>]<.+++++++++++++++++..>++++++++
++++++[-<-------->]<.>+++++++[-<++++++++>]<.>+++++
++++++++++++[-<+++>]<.+++++..>++++++++++++++[-<---
----->]<.>+++++[-<+++++++++>]<.------.>+++++++++++
++[-<--->]<.>++++++++++[-<++++++>]<.>+++++++[-<+++
++>]<.+++++++++++++++++..>++++++++++++++[-<-------
->]<.>+++++[-<+++++++++>]<.----.>+++++[-<-------->
]<-.>+++++[-<+++++++++>]<.---.>+++++++[-<------>]<
.>++++++++++[-<++++++>]<.>+++++++[-<+++++>]<.+++++
++++++++++++..>+++++++[-<-------->]<.>++++++++++++
+++++[-<+++>]<.+++++..>++++++++++++++[-<-------->]
<.>+++++[-<+++++++++>]<.-.>+++++++++++[-<---->]<.>
+++++[-<+++++++++>]<..>+++++[-<--------->]<.>+++++
+++++[-<++++++>]<.>+++++++[-<+++++>]<.++++++++++++
+++++..>++++++++++++++[-<-------->]<.>+++++[-<++++
+++++>]<.++.>>+++++++++++[-<++>]<+[-<-->]<-.>+++++
++[-<++++++++>]<.>+++++++++++++++++[-<+++>]<.+++++
..>++++++++++++++[-<-------->]<.>++++++++++[-<++++
++>]<.>+++++++[-<+++++>]<.+++++++++++++++++..>++++
++++++++++[-<-------->]<.>>+++++++++++[-<++>]<+[-<
++>]<.------.>+++++[-<-------->]<.>>+++++++++++[-<
++>]<+[-<++>]<.-----.>+++++[-<-------->]<-.>++++++
++++[-<++++++>]<.>+++++++[-<+++++>]<.+++++++++++++
++++..>++++++++++++++[-<-------->]<.>+++++++[-<+++
+++++>]<.>+++++++++++++++++[-<+++>]<.+++++..>+++++
+++++++++[-<-------->]<.>>+++++++++++[-<++>]<+[-<+
+>]<.--.>+++++++++++[-<---->]<.>++++++++++[-<+++++
+>]<.>+++++++[-<+++++>]<.+++++++++++++++++..>+++++
+++++++++[-<-------->]<.>>+++++++++++[-<++>]<+[-<+
+>]<..>>+++++++++++[-<++>]<+[-<-->]<.>>+++++++++++
[-<++>]<+[-<++>]<.+.>>+++++++++++[-<++>]<+[-<-->]<
-.>++++++++++[-<++++++>]<.>+++++++[-<+++++>]<.++++
+++++++++++++..>+++++++[-<-------->]<.>+++++++++++
++++++[-<+++>]<.+++++..>++++++++++++++[-<-------->
]<.>>+++++++++++[-<++>]<+[-<++>]<+.--------.>+++++
++++++++[-<--->]<.>>+++++++++++[-<++>]<+[-<++>]<+.
-------.>+++++[-<-------->]<.>++++++++++[-<++++++>
]<.>+++++++[-<+++++>]<.+++++++++++++++++..>+++++++
+++++++[-<-------->]<.>>+++++++++++[-<++>]<+[-<++>
]<+.-----.>+++++++[-<------>]<.>+++++++[-<++++++++
>]<.>+++++++++++++++++[-<+++>]<.+++++..>++++++++++
++++[-<-------->]<.>++++++++++[-<++++++>]<.>++++++
+[-<+++++>]<.+++++++++++++++++..>++++++++++++++[-<
-------->]<.>>+++++++++++[-<++>]<+[-<++>]<+.--.>++
+++[-<--------->]<.>>+++++++++++[-<++>]<+[-<++>]<+
.-.>>+++++++++++[-<++>]<+[-<-->]<.>++++++++++[-<++
++++>]<.>+++++++[-<+++++>]<.+++++++++++++++++..>++
++++++++++++[-<-------->]<.>+++++++[-<++++++++>]<.
>+++++++++++++++++[-<+++>]<.+++++..>++++++++++++++
[-<-------->]<.

これイカサマなので注意 (言わなきゃバレない気もするけど)。まじめに書いていたのだけれど、割り算とか出力がめんどうくさすぎるのでやめた。たぶん誰かやってくれる!!!

ちなみに

#!brainfuck
>++++++++++[-<++++++++++>]<
{*100 0}

[[->+>+<<]>>[-<<+>>]<
	{99 *99 0}
	>
		>++++++++++[-<++++++++++>]<
	<
	{99 *99 100}
	[->-<]
	{99 *0 1}
	>>+++++++[-<+++++++>]<.< # plus 49 and output
	? {99 *0 50 0}
	>[-]< # reset

<-]

ここまでであきらめた(はやい

m

instance_eval, inject は必須 Mixin もやりたい。

2007年 05月 17日

バックプロパゲーション

シグモイド関数の e の部分って何が入るんだ。(カーブのきつさが変わるみたいだけど)

自然対数の底ナノカー ありがとうございます。定数なんすね

SSH &lt;RET>~.

昨日聞いた ~. が便利すぎる。(スリープから復帰するとき (killall するようにしてる)、うまく SSH が終了されないときがある。)

SSH の異常終了で screen にアタッチできないとき

そういえば Topia さんに教えてもらった方法をつかった。メモめも。

  1. ps x | grep screen で pts/xx をさがす
  2. ps x | grep pts/xx | grep sshd して kill

あとタイムアウトするまでまてばアタッチできるようになるらしい。知らなかったので screen のセッション kill して起動しなおしてた (ひどい)

MacPorts の Io language

sudo port install iovm

だと、古いのしかはいらない (というかどこにバイナリはいるか謎)

リノリウム

なんかセンチメンタル系だと割とでてくるワードだよね

2007年 05月 20日

電車

電車内で唾はく人が生きているのが信じられないけれど、重要なのはそういう人が実際にいるということだから、電車には気を付けないとだめだなと思った。

夜中の公園

この季節は適当な格好でも寒くないから、散歩にちょうどいい。冬は寒くて外に出たくない。夏は暑くて外に出たくない。

すごく近くに公園があるからそこでぼーっとするのが良い。

もっと落ち着く必要があると思う。


他の人を注意する必要はない。自分の考えが形になれば良い。最終的には独りでやれば良い。それだけのスキルをつけるだけだ。

2007年 05月 21日

謎の勉強会 (twitter ではじまったやつらしい) でしゃべったりしました。

「Ruby とか」のほうは実際には Lua の話です。

AS 関係のかたが多かったので微妙にシクった話をした感じでしたけど気にしない!! もうちょい AS 書かないとだめますね。


参照:


text-hatena.js が nitoyon さんだったっていうのを聞いてびびったりしました。

nitoyon さんのニコニコ動画的プレゼンが素敵だったので見た瞬間から RubyCocoa で書いていたのですが、スキル的に間にあわなかったので、既に書いてあったやつと webrick を組みあわせるだけにしたのですが、やっぱヨコに流れるのがないとつまんねなと思いました。(すなおに Apollo つかえよって感じですが、Apollo のアレが Mac にはいっていないと思いこんでた)

ガッコの講義とかホントあれみたいにやればいいのになぁと思ったけど、変な学生じゃないとそもそもノートPCもってないし、ケイタイだとうつのが遅いのでだめだな。


Flash の開発スタイルを確立したい。なんか書いてるといつここが処理されるんだろう?とか考えて頭がスパゲティになってしまってダメだ。どっから入るのがいいのかなぁ。

風呂オリジンな夜

風呂に入ったのがいつもより数時間はやかったせいか、まだ日をまたいでいないのが不思議な感じがする。

2007年 05月 22日

なんだろ

こう、言語系?コミュニティの良い意味でもキモさというか、ノリのよさは素敵すぎると思います

nib よみ

http://subtech.g.hatena.ne.jp/cho45/20070325#c1175137505 で hisa さんに存在を教えていただいた rb_nibtool.rb を読んでみた。

やってることは *.nib/classes.nib を読んでるだけっぽい。これは実はただの plist で、cat で普通にクラス定義がみれる。Cocoa から plist つかうときは NSPropertyListSerialization とかいうのをつかうらしい。

http://rubyforge.org/frs/?group_id=2632 0.0.4
http://lab.lowreal.net/trac/changeset/786

tex

ちょっと細かいことやろうとするとわけわかんないなぁ。検索しても情報が散乱しててどれが正しいのかわからない。

なんかあきらめて

Keynote 買うかって気分になってきた。学割で 6800 ……

いやいや、だめだよ。じゃあ次はやぱ AS で書いてみようよ

行動にうつすほど悪いところがないというのと、良いところがある、というのはちがう。

学校いるとき自動でミュートに

トンネリングスクリプト (Ruby) の条件分岐に

`osascript -e "set volume 0"`

かいて終わった

Apollo の trace

どこにはかれるんだ!!!
なんか log.as で flash.filesystem よんだほうが確実な気がする。できんのかな
というか adl がブロックするんだから stderr とかにだしてくれたらいいのに

~/Library/Preferences/Macromedia/Flash\ Player/Logs/flashlog.txt
なので普通に mxmlc のアレと同じか

http://subtech.g.hatena.ne.jp/secondlife/20070320/1174399702 にもろに書いてあって、しかもブクマしてた。読んでないでブクマしてるオレがいる! (Apollo はあとでやろうとか思って放置してた)

adl が BUS Error

ExternalInterface よんでるせいだった。

ActionScript の問題点

コミュニティにあんまヲタク臭がしないので入りにくい。

flashlog.txt

ln -s ~/Library/Preferences/Macromedia/Flash\ Player/Logs/flashlog.txt ~/Library/Logs

して Console.app を起動すればログリストに flashlog.txt がでていいかも。

2007年 05月 23日

Timer

なんとなく setInterval を想像して

new Timer(function (e:Event):void {
}, 1000);

みたいなのを想像してたけど、addEventListener つかうんだなぁ。なんかすごいめんどうくさい。start stop があるのは便利だけどなぁ。それらがいらないなら setInterval のほうが気楽なのかな? なにか問題あるんだろうか

マエノメリティ

これはホントに重要だと思う。つたなくてもまえのめる/れ/れば

2007年 05月 24日

編集手帳 (読売新聞)

今日の編集手帳に「人間くさい記述で知られる三省堂の「新明解国語辞典」」とか書いてあってふいた。

新聞の編集手帳とかを読むのは割と好き (高校のとき授業で毎回読まされたんだけど、おもしろかったので今も気がむいたら読んでる)。

Apollo

なんかオブジェクトが急にきえたりする……

座標計算で 0 除算してて、それがどっかに影響してたっぽい。

はじめての Apollo : RO のホムの状況を可視化する。


http://lab.lowreal.net/trac/browser/c/ro/AI/HomunEye

Lua側から状況をてきとうなファイルにてきとうにダンプして、Apollo 側でカレントディレクトリのファイルよ読みこんで随時更新してく感じにしてみた。(Windows ではカレントディレクトリをショートカットつくって作業フォルダを変更すればどこにでもできるのでファイルの置きばをそこにしてる)

上のスクリーンショットだと中央にいるのがホムで、近くにいる Alchemist が自分、ちょい遠くにいるのは移動用ポータル。敵は赤で表示される。オブジェクトが消えるときは点滅しながら消えるようにしてみた。

でもいまいち直感的なインターフェイスじゃないんだよなぁ。たぶんグリッドが動かないからだと思うんだけど……

冷静に考えて、こんなのつくっても誰も試せない。

2007年 05月 25日

なんか

ホテルみたいな、マンションみたいなところに、知りあいの人達がたくさん泊っている夢を見た。部屋は広くなくて質素で、パイプベッドみたいなのとかがあるだけだった。13階立てぐらい。
一階から半階分さがったところにロッカーがたくさんあって、そこにいっぱい人がいた。食事は自分達でやっていた。


それとは別に大学みたいな夢を見た。渋谷を綺麗にした感じの駅で、近くに海があった。既に9月になり、後期がはじまっていたけれど、自分には前期試験の記憶がないので (あたりまえ)、単位がとれているか不安になった。そして後期からの講義の先生ですごく嫌な人がいて、学校をやめたくなった。単位がとれる気がしなかった。

不安になりながら電車にのって帰った。電車に乗っている人がなんだか少なかった。

特別幻想

自分は一般人ではないっていう論調のブログはめんどくさいので購読をやめる。

酔ったきぶんでドメイン名の由来を書いてみる

ドメイン名の由来を書いてみる - 2xup.org からです。だいぶ乗りおくれてしまったので書くかどうかアレ

lowreal.net を取得したのはいつだっけ? そうだな、高校生のころだった、ってことは、いくらモノ覚えのない僕でも覚えている。でも正確な日付は調べなければわからない。

$ whois lowreal.net G "Creation date"
Creation date: 05 Apr 2004 04:03:37

三年以上前らしい。三年前の日記にリンクをはろうと思ったけどキモすぎたのでやめた。自分でも読んでいられない。

とにかくいつとったかっていうと、高校のときで、高校っていうのはすごくつまらなかった。そして BURGER NUDS の LOW NAME という初期のアルバムが好きだったので、それをもじって lowreal にした。たぶん意味的にはクソみたいな現実とかそういうのをイメージしていたと思う。

それ以上とくになかったりする。あんまカッコいいドメインじゃないけど、これだけは最後まで保持するつもりで、パーマリンクが必要な場合はできるだけ lowreal.net にしてる (AS のパッケージとか)


なんかそれだけだとアレなので cho45 の由来も書いてみると、先に「砂糖」があったので C12H22O11 (化学式) を短くしただけです。id:c12h22o11 は使ってない CSS テスト用サブアカです。最初のころは C12H22O11 そのままでした。

砂糖の由来はまたどこかで (説明するのめんどい)

JS

は演算子の挙動変えられないのが悲しい。

2007年 05月 26日

風景描写

(一人称小説で) 風景描写つかって心情表現してるのが好き

2007年 05月 27日

RubyCocoa

まぜてもらうことになった。コマンドラインツールを Ruby で書く (まだ OptionParser でうんぬんするところしか書いてない。とりあえず既存のを組みあわせて一つにしてく、けど、テンプレあたりがよくわかってなかったりする。もともとは Makefile つかったバージョンのサンプルをみながら Rakefile を書いたから、テンプレも Makefile つかうほうのテンプレを Rakefile に置きかえたやつにしたらいいと (とりあえずは使えるから) いいと思うんだけど、よくわかってない)
英語むずい。なにやら高校のときよりも英語力がなくてへなへな。あと入る ML を間違えてた>< (だめすぎ)

伊藤大地 (Good Dog Happy Men, SAKEROCK) が誰かに似ている

ひろゆき

2007年 05月 30日

八重の花

八重の花ってあんまり好きじゃない。たとえば八重のバラとかだと、綺麗だとは思うけれど「ふーん」と思ってしまう。豪華すぎると思う。
濃い赤の花も苦手だ。自己主張が強すぎてかえっていやらしい感じがする。