clojure web関連キャッチアップ 2014冬


# はじめに
広めで薄い内容ですが、お付き合いください。

clojure関連で話題になったWeb関連のライブラリなどを上げていきます。
今後、具体出来な紹介記事を書くかもしれません。

# カンファレンス紹介

まずは、今年あった大きなClojrueイベントで発表された資料をまとめてみました。
英語が苦手でも、図入りのスライドなどから雰囲気を読み取ってもらえるといいと思います。

## EuroClojure 2014
毎年6月後半ごろに開催されるヨーロッパのオンリーイベント

今年のEuroClojureは実践的な発表がかなり多く、また他のイベントでも同じ発表しているようですので、感想記とスライドをひと通りみてみるといいとおもいます。

### 感想記
EuroClojure 2014, Krakow
https://gist.github.com/philandstuff/299cda371c7e74b03f18

### slides
https://www.google.co.jp/search?q=euroclojure+2014+site:slideshare.net

### videos
http://vimeo.com/euroclojure/videos/sort:date/format:detail

### 一部を紹介
自分が面白いとおもったセッションを紹介します。

#### Schema & Swagger - making your Clojure web APIs more awesome
http://www.slideshare.net/metosin/euroclojure2014-schema-swagger-making-your-clojure-web-apis-more-awesome

compojureをベースにしたWEB APIを作る話。
入出力の型にPrismaticのSchemaを使うことで、
APIのドキュメントは、Swagger UIを使って自動生成して、実際に叩いて試すことも出来る。

動作しているところに一見の価値があるので、実際に、動かしてみよう。
動作デモ1([ソース](https://github.com/metosin/compojure-api))
https://immense-inlet-2435.herokuapp.com/index.html
動作デモ2([ソース](https://github.com/odekopoon/compojure-api-examples))
https://infinite-wave-1738.herokuapp.com/index.html
Github
https://github.com/metosin/compojure-api

#### Clojure at a post office
http://www.slideshare.net/colinlogaan/clojure-at-a-post-office-36333973

オーストラリア郵政公社のスマホアプリのバックエンドをhttp-kitと非同期APIで構築したはなし。
同時利用者が30万人、秒間5000弱のリクエストのWEB APIサービスが、EC2 C1 Mediumインスタンス(8core/メモリ7GB)で動いている。
設計がCQRS（命令と問い合わせを分けている）なので、APIが非同期になっている。
イベントストアはCassandraを使っている。

#### Using Clojure for Sentiment Analysis of the Twittersphere
http://www.slideshare.net/garycrawford/using-clojure-for-sentiment-analysis-of-the-twittersphere-euroclojur

tweetを集めて、解析するはなし。
ringサーバでtweetを受信する仕組みと、保存する仕組みと解析する仕組みがある。
LMAX Disrupter経由で非同期にバッファリングして保存している。


#### Reactive data visualisations with Om
http://www.slideshare.net/annapawlicka/reactive-data-visualisations-with-om

Omを使ったビジュアライゼーションの話。
実際にどんなことをしてるか説明している。

ちなみに、下記のclojure/conjの発表資料には、「avoid pie chart」というスライドがあったり、websocket使う場合、開発環境にchestnutを使う話もある。

Om nom nom nom
http://www.slideshare.net/annapawlicka/om-nom-nom-nom

デモアプリをためしてよう。
デモ http://evening-citadel-3933.herokuapp.com/
github https://github.com/annapawlicka/pumpkin


## Strange Loop 2014
毎年9月後半ごろにセントルイスで開催されるイベント。
Alex Millerさんが発起人の明日のソフトウエア技術に関する発表が主。
２日間同時5セッションの発表のうちで1セッション程度clojure関連の発表がある。


今年の発表では、JVMでいかに実装を高速化するかという話やclojureでの、RPC(finagle-clojure)・非同期連携(Onyx)などについての発表があった。
上記のEuroClojure2014の項で取り上げたようなサービスを作りたい人に参考になると思う。

### 感想記
http://seancorfield.github.io/blog/2014/09/25/the-strange-loop-2014/

### slides
https://github.com/strangeloop/StrangeLoop2014/tree/master/slides/sessions

### Videos
https://www.youtube.com/channel/UC_QIfHvN9auy2CoOdSfMWDw/videos

## Clojure West 2014
3月後半ごろにアメリカ西海岸で行われるclojureオンリーイベント
Clojure/conjと同じくclojure開発コアメンバーが結集しているCognitect主催なので、半年交互に東海岸と西海岸となる。

### Videos
https://www.youtube.com/playlist?list=PLZdCLR02grLp__wRg5OTavVj4wefg69hM

## Clojure/conj 2014
世界中のclojure開発者を集めるconj
毎年11月後半に行われるclojureのトップカンファレンス
今後もアメリカ東海岸での開催とおもわれる。

### Videos
https://www.youtube.com/playlist?list=PLZdCLR02grLoc322bYirANEso3mmzvCiI

# ライブラリ紹介
## webサーバ
ringを使って、lein ringでjetty上で起動したり、lein ring warなどでservletコンテナファイルを作成できますが、非同期APIを使う場合には、http-kitやalephなどを使うことになります。

12月のベンチマークによると、nginx-clojure、ring-undertow, immutant2, alephなどが特別に速いようです。
https://github.com/ptaoussanis/clojure-web-server-benchmarks

nginx-clojureは、nginxのバックエンドとして動く仕組み。
ring-undertowは、JBoss WildFlyのweb subsystemであるundertowを使ったringモジュール。
immutant2は、JBoss WildFlyベースのClojure向けAPサーバでring-undertowと同じくringベースの起動かwarでWildFlyに配備します。
この後少しimmutant2の紹介を続けます。

### immutant2
この春ベータ版が公開され開発が続いてます。
http://immutant.org/news/2014/04/28/getting-started-with-2x/

immutant2を使った場合、WildFlyのと同じく、メッセージング（HornetQ）、キャッシュ（Infinispan）、トランザクション（Narayana）、ジョブスケジュール（Quartz）、ロギングなどJBossアプリケーションの昨日を利用することが出来ますが、webサーバのみ利用できるため、実際に使うかどうかは好みになると思います。

ドキュメントは、cloudbeesのCIサーバ上にあります。
https://projectodd.ci.cloudbees.com/job/immutant2-incremental/lastSuccessfulBuild/artifact/target/apidocs/index.html


## webフレームワーク
[immutant2のドキュメント](https://projectodd.ci.cloudbees.com/job/immutant2-incremental/lastSuccessfulBuild/artifact/target/apidocs/guide-web.html)でも触れられていますが、Compojure、[Luminus](http://www.luminusweb.net/)、[Caribou](http://let-caribou.in/)などが認知されているWebフレームワークです。

### Luminus
noirというWebフレームワークがディスコンした後、noirをライブラリ化して再構成したwebフレームワークです。

#### 構成
下記のように、Compojure/Ring、Hiccupに、SelmerというDjangoライクなテンプレート、libnoir、ActiveRecordのKormaという構成になっています。
http://www.luminusweb.net/api

#### libnoir
中心になるlibnoirは、
lib noirは、cookie、session、io（静的ファイルのレスポンス用）、リクエスト、ヘッダやリダイレクト、コンテンツ形式を扱うレスポンス、バリデーションライブラリのセットです。
http://yogthos.github.io/lib-noir/index.html


### Caribou
Caribouは、新しいフルスタック指向のWebフレームワークです。clojureエコシステムでは、あまり受け入れられないことが多いのですがどうなるでしょうか。

http://caribou.github.io/caribou/docs/components.html

### Schema & Swagger (Compojure-API)
https://github.com/metosin/compojure-api

EuroClojureのSchema & Swaggerを参考にしてください。
Metosinという会社では、SchemaやSwaggerを使うためのライブラリの他に、HTTPレスポンスなどのライブラリも作っています。

## RPC
バックエンドをREST/HTTPを優先で組み立てていても、
すべてのサービスを非同期HTTPで捌き切れない場合の構成として、下記のスライドのような「HTTP - RPC - Resource」の構成を取りたいときにRPCが必要になる。
Finagle-Based Microservices at SoundCloud
http://www.slideshare.net/pcalcado/finaglebased-microservices-at-soundcloud

RPCサービスとして実装が必要になった時は、JVMのReactorやFinagleなどを使うことが多い。

### clojure-finagle
https://github.com/finagle/finagle-clojure

[サンプルのように](https://github.com/finagle/finagle-clojure/blob/master/doc/quick-start.md
)Thriftのインターフェイスを定義してやると、clojureで、finagleサーバとクライアントの実装が書ける。

strangeloop 2014で発表があったので、参考にしてほしい。
Highly Concurrent Services with Finagle & Clojure
https://www.youtube.com/watch?v=-woCYVaMBsg

### その他
JVMの世界では、アプリケーション内部の非同期メッセージングに[LMAX Disruptor](https://lmax-exchange.github.io/disruptor/)を使った実装が増えている。

springのチームでも、LMAX Disruptorを使った[Reactor](http://reactor.github.io/reactor/)という非同期ライブラリに[Reactive Streams](https://spring.io/blog/2014/10/21/reactor-2-0-0-m1-released-with-reactive-streams-integration)を実装したという発表をしており開発者も増えている。

clojureでも、stormやstrengeloop 2014で発表のあった分散データプロセッサの[Onyx](http://michaeldrogalis.tumblr.com/post/98143185776/onyx-distributed-data-processing-for-clojure)
などに使われている。

# おわりに
取り留めもない感じになってしまいましたが、今回はこのへんで。
MQTTや分散処理系の話などもまとめる機会があるといいのですが。

最後まで付き合いいただき有り難うございます。
来週の記事でまたお会いしましょう。