(-> % read write unlearn)

My writings on this area are my own delusion

JJUGCrossCommunityConference2015Springメモ

JJUGCrossCommunityConference2015Springのメモです。昼に予定があって、17:00から3つのセッションにしか参加できなかったです。表示も整えていないし、メモベースなので、ひどい状態ですが、自分の備忘として。下書きにしたまま結構日が経ってしまった。。

2015年04月11日 ベルサール新宿グランド

プログラミング言語Clojureのニャンパスでの活用事例

17:00

発表者の方のスライド->プログラミング言語Clojureのニャンパスでの活用事例

太田正悟さん

  • @athos0220
  • Clojureのコントリビュータ(ちょこっと)
  • 今年2月よりニャンパス所属。

ニャンパス株式会社

Clojureの概要

関数型言語

  • 多くの値がイミュータブル
  • ファーストクラスな関数
  • 遅延シーケンスで無限個の値も扱える。

JVM言語

  • Javaのオブジェクトも簡単に扱える。
  • 無名クラスも簡単に作れる。

Clojureを使う理由

・・・

アジャイル開発との親和性

十分な実用性

  • 十分なパフォーマンス
  • 豊富なライブラリ
  • 実用レベルのエコシステム

言語の自由度

  • 実行時のプログラム変更
  • 問題領域にあった言語の定義

    • マクロ
  • マクロライブラリ

    • core.typed 静的型チェック
    • core.async 非同期プログラミング
    • core.match パターンマッチ
    • core.logic 論理プログラミング

Clojureの活用事例

baasday

LessonSupporter

  • 個人レッスン支援サービス
    • 簡易CMS・ブログ・予約完治機能等を提供
  • ボイストレーナー星野氏と共同で開発中
  • 近日公開予定

CMSモデル

  • CMSを構成するページからなるマップ
  • 着手から3日でCMSモデルと秒が処理のコアが完成。
  • 後にページテンプレート毎のカスタム描画方法をマルチメソッドで定義できるように。
  • インタラクティブAPIの確認
    • WebPayAPIによるクレジット決済
    • 初利用だったためREPLからAPIの使い勝手を確認。

Clojureコミュニティに向けた取り組み

質疑応答

  • どれくらい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式)

logappender : logbackのアペンダとしてMavenで公開している。

RRD4J:RRDToolJavaクローン。PureJavaでグラフが書ける。