K.Sasada's Home Page

Diary - 2007 June

研究日記

水無月

_27(Wed)

call threading にまともに対応させてみた。とりあえず、通常の状態では、switch/case による命令ディスパッチのほうが高速なようだ(fib/mswin32 調べ)。

_26(Tue)

ブロックパラメータについて、いろいろ突き詰めて実装した。たぶん、これで完璧だろう。完璧といってくれ。


なんというか、こういう作業は絶対誰もしないだろうレアケースを考えて、それに対応する作業になる。誰も使わないような機能を一生懸命実装するのは、なんとも空しい作業である。


昨日は、まつもとさんが来て、B4の人が来て、ついでに仮想化実装技術勉強会だった。疲れた。


田中さんの突っ込みを受けて、呼び出し側も修正。NODE_YIELD の処理が甘かったので、これも通常のメソッド呼び出しで利用する関数を利用するように変更。大分コードが整理された感じ。なんだかんだで、コンパイラのコードは5000行弱か。そんなに難しいことしてないのにな。

_shiro(Tue Jun 26 05:18:29 JST 2007)

誰も使わないような機能 そう思って放置しとくと、ある日突然バグレポートが届いて、 「まさかこんな使いかたをする人がいるとは思わなかった」と嘆息。 でも、実装者が思っても見なかった使われ方をするってことは 実装者冥利に尽きるというか。 逆に先回りして対応しといて、「こんな使いかたにまで対応してるとは 思わなかった」といわれるとちょっと勝った気分になったりして。

_21(Thu)

twitter に登録してみた。とりあえず irc につなげないと使う気になれないな。どうしたもんか。

_みつい(Thu Jun 21 21:38:17 JST 2007)

 こんなんあるらしいです http://iseebi.half-done.net/diary/?date=20070417

_arton(Fri Jun 22 16:04:02 JST 2007)

 突然だけど、時分割GC(メトロノームGC)ってのがあるらしいね。http://www-06.ibm.com/jp/developerworks/java/library/j-rtj1/

_20(Wed)

25〜29歳代のITエンジニアの「研究職」での平均年収は600万弱らしい。なんじゃそりゃ。世間ではそんなにもらってるのかよ!

http://rikunabi-next.yahoo.co.jp/rnc/docs/ci_s00910.jsp?html_nm=promotion01/promotion01.html&vos=nynmsdjb9000000001

転職したい。

(実のところ、未踏を含めると瞬間風速的にはそれくらいもらえているんだけど、今後はもうないだろうしなぁ)


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の開発に関わっている笹口さんともよい関係を持っています。

_斎藤ただし(Wed Jun 20 21:25:30 JST 2007)

ごめんなさい、それいただきました……>Sun あと一番上のは「相手(転職支援サービス)がこちらに何を欲してるか」まで考えると、「そんなに」の真偽は自明じゃないかと思います。

_19(Tue)

GC のバグがさっぱりわからないので、しょうがないので postfix をインストールしてみる。色々困った。

ついでに、quickml, qwik のインストール。どちらも困った。mod_proxy とか、hostname とかで困った。


taRgrey をインストールしてみようと思ったけど、これもさっぱりわからなかったので保留。postgrey と postfix をどうくっつけるのか、その時点でわからんかった。


http://maker.usoko.net/nounai/img/ko1.gif 鬱だ。

_maeda(Tue Jun 26 01:09:51 JST 2007)

 言ってくれれば、qmail用のgreylistingスクリプトあげるのに。postgreyも(職場で)使ってますが。

_18(Mon)

本郷で用事があったので、書籍を購入。本郷は危険だ。

  • 今夜わかるメールプロトコル
    • IMAP4 プロトコルを知りたかった。全般的にメールは苦手だ。
  • Code Quolity
  • Rubyクックブック
    • とりあえず
  • 速効Python
    • みんぱいも、まだ読んでないんだけど。
  • 刀語 5
    • たんたんと進むなあ。
_nov(Tue Jun 19 11:20:32 JST 2007)

 もしかして: Code Quality

_17(Sun)

rb_iterate のコードを読んで解明、という人がいないのがさびしい。

_13(Wed)

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 だな。

_arton(Wed Jun 13 15:34:26 JST 2007)

 こんなのとか? http://www.flickr.com/photos/jimgris/537955929/in/set-72157600332802702/

_takahashim(Wed Jun 13 15:49:49 JST 2007)

 げ、そういえば今年はドメイン切れ予告通知が届いてなかったような……。どうすればいいんでしたっけ?

_Psychs(Thu Jun 14 00:15:00 JST 2007)

あとで気づいたんですが、その方式だと Fiber の中でネットワークのIO待ちが必要な処理 (例えば、DBの更新とか、HTTP で post とか) をやると、そこで全体がブロックしてしまうと思います。もし、いろんなライブラリが内部で使う socket の面倒もまとめて見てくれると、Fiber の中で既存のライブラリを気にせずに使えるから便利なんですけど。

_12(Tue)

サンタクロース巡回問題かと思ったら違った。ので、解いてみようと思う。

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 で並列実行は危険。

_9(Sat)

眠いよう。寝たら起きられないだろうな。


やっぱり、朝から来る人は少ないんだろうな...。

_まちゅ(Sun Jun 10 03:04:07 JST 2007)

 今年は朝から大盛況でしたね。

_7(Thu)

callcc を実行すると、なんか免責条項とかが出てきて agree を選ばないと進まないようにするのはどうだろうか。

_sheepman(Thu Jun 07 20:54:45 JST 2007)

 call-with-no-warranty に名前を変えるとか。

_斎藤ただし(Thu Jun 07 22:39:35 JST 2007)
--- 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;
     }

(冗談ですごめんなさい)

_moriq(Fri Jun 08 20:48:14 JST 2007)

 tel plz. orz

_6(Wed)

なんというか、とてもやばい。昨日、終わらせることができなかったのがとてもまずい。田中さんがあんな時間まで居座る付き合ってくれるとは思わなかったからなあ。


昨日の田中さんのスクリプトを 100% 通るようにした。

_5(Tue)

電通大でいろいろしゃべる。


田中さんにいろいろ教えてもらう。

  • ラッパー
    • lambda(&Proc.new{}) 禁止
  • lambda{break/return} のあるべき挙動は?
  • safe signal/Thread#raise
  • postarg が変
  • rb_attr() で segv
  • なんか最近 segv
  • verifier がないなぁ。
  • cleanup 時には signal mask はとらないと
_akr(Wed Jun 06 00:28:11 JST 2007)

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
  }
}
_ささだ(Wed Jun 06 09:05:06 JST 2007)

 SEGVですか? うちだと [BUG] Stack consistency error なのですが。

_akr(Wed Jun 06 10:44:32 JST 2007)

 う、見誤りました。Stack consistency error です。

_斎藤ただし(Wed Jun 06 11:10:09 JST 2007)

 自分も同じエラーが出ましたが、r12449で直りました。(failは133/1597)

Sasada Koichi / sasada@namikilab.tuat.ac.jp
$Date: 2003/04/28 10:27:51 $