70
Groovyしたり RPしなかったり あとは時々 布教活動したり G*ワークショップ 2013/09/20 13925日水曜日

Groovyしたり RPしなかったり あとは時々布教活動したり

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Groovyしたり RPしなかったり あとは時々布教活動したり

Groovyしたり RPしなかったり

あとは時々布教活動したり

G*ワークショップ2013/09/20

13年9月25日水曜日

Page 2: Groovyしたり RPしなかったり あとは時々布教活動したり

お前誰よ•名前:杉浦孝博

•twitter:@touchez_du_bois

•自称「アニメエヴァンジェリスト」

•...まぁ、いつものとおり。

13年9月25日水曜日

Page 3: Groovyしたり RPしなかったり あとは時々布教活動したり

さて、

13年9月25日水曜日

Page 4: Groovyしたり RPしなかったり あとは時々布教活動したり

世の中には

13年9月25日水曜日

Page 5: Groovyしたり RPしなかったり あとは時々布教活動したり

流行っているのかわからないモノ

13年9月25日水曜日

Page 6: Groovyしたり RPしなかったり あとは時々布教活動したり

というのもございまして。

13年9月25日水曜日

Page 7: Groovyしたり RPしなかったり あとは時々布教活動したり

その中の一つ

13年9月25日水曜日

Page 8: Groovyしたり RPしなかったり あとは時々布教活動したり

RP

13年9月25日水曜日

Page 9: Groovyしたり RPしなかったり あとは時々布教活動したり

というのがございます。

13年9月25日水曜日

Page 10: Groovyしたり RPしなかったり あとは時々布教活動したり

RP?

13年9月25日水曜日

Page 11: Groovyしたり RPしなかったり あとは時々布教活動したり

Reactive Programming

13年9月25日水曜日

Page 12: Groovyしたり RPしなかったり あとは時々布教活動したり

Reactive Programming?

13年9月25日水曜日

Page 13: Groovyしたり RPしなかったり あとは時々布教活動したり

What’s RP?•データ(時間とともに変化する値)の流れとその伝搬(振る舞い)の関係性を記述することでプログラミングを行うパラダイム。

13年9月25日水曜日

Page 14: Groovyしたり RPしなかったり あとは時々布教活動したり

What’s RP?•データとして単なる値だけでなく、入力ストリーム、イベント、時刻といったものも、時間とともに変化するデータとして同じように取り扱うえるものと考える。

13年9月25日水曜日

Page 15: Groovyしたり RPしなかったり あとは時々布教活動したり

G*的には...•GParsの「Data Flow」な感じ。

import static groovyx.gpars.dataflow.Dataflow.taskfinal def x = new DataflowVariable()final def y = new DataflowVariable()final def z = new DataflowVariable()

task { z << x.val + y.val println "Result: ${z.val}"}

task { x << 10}

task { y << 5}

13年9月25日水曜日

Page 16: Groovyしたり RPしなかったり あとは時々布教活動したり

G*じゃない的には...•Excelの「表計算」な感じ。

13年9月25日水曜日

Page 17: Groovyしたり RPしなかったり あとは時々布教活動したり

詳しくは...•http://www.reactivemanifesto.org/

13年9月25日水曜日

Page 18: Groovyしたり RPしなかったり あとは時々布教活動したり

さて、

13年9月25日水曜日

Page 19: Groovyしたり RPしなかったり あとは時々布教活動したり

RPの話は

これくらい

にして

わかん

ねぇし!

13年9月25日水曜日

Page 20: Groovyしたり RPしなかったり あとは時々布教活動したり

※『やはり俺の青春ラブコメはまちがっている。』の平塚先生13年9月25日水曜日

Page 21: Groovyしたり RPしなかったり あとは時々布教活動したり

※プロレスラーの外道選手13年9月25日水曜日

Page 22: Groovyしたり RPしなかったり あとは時々布教活動したり

※プロレスラーの邪道選手13年9月25日水曜日

Page 23: Groovyしたり RPしなかったり あとは時々布教活動したり

※プロレスラーの非道選手13年9月25日水曜日

Page 24: Groovyしたり RPしなかったり あとは時々布教活動したり

※プロレスラーの故冬木弘道選手13年9月25日水曜日

Page 25: Groovyしたり RPしなかったり あとは時々布教活動したり

※プロレスラーのライオン道選手13年9月25日水曜日

Page 26: Groovyしたり RPしなかったり あとは時々布教活動したり

※現在WWEのクリス・ジェリコ選手

13年9月25日水曜日

Page 27: Groovyしたり RPしなかったり あとは時々布教活動したり

そんなことはさておき

13年9月25日水曜日

Page 28: Groovyしたり RPしなかったり あとは時々布教活動したり

.NETでRP•Rx(Reactive Extensions)•http://rx.codeplex.com/

•Microsoft Open Technologies産

•JavaScript,C++,Ruby,Python用も

13年9月25日水曜日

Page 29: Groovyしたり RPしなかったり あとは時々布教活動したり

JavaでRP•それなりにライブラリが提供されている。

•reactive4java•Reactor•RxJava

13年9月25日水曜日

Page 30: Groovyしたり RPしなかったり あとは時々布教活動したり

reactive4java•有志ベース(?)。

•ちょっと...な感じ。

•GWTとも連携。

•https://code.google.com/p/reactive4java/

13年9月25日水曜日

Page 31: Groovyしたり RPしなかったり あとは時々布教活動したり

Reactor•SpringSource産。

•多機能な感じ。

•Reactorを使ったデータアクセス用のコンポーネントや、Grails用のイベントプラグインもある。

•https://github.com/reactor/reactor/13年9月25日水曜日

Page 32: Groovyしたり RPしなかったり あとは時々布教活動したり

RxJava•Netflix産。

•お手軽な感じ。

•RxJavaを使った分散システム用のライブラリ(Hystrix)もある。

•https://github.com/Netflix/RxJava/

13年9月25日水曜日

Page 33: Groovyしたり RPしなかったり あとは時々布教活動したり

RP with Groovy•もともとがJavaベースであるため、GroovyのClosureをそのままでは使えない。

•メソッドの引数の型が合わず、「そんなメソッド知らんがな」と激おこプンプン丸。

13年9月25日水曜日

Page 34: Groovyしたり RPしなかったり あとは時々布教活動したり

そこで...•ReactorとRxJavaについては、Groovy、というかGroovyのClosureが使えるためのライブラリがある。

•RxJavaについては、ClojureとScalaもサポート。

13年9月25日水曜日

Page 35: Groovyしたり RPしなかったり あとは時々布教活動したり

Modularization(m12n)•GroovyのClosureを使えるようにするために、Groovy 2.0から導入された「モジュール化」の機能で実現している。

13年9月25日水曜日

Page 37: Groovyしたり RPしなかったり あとは時々布教活動したり

ただし...•ReactorとRxJavaでは、アプローチの仕方、というか実現方法が異なる。

13年9月25日水曜日

Page 38: Groovyしたり RPしなかったり あとは時々布教活動したり

Reactorのアプローチ•Closureを引数にとるオーバーロードのメソッドを定義し、オリジナルのクラスに追加する。

•Closureはラッパークラスで隠蔽。

•オーソドックスなアプローチ。

13年9月25日水曜日

Page 39: Groovyしたり RPしなかったり あとは時々布教活動したり

RxJavaのアプローチ•引数の型をオリジナルの型からClosureに変換して実行する「MetaMethod」を定義するExtensionModuleクラスを作成する。

•Closureはラッパークラスで隠蔽。

•アバンギャルドなアプローチ。13年9月25日水曜日

Page 40: Groovyしたり RPしなかったり あとは時々布教活動したり

Reactorの例// モジュール・ディスクリプタ// META-INF/services/org.codehaus.groovy.runtime.ExtensionModule

moduleName=reactor-groovy-modulemoduleVersion=1.0extensionClasses=reactor.groovy.ext.ObservableExtensions,reactor.groovy.ext.LinkableExtensions,reactor.groovy.ext.ComposableExtensions,reactor.groovy.ext.ProcessorExtensionsstaticExtensionClasses=reactor.groovy.ext.ReactorStaticExtensions

13年9月25日水曜日

Page 41: Groovyしたり RPしなかったり あとは時々布教活動したり

Reactorの例

// ヘルパークラスclass ObservableExtensions { /** * Closure converters */ static <T, E extends Event<T>, V> Registration<Consumer<E>> receive(final reactor.core.Observable selfType, final Selector key, final Closure<V> closure) { selfType.receive key, new ClosureEventFunction<E, V>(closure) }}

// オリジナルのクラス・インタフェースpublic interface Observable { <E extends Event<?>, V> Registration<Consumer<E>> receive(Selector sel, Function<E, V> fn);}

13年9月25日水曜日

Page 42: Groovyしたり RPしなかったり あとは時々布教活動したり

RxJavaの例// モジュール・ディスクリプタ// META-INF/services/org.codehaus.groovy.runtime.ExtensionModule

moduleFactory=rx.lang.groovy.RxGroovyPropertiesModuleFactory

13年9月25日水曜日

Page 43: Groovyしたり RPしなかったり あとは時々布教活動したり

RxJavaの例// モジュール・ディスクリプタ// org/codehaus/groovy/runtime/m12n/StandardPropertiesModuleFactory.java

public class StandardPropertiesModuleFactory extends PropertiesModuleFactory { public final static String MODULE_FACTORY_KEY = "moduleFactory";

public ExtensionModule newModule(final Properties properties, final ClassLoader classLoader) { String factoryName = properties.getProperty(MODULE_FACTORY_KEY); if (factoryName!=null) { Class<? extends PropertiesModuleFactory> factoryClass = (Class<? extends PropertiesModuleFactory>) classLoader.loadClass(factoryName); PropertiesModuleFactory delegate = factoryClass.newInstance(); return delegate.newModule(properties, classLoader); } return MetaInfExtensionModule.newModule(properties, classLoader); }}

13年9月25日水曜日

Page 44: Groovyしたり RPしなかったり あとは時々布教活動したり

RxJavaの例// モジュール・ディスクリプタ// rx/lang/groovy/RxGroovyPropertiesModuleFactory.java

public class RxGroovyPropertiesModuleFactory extends PropertiesModuleFactory {

@Override public ExtensionModule newModule( Properties properties, ClassLoader classLoader) { return new RxGroovyExtensionModule(); }

}

13年9月25日水曜日

Page 45: Groovyしたり RPしなかったり あとは時々布教活動したり

RxJavaの例// rx/lang/groovy/RxGroovyExtensionModule.java

public class RxGroovyExtensionModule extends ExtensionModule {

private final static Class[] CLASS_TO_EXTEND = new Class[] { Observable.class, BlockingObservable.class };

@Override public List<MetaMethod> getMetaMethods() { List<MetaMethod> methods = new ArrayList<MetaMethod>();

for (Class classToExtend : CLASS_TO_EXTEND) { for (final Method m : classToExtend.getMethods()) { for (Class c : m.getParameterTypes()) { if (Function.class.isAssignableFrom(c)) { methods.add(createMetaMethod(m)); break; } } } }

return methods; }

13年9月25日水曜日

Page 46: Groovyしたり RPしなかったり あとは時々布教活動したり

RxJavaの例// rx/lang/groovy/RxGroovyExtensionModule.java

private MetaMethod createMetaMethod(final Method m) { return new MetaMethod() { @Override public Object invoke(Object object, Object[] arguments) { Object[] newArgs = new Object[arguments.length]; for (int i = 0; i < arguments.length; i++) { final Object o = arguments[i]; if (o instanceof Closure) { if (Action.class.isAssignableFrom(m.getParameterTypes()[i])) { newArgs[i] = new GroovyActionWrapper((Closure) o); } else if(OnSubscribeFunc.class.isAssignableFrom(m.getParameterTypes()[i])) { newArgs[i] = new GroovyOnSubscribeFuncWrapper((Closure) o); } else { newArgs[i] = new GroovyFunctionWrapper((Closure) o); }

} else { newArgs[i] = o; } } return m.invoke(object, newArgs); }

13年9月25日水曜日

Page 47: Groovyしたり RPしなかったり あとは時々布教活動したり

Which アプローチ?•Reactorのアプローチ

•長所:静的型チェック・静的コンパイルと共存できる。

•短所:Closureを適用したいクラスを使用するメソッドすべてにオーバーロードする必要がある。

13年9月25日水曜日

Page 48: Groovyしたり RPしなかったり あとは時々布教活動したり

Which アプローチ?•RxJavaのアプローチ

•長所:対象のメソッドが増えても、コードの修正不要or少ない。

•短所:静的型チェック・静的コンパイルと共存できない。

13年9月25日水曜日

Page 49: Groovyしたり RPしなかったり あとは時々布教活動したり

まとめ

13年9月25日水曜日

Page 50: Groovyしたり RPしなかったり あとは時々布教活動したり

まとめ•m12n(モジュール化)、ぱない。

•RPとGrailsやVert.xの組み合わせは、ぱない、気がしないでもない。

13年9月25日水曜日

Page 51: Groovyしたり RPしなかったり あとは時々布教活動したり

さて、

13年9月25日水曜日

Page 52: Groovyしたり RPしなかったり あとは時々布教活動したり

皆様の期待に応えて

13年9月25日水曜日

Page 53: Groovyしたり RPしなかったり あとは時々布教活動したり

いつものやりますか!

13年9月25日水曜日

Page 54: Groovyしたり RPしなかったり あとは時々布教活動したり

7~9月期のおススメアニメ

13年9月25日水曜日

Page 55: Groovyしたり RPしなかったり あとは時々布教活動したり

日常系で癒やされたい

13年9月25日水曜日

Page 56: Groovyしたり RPしなかったり あとは時々布教活動したり

13年9月25日水曜日

Page 57: Groovyしたり RPしなかったり あとは時々布教活動したり

13年9月25日水曜日

Page 58: Groovyしたり RPしなかったり あとは時々布教活動したり

求ム家族愛

13年9月25日水曜日

Page 59: Groovyしたり RPしなかったり あとは時々布教活動したり

13年9月25日水曜日

Page 60: Groovyしたり RPしなかったり あとは時々布教活動したり

夜食テロに襲撃されたい

13年9月25日水曜日

Page 61: Groovyしたり RPしなかったり あとは時々布教活動したり

13年9月25日水曜日

Page 62: Groovyしたり RPしなかったり あとは時々布教活動したり

13年9月25日水曜日

Page 63: Groovyしたり RPしなかったり あとは時々布教活動したり

10~12月期のおススメ

13年9月25日水曜日

Page 64: Groovyしたり RPしなかったり あとは時々布教活動したり

制作会社押し

13年9月25日水曜日

Page 65: Groovyしたり RPしなかったり あとは時々布教活動したり

13年9月25日水曜日

Page 66: Groovyしたり RPしなかったり あとは時々布教活動したり

『凪のあすから』

13年9月25日水曜日

Page 67: Groovyしたり RPしなかったり あとは時々布教活動したり

ほっちゃん(永遠の17歳)のファン

13年9月25日水曜日

Page 68: Groovyしたり RPしなかったり あとは時々布教活動したり

13年9月25日水曜日

Page 69: Groovyしたり RPしなかったり あとは時々布教活動したり

『ミス・モノクローム』

13年9月25日水曜日

Page 70: Groovyしたり RPしなかったり あとは時々布教活動したり

ご清聴ありがとうございました

13年9月25日水曜日