JJUGCrossCommunityConference2015Springのメモです。昼に予定があって、17:00から3つのセッションにしか参加できなかったです。表示も整えていないし、メモベースなので、ひどい状態ですが、自分の備忘として。下書きにしたまま結構日が経ってしまった。。
2015年04月11日 ベルサール新宿グランド
プログラミング言語Clojureのニャンパスでの活用事例
17:00
発表者の方のスライド->プログラミング言語Clojureのニャンパスでの活用事例
太田正悟さん
- @athos0220
- Clojureのコントリビュータ(ちょこっと)
- 今年2月よりニャンパス所属。
ニャンパス株式会社
- 2010年設立
- 業務内容
- Webサービス・アプリ開発
- プロトタイピング(施策開発)→今後強化
- コワーキングスペースHaLakeを運営
Clojureの概要
関数型言語
- 多くの値がイミュータブル
- ファーストクラスな関数
- 遅延シーケンスで無限個の値も扱える。
JVM言語
- Javaのオブジェクトも簡単に扱える。
- 無名クラスも簡単に作れる。
Clojureを使う理由
・・・
アジャイル開発との親和性
- 素早いフィードバックループ
- REPL
- 素早いデータ構築
- イミュータブルなデータ構造
- 全身的な設計
- 後付け可能なポリモーフィズム
- 設計に関する決定を後に遅らせる。
十分な実用性
- 十分なパフォーマンス
- 豊富なライブラリ
- 実用レベルのエコシステム
言語の自由度
- 実行時のプログラム変更
問題領域にあった言語の定義
- マクロ
マクロライブラリ
- core.typed 静的型チェック
- core.async 非同期プログラミング
- core.match パターンマッチ
- core.logic 論理プログラミング
Clojureの活用事例
baasday
LessonSupporter
CMSモデル
- CMSを構成するページからなるマップ
- 着手から3日でCMSモデルと秒が処理のコアが完成。
- 後にページテンプレート毎のカスタム描画方法をマルチメソッドで定義できるように。
- インタラクティブなAPIの確認
- WebPayAPIによるクレジット決済
- 初利用だったためREPLからAPIの使い勝手を確認。
Clojureコミュニティに向けた取り組み
- OSS
- clojurnal
- Clojureの日本語発信サイト
- clojurnal
- clowpay
parabola
- チャットボットフレームワーク
コワーキングスペースHalake
質疑応答
どれくらいClojure書ける人いるの。
- 正社員で2人。他パートナーさんとか。
core.logicを使う機会ってありますか。
- Datomicでは、クエリ言語がcore.logicのようなものになっている。
Java開発の協力な相棒としていますぐ使えるGroovy
18:00
発表者の方のスライド->Java開発の強力な相棒として今すぐ使えるGroovy
中野靖治さん @nobeans NTTソフトウェア株式会社Grails推進室
Groovyとは
「ポストJava」ではなく「Java強化外骨格」。もしくは「Java拡張パック」。 Rubyに似ている。 Goovy界はRubyにリスペクトがある。
Java(7以前)との文法の互換性が高い。 Java8のラムダ記法は未対応。 代わりにより高機能なクロージャを使う。 全てのJavaAPIがシームレスに呼び出せる。 GroovyJDK(GDK)と呼ばれる超便利メソッドが標準で使える。
メインのプログラミング言語 Grails、SpringBoot、Vert.x、Android 設定ファイルの記述言語(as DSL) Gradle。SpringBoot、SpringFramework システムのプラグイン機構/拡張ポイント Javaから外部のGroovyスクリプトを簡単に実行できる。 Jenkins プロジェクトの開発支援スクリプト
Javaとの文法の違い
クロージャ
クロージャを定義する。 波括弧を使う。
Closure
assert が協力。『PowerAssert』。 いろんな言語で実装されていっている。
Grape コンパイル時にMavenリポジトリから直接JarをDLし、 クラスパスに通りてからスクリプトを実行する。
セーフナビゲーション演算子 a?.b?.c() nullでない場合のみ右側の呼び出しを実行する。
groovyConsole:GUIのREPL。標準で付いてくる。 groovysrvを使うと実行がさらに早くなる。
XmlParser DOM的(インメモリ、変更可能) XmlSlurper SAX的(ストリーム的、変更不可能)
GPathという記法。
MarkupBuilder
Groovyにもメソッドミッシングがある。
GExcelAPI 中野さんが作った。
JobStreamerではじめるJavaBatchのクラウド分散実行
19:00
発表者の方のスライド->
JobStreamerではじめるJavaBatchのクラウド分散実行
川島義隆さん 普段はClojureしか書いていない。
JavaBatchを始めてみよう。 JSR352 JavaBatchとは ほぼほぼ「SpringBatch」と同じ。
Job 1--n Step 1--0..1 Chunk ---- ItemReader,ItemProcessor,ItemWriter 1--0..1 Batchlet
1.Batchlet または ItemReader ItemProcessor、ItemWriter を実装する。
2.Batch-jobs.xml -> ツライ・・・
3.起動する。-> くやしい・・・でも・・・ジェネレータ作っちゃおう。
ジョブの組み立てをもっと簡単に! ジョブの起動をもっと簡単に! (仕様をぱっと見た時思った。)
ジョブコンテナの運用
- 小さなジョブがたくさん動いても、JVM起動のオーバーヘッドがない。
- でもやっぱり怖い。。
Disposable Batch Container
複数サーバで空いてるリソースにジョブをアサイン。
ジョブの実行環境をDistributedに。
ジョブスケジューラにまつわる思い出。(JavaBatchにはスケジューラの機能ないよ。) * 動いちゃいけないのに、動いてしまった。 * 日付を間違えて登録して、起動しなかった。 * GUIから漂う昭和感。
ジョブがいつ動くかをもっと分かりやすく! できればもっとモダンに!
なのでつくってみた。 JobStreamer(EPLライセンス)
- 管理コンソール上でのGUIによるジョブ組み立て。
- REST API によるジョブの起動
- スケジュール実行(これがないと始まらない。。)
- シンプルな分散実行
- エージェントを起動するだけでジョブが動く、ノーデプロイ・ノーコンフィギュレーション環境。
- エージェントの稼働状況モニタリング
- リアルタイムなログ収集。(ちょっと強引なしくみ。)
- すべてがS式になる。
JobStreamerの構成
- 管理コンソール コントロールバスのWebインタフェイス。 ジョブのGUI組み立て ログの表示。 ジョブのタイムライン表示。
- コントロールバス ジョブの登録やジョブのディスパッチを司る。REST API。
- Datomic(Jobの定義、Jobの実行ログ) SPoFのコントローラバスからのみ繋ぐので、Freeライセンスでも本番運用可能。
- 実行エージェント
WebSocketClassLoaderというのを作った。 WebSocketを張りっぱなしにして、随時足りないclassをロードする。
Datomicとは...
今をときめくAppend-onlyなデータベース。 ストレージ(としてのDB)は別に選択できる。 * DynamoDB * Infinispan * MySQL
などなど
PointはTransactor。ここで全部直列化される。ここは冗長化できない。OSSでもないので、大丈夫か検証できていない。
Why Datomic?
Clojureから自然な形でクエリが書ける。 クエリはDatalogという論理プログラミングの伝統的な記法。
Demo
デプロイなどのために専用のMavenプラグインをセントラルにあげている。
Architecture
WebSocketClassLoader
という(前に自分が作った)プロダクトをどうにか活かせないかと考えた。 JSR356準拠で動くので、dependenciesは0 (EEサーバ以外で動かすなら Undertow) * ClassProvider * WebSocketClassLoader
- 1.サーバ実装 liberator APIを宣言的に書くことができる。 デシジョングラフ。どこをどう通ってレスポンスを返したか、リクエストごとにヴィジュアライズされる。
- 2.Javascript -> Clojurescript (S式) -> Om (CircleCIのUIはOmで作られている)
- 3.CSS -> garden (S式)
- 4.SQL -> Datalog (S式)