Ruby開発者会議20130727Japan

= [ruby-core:38666] [ruby-trunk - Feature #5138][Assigned] Add nonblocking IO that does not use exceptions for EOF and EWOULDBLOCK

Aaron によるスライド。

* Aaron's proposal returns symbol

* matz likes returning array

* matz don't like adding new method (because we don't create new name better than "read_nonblock")

** 現状はStringを返す

** 引数が特殊な場合 (exception: false) は、symbolを返す

* give array to the method ()

* akr: デフォルトが例外なのは教育的効果があってよろしい (何も考えずに使うと例外が上がって気付く)

* ko1: JavaScriptみたいなasyncreadを提案(冗談)

* matz: accept

= https://bugs.ruby-lang.org/issues/3753

西山さんによるスライド

* 戻り値は何か

** メソッドの場合はsymbol (メソッドオブジェクトは通常作られないので)

* mame: 使っている例 http://d.hatena.ne.jp/ku-ma-me/20091126/p1

* akr: pythonにはdecoratorという文化が

* matz: accept

* ko1:attr_readerは?

** 複数があるから変えづらい

* ko1: define_methodは?

** procからsymbolに変えるべきでは

= [ruby-core:55993] [ruby-trunk - Feature #8632][Assigned] Remove warnings for Refinements

* matz: accept

* ko1: レアケースでのみ警告が出るのはよくない

* shugo: 継承したメソッドを上書きしても警告でないし、自己責任で

= tail call optimizationについて

特殊なケースでtail call optimizationが効かないことがあってもよいか

* ko1: 言語仕様として末尾再帰の最適化を行うべしと決めるのか、それとも最適化のひとつとしてやってくれたらうれしいという話なのか

* shugo: 後者です

* ko1: 例えばtraceに影響したりするがOK?

** OKと思う

* knu: 再帰(自己)呼出を行う命令を設けてそれをジャンプにするのはどうか(無名procで再帰呼出を行う方法もないことだし)

* matz: とりあえずgotoって名前なら却下

= https://bugs.ruby-lang.org/issues/8678

* akr: String#scrubしてからではダメ?

** matz: バイナリをgsubで書き換えたいときとかにそれだと使えない

* akr: invalidな文字列を例外にすることで、Railsが脆弱性を防いだ事例がある

* naruse: /./は壊れたバイトにもマッチする

* knu: 「文字でない壊れたバイト」にマッチするパターンはあるの?

** naruse: \P{Any} でいければいいがどうだったか

* デフォルトに入れるのは反対、オプションで入れるのは許容

** knu: /(?option:...)/とかで簡単にできてしまうと濫用を招くので定数を書くという不便なAPIは好ましい

* znz: inspectで表示

** naruse: 何か表示出来ないとね

** to_sで出ないのは問題ない

* 仕様がはっきりしていない

* unionはサポートしない

= Threadに名前をつける話

名前というのはシステムから見える名前と、Rubyから見える名前とがあり、

ここでのはシステムから見える名前の話。

timer threadにはruby-timer-thrという名前がついている

Rubyの仕様の話ではないので処理系実装者の判断で実装してしまってもよいのではないか

勝手に付けるべきか等含め、ささださんが実装してから考える

= http://bugs.ruby-lang.org/issues/7292

* Hash[]使え

** method chainしたいよ

* 各要素が2要素の配列であるという前提でのメソッドというのはどうなのか

** knu: assocのような例は一応ある

** matz: assocはそうなんだけどto_hは全要素がそれを満たすという前提なのでちょっと話が変わってくる

* matz: コーナーケースが書かれていないので判断が付かない

* matz: 詳細を記述の上で再提案してほしい

= http://bugs.ruby-lang.org/issues/8026

* akr: メタプログラミングでメソッド検索がどういう順番で行われるか、Rubyから調べることが出来ない(outerとmixinの関係で)

* nobu: ancestorsにouterの情報もある

* prependとの関係

** included_modulesにはprependしたものも含まれている

* この辺にこだわりのある人がいない

* matz: いいんじゃない?

* 実装がないとわからないね

= http://bugs.ruby-lang.org/issues/6589

* knu: データ構造にHashを使っていること自体は秘密ではないし仕様とも言える

* rehashって名前は微妙なんだけど

** mame: reset!

* knu: 要素を後から変更することは想定されていないというのが本当のところ

** 追認してrehashかなにかするか、却下するか

% ruby -e '

a = ["a"]

b = ["b"]

h = { a => 1, b => 2 }

p h

a[0] = "b"

p h

p h[["b"]]

'

{["a"]=>1, ["b"]=>2}

{["b"]=>1, ["b"]=>2}

2

* akr: HashにStringを入れるときはdup.freezeしている

* mame: rebuildは?

knuさんが検討した上で逆提案

= http://bugs.ruby-lang.org/issues/6588

* intersect?もdisjoint?も用語としてはestablishedで問題ない(※両者は互いに逆の意味。念のため)

* knu: 両方入れていいと思う

accept

= https://bugs.ruby-lang.org/issues/8499

* matz: sliceは連続した範囲から切り出すものなので違う

* matz: なかださんの、select/rejectを拡張する案がよい

* knu: Hash を継承したクラスの場合はHashとサブクラスどちらを返すのか

** 部分集合の場合はサブクラスの方がいい……のか?

** 現状のselect{}はサブクラスでもHashを返すのでそれで

** naruse: 文句があれば改めて起票

= https://bugs.ruby-lang.org/issues/8430

* matz: 演算子は却下

* akr: 演算子とリテラル、どちらが欲しいのか?

* suffixはいいのでは

** 1/3r #=> 1/Rational(3)

** ただし処理系による最適化でRational(1,3)とする等は許容

** knu: 2/3r**2は

** 通常の演算子の結合規則を適用する(上記の場合4/9rでなく2/9r)

** matz: 1i は複素数になるの?         ← 今日一番の盛り上がり

* 0.3r #=> Rational(3, 10)

* matz: で、iはどうするの?

* jはどうするの? -> 数学だからいれない

* メソッドも現状#iのみで、そのときに議論済み

accept: rとiをいれる

= キーワード引数の別名

リファレンスは?

togetterでまとめといてよ

* https://twitter.com/n0kada/status/356963333309599746

* nobu: if: var: defaultは実装できるかも

* 見た目がわかりにくい

* syntax highlighterとかも死ぬ

* knu: if: default => varは?

* nobu: それhash

* knu: そこに{}省略hashリテラルが書けるの?(それなら if: var: default もダメじゃないのか)

* taru: 引数が与えられているかのチェックさえできればよくて、ローカル変数に代入してくれなくてもよいのでは

* taru: つまり、キーワード引数用のハッシュを取れればいいのでは

* __arguments__: https://twitter.com/a_matsuda/status/343678826620018688

* if_とか別名

** 被ったらどうするの?

** if__ ←ねーよ

** akr: 被ったらエラーでいいのでは

* akr: 昔*&でrestもblockも受け取れるものを追加してはどうかという提案があった

* matz: 中田案には否定的

* it ← ねーよ

* matz:「 レアケースなんだから**optを自分で解析してよ」ってのが有力

** akr: 自分で解析するのを支援するようなユーティリティメソッドを追加する可能性は

** matz: 名前が問題だがあるのはよいのでは

* glass_saga: def (if: true) => arg

** うーん

* taru: local_variable_get(:if)は?

** エスケープ解析できなくなるよね

** Binding#local_variable_getならセーフかも

** sora: Binding#arguments

** Binding[:if]

* ko1: https://bugs.ruby-lang.org/issues/8643 と関係しますね

* matz: bracketはなし、Binding#local_variable_getで

= [ruby-core:55538] [ruby-trunk - Feature #8539] Unbundle ext/tk

* Macを持っていないとかUbuntu環境がないとかで止まっている問題が多い

* naruse: 2.1では断念 今回はその時ではないという感触

* 壊れたままでもとりあえずCI的には問題ないようにした

= [ruby-core:56123] [ruby-trunk - Feature #8671] support SEEK_DATA and SEEK_HOLE

* matz: go a head

= [ruby-dev:46523] [ruby-trunk - Feature #7368] rb_str_each_line()のパフォーマンス向上とリファクタリング

提案の趣旨は悪くないので、説明を丁寧にしつつ、テストを加えて欲しい

= Feature #8643 Add Binding.from_hash

* テンプレートエンジンとかで便利になる

* 今まではevalを使えば出来た

** evalを減らせれば最適化で有利

** akr: 文字列でのevalは非リテラルな右辺値の渡し方を考える必要がある

** sora: Railsではハッシュ変数経由で渡している

* もっとよいユーティリティ関数を提供する

* knu: 空のBindingを作る機能と、ローカル変数をセットする機能に分ければ汎用性が高まるのでは

* ko1: Binding#local_variable_setの線でやってみる

= Feature #8629 Method#parameters should include the default value

デフォルト引数の指定されたexpressionの方を外から取りたい

* 定数ならとるのはかんたん

* Time.nowだったらどうするの?

** procを返せばいいじゃない

* knu: proc{..}だったら?

** proc{ proc{..} } を返す

* f(a = 1, b = a+1)のような、先行する引数を参照するもの、順序に依存するものがある

* ko1: Railsの人達はメタプログラミングでデフォルト引数の値によって挙動を変えるとか従っているらしい

** matz: そういうのはよくないのでは

* ko1: コードの位置を書いてもらった方がいいのでは

= 次回

8/24がLLなので23→akrさんがダメ

8月31日で。

= https://bugs.ruby-lang.org/issues/8553

mame: Bignum#sizeはそもそもなんで入れたの?

matz: Fixnum#sizeはVALUEのサイズを取るのに使おうと思って入れて、ポリモーフィズムでBignumにも入れたという感じだったかな?

naruse: (Fixnum#sizeは)今はlongのサイズですね

akr: 1.sizeで32bit環境なのか64bit環境なのかを調べるという非常に間違った用例があるのは把握している

* longのサイズとポインタのサイズとは違う

knu: Fixnum#sizeのようにBignum#sizeは#[]で有効なビットが取れる範囲を知るためにあると思っていた

akr: なるほどそう思いますよね、ところがBignum#sizeが返すのはビットではなくバイト数!

akr: bit sizeにするのは0や負の値で定義が難しいし、値が8倍になるので互換性的に微妙

akr: Integer#bitsizeを入れるなら絶対値のビットサイズが無難な気がする

akr: それ以外の定義も考えられる(2の補数のサイズなど)が、使わないよね

matz: あってもいいんじゃないかなぁ

akr: Bignum#sizeは絶対値のバイトのサイズがいいいのでは

matz: それでいいのでは

* bitsize/bytesizeを入れたらFixnum#sizeはしょうがないとして使い方も謎なBignum#sizeはobsoleteとするのも一案

= https://bugs.ruby-lang.org/issues/8658

naruse: clock_gettimeの話は?

akr: まだ議論中なので

naruse: じゃあ次回で

akr: matzの感想だけ聞きましょうか

matz: 色んなOSで動くの?

akr: POSIXで定義されているし、基本普通の時計であるCLOCK_REALTIMEはあるはず

naruse: darwinやWindowsにはないが、代替物がありエミュレート可能

akr: 高レイヤのAPIは収束するかわからない

naruse: 低レイヤのはとりあえずいれてもいいんじゃない

= https://bugs.ruby-lang.org/issues/6065

akr: Bignum をバイト列にするC APIに

ko1: Bignumの定義をruby.hから削れる?

akr: 削れる

ko1: GMPとかに簡単に差し替えられるようになるといいなぁ

akr: 非互換性をいつ入れられるかになりますね

akr: C APIはC風のデザインなので、Ruby APIをどうするかは今後の課題

akr: 誰か提案してください

= https://bugs.ruby-lang.org/issues/8568

knu: いちおう、FFI/Fiddleではlongやポインタのサイズを提供している

akr: そういえばtime_tのサイズを知りたくて困ることがしばしば

knu: FFIではtime_tのサイズが取れます(※RbConfigへの追加には反対していません)

(結論出ず?)