読者です 読者をやめる 読者になる 読者になる

testblog

プログラミングとかの話題はQiitaの方へ投稿しています。ここにはなんかテキトゥなこと書いてます。

先週「Reactive System Meetup in 西新宿」に行ってみた。

(Elmを勉強していたので)リアクティブという言葉に惹かれて「Reactive System Meetup in 西新宿」に行ってみた。
行ってみると自分の知らない分野について知ることが出来て大変良かった。
リアクティブと名がつく技術たちを見渡せることが出来るようになったと思う。

発表は3つあった。見ての感想とか。

Reactive とは何か

岡本雄太 (@okapies)氏

Reactiveという言葉を

・リアクティブプログラミング(FRPソースコード上の表現)
・ランタイム(実際の実現方法、生成されるコード)
・リアクティブシステム(システム設計)

の3つの視点からまとめていた。

リアクティブプログラミング。(FRP|RP)
 リアクティブプログラミング、そういう表現方法。データと処理をまるで配線か流れように、定義的に記述することができる。

ランタイム  ランタイムとは、(リアクティブプログラミング)コードをコンパイルしたあと、生成されるもの。コードの裏側。
 つまり、どういった技術が使われているのかであり、最適化が施されたりする部分。なので、リアクティブの技術でこれから注目すべき部分だと言っていた。

リアクティブシステム  リアクティブなシステム設計。リアクティブストリーム。

リアクティブマニフェスト "The Reactive Manifesto v2.0" 日本語訳 http://okapies.hateblo.jp/entry/2014/12/03/025921

リアクティブストリーム。 参考: 2014 akka-streams-tokyo-japanese
http://www.slideshare.net/ktoso/2014-akkastreamstokyojapanese

リアクティブストリームとはサーバーからフロントエンドまで、リアクティブなシステムを繋げるために、提唱された規格?。 バックプレッシャーな、データストリーム機構を指す。
ストリームのパブリッシャー役とスクライバー役のうち、処理速度の速い方がスクライバー役になり、pullを基本に処理速度の差を調節するストリームを指す。ようだ。
(例えばslick streamではDB側がパブリッシャーになっている,,であってるのだろうか?)

どちらの提唱も、歴史的に最初にtypesafe社が行い、リアクティブストリームは、javaの並列計算の本の著者が一部をJava9仕様に入れようとしていたり、リアクティブマニフェストは署名者が1万人になっていたり、といった発展をしている。

FRPをしていたので発表は非常にわかりやすかった。 リアクティブは主にRxだけだと思っていたが、サーバーサイドでも発展にしている。 リアクティブストリームを知った。

scalaz-streamによるFunctional Reactive Programming

(株)Everforth 浅海智晴 (@asami224)氏
リンク : http://www.slideshare.net/asami224/scalazstreamfunction-reactie-programming

関数型言語の変革から関数型言語デザパタ、Stateモナドへの記述の変化。 FRPのコードを、再利用するコード例など、関数型言語の利点に溢れていた。

関数型言語多少やっててよかった、スライド上のコードがなんとなく読めた。

scalazはscalaの標準ライブラリを補強するライブラリであり、scalaz-streamはFRPライブラリのようだ。
(scalaz-streamはこれからscalazに依存しなくなるので名前を募集中とtwitterに補足があった)
発表の中で、FRPの挙動と、種類に纏わる話が出た。(scalaz-streamはrunで実行されるのでpullのみなど)あとで調べてみようと思った。

スライド中から

Rx
はObservable
scalaz-stream
はProcess
Akka stream
はAkka actor

(ElmはSignalかな)

push pull 等 http://neue.cc/2010/06/24_263.html

(Elmはpush、hotのみ、Task(Elmの非同期の型)はrunにあたるものがあるからそこだけpullといえるだろうか。)

「Typesafe Reactive Platform」で作るリアクティブ・システム入門

TIS(株) 前出祐吾(@yugolf)
リアクティブ体験 ~「Reactive Solar Farm Monitor」デモ
TIS(株) 根来和輝(@negokaz)
リンク : http://www.slideshare.net/yugolf/typesafe-reactive-platformreactive-system

Typesafe 社の Typesafe Reactive Platform というのをつかって開発を行っているそうだ。

Typesafe Reactive Platformというのは以下のもので成り立つ。
Scala Java
PlayFramework Akka Slick
JavaVM

それぞれの特徴について説明されていて、そのあとソーラーパネルの監視システムという例で作られたデモが公開された。
そしてデモが素晴らしかった。(Elmのデモでも見たようなあの)操作がすぐリアルタイムで反映されて壊れない、リアクティブ感を感じるものだった。
アクターを親、子で起動して子供(ワーカー)に仕事に割り振るのだが、ワーカーがダウンしても他のワーカーが自動でやりくりしたり、親役がダウンしても子供が親役に自動で昇格したり、もうこいつ(akkaのアクター)だけでよくね、っていうモダンさだった。

サーバー側のデモというのを今まで見たことなかったのでほんとうに見れてよかった。githubに挙がっているので家でも動かすことができる。
個人的にサーバーサイド自体にはあまり目を向けていなかった。だが、耐障害性、拡張性など考える部分、すごく面白そうだ。調べてみようと思う。

まとめ

リアクティブ、行ってみると、scalaだった。自分はscalaについて何も知らなかったがとてもおもしろかった。思っていた以上にFRPの利用範囲って広い。
Scalaはこの分野強そうである。とてもモダンに感じた。

特に気になったのは、リアクティブストリームが提唱されたのは、サーバー、ソース元のシステム、各コンポーネントシステム、フロントエンドまですべてで、FRP|RPのストリームをつなげて、協調動作させるためらしい。
scalaというかtypesafe社?の世界観(と実現力)半端ない。

補足

Typesafe Reactive Platform

Scala
Java
PlayFramework
Akka
Slick
spark
JavaVM
というものたちで構成される。

playフレームワーク

scalaのサーバーサイドmvcフレームワーク

slick

リレーショナルデータベースを簡単に扱うための、ScalaのFRM (Functional Relational Mapping)ライブラリ。playが採用している。
直接sql書くこと可能。非同期アクセスが可能。oracle とか使うときは商用のプラグインが必要。
DATABASES & ACTIONS
http://slick.typesafe.com/doc/3.0.0-M1/database.html
ver3のドキュメント日本語訳
http://krrrr38.github.io/slick-doc-ja/v3.0.out/Combined+Pages.html

akka

アクターモデル」で記述する、並列分散処理フレームワーク
子供のアクターをつくって、いろんなアルゴリズムで処理を振り分けたりできる。アクターの増減でスケールが容易。 クラスター用のプラグインを使うことで、クラスター間でもつかえる。 とてもわかりやすいスライド http://www.slideshare.net/sifue/akka-39611889

他参考 Play2+nginx/Akka/WebSocketで高速双方向通信 (1/2) http://www.atmarkit.co.jp/ait/articles/1312/18/news031.html

リアクティブストリーム

以下のスライドがとてもわかりやすい。 2014 akka-streams-tokyo-japanese
http://www.slideshare.net/ktoso/2014-akkastreamstokyojapanese

リアクティブストリームとはサーバーからフロントエンドまで、リアクティブなシステムを繋げるために、提唱された規格?。バックプレッシャーな、データストリーム機構を指す。   ストリームのパブリッシャー役スクライバー役のうち、処理速度の速い方がスクライバー役になり、pullを基本に処理速度の差を調節するストリームを指すようだ。(例えばslick streamではDB側がパブリッシャーになっている,,であってるのだろうか?)

slickもakkaも最近リアクティブストリームに準拠した
slick stream
akka stream
というapiが追加された。
slick streamはまだよくわからないが、akka stream はFRPのようなものっぽい。
DSLでストリームのグラフを記述したりもできるようだ。
またslick steram からakkaのactorにつなげて起動したり、slick stream からakka streamにつなげたりも?できるらしい。

サーバーの種類?

scala製サーバーって速いと聞くけど、サーバーの仕組み?種類はなんなんだと検索したら、playフレームワークは、nettyというサーバー(フレームワーク)を内封していて、その上に構築されているようだ。
nettyはマルチスレッド、非同期イベント駆動のフレームワークらしく。パイプラインの中にハンドラーが並んでいるモデルで記述するようだ。 http://d.hatena.ne.jp/fatrow/20110208/netty PlayのNettyServer http://krrrr.hatenablog.com/entry/2014/10/12/080550