プログラミング言語Clojureの
ニャンパスでの活用事例
JJUG CCC 2015 Spring
2015/04/11 @ ベルサール新宿グランド
ニャンパス株式会社 太田 正悟
自己紹介
‣ 太田 正悟 (@athos0220)
‣ Clojureコントリビュータ
‣ 今年2月よりニャンパス所属
‣ 2013年に某アニメ関連で話題になっていたニャン
パスと交流をはじめる
会社紹介
‣ ニャンパス株式会社
‣ 2010年設立
‣ 業務内容
‣ Webサービス・アプリ開発
‣ プロトタイピング(試作開発)
‣ コワーキングスペースHaLakeを運営
アジェンダ
‣ Clojureの概要
‣ Clojureを使う理由
‣ Clojure活用事例
‣ Clojureコミュニティに向けた取り組み
Clojureの概要
Clojureの概要
‣ Lisp系言語
‣ 関数型言語
‣ JVM言語
Clojureの概要: Lisp系言語
‣ S式というLisp由来の独特のシンタックスをもつ
‣ 言語がシンプルで覚えることが少ない
‣ マクロを使ってプログラマが言語を拡張できる(後述)
(defn hello [name]	
(println (str “Hello ” name)))
Clojureの概要: Lisp系言語
user=> (defn f [x] (+ x 1))	
#’user/f	
user=> (f 10)	
11	
user=> (defn f [x] (* x x))	
#’user/f	
user=> (f 10)	
100
REPL(Read-Eval-Print Loop)を
使ったインタラクティブな開発
Clojureの概要: 関数型言語
‣ 多くの値がイミュータブル(不変)
‣ ファーストクラスな関数
‣ 遅延シーケンスで無限個の値も扱える
(reduce (fn [a x] (+ a x))	
(map (fn [x] (* x x))	
(take-while (fn [x] (<= x 100))	
(range))))
Clojureの概要: 関数型言語
(->> (range)	
(take-while #(<= % 100))	
(map #(* % %))	
(reduce +)) こうも書ける!
‣ 多くの値がイミュータブル
‣ ファーストクラスな関数
‣ 遅延シーケンスで無限個の値も扱える
Clojureの概要: JVM言語
‣ Javaのオブジェクトを簡単に扱える
‣ 無名クラスも簡単に作れる
(String. “foo”)	
(.substring “foo” 1)	
Math/PI	
(Long/parseLong “42”)
new String(“foo”)	
“foo”.substring(1)	
Math.PI	
Long.parseLong(“42”)
Clojure Java
Clojureの概要: JVM言語
‣ Javaのオブジェクトを簡単に扱える
‣ 無名クラスも簡単に作れる
(reify Runnable	
(run [this]	
(println “foo”)))
new Runnable() {	
public void run() {	
System.out.println(“foo”);	
}	
}
Clojure Java
Clojureを使う理由
Clojureを使う理由
‣ アジャイル開発との親和性
‣ 十分な実用性
‣ 言語の自由度
Clojureを使う理由: アジャイル開発との親和性
すばやいフィード
バックループ
すばやい
データ構築
漸進的な設計
REPLによる!
インタラクティブ開発
イミュータブルな!
データ構造
後づけ可能な!
ポリモーフィズム
Clojureを使う理由: アジャイル開発との親和性
‣ イミュータブルなマップ(辞書)でデータの表現を柔軟に
‣ 設計に関する決定を後に遅らせることができる
{:type :rectangle	
:width 30	
:height 40}
public class Rectangle 	
extends Shape {	
int width, height;	
…	
}
Clojure
Java
Clojureを使う理由: アジャイル開発との親和性
‣ イミュータブルなマップ(辞書)でデータの表現を柔軟に
‣ 設計に関する決定を後に遅らせることができる
{:type :rectangle	
:width 30	
:height 40}
(defmulti area :type)
(defmethod area :rectangle	
[shape]	
(* (:width shape)	
(:height shape)))
public class Rectangle 	
extends Shape {	
int width, height;	
…	
}
Clojure
Java
ポリモーフィックな振る舞いは  
マルチメソッド等で後づけできる!
Clojureを使う理由: 十分な実用性
十分な
パフォーマンス
豊富なライブラリ
実用レベルの!
エコシステム
JVM上で動作
Javaとの!
相互運用性
Leiningen!
Clojars, etc.
Clojureを使う理由: 言語の自由度
実行時の
プログラム変更
問題領域にあった
言語の定義
リロード機能!
REPL, etc.
マクロ
Clojureを使う理由: 言語の自由度
マクロ
‣ プログラマが独自の構文を定義できる仕組み
‣ 問題領域に合わせてClojureを拡張可能
(defmacro with-open	
[[name file] & body]	
`(let [~name ~file]	
(try	
~@body	
(finally	
(.close ~name)))))
(with-open [f (reader “foo”)]	
(write-to-file f))
(let [f (reader “foo”)]	
(try	
(write-to-file f)	
(finally	
(.close f))))
マクロの定義
展開
Clojureを使う理由: 言語の自由度
マクロ!
ライブラリ
静的
型チェック
非同期
プログラミング
パターン
マッチ
論理
プログラミング
core.typed
core.async
core.match
core.logic
Clojure活用事例
Clojure活用事例
‣ baasday
‣ Lesson Supporter
baasday
‣ MBaaS (Mobile Backend as a Service)
‣ スマホアプリのバックエンド機能をクラウドサービスとして提供
‣ 運用:2年
‣ 利用者:のべ20万インストール
‣ スループット:150リクエスト/秒
Amazon SES
Amazon SNS
Amazon S3
Amazon ELB
App (EC2)
App (EC2)
App (EC2) DB (EC2)
Lesson Supporter
‣ 個人レッスン支援サービス
‣ 簡易CMS・ブログ・予約管理機能等を提供
‣ ボイストレーナー星野氏と共同で開発中
‣ 近日公開予定
Lesson Supporter
CMSモデル
‣ CMSを構成するペー
ジからなるマップ
‣ 着手から3日でCMS
モデルとページ描画
処理のコアが完成
‣ 後にページテンプレ
毎のカスタム描画方
法をマルチメソッド
で定義できるように
{:description “太田のパソコン教室”,	
:_id “ohta-pc”,	
:name “ohta-pc”,	
:title “ようこそ太田のパソコン教室へ”,	
:pages [{:display-name “ホーム”,	
:name “intro”,	
:template “intro”,	
:context {:page-name “intro”,	
:content “”,	
:subtitle “よろしく”,	
:page-title “自己紹介”}}	
{:name “blog”,	
:template “blog”,	
:context {:blog-description nil},	
:display-name “ブログ”}	
……	
]}
Lesson Supporter
user=> (import 'jp.webpay.webpay.WebPay)	
jp.webpay.webpay.WebPay
user=> (def wp (WebPay. secret-key))
#'user/wp 	
user=> (import
'jp.webpay.webpay.data.CardRequest)
jp.webpay.webpay.data.CardRequest
user=> (def req (.. (CardRequest.)
(number number)
(expMonth 3)
(expYear 16)
(cvc "123")
(name "Shogo Ohta")))
#'user/req 	
user=> (.. wp token createRequest (card req)
execute)	
#<TokenResponse …>
インタラクティブな
APIの確認
‣ WebPay APIによる
クレジット決済
‣ 初利用だったため、
REPLからAPIの使い
勝手を確認
Clojureコミュニティ
に向けた取り組み
Clojureコミュニティに向けた取り組み
‣ OSS
‣ 勉強会
‣ コワーキングスペースHaLake
Clojureコミュニティに向けた取り組み: OSS
clojournal (https://github.com/nyampass/clojournal)
‣ Clojureの日本語情報発信サイト (http://clojournal.com)
clowpay (https://github.com/nyampass/clowpay)
‣ WebPay APIのClojureバインディング
parabola (https://github.com/athos/parabola)
‣ Clojureチャットボットフレームワーク
その他のリポジトリは https://github.com/nyampass/ から確認できます
Clojureコミュニティに向けた取り組み: 勉強会
Tokyo.clj (渋谷)
‣ 不定期開催。Clojure入門セッション、もくもく会。
Laketown.clj (HaLake@越谷レイクタウン)
‣ 月1開催。もくもく会。
テーマ特化勉強会 (gen-class勉強会/core.async勉強会/etc.)
‣ 特定の言語機能等にフォーカスした勉強会。
ハンモック
‣ Rich Hickeyが提唱するハンモック駆動開発に由来。
Clojure割引
‣ 1日利用500円 (通常1000円)。
チェックインアプリ
HaLake API
‣ OSSとして公開。
Clojureコミュニティに向けた取り組み: HaLake
まとめ
‣ Clojureを使う理由
‣ アジャイル開発との親和性
‣ 十分な実用性
‣ 言語の自由度
‣ 日本でもClojureコミュニティが徐々に活発化!
‣ さぁ、皆さんもClojureをはじめてみよう!!

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