Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

12,245 views

Published on

JJUG CCC 2015 Springでの発表資料です。

Published in: Software

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

  1. 1. プログラミング言語Clojureの ニャンパスでの活用事例 JJUG CCC 2015 Spring 2015/04/11 @ ベルサール新宿グランド ニャンパス株式会社 太田 正悟
  2. 2. 自己紹介 ‣ 太田 正悟 (@athos0220) ‣ Clojureコントリビュータ ‣ 今年2月よりニャンパス所属 ‣ 2013年に某アニメ関連で話題になっていたニャン パスと交流をはじめる
  3. 3. 会社紹介 ‣ ニャンパス株式会社 ‣ 2010年設立 ‣ 業務内容 ‣ Webサービス・アプリ開発 ‣ プロトタイピング(試作開発) ‣ コワーキングスペースHaLakeを運営
  4. 4. アジェンダ ‣ Clojureの概要 ‣ Clojureを使う理由 ‣ Clojure活用事例 ‣ Clojureコミュニティに向けた取り組み
  5. 5. Clojureの概要
  6. 6. Clojureの概要 ‣ Lisp系言語 ‣ 関数型言語 ‣ JVM言語
  7. 7. Clojureの概要: Lisp系言語 ‣ S式というLisp由来の独特のシンタックスをもつ ‣ 言語がシンプルで覚えることが少ない ‣ マクロを使ってプログラマが言語を拡張できる(後述) (defn hello [name] (println (str “Hello ” name)))
  8. 8. 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)を 使ったインタラクティブな開発
  9. 9. Clojureの概要: 関数型言語 ‣ 多くの値がイミュータブル(不変) ‣ ファーストクラスな関数 ‣ 遅延シーケンスで無限個の値も扱える (reduce (fn [a x] (+ a x)) (map (fn [x] (* x x)) (take-while (fn [x] (<= x 100)) (range))))
  10. 10. Clojureの概要: 関数型言語 (->> (range) (take-while #(<= % 100)) (map #(* % %)) (reduce +)) こうも書ける! ‣ 多くの値がイミュータブル ‣ ファーストクラスな関数 ‣ 遅延シーケンスで無限個の値も扱える
  11. 11. 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
  12. 12. Clojureの概要: JVM言語 ‣ Javaのオブジェクトを簡単に扱える ‣ 無名クラスも簡単に作れる (reify Runnable (run [this] (println “foo”))) new Runnable() { public void run() { System.out.println(“foo”); } } Clojure Java
  13. 13. Clojureを使う理由
  14. 14. Clojureを使う理由 ‣ アジャイル開発との親和性 ‣ 十分な実用性 ‣ 言語の自由度
  15. 15. Clojureを使う理由: アジャイル開発との親和性 すばやいフィード バックループ すばやい データ構築 漸進的な設計 REPLによる! インタラクティブ開発 イミュータブルな! データ構造 後づけ可能な! ポリモーフィズム
  16. 16. Clojureを使う理由: アジャイル開発との親和性 ‣ イミュータブルなマップ(辞書)でデータの表現を柔軟に ‣ 設計に関する決定を後に遅らせることができる {:type :rectangle :width 30 :height 40} public class Rectangle extends Shape { int width, height; … } Clojure Java
  17. 17. 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 ポリモーフィックな振る舞いは   マルチメソッド等で後づけできる!
  18. 18. Clojureを使う理由: 十分な実用性 十分な パフォーマンス 豊富なライブラリ 実用レベルの! エコシステム JVM上で動作 Javaとの! 相互運用性 Leiningen! Clojars, etc.
  19. 19. Clojureを使う理由: 言語の自由度 実行時の プログラム変更 問題領域にあった 言語の定義 リロード機能! REPL, etc. マクロ
  20. 20. 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)))) マクロの定義 展開
  21. 21. Clojureを使う理由: 言語の自由度 マクロ! ライブラリ 静的 型チェック 非同期 プログラミング パターン マッチ 論理 プログラミング core.typed core.async core.match core.logic
  22. 22. Clojure活用事例
  23. 23. Clojure活用事例 ‣ baasday ‣ Lesson Supporter
  24. 24. 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)
  25. 25. Lesson Supporter ‣ 個人レッスン支援サービス ‣ 簡易CMS・ブログ・予約管理機能等を提供 ‣ ボイストレーナー星野氏と共同で開発中 ‣ 近日公開予定
  26. 26. 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 “ブログ”} …… ]}
  27. 27. 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の使い 勝手を確認
  28. 28. Clojureコミュニティ に向けた取り組み
  29. 29. Clojureコミュニティに向けた取り組み ‣ OSS ‣ 勉強会 ‣ コワーキングスペースHaLake
  30. 30. 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/ から確認できます
  31. 31. Clojureコミュニティに向けた取り組み: 勉強会 Tokyo.clj (渋谷) ‣ 不定期開催。Clojure入門セッション、もくもく会。 Laketown.clj (HaLake@越谷レイクタウン) ‣ 月1開催。もくもく会。 テーマ特化勉強会 (gen-class勉強会/core.async勉強会/etc.) ‣ 特定の言語機能等にフォーカスした勉強会。
  32. 32. ハンモック ‣ Rich Hickeyが提唱するハンモック駆動開発に由来。 Clojure割引 ‣ 1日利用500円 (通常1000円)。 チェックインアプリ HaLake API ‣ OSSとして公開。 Clojureコミュニティに向けた取り組み: HaLake
  33. 33. まとめ ‣ Clojureを使う理由 ‣ アジャイル開発との親和性 ‣ 十分な実用性 ‣ 言語の自由度 ‣ 日本でもClojureコミュニティが徐々に活発化! ‣ さぁ、皆さんもClojureをはじめてみよう!!

×