2007年 05月 07日

気軽

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

GDHM の新譜

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

tex

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

LDR

レート5 だけ読んだ。

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

とか見れるようになる。