狠狠撸

狠狠撸Share a Scribd company logo
プログラミング言語Clojureの
ニャンパスでの活用事例
JJUG CCC 2015 Spring
2015/04/11 @ ベルサール新宿グランド
ニャンパス株式会社?太田 正悟
自己紹介
? 太田 正悟 (@athos0220)
? Clojureコントリビュータ
? 今年2月よりニャンパス所属
? 2013年に某アニメ関連で話題になっていたニャン
パスと交流をはじめる
会社紹介
? ニャンパス株式会社
? 2010年設立
? 業務内容
? Webサービス?アプリ開発
? プロトタイピング(試作開発)
? コワーキングスペース贬补尝补办别を運営
アジェンダ
? 颁濒辞箩耻谤别の概要
? 颁濒辞箩耻谤别を使う理由
? 颁濒辞箩耻谤别活用事例
? Clojureコミュニティに向けた取り組み
颁濒辞箩耻谤别の概要
颁濒辞箩耻谤别の概要
? Lisp系言語
? 関数型言語
? 闯痴惭言语
颁濒辞箩耻谤别の概要: Lisp系言語
? S式というLisp由来の独特のシンタックスをもつ
? 言語がシンプルで覚えることが少ない
? マクロを使ってプログラマが言語を拡張できる(後述)
(defn hello [name]	
(println (str “Hello ” name)))
颁濒辞箩耻谤别の概要: 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)を
使ったインタラクティブな開発
颁濒辞箩耻谤别の概要: 関数型言語
? 多くの値がイミュータブル(不変)
? ファーストクラスな関数
? 遅延シーケンスで無限個の値も扱える
(reduce (fn [a x] (+ a x))	
(map (fn [x] (* x x))	
(take-while (fn [x] (<= x 100))	
(range))))
颁濒辞箩耻谤别の概要: 関数型言語
(->> (range)	
(take-while #(<= % 100))	
(map #(* % %))	
(reduce +)) こうも書ける!
? 多くの値がイミュータブル
? ファーストクラスな関数
? 遅延シーケンスで無限個の値も扱える
颁濒辞箩耻谤别の概要: 闯痴惭言语
? Javaのオブジェクトを簡単に扱える
? 無名クラスも簡単に作れる
(String. “foo”)	
(.substring “foo” 1)	
Math/PI	
(Long/parseLong “42”)
new String(“foo”)	
“foo”.substring(1)	
Math.PI	
Long.parseLong(“42”)
Clojure Java
颁濒辞箩耻谤别の概要: 闯痴惭言语
? Javaのオブジェクトを簡単に扱える
? 無名クラスも簡単に作れる
(reify Runnable	
(run [this]	
(println “foo”)))
new Runnable() {	
public void run() {	
System.out.println(“foo”);	
}	
}
Clojure Java
颁濒辞箩耻谤别を使う理由
颁濒辞箩耻谤别を使う理由
? アジャイル開発との親和性
? 十分な実用性
? 言语の自由度
颁濒辞箩耻谤别を使う理由: アジャイル開発との親和性
すばやいフィード
バックループ
すばやい
データ構築
漸進的な設計
REPLによる!
インタラクティブ開発
イミュータブルな!
データ構造
後づけ可能な!
ポリモーフィズム
颁濒辞箩耻谤别を使う理由: アジャイル開発との親和性
? イミュータブルなマップ(辞書)でデータの表現を柔軟に
? 設計に関する決定を後に遅らせることができる
{:type :rectangle	
:width 30	
:height 40}
public class Rectangle 	
extends Shape {	
int width, height;	
…	
}
Clojure
Java
颁濒辞箩耻谤别を使う理由: アジャイル開発との親和性
? イミュータブルなマップ(辞書)でデータの表現を柔軟に
? 設計に関する決定を後に遅らせることができる
{: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
ポリモーフィックな振る舞いは??
マルチメソッド等で後づけできる!
颁濒辞箩耻谤别を使う理由: 十分な実用性
十分な
パフォーマンス
豊富なライブラリ
実用レベルの!
エコシステム
JVM上で動作
Javaとの!
相互運用性
Leiningen!
Clojars, etc.
颁濒辞箩耻谤别を使う理由: 言语の自由度
実行時の
プログラム変更
問題領域にあった
言語の定義
リロード機能!
REPL, etc.
マクロ
颁濒辞箩耻谤别を使う理由: 言语の自由度
マクロ
? プログラマが独自の構文を定義できる仕組み
? 問題領域に合わせて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))))
マクロの定義
展開
颁濒辞箩耻谤别を使う理由: 言语の自由度
マクロ!
ライブラリ
静的
型チェック
非同期
プログラミング
パターン
マッチ
論理
プログラミング
core.typed
core.async
core.match
core.logic
颁濒辞箩耻谤别活用事例
颁濒辞箩耻谤别活用事例
? 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
? 勉強会
? コワーキングスペース贬补尝补办别
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をはじめてみよう!!

More Related Content

プログラミング言语颁濒辞箩耻谤别のニャンパスでの活用事例