マシンを変えようと、HDDだけ取り外して別のマシンにつないだらハマった。
IPアドレス重複警告がでて、何じゃらほい、と思ったら、とりかえたマシンと元のマシンでIPアドレスが重複してた。
esxiサーバーのコンソールに表示されるmacアドレスと、外にパケットが飛んでいく時に使われるmacアドレスが違ってる上に、実際には古いマシンのNICのアドレスが使われてる。
sshでesxiに入って、/etc/vmware/esx.confを書き換える。
/net/pnic/child[0000]/mac = "00:ac:de:ad:be:ef" /net/pnic/child[0000]/virtualMac = "00:ac:de:ad:be:ef"
という二行を書き換えた。
VMのインスタンスをサスペンド状態にして、移動したら、何もできなくなってこまった。
CPUが違うから復帰もできないし、終了もできない。
こっちもsshでログインして、
まず、
# vim-cmd vmsvc/getallvms
で、vmid(数字)を知る。
# vim-cmd vmsvc/unregister {vmid}で、そのvmを管理対象から外す
viで、vmを編集して
# vi /vmfs/volumes/datastore1/{vmname}/{vmname}.vmxcheckpoint.vmStateを空にする。
checkpoint.vmState = ""
また、管理対象にして、
# vim-cmd solo/registervm /vmfs/volumes/datastore1/{vmname}/{vmname}.vmxでおk
古いしねー
家にあった金メッキしてある高そうなUSBケーブルにしたら認識された。謎
今、Byflowをみなおしてたら、驚く事にほとんど買ってない!
偉いぞ俺。
リスト: http://www.byflow.com/user/ikeji?tag=%E3%82%AC%E3%82%B8%E3%82%A7%E3%83%83%E3%83%882011
速度は遅くてもいいけど容量が必要な感じのストレージ用にUSB-HDDを10TBほど追加。RaidZ運用
http://kuroutoshikou.com/modules/display/?iid=1194 ケースはこれ。
バルクのHDDを通販で買ったのはこれがはじめてかもしれん。
某後輩から購入。買わないわけにはいくまい。
まだ、あまり活用できてない。
NP2を動かしてPC-98モドキとして使うのが幸せだったりする。のか?
秋葉と通販を駆使して、ゲームボーイポケットとワンダースワンを購入。
ワンダースワン(初代)の電池のもちぐあいに感動!
ARMやらんとな、という事ではじめたい。
まあ、買ったのはこれだけど。
まだ、とりあえず開発環境を構築しだだけ、続きはまたこんど。
来年はもっといろいろ買いたい。
1年ぶりぐらいに自作の言語でプログラムを書いていたら、文法エラーの表示がイマイチなのに気がついた。
f = {|a,b,3| hoge()}
みたいなコードを書いてしまった時(3つ目の仮引数名が数字)、できればその場所を指摘して欲しいのだが、
[utils.cc:114] x = {|a,b,3| hoge(); fuga(); }
[utils.cc:117] ^
[interpreter.cc:152] Parse error: End of src not found.
というようなエラーがでる。
SRUはPackrat Parsingをするのだが、エラー表示をどうやったら良いかわからなかったので、なるべく先の方までパースできたのを使っている。
例えば、
flow_statement ← if_statement / while_statement if_statement ← "if" expression "then" ... while_statement ← "while" ....
という文法に
if true some_statement # forgot "then"
という入力を渡すと、
flow_statementにある/の両側は、それぞれ「9文字目でthenが見付からなかった」、「1文字目でwhileが見つからなかった」というエラーを起こすので、前者を採用してバックトラックする。
しかし、頭で書いた例の場合、
statement ← ( let_statement / flow_statement ) eos let_statement ← flow_statement "=" flow_statement
という感じの文法定義になっているので、
1. let_statementに入る。
2. 左辺値"f"をflow_statementがパース
3. fの後ろの"="がlet_statement内の"="にマッチ
4. 右辺値をflow_statementがパースしようとして途中でエラー
5. バックトラックしてlet_statementを抜ける
6. flow_statementの"/"の後ろ側のflow_statementとして"f"を取り出す。
7. statement全体としては成功したので"/"の前側のエラーメッセージは捨てる
8. うしろに余計な文字があるので ")" の後ろでエラー
しかし、エラーは既に破棄されている。
とりあえず、statementの定義を
statement ← ( let_statement / flow_statement !"=") eos
という風にしてみると、少し改善される。
[utils.cc:114] x = {|a,b,3| hoge(); fuga(); }
[utils.cc:117] ^
[interpreter.cc:152] Parse error: } not found.
まだもうちょっと。
案1で解決しない部分は省略可能部、もしくは、任意回の繰り返しの中でおこりえる。
なぜなら、それらの中で起こったエラーがその節ごと不要にできるので無視されてしまうからだ。
無視できないようにするために、誰かの修論を参考にカット演算子を入れてやればいい気がする。
まだ、試してみてないけど、メモのために。
% cat hoge.py
def taky(x,y,z):
if x <= y:
return y
else:
return taky(taky(x-1,y,z), taky(y-1,z,x), taky(z-1,x,y))
print(taky(14,8,0))
% java -jar jython.jar hoge.py
14
-------------------------------------------------------------
Job Name. :java -jar jython.jar hoge.py
Elapsed Time. :133.91s
(User: 126.91s, Kernel: 4.60s, CPU Usage: 98%)
-------------------------------------------------------------
ちなみに
% python hoge.py 14 ------------------------------------------------------------- Job Name. :python hoge.py Elapsed Time. :199.98s (User: 196.78s, Kernel: 0.28s, CPU Usage: 98%) -------------------------------------------------------------
jruby/rubyとの差が興味深い
http://jruby.org/
ある意味佳境
シンボルのハッシュをキャッシュする意味はあんまないのかね。
MRIがyaccだからjayになるのはしかたない。
% cat hoge.rb
def taky(x,y,z)
if(x <= y)
y
else
taky(taky(x-1,y,z), taky(y-1,z,x),taky(z-1,x,y))
end
end
puts(taky(14,8,0))
% ./jruby hoge.rb
14
-------------------------------------------------------------
Job Name. :./jruby hoge.rb
Elapsed Time. :28.03s
(User: 26.83s, Kernel: 0.37s, CPU Usage: 97%)
-------------------------------------------------------------
ちなみに
% ruby -v ruby 1.8.7 (2010-01-10 patchlevel 249) [universal-darwin10.0] % ruby hoge.rb 14 ------------------------------------------------------------- Job Name. :ruby hoge.rb Elapsed Time. :450.82s (User: 435.24s, Kernel: 1.32s, CPU Usage: 96%) -------------------------------------------------------------
https://github.com/jruby/jruby/blob/master/src/org/jruby/RubyContinuation.java#L101
> throw continuation;
えーえーえーえー
% cat callcc.rb
callcc{|c|
p 1
c.call(nil)
p 2
}
first = true
x = callcc{|c| c}
p 3
if(first)
p 4
first = false
x.call(x)
end
p 5
% ruby callcc.rb
1
3
4
3
5
% ./jruby callcc.rb
1
3
4
LocalJumpError: continuations can not be called from outside their scope
call at org/jruby/RubyContinuation.java:97
(root) at callcc.rb:13
http://objectscript.sourceforge.net/
ObjectScript?も結構昔からありそう。
JTBはJTreeよりは良さげ。
% cat hoge.os
function taky(x,y,z){
if(x <= y){
return y;
} else {
return taky(taky(x-1,y,z), taky(y-1,z,x),taky(z-1,x,y));
}
}
writeln(taky(14,8,0));
% java -jar oscript.jar hoge.os
14
-------------------------------------------------------------
Job Name. :java -jar oscript.jar hoge.os
Elapsed Time. :167.16s
(User: 159.01s, Kernel: 0.80s, CPU Usage: 95%)
-------------------------------------------------------------
古くからあるJVMスクリプト処理系
http://java.net/projects/pnuts
サイトは大破。mavenからダウンロードできるとkmizuに聞いた。
http://download.java.net/maven/2/pnuts/pnuts/1.2/pnuts-1.2.jar
自前のコード生成クラスがかっこいい。
% cat hoge.pnut
function taky(x,y,z){
if(x <= y){
return y;
} else {
return taky(taky(x-1,y,z), taky(y-1,z,x),taky(z-1,x,y));
}
}
System.out.println(taky(14,8,0).toString())
% LC_ALL=ja_JP.SJIS luit java -cp pnuts-1.2.jar pnuts.tools.Main hoge.pnut
14
-------------------------------------------------------------
Job Name. :LC_ALL=ja_JP.SJIS luit java -cp pnuts-1.2.jar pnuts.tools.Main hoge.pnut
Elapsed Time. :20.09s
(User: 19.94s, Kernel: 0.51s, CPU Usage: 101%)
-------------------------------------------------------------
http://dynjs.org/
Java7に入ったinvokeDynamic命令を使いたいがために作られたJS処理系
https://github.com/dynjs/dynjs/blob/master/dynjs/src/main/java/org/dynjs/parser/statement/CallStatement.java
とかを見ると、本当にinvokeDynamicに意味あるのか心配になる、、、、
% cat hoge.js
function taky(x,y,z){
if(x <= y){
return y;
} else {
return taky(taky(x-1,y,z), taky(y-1,z,x),taky(z-1,x,y));
}
}
print(taky(14,8,0))
% java -jar dynjs-all.jar hoge.js
(中略)
14.0
-------------------------------------------------------------
Job Name. :java -jar dynjs-all.jar hoge.js
Elapsed Time. :17.96s
(User: 17.61s, Kernel: 0.65s, CPU Usage: 101%)
-------------------------------------------------------------
kmizuに「JVM上で動くスクリプト言語を10個あげろ」と行ったら、pnuts, objectscript, jruby, jython, groovy, clojure, fantom, sisc, BeanShell?, Rhino が出てきたのでこれらも調べたい(願望)
シンプルなテキストチャットを作ろうと思って適当に作ってみました。
http://chat.ikeji.ma/
Comet的な事をしています。
たぶん、
などはすぐには実装されません。
vimで作業中に音楽を聞くのに、
unite.vim,unite-scriptとunite-scriptについてくるサンプルのitunes制御スクリプトのセットを使ってるんだけど、
曲数が増えると、unite.vimを開くのが遅くなる問題がある。
5000曲ぐらいリストにあると20秒ぐらいかかるみたい。
この状態だと、unite.vimを他の事に使うのも厳しくなるので、こいつにひっぱられないように、
unite-scriptを非同期化した。ー>パッチ
vimのsystem関数は多分Cのsystem関数を呼んでるだろう、とあたりをつけて、
コマンドを呼ぶ時に、
( {呼びたいコマンド} > {一時ファイル} ; echo OK > {一時ファイル2} )&
という形にして、
一時ファイル2が作られるのを待ってから結果を取る。
とりあえず、Macでは動いた。Unix(というかsystem関数が呼ぶシェルが)上の形式をサポートしてたら動くと思う。
Windowsのcmd.exeも&が;の代わりに使って、startコマンドか、"rundll32 kernel32.dll,CreateProcess?"的な事をすれば同じ事ができると思うけど、試してない。
どっかにこういうのをやってくれるラッパーがあったりしないかな?