Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Clojureを用いたWebアプリケーション開発
Search
ayato
December 02, 2016
Programming
2
3k
Clojureを用いたWebアプリケーション開発
ayato
December 02, 2016
Tweet
Share
More Decks by ayato
See All by ayato
Clojureという言語が私逹にもたらしたもの
ayato0211
6
3k
3年間考え続けてきたWebアプリケーションにおけるテストの話
ayato0211
3
240
Re:REPL-Driven Development
ayato0211
3
1.2k
Meta Template Engine
ayato0211
2
1.1k
超変換! Hiccup data structure!!
ayato0211
2
570
About Integrant
ayato0211
0
520
Muscle Assert
ayato0211
0
230
翻訳にまつわるエトセトラ
ayato0211
6
1.2k
Ring Middleware の基礎
ayato0211
2
260
Other Decks in Programming
See All in Programming
動作確認やテストで漏れがちな観点3選
starfish719
6
1k
Conform を推す - Advocating for Conform
mizoguchicoji
3
690
仕様変更に耐えるための"今の"DRY原則を考える / Rethinking the "Don't repeat yourself" for resilience to specification changes
mkmk884
0
190
ARA Ansible for the teams
kksat
0
150
ファインディの テックブログ爆誕までの軌跡
starfish719
2
1.1k
Amazon S3 TablesとAmazon S3 Metadataを触ってみた / 20250201-jawsug-tochigi-s3tables-s3metadata
kasacchiful
0
170
Unity Android XR入門
sakutama_11
0
160
Grafana Loki によるサーバログのコスト削減
mot_techtalk
1
130
AWS Organizations で実現する、 マルチ AWS アカウントのルートユーザー管理からの脱却
atpons
0
150
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
8
1.8k
Spring gRPC について / About Spring gRPC
mackey0225
0
220
負債になりにくいCSSをデザイナとつくるには?
fsubal
9
2.4k
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
Six Lessons from altMBA
skipperchong
27
3.6k
KATA
mclloyd
29
14k
Designing Experiences People Love
moore
140
23k
How to Ace a Technical Interview
jacobian
276
23k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
960
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
Transcript
#ccc_m2 Clojureを用いた Webアプリケーション開発 普通のベンチャー企業編 2016.12.03 JJUG CCC 2016 Fall @_ayato_p
ָ͍͠
#ccc_m2 (keyword "括弧 is ")
#ccc_m2 あやぴー •サイボウズスタートアップス株式会社 •一般的なClojureエンジニア •好きなもの: 前置記法、Emacs、SKK •得意料理: 唐揚げ、さばの味噌煮 •好きなwebサービス: 白ごはん.com
•好きな料理研究家: 冨田ただすけ _ayato_p ayato-p
#ccc_m2 •Clojureの日本語ガイド •clojure.orgの翻訳(手伝い) こんなの書いてる人
#ccc_m2 サイボウズスタートアップス •社員数20名以下 •安否確認サービス、kintone連携サービスの提供 •(今までは)全部PHPで作られたシステム •よくある普通(?)のベンチャー企業
#ccc_m2 サイボウズスタートアップス 情報サービスをとおして、 世界の豊かな社会生活の 実現に貢献する
#ccc_m2 もくじ 1. 普通のベンチャー企業が何故Clojureを選んだのか 2. 安否確認サービスについて 3. Clojureを採用して良かったところ 4. Clojureを採用して苦労したこと
5. まとめ
#ccc_m2 普通のベンチャー企業が 何故Clojureを選んだのか (CTOに聞いてみた%)
#ccc_m2 背景 (何故、新しい言語?) ྑ͍αʔϏεΛੈͷதʹఏڙ͍ͨ͠
#ccc_m2 背景 (何故、新しい言語??) ༏लͳΤϯδχΞ͕ඞཁ ྑ͍αʔϏεΛੈͷதʹఏڙ͍ͨ͠
#ccc_m2 背景 (何故、新しい言語???) ϒϥϯυͷߏங͕ඞཁ ༏लͳΤϯδχΞ͕ඞཁ ྑ͍αʔϏεΛੈͷதʹఏڙ͍ͨ͠
#ccc_m2 背景 (何故、新しい言語????) ٕज़ϚʔέςΟϯάͷඞཁੑ ϒϥϯυͷߏங͕ඞཁ ༏लͳΤϯδχΞ͕ඞཁ ྑ͍αʔϏεΛੈͷதʹఏڙ͍ͨ͠
#ccc_m2 条件 •すぐに廃れないこと(FWやライブラリで選択しない) •エンジニアが成長出来るテーマであること •テーマに対するチャレンジにワクワクできること •テーマにアンテナを張るエンジニアが優秀である場合が 多いこと •ニッチでも良い(大量の採用は考えてない) •採用面で競合が少ないこと •日本で一番になれる可能性があるテーマであること
#ccc_m2 選ばれたのはClojureでした •条件に当てはまっていた •社内にClojureに関する知見を持ったメンバーがいた •当たり前だけど使えそうかどうかというのも しっかり考慮されてます
#ccc_m2 安否確認サービス⛑ について
#ccc_m2 気象庁
#ccc_m2 •大災害を想定した堅牢なシステム構成 •気象庁の地震速報と連動 •地域/部署別の安否状況が確認できる •全社員または個別に対策支持が出せる •パケット通信による通信 •フィーチャーフォンやスマホからでも操作できる •安否確認システム
#ccc_m2 言い換えると… •企業向けのシステム •緊急時に高い可用性が求められている •外部サービスと連携している •モバイルアプリと連携している •レガシーブラウザやフィーチャーフォンをサポート
#ccc_m2 言い換えると… •企業向けのシステム •緊急時に高い可用性が求められている •外部サービスと連携している •モバイルアプリと連携している •レガシーブラウザやフィーチャーフォンをサポート どちらかと言えば 堅いサービス
#ccc_m2 Clojureでリプレース♻ •規模の大きいクライアントが増えてきた •根幹からの作り直し •2015年の初夏くらいから1.5人くらいで開発がスタート • 現在3人で開発中 •2016年12月中旬リリース予定!!
#ccc_m2 プロジェクト構成 •lein-modulesでマルチモジュールプロジェクト構成 anpi ├── lib // アプリ共通ライブラリ ├── db
// データベース接続用のライブラリ ├── ymir // Quenoteクライアントライブラリ ├── web // メインのアプリ ├── worker // 非同期処理用アプリ ├── admin // 管理画面用アプリ └── project.clj
#ccc_m2 利用しているライブラリ •サーバー: Immutant Web •ルーティング: bidi •テンプレートエンジン: Enlive •SQLビルダー:
stch.sql, HugSQL •ライフサイクル, DI: Component •フロントエンド: Reagent, re-frame •テスト: Midje, kerodon, clojure.test •ユーティリティ: Plumbing, Medley
#ccc_m2 Componentベース
#ccc_m2 ネームスペース間の依存
#ccc_m2 規模感 •総ファイル数: 650超 •総コード行数: 50000超 •含まれているライブラリの数: 400弱 •テーブルの数: 123
•uberjarのサイズ: 153MB •JavaScriptのサイズ: 852KB
#ccc_m2 インフラ概要
#ccc_m2 Clojureを採用して 良かったところ☀
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
#ccc_m2 シンプルさ https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html VS ?
#ccc_m2 シンプルさ https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html VS ()
#ccc_m2 https://www.youtube.com/watch?v=rI8tNMsozo0 Rails Conf 2012 Keynote: Simplicity Matters by Rich
Hickey
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
#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"}
#ccc_m2 σϑΥϧτͰϛϡʔλϒϧͳͷ ૣ͗͢Δ࠷దԽͩɻ Luminus作者 Dmitri Sotnikov(@yogthos) https://twitter.com/yogthos/status/688250762334343170
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
#ccc_m2 Java資産の活用 •Clojureで記述されたライブラリがなくても Javaのライブラリが使えるという安心感 •Clojureを書くように自然にJavaを呼び出せる
#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))))
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
#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)))
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
#ccc_m2 拡張性の高さ •ライブラリに拡張ポイントが残されている •clojure.java.jdbcなど •Protocols / Multimethods •既存のJavaクラスも拡張できる
#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)))
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
#ccc_m2 高い後方互換性 •バージョンを上げても、ほとんど影響がない •Clojure 1.3で動けばだいたい動くはず •関数の名前が衝突することは稀にある •古いライブラリでもたいてい問題なく動作する
#ccc_m2 ݹͷϓϩδΣΫτͷϝδϟʔϦϏ δϣϯΛ্ͭ͛ͯյΕͳ͔ͬ ͨΑɻ$MPKVSFޓੑΛେࣄʹ ͨ͠ઃܭ͔ͩΒͶɻ Cognitectの偉い人 Stuart Halloway(@stuarthalloway) https://twitter.com/stuarthalloway/status/793614590781390852
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability
#ccc_m2 組み合わせの容易性 •少ないデータ型に対して大量の関数がある •個々のライブラリは独立している •特定のフレームワークを前提に設計されていない
#ccc_m2 http://tomasp.net/blog/2015/library-frameworks/
#ccc_m2 Simplicity Immutability Interoperability Isomorphism Extensibility Compatibility Composability and more
#ccc_m2 •覚えることが少ないのにパワフル •単純なマップやベクタを渡せばいいのでテストが容易 •Nil PunningによってNPEをある程度回避できる •REPLがあるので小さい粒度で確認ができる •マクロを適切に使えば一定の処理を一般化できる •Transducersを使うことで計算量が減らせることがある •Checkout Dependencyによってライブラリを同時開発可
•Emacsを使うことに大義名分がある
#ccc_m2 Clojureを利用していて 苦労したこと
#ccc_m2 •大きなアプリの作り方が分からなかった •フレームワークがなかった •スタックトレースが難しかった •Jar地獄に陥った •なんだかんだでJavaの知識が欲しくなる •日本のコミュニティが小さかった •日本語の情報が少なかった
#ccc_m2 まとめ
#ccc_m2 •Clojureを選んだのは良いサービスを作るため •弊社はStuart Sierra's Componentベースで 開発している •シンプルさは選ばないと手に入らない •WAFやORMを使わない(使えない)のは良い面も 悪い面もある •Clojureを使ってもWebアプリは作れる