call threading にまともに対応させてみた。とりあえず、通常の状態では、switch/case による命令ディスパッチのほうが高速なようだ(fib/mswin32 調べ)。
ブロックパラメータについて、いろいろ突き詰めて実装した。たぶん、これで完璧だろう。完璧といってくれ。
なんというか、こういう作業は絶対誰もしないだろうレアケースを考えて、それに対応する作業になる。誰も使わないような機能を一生懸命実装するのは、なんとも空しい作業である。
昨日は、まつもとさんが来て、B4の人が来て、ついでに仮想化実装技術勉強会だった。疲れた。
田中さんの突っ込みを受けて、呼び出し側も修正。NODE_YIELD の処理が甘かったので、これも通常のメソッド呼び出しで利用する関数を利用するように変更。大分コードが整理された感じ。なんだかんだで、コンパイラのコードは5000行弱か。そんなに難しいことしてないのにな。
twitter に登録してみた。とりあえず irc につなげないと使う気になれないな。どうしたもんか。
25〜29歳代のITエンジニアの「研究職」での平均年収は600万弱らしい。なんじゃそりゃ。世間ではそんなにもらってるのかよ!
転職したい。
(実のところ、未踏を含めると瞬間風速的にはそれくらいもらえているんだけど、今後はもうないだろうしなぁ)
vista で smb over ssh をやろうとして少しはまる。139 は、ループバックを作っても使えないらしい。で、445 でやったらすんなり使えた。幸せ。
追記:ウソでした。445 でつながるんだけど、読めないし書き込めない。
ニコニコ動画に仮登録いただきありがとうございます。 24時間以内に登録の完了手続きをしてください。 登録情報 [ニックネーム] ササヤン [パスワード] xxx 下記のURLにアクセスすると登録完了となります。 http://www.nicovideo.jp/regist?cmp_rege=xxx ユーザーIDは登録完了手続き後に発行されます。 ※このメールアドレスには返信しないでください。
こんなメールが来てた。spam になってた。
なんだろう、これ。差出人などの詐称はないような気がするんだけど。ちなみに、もちろん登録した記憶はない。
IRCで教えてもらった: SunとJavaとダイナミック言語−JRuby開発者に聞く
Tim:私たちはRubyの発明者であるまつもとさんと強力な関係を維持しています。また、次世代Rubyの開発に関わっている笹口さんともよい関係を持っています。
ごめんなさい、それいただきました……>Sun あと一番上のは「相手(転職支援サービス)がこちらに何を欲してるか」まで考えると、「そんなに」の真偽は自明じゃないかと思います。
GC のバグがさっぱりわからないので、しょうがないので postfix をインストールしてみる。色々困った。
ついでに、quickml, qwik のインストール。どちらも困った。mod_proxy とか、hostname とかで困った。
taRgrey をインストールしてみようと思ったけど、これもさっぱりわからなかったので保留。postgrey と postfix をどうくっつけるのか、その時点でわからんかった。
言ってくれれば、qmail用のgreylistingスクリプトあげるのに。postgreyも(職場で)使ってますが。
本郷で用事があったので、書籍を購入。本郷は危険だ。
もしかして: Code Quality
http://www.okasan.co.jp/movie/index.php
昨日TVで見たんだけど、てっきり Java2Ruby の宣伝かと思った。
http://www.rubycolor.org/maki/d/
ちょっ。
海外スピーカーがゆっくりだったのは、空気を読んでくれたからだと思う。
RubyKaigi 初日、せっかくスーツで行ったのだから、写真の一枚でも残しておけばよかったと後悔。誰か、撮ってたらください。
中川さんの発表で出た「epollとかを使えばいいじゃない」という話。
EventMachine はないんだけど、Fiber をこれと組み合わせると面白いんじゃないかと思ってみた。
APIの思考実験。
io = open(...) # socket とかなんとか f = Fiber.new{ io.read } IO.select_with(io, f) ...
select_with(io, f) は、io で read 可能?になったら f をディスパッチするというもの。select って書いてあるけど、たぶん使わない。しかし、恐ろしいほどしょぼいインターフェースだな。
肝は、fiber (もしくは block)と io を同時に登録するということ。CPS だな。
こんなのとか? http://www.flickr.com/photos/jimgris/537955929/in/set-72157600332802702/
げ、そういえば今年はドメイン切れ予告通知が届いてなかったような……。どうすればいいんでしたっけ?
あとで気づいたんですが、その方式だと Fiber の中でネットワークのIO待ちが必要な処理 (例えば、DBの更新とか、HTTP で post とか) をやると、そこで全体がブロックしてしまうと思います。もし、いろんなライブラリが内部で使う socket の面倒もまとめて見てくれると、Fiber の中で既存のライブラリを気にせずに使えるから便利なんですけど。
サンタクロース巡回問題かと思ったら違った。ので、解いてみようと思う。
wait_tonakais = [] wait_kobitos = [] $players = [] def next_fiber $players << (f = $players.shift) f.yield end 9.times{ $players << Fiber.new{ next_fiber while rand(5) % 2 == 0 wait_tonakais << Fiber.current puts "Tonakai (#{wait_tonakais.size}) reached." (wait_tonakais = []; puts "9 Tonakais are reached.") if wait_tonakais.size == 9 next_fiber while wait_tonakais.include? Fiber.current redo } } 3.times{ $players << Fiber.new{ next_fiber while rand(5) % 2 == 0 wait_kobitos << Fiber.current puts "Kobito (#{wait_kobitos.size}) reached." (wait_kobitos = []; puts "3 Kobitos are reached.") if wait_kobitos.size == 3 next_fiber while wait_kobitos.include? Fiber.current redo } } next_fiber
32行。
やはり、Fiber local ではなく Thread local な何かは要るなぁ。rare case な気はするので、API を追加するべきかどうかは難しい。
JRuby を使ってみた。
str = '' max = 1000 (1..4).map{|e| Thread.new(e){|ti| max.times{ str << ti.to_s } } }.each{|t| t.join} p str
結果:
c:\ko1\src\rb>c:\app\Java\jruby-1.0\bin\jruby t.rb System.java:-2:in `java.lang.System.arraycopy': java.lang.ArrayIndexOutOfBoundsException: null (NativeException) from ByteList.java:497:in `org.jruby.util.ByteList.grow' from ByteList.java:197:in `org.jruby.util.ByteList.append' from ByteList.java:189:in `org.jruby.util.ByteList.append' from RubyString.java:714:in `org.jruby.RubyString.cat' from RubyString.java:1125:in `org.jruby.RubyString.append' from RubyString.java:1136:in `org.jruby.RubyString.concat' from RubyString.java:243:in `org.jruby.RubyString.callMethod' from RubyObject.java:488:in `org.jruby.RubyObject.compilerCallMethodWithIndex' ... 18 levels... from RubyNativeThread.java:73:in `org.jruby.internal.runtime.RubyNativeT hread.run' from :-1 from :-1:in `initialize' Complete Java stackTrace java.lang.ArrayIndexOutOfBoundsException at java.lang.System.arraycopy(Native Method) at org.jruby.util.ByteList.grow(ByteList.java:497) at org.jruby.util.ByteList.append(ByteList.java:197) at org.jruby.util.ByteList.append(ByteList.java:189) at org.jruby.RubyString.cat(RubyString.java:714) at org.jruby.RubyString.append(RubyString.java:1125) at org.jruby.RubyString.concat(RubyString.java:1136) at org.jruby.RubyString.callMethod(RubyString.java:243) at org.jruby.RubyObject.compilerCallMethodWithIndex(RubyObject.java:488) at org.jruby.javasupport.util.CompilerHelpers.doInvokeDynamicIndexed(Com pilerHelpers.java:134) at EVAL14620722.closure2(EVAL14620722:8) at EVAL14620722Blockclosure2xx1.call(Unknown Source) at org.jruby.runtime.CompiledBlock.yield(CompiledBlock.java:87) at org.jruby.runtime.Block.yield(Block.java:186) at org.jruby.RubyInteger.times(RubyInteger.java:166) at org.jruby.RubyIntegerInvokertimes0.call(Unknown Source) at org.jruby.runtime.callback.InvocationCallback.execute(InvocationCallb ack.java:49) at org.jruby.internal.runtime.methods.FullFunctionCallbackMethod.interna lCall(FullFunctionCallbackMethod.java:78) at org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.j ava:79) at org.jruby.RubyObject.compilerCallMethod(RubyObject.java:509) at org.jruby.javasupport.util.CompilerHelpers.doInvokeDynamic(CompilerHe lpers.java:124) at EVAL14620722.closure1(EVAL14620722:7) at EVAL14620722Blockclosure1xx1.call(Unknown Source) at org.jruby.runtime.CompiledBlock.yield(CompiledBlock.java:87) at org.jruby.runtime.CompiledBlock.call(CompiledBlock.java:69) at org.jruby.RubyProc.call(RubyProc.java:173) at org.jruby.RubyProc.call(RubyProc.java:148) at org.jruby.internal.runtime.RubyNativeThread.run(RubyNativeThread.java:73)
誰だよ、JRuby は並列実行サポートしてるって言った奴。
とかそういう話を隣にいた charles にしてみたら、「デバッグ中」という答えが返ってきた。これが嫌だからYARVではネイティブスレッドは並列実行させないんだよ、って言ったら、「あー、CRuby は segv するから大変だよね」という。問題は同じだと思うんだがなあ。
とりあえず、JRuby で並列実行は危険。
眠いよう。寝たら起きられないだろうな。
やっぱり、朝から来る人は少ないんだろうな...。
今年は朝から大盛況でしたね。
callcc を実行すると、なんか免責条項とかが出てきて agree を選ばないと進まないようにするのはどうだろうか。
call-with-no-warranty に名前を変えるとか。
--- cont.c (revision 12471) +++ cont.c (working copy) @@ -308,6 +308,7 @@ volatile int called; volatile VALUE val = cont_capture(&called); + abort(); if (called) { return val; }
(冗談ですごめんなさい)
tel plz. orz
なんというか、とてもやばい。昨日、終わらせることができなかったのがとてもまずい。田中さんがあんな時間まで居座る付き合ってくれるとは思わなかったからなあ。
昨日の田中さんのスクリプトを 100% 通るようにした。
電通大でいろいろしゃべる。
田中さんにいろいろ教えてもらう。
new_yield のところの検査を書いてみました。 とりあえず SEGV します。
YIELDS = [ "yield", "b.yield", "b.call" ] YIELDS.delete "b.yield" unless lambda {}.respond_to? :yield ARGS_TEMPLATES = [ "", "()", "(v1)", "(v1,v2)", "(*v1)", "(v1,*v2)", "(v1,v2,*v3)", ] PROCS = [ lambda {|*v| v }, proc {|*v| v }, Proc.new {|*v| v } ] VALUES = [ nil, 0, [], [0], [[]], [[0]], [[[]]], [0,0], [0,[]], [[],0], [[],[]] ] def perm(vs, n) if n == 0 yield [] else perm(vs, n-1) {|vv| vs.each {|v| yield vv + [v] } } end end ARGS_TEMPLATES.each {|args_template| arg_vars = args_template.scan(/v\d+/) perm(VALUES, arg_vars.length) {|vs| vs2 = vs.dup as = args_template.gsub(/v\d+/) { vs2.shift.inspect } #next if /\*[^\[]/ =~ as results = [] YIELDS.each {|y| code = "def tmp_m(&b) #{y}#{as} end; tmp_m {|*x| x }" #p code r = eval(code) results << r } if results.uniq.length == 1 puts "succ #{as.inspect} #{vs.inspect}\t#{results.map {|rr| rr.inspect}.join("\t")}" else puts "fail #{as.inspect} #{vs.inspect}\t#{results.map {|rr| rr.inspect}.join("\t")}" end } }
SEGVですか? うちだと [BUG] Stack consistency error なのですが。
う、見誤りました。Stack consistency error です。
自分も同じエラーが出ましたが、r12449で直りました。(failは133/1597)