第9回 Ruby勉強会@関西

参加しています。いつものようにメモ。
Ruby Refectoring Browser by 大林さん

  • lessプレゼン?
  • 自己紹介。KMC。Ruby/SDL、SDLSKK、RRSE(Emacs上で使うRubyリファレンス参照ツール)とか。
  • リファクタリング。機能追加ではない。デバッグでもない。デグレを防ぐ。ユニットテストじうよう。ファウラーの本を読もう。
  • RubyRefectoringBrowserとは? リファクタリングを自動化。SmallTalkが最初らしい。今ではJavaとかC#でも。 これはRuby用。
  • 変数の名前変更。メソッドの切り出しとか、メソッドの親子巻の移動とか、共通スーパークラスの作成とか。
  • EmacsVIMコマンドラインxyzzy、freerideで使える。Emacsが一番ちゃんと動く。VIMはリネームとメソッドの切り出しくらい(それ以外はコマンドラインのやつで使う)。コマンドラインcursesのインターフェースで使える?
  • Emacsでのデモ。
  • 変数の名前変更。リファクタリングのundo(グローバル変数とか複数のファイルにまたがる変更もundoできる)。やっぱり名前変更は便利だ。
  • メソッドの抽出。Rubyって構文が複雑だから結構大変そう。構文解析どうやってるんだろう。Ripper使ってるのかな?
  • 注意点。適当な構文解析。メソッド抽出がやばめ。目で確認。スクリプトは実際に実行しちゃう。if __FILE__ == $0 ... endのおまじない。ユニットテストと同じ感じ。リファクタリングされるファイルの範囲。Emacsの場合は、今読み込まれているRubyスクリプトらしきものはリファクタリング対象とされる。コマンドラインは全部手で指定する。
  • RubyRefectoringBrowserの組込み。置換とかカット・アンド・ペーストの組合せ。開発環境から簡単に使えるようにしないと使いにくい。プロセス間通信でRubyを動かす。Emacsの場合、pipe。VIMにはRubyが組込まれているので、直接Rubyを呼出す。RDT。Eclipse。誰かやってください。自分で使ってない環境は大変。
  • 今後の課題。より正確な変換をしたい。今は、attr_*は無視している。1.9のRipperに期待。ドキュメントの拡充。今はチュートリアルくらい。特に英語のドキュメントが欲しい。新たなリファクタリングの追加。Remove、InliningMethod。
  • RubyRefectoringBrowserの裏側。80-20の法則。大体上手く変換できれば大丈夫というポリシー。最大の問題はパーザ。古ーいRipperを改造して使っている。制御構文とかは無視。識別子の位置と種類だけ持っている。
  • 一番使うのはローカル変数の名前変更。これだけできれば結構快適。
  • 同じ名前のメソッドの名前変更はどう扱うべきか難しい。動的な言語の宿命。

JRuby by 西本さん

  • 構造解析。Web以外の何か。とはいいつつ。最近はマルチメディアとか。趣味は最近Rubyが多い。JavaOneのプライベートイベント。Night for Java TEchnology。G1 Granpixに出場。Dukeくんのウクレレ。まだ弾けません。DRUMの作成。相変らずリリースしていない。現在JavaScript版を作成中(今はJava上でJavaScriptが動く)。C#はやっていない。XII POTION飲んでみました。薬っぽい。100ポイント体力が回復したような気がする(単位不明)。
  • JRubyとは。JVM上で動くRuby実行系。Rubyと同じ文法。BSF(Bean Scripting Framework)サポート(jakarta project)。Ruby 1.8.2相当。CPL/GPL/LGPLトリプルライセンス。
  • 特徴。JavaからRubyを呼べる。RubyからJavaが呼べる。
  • 短所。かなり遅い。オリジナルの1000倍遅い。Processがない(forkがない。これはJavaだから仕方がない)。ThreadはRubyのソレと違う。一部ライブラリが動かない(Nativeものとか)。
  • その他。Java APIの呼出しが0.8.2系では遅い。0.8.3系は速くなるらしい。0.8.4系はRailsが動く予定らしい。
  • デモ1。円周率。モンテカルロ法。乱数で大体の値を求める。JRubyで20秒くらい。Rubyは1秒くらい。Rhinoは速いから何とかなるんじゃ。
  • デモ2。JavaRuby正規表現が使える。Javaでも正規表現は使えるけど、すごい面倒。
  • デモ3。RubyからJavaを呼出す。この前のDRUMみたいな感じ。とっても遅い。Javaのクラスを最初にラッピングしているんじゃないかな。SWINGは関連するクラスが多いからそのラッピングに時間がかかっているんじゃないかな(予想)。今のところ実用にならない。初期化をLazyにする必要あり?
  • まとめ。何がうれしいの? 膨大なJava APIを呼出せる。LLなRubyJavaから呼出せる。
  • でかい整数もやっているハズ。どうやっているかは不明。
  • RubyのソースからJavaRubyのパーザを書いている。体力あるなぁ。

Ruby初級者向けレッスン by かずひこさん

  • タイトルは「わかりやすいRubyのコードを書こう」
  • Euler法を改良する。Leap-Flog法。で、あなたのコード添削します。数値計算バージョン。
  • 漢字コード。EUCUTF-8がいいかな。
  • shebang行。/usr/bin/envが便利。
  • 変数名には_を適宜入れる。空白とインデントは読み易く。
  • 誤差を考慮して、ループの終了条件を考える。Float#stepでもよさそう。誤差を気にするんだったら整数でループを回すべき。僕もそう思う。DRUMでも同じようなバグがあった。Rationalはどう?
  • コメントはまとまりごとの方がいい。
  • タイトルは「わかりやすいRubyのコードを書こう」ですから。
  • どうやったら速くなるのか。ループの中でしか使っていない変数をループの外で作成しておく。オブジェクトの生成が少なくなる。
  • 正規表現のオブジェクトを作るのは遅くなる場合がある。
  • Rubyコマンドラインオプションに-r profileを付けて、プロファイルをとってみる。
  • 今日は「わかりやすいRubyのコードを書こう」じゃなかったのか…
  • コーディング規約。http://shugo.net/ruby-codeconv/codeconv.rdとか。

(追記) かずひこさんからコメントいただきました。コーディング規約のURIは、http://shugo.net/ruby-codeconv/codeconv.htmlの方がよいらしいです。