「愛されたい!」と思ったときにJavaで書くRubyクラス

35
されたい!」 思ったときに Java で書く Ruby クラス 大場光一郎 Akasaka.rb, Meadowy.org

description

Rails勉強会@東京 32thの資料。 http://wiki.fdiary.net/rails/?RailsMeetingTokyo-0032

Transcript of 「愛されたい!」と思ったときにJavaで書くRubyクラス

Page 1: 「愛されたい!」と思ったときにJavaで書くRubyクラス

「愛されたい!」と思ったときにJavaで書くRubyクラス

大場光一郎Akasaka.rb, Meadowy.org

Page 2: 「愛されたい!」と思ったときにJavaで書くRubyクラス

今日の目的

•JavaでRubyクラスを書く

Page 3: 「愛されたい!」と思ったときにJavaで書くRubyクラス

JRubyとは

•JavaVMで動くRuby実装•JIT、事前バイトコンパイル•Java Integration•Java 5.0 higher

Page 4: 「愛されたい!」と思ったときにJavaで書くRubyクラス

JRubyを拡張したい

•動かしたいパッケージがC•openssl,RMagick4J,image_voodoo

•速くしたい

Page 5: 「愛されたい!」と思ったときにJavaで書くRubyクラス

Mにおすすめ

•素直にRubyで書けば5行くらいですむところを50行で書く

Page 6: 「愛されたい!」と思ったときにJavaで書くRubyクラス

生もの注意

•公開APIではなくて言語のコアに近い部分

•ゴリゴリ変わってます

Page 7: 「愛されたい!」と思ったときにJavaで書くRubyクラス

JRubyを拡張する方法

•Rubyで書く•Dubyで書く•Javaで書く

Page 8: 「愛されたい!」と思ったときにJavaで書くRubyクラス

Rubyで書く

•普通にRubyで書く•Javaクラスも呼べるよ

Page 9: 「愛されたい!」と思ったときにJavaで書くRubyクラス

Dubyで書く

•型修飾ができるRubyっぽい言語

•コンパイラ型•Hashリテラルっぽい書き方

Page 10: 「愛されたい!」と思ったときにJavaで書くRubyクラス

Dubyの例def foo(str) {str => :string} puts strend

Page 11: 「愛されたい!」と思ったときにJavaで書くRubyクラス

Javaで書く

•速い•面倒•jarパッケージ

Page 12: 「愛されたい!」と思ったときにJavaで書くRubyクラス

Javaで書こうRubyクラス

•Java SE 5.0•JRubyのソースコード一式

Page 13: 「愛されたい!」と思ったときにJavaで書くRubyクラス

JavaクラスとRubyクラス

•クラス/メソッドの可視性•オーバーロード•オープンクラス

Page 14: 「愛されたい!」と思ったときにJavaで書くRubyクラス

Javaで書くとき必要なこと

•メモリアロケーション•アノテーション

Page 15: 「愛されたい!」と思ったときにJavaで書くRubyクラス

メモリアロケーション

•JRubyのrubyランタイムにクラスやモジュールを登録する

Page 16: 「愛されたい!」と思ったときにJavaで書くRubyクラス

コード例 private static final ObjectAllocator ICONV_ALLOCATOR = new ObjectAllocator() { public IRubyObject allocate(Ruby runtime, RubyClass klass) { return new RubyIconv(runtime, klass); } };

Page 17: 「愛されたい!」と思ったときにJavaで書くRubyクラス

RubyClass iconvClass = runtime.defineClass("Iconv", runtime.getObject(), ICONV_ALLOCATOR);

Page 18: 「愛されたい!」と思ったときにJavaで書くRubyクラス

アノテーション

•Java 5から導入•javadoc/Rdocっぽい•メソッドやクラスに宣言的にメタ情報を記述

Page 19: 「愛されたい!」と思ったときにJavaで書くRubyクラス

JRubyアノテーション

•クラス•モジュール•メソッド

Page 20: 「愛されたい!」と思ったときにJavaで書くRubyクラス

クラスアノテーション

@JRubyClass(name = “Iconv”)class IconvClass {}

Page 21: 「愛されたい!」と思ったときにJavaで書くRubyクラス

メソッドアノテーション

•引数の数/可変長引数•インスタンスか、特異か•ブロックの有無

Page 22: 「愛されたい!」と思ったときにJavaで書くRubyクラス

コード例

@JRubyMethod(name = "open", required = 2, frame = true, meta = true)public static IRubyObject open(ThreadContext context, IRubyObject recv, IRubyObject to, IRubyObject from, Block block) {}

Page 23: 「愛されたい!」と思ったときにJavaで書くRubyクラス

メソッドアノテーションの種類

•name,required•optional,rest•alias, meta, module•visibility, etc...

Page 24: 「愛されたい!」と思ったときにJavaで書くRubyクラス

アノテーションをRubyへ定義

•クラスにどんなアノテーションがついているかRubyランタイムに登録する

Page 25: 「愛されたい!」と思ったときにJavaで書くRubyクラス

コード例iconvClass.defineAnnotatedMethods(RubyIconv.class);

Page 26: 「愛されたい!」と思ったときにJavaで書くRubyクラス

ロードしよう

Page 27: 「愛されたい!」と思ったときにJavaで書くRubyクラス

ロードのJRuby拡張

•.rb .so .dll以外に.classと.jarの読み込みがサポート

Page 28: 「愛されたい!」と思ったときにJavaで書くRubyクラス

require ‘hogehoge’require ‘hogehoge.class’require ‘hogehoge.jar’

Page 29: 「愛されたい!」と思ったときにJavaで書くRubyクラス

.classをロードする

Page 30: 「愛されたい!」と思ったときにJavaで書くRubyクラス

.jarをロードする

•jarredScript•jarに固めたclassファイルをロードする仕組み

•gemに含めるのも可

Page 31: 「愛されたい!」と思ったときにJavaで書くRubyクラス

JarredScript

•規約指向•クラス名とjarファイル名を合わせる

•LoadService

Page 32: 「愛されたい!」と思ったときにJavaで書くRubyクラス

LoadService

•JRubyがjar内から拡張クラスを探すきっかけになる• org.jruby.runtime.load.BasicLoadService•パッケージは無し

Page 33: 「愛されたい!」と思ったときにJavaで書くRubyクラス

LoadServiceの例

Page 34: 「愛されたい!」と思ったときにJavaで書くRubyクラス

jarに固める

Page 35: 「愛されたい!」と思ったときにJavaで書くRubyクラス

JRubyを拡張しよう

•メモリアロケーション•アノテーション•jarに固める