Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

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

12 295 vues

Publié le

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

Publié dans : Logiciels
  • Soyez le premier à commenter

プログラミング言語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をはじめてみよう!!

×