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

1,514 views

Published on

0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,514
On SlideShare
0
From Embeds
0
Number of Embeds
553
Actions
Shares
0
Downloads
5
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

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

  1. 1. Groovyしたり RPしなかったり あとは時々 布教活動したり G*ワークショップ 2013/09/20 13年9月25日水曜日
  2. 2. お前誰よ •名前:杉浦孝博 •twitter:@touchez_du_bois •自称「アニメエヴァンジェリスト」 •...まぁ、いつものとおり。 13年9月25日水曜日
  3. 3. さて、 13年9月25日水曜日
  4. 4. 世の中には 13年9月25日水曜日
  5. 5. 流行っているのか わからないモノ 13年9月25日水曜日
  6. 6. というのも ございまして。 13年9月25日水曜日
  7. 7. その中の一つ 13年9月25日水曜日
  8. 8. RP 13年9月25日水曜日
  9. 9. というのが ございます。 13年9月25日水曜日
  10. 10. RP? 13年9月25日水曜日
  11. 11. Reactive Programming 13年9月25日水曜日
  12. 12. Reactive Programming? 13年9月25日水曜日
  13. 13. What s RP? •データ(時間とともに変化する値)の 流れとその伝搬(振る舞い)の関係性 を記述することでプログラミングを 行うパラダイム。 13年9月25日水曜日
  14. 14. What s RP? •データとして単なる値だけでなく、 入力ストリーム、イベント、時刻と いったものも、時間とともに変化す るデータとして同じように取り扱う えるものと考える。 13年9月25日水曜日
  15. 15. G*的には... •GParsの「Data Flow」な感じ。 import static groovyx.gpars.dataflow.Dataflow.task final 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日水曜日
  16. 16. G*じゃない的には... •Excelの「表計算」な感じ。 13年9月25日水曜日
  17. 17. 詳しくは... •http://www.reactivemanifesto.org/ 13年9月25日水曜日
  18. 18. さて、 13年9月25日水曜日
  19. 19. R P の 話 は こ れ く ら い に し て わ か ん ね ぇ し ! 13年9月25日水曜日
  20. 20. ※『やはり俺の青春ラブコメはまちがっている。』の平塚先生 13年9月25日水曜日
  21. 21. ※プロレスラーの外道選手 13年9月25日水曜日
  22. 22. ※プロレスラーの邪道選手 13年9月25日水曜日
  23. 23. ※プロレスラーの非道選手 13年9月25日水曜日
  24. 24. ※プロレスラーの故冬木弘道選手 13年9月25日水曜日
  25. 25. ※プロレスラーのライオン道選手 13年9月25日水曜日
  26. 26. ※現在WWEのクリス・ジェリコ選手 ⇒ 13年9月25日水曜日
  27. 27. そんなことは さておき 13年9月25日水曜日
  28. 28. .NETでRP •Rx(Reactive Extensions) •http://rx.codeplex.com/ •Microsoft Open Technologies産 •JavaScript,C++,Ruby,Python用も 13年9月25日水曜日
  29. 29. JavaでRP •それなりにライブラリが提供されて いる。 •reactive4java •Reactor •RxJava 13年9月25日水曜日
  30. 30. reactive4java •有志ベース(?)。 •ちょっと...な感じ。 •GWTとも連携。 •https://code.google.com/p/reactive4java/ 13年9月25日水曜日
  31. 31. Reactor •SpringSource産。 •多機能な感じ。 •Reactorを使ったデータアクセス用 のコンポーネントや、Grails用のイ ベントプラグインもある。 •https://github.com/reactor/reactor/ 13年9月25日水曜日
  32. 32. RxJava •Netflix産。 •お手軽な感じ。 •RxJavaを使った分散システム用のラ イブラリ(Hystrix)もある。 •https://github.com/Netflix/RxJava/ 13年9月25日水曜日
  33. 33. RP with Groovy •もともとがJavaベースであるため、 GroovyのClosureをそのままでは使 えない。 •メソッドの引数の型が合わず、「そ んなメソッド知らんがな」と激おこ プンプン丸。 13年9月25日水曜日
  34. 34. そこで... •ReactorとRxJavaについては、 Groovy、というかGroovyの Closureが使えるためのライブラリ がある。 •RxJavaについては、Clojureと Scalaもサポート。 13年9月25日水曜日
  35. 35. Modularization(m12n) •GroovyのClosureを使えるようにす るために、Groovy 2.0から導入され た「モジュール化」の機能で実現し ている。 13年9月25日水曜日
  36. 36. 詳細は •http://beta.mybetabook.com/showpage/ 508402c90cf2ffb79bb046dd 13年9月25日水曜日
  37. 37. ただし... •ReactorとRxJavaでは、アプローチ の仕方、というか実現方法が異な る。 13年9月25日水曜日
  38. 38. Reactorのアプローチ •Closureを引数にとるオーバーロー ドのメソッドを定義し、オリジナル のクラスに追加する。 •Closureはラッパークラスで隠 。 •オーソドックスなアプローチ。 13年9月25日水曜日
  39. 39. RxJavaのアプローチ •引数の型をオリジナルの型からClosure に変換して実行する「MetaMethod」 を定義するExtensionModuleクラスを 作成する。 •Closureはラッパークラスで隠 。 •アバンギャルドなアプローチ。 13年9月25日水曜日
  40. 40. Reactorの例 // モジュール・ディスクリプタ // META-INF/services/org.codehaus.groovy.runtime.ExtensionModule moduleName=reactor-groovy-module moduleVersion=1.0 extensionClasses=reactor.groovy.ext.ObservableExtensions,reactor.groo vy.ext.LinkableExtensions,reactor.groovy.ext.ComposableExtensions,rea ctor.groovy.ext.ProcessorExtensions staticExtensionClasses=reactor.groovy.ext.ReactorStaticExtensions 13年9月25日水曜日
  41. 41. 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日水曜日
  42. 42. RxJavaの例 // モジュール・ディスクリプタ // META-INF/services/org.codehaus.groovy.runtime.ExtensionModule moduleFactory=rx.lang.groovy.RxGroovyPropertiesModuleFactory 13年9月25日水曜日
  43. 43. 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日水曜日
  44. 44. 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日水曜日
  45. 45. 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日水曜日
  46. 46. 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日水曜日
  47. 47. Which アプローチ? •Reactorのアプローチ •長所:静的型チェック・静的コンパイ ルと共存できる。 •短所:Closureを適用したいクラスを 使用するメソッドすべてにオーバーロ ードする必要がある。 13年9月25日水曜日
  48. 48. Which アプローチ? •RxJavaのアプローチ •長所:対象のメソッドが増えても、コ ードの修正不要or少ない。 •短所:静的型チェック・静的コンパイ ルと共存できない。 13年9月25日水曜日
  49. 49. まとめ 13年9月25日水曜日
  50. 50. まとめ •m12n(モジュール化)、ぱない。 •RPとGrailsやVert.xの組み合わせ は、ぱない、気がしないでもない。 13年9月25日水曜日
  51. 51. さて、 13年9月25日水曜日
  52. 52. 皆様の期待に 応えて 13年9月25日水曜日
  53. 53. いつもの やりますか! 13年9月25日水曜日
  54. 54. 7∼9月期の おススメアニメ 13年9月25日水曜日
  55. 55. 日常系で 癒やされたい 13年9月25日水曜日
  56. 56. 13年9月25日水曜日
  57. 57. 13年9月25日水曜日
  58. 58. 求ム 家族愛 13年9月25日水曜日
  59. 59. 13年9月25日水曜日
  60. 60. 夜食テロに 襲撃されたい 13年9月25日水曜日
  61. 61. 13年9月25日水曜日
  62. 62. 13年9月25日水曜日
  63. 63. 10∼12月期の おススメ 13年9月25日水曜日
  64. 64. 制作会社押し 13年9月25日水曜日
  65. 65. 13年9月25日水曜日
  66. 66. 『凪のあすから』 13年9月25日水曜日
  67. 67. ほっちゃん (永遠の17歳) のファン 13年9月25日水曜日
  68. 68. 13年9月25日水曜日
  69. 69. 『ミス・モノクローム』 13年9月25日水曜日
  70. 70. ご清聴ありがと うございました 13年9月25日水曜日

×