Upload
takahiro-sugiura
View
1.190
Download
6
Embed Size (px)
DESCRIPTION
Citation preview
Groovyしたり RPしなかったり
あとは時々布教活動したり
G*ワークショップ2013/09/20
13年9月25日水曜日
お前誰よ•名前:杉浦孝博
•twitter:@touchez_du_bois
•自称「アニメエヴァンジェリスト」
•...まぁ、いつものとおり。
13年9月25日水曜日
さて、
13年9月25日水曜日
世の中には
13年9月25日水曜日
流行っているのかわからないモノ
13年9月25日水曜日
というのもございまして。
13年9月25日水曜日
その中の一つ
13年9月25日水曜日
RP
13年9月25日水曜日
というのがございます。
13年9月25日水曜日
RP?
13年9月25日水曜日
Reactive Programming
13年9月25日水曜日
Reactive Programming?
13年9月25日水曜日
What’s RP?•データ(時間とともに変化する値)の流れとその伝搬(振る舞い)の関係性を記述することでプログラミングを行うパラダイム。
13年9月25日水曜日
What’s RP?•データとして単なる値だけでなく、入力ストリーム、イベント、時刻といったものも、時間とともに変化するデータとして同じように取り扱うえるものと考える。
13年9月25日水曜日
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日水曜日
G*じゃない的には...•Excelの「表計算」な感じ。
13年9月25日水曜日
詳しくは...•http://www.reactivemanifesto.org/
13年9月25日水曜日
さて、
13年9月25日水曜日
RPの話は
これくらい
にして
わかん
ねぇし!
13年9月25日水曜日
※『やはり俺の青春ラブコメはまちがっている。』の平塚先生13年9月25日水曜日
※プロレスラーの外道選手13年9月25日水曜日
※プロレスラーの邪道選手13年9月25日水曜日
※プロレスラーの非道選手13年9月25日水曜日
※プロレスラーの故冬木弘道選手13年9月25日水曜日
※プロレスラーのライオン道選手13年9月25日水曜日
※現在WWEのクリス・ジェリコ選手
⇒
13年9月25日水曜日
そんなことはさておき
13年9月25日水曜日
.NETでRP•Rx(Reactive Extensions)•http://rx.codeplex.com/
•Microsoft Open Technologies産
•JavaScript,C++,Ruby,Python用も
13年9月25日水曜日
JavaでRP•それなりにライブラリが提供されている。
•reactive4java•Reactor•RxJava
13年9月25日水曜日
reactive4java•有志ベース(?)。
•ちょっと...な感じ。
•GWTとも連携。
•https://code.google.com/p/reactive4java/
13年9月25日水曜日
Reactor•SpringSource産。
•多機能な感じ。
•Reactorを使ったデータアクセス用のコンポーネントや、Grails用のイベントプラグインもある。
•https://github.com/reactor/reactor/13年9月25日水曜日
RxJava•Netflix産。
•お手軽な感じ。
•RxJavaを使った分散システム用のライブラリ(Hystrix)もある。
•https://github.com/Netflix/RxJava/
13年9月25日水曜日
RP with Groovy•もともとがJavaベースであるため、GroovyのClosureをそのままでは使えない。
•メソッドの引数の型が合わず、「そんなメソッド知らんがな」と激おこプンプン丸。
13年9月25日水曜日
そこで...•ReactorとRxJavaについては、Groovy、というかGroovyのClosureが使えるためのライブラリがある。
•RxJavaについては、ClojureとScalaもサポート。
13年9月25日水曜日
Modularization(m12n)•GroovyのClosureを使えるようにするために、Groovy 2.0から導入された「モジュール化」の機能で実現している。
13年9月25日水曜日
詳細は•http://beta.mybetabook.com/showpage/508402c90cf2ffb79bb046dd
13年9月25日水曜日
ただし...•ReactorとRxJavaでは、アプローチの仕方、というか実現方法が異なる。
13年9月25日水曜日
Reactorのアプローチ•Closureを引数にとるオーバーロードのメソッドを定義し、オリジナルのクラスに追加する。
•Closureはラッパークラスで隠蔽。
•オーソドックスなアプローチ。
13年9月25日水曜日
RxJavaのアプローチ•引数の型をオリジナルの型からClosureに変換して実行する「MetaMethod」を定義するExtensionModuleクラスを作成する。
•Closureはラッパークラスで隠蔽。
•アバンギャルドなアプローチ。13年9月25日水曜日
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日水曜日
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日水曜日
RxJavaの例// モジュール・ディスクリプタ// META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
moduleFactory=rx.lang.groovy.RxGroovyPropertiesModuleFactory
13年9月25日水曜日
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日水曜日
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日水曜日
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日水曜日
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日水曜日
Which アプローチ?•Reactorのアプローチ
•長所:静的型チェック・静的コンパイルと共存できる。
•短所:Closureを適用したいクラスを使用するメソッドすべてにオーバーロードする必要がある。
13年9月25日水曜日
Which アプローチ?•RxJavaのアプローチ
•長所:対象のメソッドが増えても、コードの修正不要or少ない。
•短所:静的型チェック・静的コンパイルと共存できない。
13年9月25日水曜日
まとめ
13年9月25日水曜日
まとめ•m12n(モジュール化)、ぱない。
•RPとGrailsやVert.xの組み合わせは、ぱない、気がしないでもない。
13年9月25日水曜日
さて、
13年9月25日水曜日
皆様の期待に応えて
13年9月25日水曜日
いつものやりますか!
13年9月25日水曜日
7~9月期のおススメアニメ
13年9月25日水曜日
日常系で癒やされたい
13年9月25日水曜日
13年9月25日水曜日
13年9月25日水曜日
求ム家族愛
13年9月25日水曜日
13年9月25日水曜日
夜食テロに襲撃されたい
13年9月25日水曜日
13年9月25日水曜日
13年9月25日水曜日
10~12月期のおススメ
13年9月25日水曜日
制作会社押し
13年9月25日水曜日
13年9月25日水曜日
『凪のあすから』
13年9月25日水曜日
ほっちゃん(永遠の17歳)のファン
13年9月25日水曜日
13年9月25日水曜日
『ミス・モノクローム』
13年9月25日水曜日
ご清聴ありがとうございました
13年9月25日水曜日