SlideShare une entreprise Scribd logo
1  sur  54
Télécharger pour lire hors ligne
RxJavaとOptionalで
関数型Androidしよう
shibuya.apk #2 2015-07-30
• 白山 文彦(しろやま ふみひこ)
• 株式会社マナボ 技術者
• @fushiroyama / fu.shiroyama@gmail.com
• ナマポではありません。これだけ覚えて帰ってく
ださい。
• すごいHaskellたのしく学ぼう読書会やってま
す!求む同士!気軽に話しかけて下さい!
お詫び
• 「関数型」とタイトルに入れましたが誤解を招
きやすいので資料の最後で発表者の考える関数
型プログラミングについて補足してあります。
Optional
• Haskell
• Maybe a = Nothing ¦ Just a
• Scala
• Option[T] = Some(T) ¦ None
• あるかもしれないし、ないかもしれない
• ないかもしれない可能性を型で明示
• ないかもしれないまま扱える
• Map#get…キーがなければnull
• String#indexOf…見つからなければ-1
• 特定条件下で返り値がない、いつもと違うケー
スではOptionalを使うチャンス!
Android doesn t
suport Java 8
• RxJavaのObservable<T>でOptional<T>を代行
する (by id:sys1yagi)
• http://sys1yagi.hatenablog.com/entry/
2015/01/26/183000
• 神いわゆるゴッド
• RxJava(後述)でOptionalを代用
• eccyan/RxJava-Optional
• https://github.com/eccyan/RxJava-Optional
• 素晴らしすぎます。ありがとうございます。
repositories {
jcenter()
}
dependencies {
compile 'io.reactivex:rxandroid:0.25.0'
compile 'com.eccyan:rxjava-optional:1.1.2'
}
バージョン注意
早速使おう!
Optional作る
• Optional.of(T)
• Optional.ofNullable(T)
• Optional.empty()
• Optional.of(null)
• NullPointerException
• Optional.ofNullable(null)
• OK!
• Optional.empty = Optional.ofNullable(null)
• その式でNonNullであることが自明である場合
はOptional.of()を使う
• Optional.ofNullable()を毎回使うみたいな考え
方は誤り!
Optional使う
• Optional#get()
• Optional#orElse(T)
• Optional#orElseCall(() -> {T})
• Optional#orElseThrow(() -> {Throwable})
• Optional#get
• 見つからなければNoSuchElementException
• Optional#orElse(elseValue)
• Optional#orElseCall(() -> elseValue)
• ラムダ式の結果がelseValueに
• Optional#orElseThrow(() -> Throwable)
• Optional#get は中身があるかどうか意識する必
要があるのであまり使わない
• if (opt.isPresent) { opt.get() } とかは最悪
• orElseとorElseCallの違いは、後者はemptyの
場合に初めてラムダ式の中身が評価される
• orElseThrowの多用は禁物。これするぐらいな
らなぜ普通にthrowしないのか考えよう。
Maybeモナド的に使う
• Optional#ifPresent(val -> {})
• Optional#map(T -> U)
• Optional#flatMap(T -> Optional<U>)
• Optional#filter(Predicator<T, Boolean> -> T)
Optional#ifPresent
Optional<String> opt = Optional.of(getOpt());
opt.ifPresent(s -> Log.i(TAG, s));
nullのときは何もしない
Optional#map
Optional<String> nameOpt =
entityOpt.map(userEntity -> userEntity.getFirstName());
entityOpt.map(UserEntity::getFirstName);
と表記可(メソッド参照)
Optional#flatMap
Optional<Optional<T>>を
flatten(平らにする)イメージ
Optional<AnotherOptional> anotherOpt =
entityOpt.flatMap(userEntity -> {
return userEntity.getAnotherOptional();
});
Optional#filter
a -> Bool -> a
String userName = entityOpt
.filter(entity -> entity.getUserName.contains( hoge ));
String userName = entityOpt
.filter(entity -> !TextUtils.isEmpty(entity.getUserName()))
.map(UserEntity::getUserName)
.orElse(getString(R.string.default_name));
filterやorElseとかと組み合わせると
更に強力に!
Optional総括
• ほぼ完全なOptionalがAndroidでも使える
• 幾つかメソッド名が違ったり、SupplierやFunctionなどの関数オブジェクト型がRxJavaの
Action1やFunction1で置き換えられているがラムダ式を使う限り何も意識する必要がない
• 外出しの変数とnullチェックやforループみたいな手続き的
な処理をかなり減らせる
• パターンマッチもタプルもないが充分強力
• 正しく使う限りデメリットが思いつかないので積極的にプ
ロジェクトに取り入れるべきだと思う
ラムダ式は後述
RxJava
RxJava
• https://github.com/ReactiveX/RxJava
• オブザーバパターンを拡張してデータやイベントの
シーケンス(一連の流れ)をサポートし、これらの
シーケンスを宣言的に組み合わせるオペレータを提
供する。
• RxAndroidという、Androidで使って便利なRxJava
拡張(というのが適切かわからないですが)も存在
する
インストール
• compile io.reactivex:rxandroid:0.25.0'
• RxAndroidを入れるとRxJavaも一緒に入る
• RxAndroidは現時点で大きくなりすぎて開発者の間でライ
ブラリの分割が検討されており、RxAndroid固有の機能を
利用する場合は注意を要する
• https://github.com/ReactiveX/RxAndroid/issues/172
• https://github.com/JakeWharton/RxBinding
• プロミスとしての使われ方が一番一般的
• 将来起こる一連のイベントの流れを表現する
• 非同期通信の結果
• ユーザのタッチイベント
• リスト
• 参考)RxJava学習のベストプラクティスっぽいもの by yagi
• https://speakerdeck.com/sys1yagi/rxjavaxue-xi-falsehesutohurakuteisutuhoimofalse
Observable
• オブザーバパターンの観測対象に相当
• イベントドリブンに結果が通知されてくる
• 観測者(わたくしども)はObservableをsubscribe(購読)し、
結果を好きなようにし、不要なタイミングでunsubscribe(購読
解除)する
• プロミスと違い、いつ終わるとも知れない無限ストリームも表現
できる(例:ユーザのタッチイベントはいつ来るとも知れず、ユー
ザが飽きてスマホを放り投げるまで永久に続くかもしれない)
結果を受け取る
• onNext(result -> {})
• 例えばユーザタッチイベントのObservableはユーザがタッチするごとにonNextにコールバックされる
• 非同期通信のObservableはここで結果を受け取る
• onError(e)
• エラーが発生するとここで受け取る
• onComplete()
• 有限ストリームは最後にここが呼ばれる
Retrofitで試す
• compile com.squareup.retrofit:retrofit:1.9.0'
• @GET("/user/{id}/photo")

void getUserPhoto(@Path("id") int id, Callback<Photo> cb);
• @GET("/user/{id}/photo")

Observable<Photo> getUserPhoto(@Path("id") int id);
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.build();
GitHubService service = restAdapter.create(GitHubService.class);
service.getUserPhoto(12345)
.subscribe(
photo -> {
doSomething(photo);
}
error -> {},
() -> {} // complete
);
購読!
非同期処理はこの瞬間はじまる。
で、何が嬉しいの?
Observableは連結できる!
各種オペレータは後述
こんなことが簡単に!
Observable<Token> tokenObservable = getTokenObservable();
tokenObservable
.flatMap(token -> getUserInfoObservable(token, args))
.subscribe(
userInfo -> { doSomething(userInfo) },
error -> {},
);
重要ポイントおさらい
• Observableはいくつでも連結できるよ(複数の
Observableの連結方法はこのあと出てくる)
• 複数のObservableがそれぞれ非同期処理をするとして、
それぞれをシーケンシャルに実行して結果を次々渡す
などもお手の物。(もちろんパラレルにも出来る)
• Observable自体は将来実行される何かなので、そのオ
ブジェクト自体ができた時点では何も起こってないこ
とに注意。
実行場所と観測場所
• Observable#subscribeOn
• Observableがsubscribeされるスレッドを指定(処理が実行されるスレッドと考えて差し支えない)
• Observableごとに異なるsubscribeOnを指定みたいなことは出来ない。いくつ指定しても最初に指
定したものが使わる。
• Observable#observeOn
• Observableがイベントを通知する先のスレッドを変更
• Androidの場合だと非同期処理の結果をViewに描画するときはMainThreadである必要があるので、
subscribeの直前でobserveOnにRxAndroidのAndroidSchedulers.mainThread()を指定すると便
利
GitHubService service = restAdapter.create(GitHubService.class);
service.getUserPhoto(12345)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
photo -> {
doSomething(photo);
}
error -> {},
() -> {} // complete
);
ワーカスレッドで実行
メインスレッドに結果を
通知してもらう
各種オペレータ
• map
• Observable<T> -> U
• flatMap
• Observable<T> -> Observable<U>
• filter
• retry
• take
• などなど…便利なのが山ほどある
Observableを連結する
• Observable.merge
• Observable.concat
• Observable.zip
• Observable.combineLatest
Observable.merge
• 複数のObservableを1つにまとめる
• 各々のObservableから排出されるアイテムTは
排出された時系列に並べれる(パラレル)
Observable.concat
• 複数のObservableを1つにまとめる
• 各々のObservableから排出されるアイテムTは
前のObservableから排出された順、次の
Observableから排出された順というふうに並べ
れる(シリアル)
Observable.zip
• 複数のObservableを1つにまとめる
• 各々のObservableから排出されるアイテムTは
ひとつめのObservableから排出された最新のも
のと、もうひとつのObservableから排出された
最新のものをペアにして関数に渡される
Observable.combineLatest
• 複数のObservableを1つにまとめる
• 複数のObservableの、それぞれ最後のアイテムにfuncを適用して新し
い結果を次に返す。
• funcは複数のObservableのどれかのonNextが来るたびに適用され
る。
• zipと似ているが、複数のObservableのそれぞれ最新の値を待ち合わせ
るわけではない。どれかがonNextに来るたびに呼ばれて、値が新しく
なったもの以外はこれまでの最新の値がfuncの引数に渡る。このこと
によって、3つぐらいの条件が全て満たされたら○○みたいなのが非常
に書きやすくなる。これめっちゃつかえるので絶対に覚える必要あり。
WidgetもObservableに
Observable.combineLatest(
WidgetObservable.text(editTextNickname),
WidgetObservable.text(editTextPhone),
(onTextChangeEvent, onTextChangeEvent2) -> {
return TextUtils.isEmpty(onTextChangeEvent.text())
&& TextUtils.isEmpty(onTextChangeEvent2.text());
})
.subscribe( submitButton::setEnabled);
まとめ
• Observable(ストリーム)をリストと考えると、
リストに対して関数をmap(写像)して違う結果を
得るというのは非常に関数型プログラミング的でとっ
つきやすい
• Observableと前出のOptional(今回は実質同じも
の)を組み合わせると非常に表現の幅が広がる
• すべてがObservableな世界ではObservableを組み
合わせるだけでアプリが完成する!
Androidで関数型プログラミング
• あるデータ構造(しばしばリスト)aに関数を適用して別のデー
タ構造bを得る。(a -> b) -> [a] -> [b]
• Maybe的にデータ構造の中身を取り出すことなく利用する
• こういったプログラミングスタイルが可能になることから
「Androidで関数型プログラミング」という表現を使いました
• Androidで利用可能なJavaで参照透過性を強制するのは不可能
だし無意味だし高階関数も中途半端なので世間的には関数型プロ
グラミングとは見なされないかもしれませんが、どうか広い心で
発表を楽しんでいただけたら幸いです
いい忘れ
• ラムダ式はRetrolambdaで使えます
• ラムダ式
• メソッド参照
• ちょっとインストールややこしいので後で加筆
します。
ご静聴ありがとうございました。

Contenu connexe

Tendances

Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門yujiro_t
 
おっさんES6/ES2015,React.jsを学ぶ
おっさんES6/ES2015,React.jsを学ぶおっさんES6/ES2015,React.jsを学ぶ
おっさんES6/ES2015,React.jsを学ぶdcubeio
 
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしい関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしいke-m kamekoopa
 
ScalaでBacklogの通知bot作ったで
ScalaでBacklogの通知bot作ったでScalaでBacklogの通知bot作ったで
ScalaでBacklogの通知bot作ったでAsami Abe
 
Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Ra Zon
 
元インフラエンジニアが
Scalaを触ってつまづいたところ。
元インフラエンジニアが
Scalaを触ってつまづいたところ。元インフラエンジニアが
Scalaを触ってつまづいたところ。
元インフラエンジニアが
Scalaを触ってつまづいたところ。takako onoue
 
PlayFramework1.x基礎編
PlayFramework1.x基礎編PlayFramework1.x基礎編
PlayFramework1.x基礎編Asami Abe
 
ぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュKenji Mori
 
Railsバージョンアップを 段階的に行うために Rails3/4並行稼動させる仕組み を作ってる話
Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話
Railsバージョンアップを 段階的に行うために Rails3/4並行稼動させる仕組み を作ってる話Masayuki Morita
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 
あなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデルあなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデルMikiya Okuno
 
Java8 code kata (Japanese)
Java8 code kata (Japanese)Java8 code kata (Japanese)
Java8 code kata (Japanese)Hiroaki Kono
 
20150207 何故scalaを選んだのか
20150207 何故scalaを選んだのか20150207 何故scalaを選んだのか
20150207 何故scalaを選んだのかKatsunori Kanda
 
JavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなことJavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなことMayu Kimura
 
クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介しくみ製作所
 
Scalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive ProgrammingScalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive ProgrammingTomoharu ASAMI
 
Introduction of SQL Anti-pattern at Phpcon Hokkaido
Introduction of SQL Anti-pattern at Phpcon HokkaidoIntroduction of SQL Anti-pattern at Phpcon Hokkaido
Introduction of SQL Anti-pattern at Phpcon HokkaidoKenta Kawai
 

Tendances (20)

Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門
 
おっさんES6/ES2015,React.jsを学ぶ
おっさんES6/ES2015,React.jsを学ぶおっさんES6/ES2015,React.jsを学ぶ
おっさんES6/ES2015,React.jsを学ぶ
 
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしい関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
 
ScalaでBacklogの通知bot作ったで
ScalaでBacklogの通知bot作ったでScalaでBacklogの通知bot作ったで
ScalaでBacklogの通知bot作ったで
 
Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]
 
元インフラエンジニアが
Scalaを触ってつまづいたところ。
元インフラエンジニアが
Scalaを触ってつまづいたところ。元インフラエンジニアが
Scalaを触ってつまづいたところ。
元インフラエンジニアが
Scalaを触ってつまづいたところ。
 
PlayFramework1.x基礎編
PlayFramework1.x基礎編PlayFramework1.x基礎編
PlayFramework1.x基礎編
 
ぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュ
 
Railsバージョンアップを 段階的に行うために Rails3/4並行稼動させる仕組み を作ってる話
Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話
Railsバージョンアップを 段階的に行うために Rails3/4並行稼動させる仕組み を作ってる話
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
あなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデルあなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデル
 
Java8 code kata (Japanese)
Java8 code kata (Japanese)Java8 code kata (Japanese)
Java8 code kata (Japanese)
 
20150207 何故scalaを選んだのか
20150207 何故scalaを選んだのか20150207 何故scalaを選んだのか
20150207 何故scalaを選んだのか
 
JavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなことJavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなこと
 
クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介
 
Scalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive ProgrammingScalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive Programming
 
Introduction of SQL Anti-pattern at Phpcon Hokkaido
Introduction of SQL Anti-pattern at Phpcon HokkaidoIntroduction of SQL Anti-pattern at Phpcon Hokkaido
Introduction of SQL Anti-pattern at Phpcon Hokkaido
 
TypeScript超入門
TypeScript超入門TypeScript超入門
TypeScript超入門
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
Scala is-unscared
Scala is-unscaredScala is-unscared
Scala is-unscared
 

Similaire à Rxjavaとoptionalで関数型androidしよう

Reactive Systems と Back Pressure
Reactive Systems と Back PressureReactive Systems と Back Pressure
Reactive Systems と Back PressureAkihiro Ikezoe
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
サーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみたサーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみたItaru Kitagawa
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
Reactive Extensionの紹介
Reactive Extensionの紹介Reactive Extensionの紹介
Reactive Extensionの紹介Dev Ogiwara
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and designTomoharu ASAMI
 
Redux, Relay, HorizonあるいはElm
Redux, Relay, HorizonあるいはElmRedux, Relay, HorizonあるいはElm
Redux, Relay, HorizonあるいはElmchuck h
 
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumiリアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumiYuta Okamoto
 
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~Developers Summit
 
The Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in CorporationsThe Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in CorporationsKoichiro Ohba
 
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについてNobukazu Hanada
 
Ruby Extended Library
Ruby Extended LibraryRuby Extended Library
Ruby Extended LibraryAkio Tajima
 
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングデザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングkei takakuda
 
Scala.jsはじめました!
Scala.jsはじめました!Scala.jsはじめました!
Scala.jsはじめました!K Kinzal
 
JavascriptでRubyの作り方
JavascriptでRubyの作り方JavascriptでRubyの作り方
JavascriptでRubyの作り方Shuyo Nakatani
 
rChartsによるインタラクティブな可視化表現
rChartsによるインタラクティブな可視化表現rChartsによるインタラクティブな可視化表現
rChartsによるインタラクティブな可視化表現Yasuyuki Sugai
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Tomoharu ASAMI
 
JavaScriptことはじめ
JavaScriptことはじめJavaScriptことはじめ
JavaScriptことはじめYuki Ishikawa
 

Similaire à Rxjavaとoptionalで関数型androidしよう (20)

Reactive Systems と Back Pressure
Reactive Systems と Back PressureReactive Systems と Back Pressure
Reactive Systems と Back Pressure
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
サーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみたサーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみた
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
Reactive Extensionの紹介
Reactive Extensionの紹介Reactive Extensionの紹介
Reactive Extensionの紹介
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
 
Redux, Relay, HorizonあるいはElm
Redux, Relay, HorizonあるいはElmRedux, Relay, HorizonあるいはElm
Redux, Relay, HorizonあるいはElm
 
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumiリアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
 
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
 
The Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in CorporationsThe Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in Corporations
 
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
 
Ruby Extended Library
Ruby Extended LibraryRuby Extended Library
Ruby Extended Library
 
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングデザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリング
 
Scala.jsはじめました!
Scala.jsはじめました!Scala.jsはじめました!
Scala.jsはじめました!
 
JavascriptでRubyの作り方
JavascriptでRubyの作り方JavascriptでRubyの作り方
JavascriptでRubyの作り方
 
rChartsによるインタラクティブな可視化表現
rChartsによるインタラクティブな可視化表現rChartsによるインタラクティブな可視化表現
rChartsによるインタラクティブな可視化表現
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
JavaScriptことはじめ
JavaScriptことはじめJavaScriptことはじめ
JavaScriptことはじめ
 
Rx Showcase
Rx ShowcaseRx Showcase
Rx Showcase
 

Plus de Fumihiko Shiroyama

GCP HTTPロードバランサ運用例
GCP HTTPロードバランサ運用例GCP HTTPロードバランサ運用例
GCP HTTPロードバランサ運用例Fumihiko Shiroyama
 
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発Fumihiko Shiroyama
 
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFirebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFumihiko Shiroyama
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方Fumihiko Shiroyama
 
Ops worksに今後期待するところ
Ops worksに今後期待するところOps worksに今後期待するところ
Ops worksに今後期待するところFumihiko Shiroyama
 

Plus de Fumihiko Shiroyama (10)

Firebase with Android
Firebase with AndroidFirebase with Android
Firebase with Android
 
RxJava - Subject 入門
RxJava - Subject 入門RxJava - Subject 入門
RxJava - Subject 入門
 
GCP HTTPロードバランサ運用例
GCP HTTPロードバランサ運用例GCP HTTPロードバランサ運用例
GCP HTTPロードバランサ運用例
 
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
 
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFirebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
 
AndroidでEither
AndroidでEitherAndroidでEither
AndroidでEither
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
 
Ops worksに今後期待するところ
Ops worksに今後期待するところOps worksに今後期待するところ
Ops worksに今後期待するところ
 
Wallet api
Wallet apiWallet api
Wallet api
 
Google io 2013_keynote
Google io 2013_keynoteGoogle io 2013_keynote
Google io 2013_keynote
 

Rxjavaとoptionalで関数型androidしよう