Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Clojureを用いたWebアプリケーション開発

5335315769ef28d5b1b2ddbd776cef2d?s=47 ayato
December 02, 2016

 Clojureを用いたWebアプリケーション開発

5335315769ef28d5b1b2ddbd776cef2d?s=128

ayato

December 02, 2016
Tweet

Transcript

  1. #ccc_m2 Clojureを用いた Webアプリケーション開発 普通のベンチャー企業編 2016.12.03 JJUG CCC 2016 Fall @_ayato_p

    ָ͍͠
  2. #ccc_m2 (keyword "括弧 is ")

  3. #ccc_m2 あやぴー •サイボウズスタートアップス株式会社 •一般的なClojureエンジニア •好きなもの: 前置記法、Emacs、SKK •得意料理: 唐揚げ、さばの味噌煮 •好きなwebサービス: 白ごはん.com

    •好きな料理研究家: 冨田ただすけ _ayato_p ayato-p
  4. #ccc_m2 •Clojureの日本語ガイド •clojure.orgの翻訳(手伝い) こんなの書いてる人

  5. #ccc_m2 サイボウズスタートアップス •社員数20名以下 •安否確認サービス、kintone連携サービスの提供 •(今までは)全部PHPで作られたシステム •よくある普通(?)のベンチャー企業

  6. #ccc_m2 サイボウズスタートアップス 情報サービスをとおして、
 世界の豊かな社会生活の
 実現に貢献する

  7. #ccc_m2 もくじ 1. 普通のベンチャー企業が何故Clojureを選んだのか 2. 安否確認サービスについて 3. Clojureを採用して良かったところ 4. Clojureを採用して苦労したこと

    5. まとめ
  8. #ccc_m2 普通のベンチャー企業が
 何故Clojureを選んだのか (CTOに聞いてみた%)

  9. #ccc_m2 背景 (何故、新しい言語?) ྑ͍αʔϏεΛੈͷதʹఏڙ͍ͨ͠

  10. #ccc_m2 背景 (何故、新しい言語??) ༏लͳΤϯδχΞ͕ඞཁ ྑ͍αʔϏεΛੈͷதʹఏڙ͍ͨ͠

  11. #ccc_m2 背景 (何故、新しい言語???) ϒϥϯυͷߏங͕ඞཁ ༏लͳΤϯδχΞ͕ඞཁ ྑ͍αʔϏεΛੈͷதʹఏڙ͍ͨ͠

  12. #ccc_m2 背景 (何故、新しい言語????) ٕज़ϚʔέςΟϯάͷඞཁੑ ϒϥϯυͷߏங͕ඞཁ ༏लͳΤϯδχΞ͕ඞཁ ྑ͍αʔϏεΛੈͷதʹఏڙ͍ͨ͠

  13. #ccc_m2 条件 •すぐに廃れないこと(FWやライブラリで選択しない) •エンジニアが成長出来るテーマであること •テーマに対するチャレンジにワクワクできること •テーマにアンテナを張るエンジニアが優秀である場合が
 多いこと •ニッチでも良い(大量の採用は考えてない) •採用面で競合が少ないこと •日本で一番になれる可能性があるテーマであること

  14. #ccc_m2 選ばれたのはClojureでした •条件に当てはまっていた •社内にClojureに関する知見を持ったメンバーがいた •当たり前だけど使えそうかどうかというのも
 しっかり考慮されてます

  15. #ccc_m2 安否確認サービス⛑
 について

  16. #ccc_m2 気象庁

  17. #ccc_m2 •大災害を想定した堅牢なシステム構成 •気象庁の地震速報と連動 •地域/部署別の安否状況が確認できる •全社員または個別に対策支持が出せる •パケット通信による通信 •フィーチャーフォンやスマホからでも操作できる •安否確認システム

  18. #ccc_m2 言い換えると… •企業向けのシステム •緊急時に高い可用性が求められている •外部サービスと連携している •モバイルアプリと連携している •レガシーブラウザやフィーチャーフォンをサポート

  19. #ccc_m2 言い換えると… •企業向けのシステム •緊急時に高い可用性が求められている •外部サービスと連携している •モバイルアプリと連携している •レガシーブラウザやフィーチャーフォンをサポート どちらかと言えば
 堅いサービス

  20. #ccc_m2 Clojureでリプレース♻ •規模の大きいクライアントが増えてきた •根幹からの作り直し •2015年の初夏くらいから1.5人くらいで開発がスタート • 現在3人で開発中 •2016年12月中旬リリース予定!!

  21. #ccc_m2 プロジェクト構成 •lein-modulesでマルチモジュールプロジェクト構成 anpi ├── lib // アプリ共通ライブラリ ├── db

    // データベース接続用のライブラリ ├── ymir // Quenoteクライアントライブラリ ├── web // メインのアプリ ├── worker // 非同期処理用アプリ ├── admin // 管理画面用アプリ └── project.clj
  22. #ccc_m2 利用しているライブラリ •サーバー: Immutant Web •ルーティング: bidi •テンプレートエンジン: Enlive •SQLビルダー:

    stch.sql, HugSQL •ライフサイクル, DI: Component •フロントエンド: Reagent, re-frame •テスト: Midje, kerodon, clojure.test •ユーティリティ: Plumbing, Medley
  23. #ccc_m2 Componentベース

  24. #ccc_m2 ネームスペース間の依存

  25. #ccc_m2 規模感 •総ファイル数: 650超 •総コード行数: 50000超 •含まれているライブラリの数: 400弱 •テーブルの数: 123

    •uberjarのサイズ: 153MB •JavaScriptのサイズ: 852KB
  26. #ccc_m2 インフラ概要

  27. #ccc_m2 Clojureを採用して
 良かったところ☀

  28. #ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability

  29. #ccc_m2 シンプルさ https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html VS ?

  30. #ccc_m2 シンプルさ https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html VS ()

  31. #ccc_m2 https://www.youtube.com/watch?v=rI8tNMsozo0 Rails Conf 2012 Keynote: Simplicity Matters by Rich

    Hickey
  32. #ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability

  33. #ccc_m2 不変性 •オブジェクトは不変(一部の参照型を除く) •関数を呼び出して引数を変更される恐れがない user> (def m {:username "ayato-p" :age

    "25"}) #'user/m user> (update m :age inc) {:age 26, :username "ayato-p"} user> m {:age 25, :username "ayato-p"}
  34. #ccc_m2 σϑΥϧτͰϛϡʔλϒϧͳͷ͸
 ૣ͗͢Δ࠷దԽͩɻ Luminus作者 Dmitri Sotnikov(@yogthos) https://twitter.com/yogthos/status/688250762334343170

  35. #ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability

  36. #ccc_m2 Java資産の活用 •Clojureで記述されたライブラリがなくても
 Javaのライブラリが使えるという安心感 •Clojureを書くように自然にJavaを呼び出せる

  37. #ccc_m2 (import [com.orangesignal.csv Csv]) (defprotocol CsvLoader (load [this])) (extend-protocol CsvLoader

    com.orangesignal.csv.CsvReader (load [csv-reader] (->> (Csv/load csv-reader (str-ary-handler)) (map vec))))
  38. #ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability

  39. #ccc_m2 Server/Clientを同一言語で •コンテキストスイッチがなくなる •プラットフォームに依存するようなコードがあっても
 共通化できる •ReaderConditionals since Clojure 1.7 •Transit

    formatで流れるようにデータの受け渡し (defn str->int [s] #?(:clj (java.lang.Integer/parseInt s) :cljs (js/parseInt s)))
  40. #ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability

  41. #ccc_m2 拡張性の高さ •ライブラリに拡張ポイントが残されている •clojure.java.jdbcなど •Protocols / Multimethods •既存のJavaクラスも拡張できる

  42. #ccc_m2 (require [clojure.java.jdbc :as jdbc]) (import org.postgresql.jdbc4.Jdbc4Array org.postgresql.util.PGobject) (extend-protocol jdbc/IResultSetReadColumn

    Jdbc4Array (result-set-read-column [val rsmeta idx] (sequence (.getArray val))) PGobject (result-set-read-column [val rsmeta idx] (parse-pgobject val)))
  43. #ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability

  44. #ccc_m2 高い後方互換性 •バージョンを上げても、ほとんど影響がない •Clojure 1.3で動けばだいたい動くはず •関数の名前が衝突することは稀にある •古いライブラリでもたいてい問題なく動作する

  45. #ccc_m2 ݹͷϓϩδΣΫτͷϝδϟʔϦϏ δϣϯΛ্ͭ͛ͯ΋յΕͳ͔ͬ ͨΑɻ$MPKVSF͸ޓ׵ੑΛେࣄʹ ͨ͠ઃܭ͔ͩΒͶɻ Cognitectの偉い人 Stuart Halloway(@stuarthalloway) https://twitter.com/stuarthalloway/status/793614590781390852

  46. #ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability

  47. #ccc_m2 組み合わせの容易性 •少ないデータ型に対して大量の関数がある •個々のライブラリは独立している •特定のフレームワークを前提に設計されていない

  48. #ccc_m2 http://tomasp.net/blog/2015/library-frameworks/

  49. #ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability and more

  50. #ccc_m2 •覚えることが少ないのにパワフル •単純なマップやベクタを渡せばいいのでテストが容易 •Nil PunningによってNPEをある程度回避できる •REPLがあるので小さい粒度で確認ができる •マクロを適切に使えば一定の処理を一般化できる •Transducersを使うことで計算量が減らせることがある •Checkout Dependencyによってライブラリを同時開発可

    •Emacsを使うことに大義名分がある
  51. #ccc_m2 Clojureを利用していて
 苦労したこと

  52. #ccc_m2 •大きなアプリの作り方が分からなかった •フレームワークがなかった •スタックトレースが難しかった •Jar地獄に陥った •なんだかんだでJavaの知識が欲しくなる •日本のコミュニティが小さかった •日本語の情報が少なかった

  53. #ccc_m2 まとめ

  54. #ccc_m2 •Clojureを選んだのは良いサービスを作るため •弊社はStuart Sierra's Componentベースで
 開発している •シンプルさは選ばないと手に入らない •WAFやORMを使わない(使えない)のは良い面も
 悪い面もある •Clojureを使ってもWebアプリは作れる