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

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

ayato
December 02, 2016

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

ayato

December 02, 2016
Tweet

More Decks by ayato

Other Decks in Programming

Transcript

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

    View Slide

  2. #ccc_m2
    (keyword "括弧 is ")

    View Slide

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

    View Slide

  4. #ccc_m2
    •Clojureの日本語ガイド
    •clojure.orgの翻訳(手伝い)
    こんなの書いてる人

    View Slide

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

    View Slide

  6. #ccc_m2
    サイボウズスタートアップス
    情報サービスをとおして、

    世界の豊かな社会生活の

    実現に貢献する

    View Slide

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

    View Slide

  8. #ccc_m2
    普通のベンチャー企業が

    何故Clojureを選んだのか
    (CTOに聞いてみた%)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. #ccc_m2
    条件
    •すぐに廃れないこと(FWやライブラリで選択しない)
    •エンジニアが成長出来るテーマであること
    •テーマに対するチャレンジにワクワクできること
    •テーマにアンテナを張るエンジニアが優秀である場合が

    多いこと
    •ニッチでも良い(大量の採用は考えてない)
    •採用面で競合が少ないこと
    •日本で一番になれる可能性があるテーマであること

    View Slide

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

    しっかり考慮されてます

    View Slide

  15. #ccc_m2
    安否確認サービス⛑

    について

    View Slide

  16. #ccc_m2
    気象庁

    View Slide

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

    View Slide

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

    View Slide

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

    堅いサービス

    View Slide

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

    View Slide

  21. #ccc_m2
    プロジェクト構成
    •lein-modulesでマルチモジュールプロジェクト構成
    anpi
    ├── lib // アプリ共通ライブラリ
    ├── db // データベース接続用のライブラリ
    ├── ymir // Quenoteクライアントライブラリ
    ├── web // メインのアプリ
    ├── worker // 非同期処理用アプリ
    ├── admin // 管理画面用アプリ
    └── project.clj

    View Slide

  22. #ccc_m2
    利用しているライブラリ
    •サーバー: Immutant Web
    •ルーティング: bidi
    •テンプレートエンジン: Enlive
    •SQLビルダー: stch.sql, HugSQL
    •ライフサイクル, DI: Component
    •フロントエンド: Reagent, re-frame
    •テスト: Midje, kerodon, clojure.test
    •ユーティリティ: Plumbing, Medley

    View Slide

  23. #ccc_m2
    Componentベース

    View Slide

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

    View Slide

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

    View Slide

  26. #ccc_m2
    インフラ概要

    View Slide

  27. #ccc_m2
    Clojureを採用して

    良かったところ☀

    View Slide

  28. #ccc_m2
    Simplicity
    Immutability
    Interoperability
    Isomorphism
    Extensibility
    Compatibility
    Composability

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  32. #ccc_m2
    Simplicity
    Immutability
    Interoperability
    Isomorphism
    Extensibility
    Compatibility
    Composability

    View Slide

  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"}

    View Slide

  34. #ccc_m2
    σϑΥϧτͰϛϡʔλϒϧͳͷ͸

    ૣ͗͢Δ࠷దԽͩɻ
    Luminus作者 Dmitri Sotnikov(@yogthos)
    https://twitter.com/yogthos/status/688250762334343170

    View Slide

  35. #ccc_m2
    Simplicity
    Immutability
    Interoperability
    Isomorphism
    Extensibility
    Compatibility
    Composability

    View Slide

  36. #ccc_m2
    Java資産の活用
    •Clojureで記述されたライブラリがなくても

    Javaのライブラリが使えるという安心感
    •Clojureを書くように自然にJavaを呼び出せる

    View Slide

  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))))

    View Slide

  38. #ccc_m2
    Simplicity
    Immutability
    Interoperability
    Isomorphism
    Extensibility
    Compatibility
    Composability

    View Slide

  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)))

    View Slide

  40. #ccc_m2
    Simplicity
    Immutability
    Interoperability
    Isomorphism
    Extensibility
    Compatibility
    Composability

    View Slide

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

    View Slide

  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)))

    View Slide

  43. #ccc_m2
    Simplicity
    Immutability
    Interoperability
    Isomorphism
    Extensibility
    Compatibility
    Composability

    View Slide

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

    View Slide

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

    View Slide

  46. #ccc_m2
    Simplicity
    Immutability
    Interoperability
    Isomorphism
    Extensibility
    Compatibility
    Composability

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  51. #ccc_m2
    Clojureを利用していて

    苦労したこと

    View Slide

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

    View Slide

  53. #ccc_m2
    まとめ

    View Slide

  54. #ccc_m2
    •Clojureを選んだのは良いサービスを作るため
    •弊社はStuart Sierra's Componentベースで

    開発している
    •シンプルさは選ばないと手に入らない
    •WAFやORMを使わない(使えない)のは良い面も

    悪い面もある
    •Clojureを使ってもWebアプリは作れる

    View Slide