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
5
2.9k
3年間考え続けてきたWebアプリケーションにおけるテストの話
ayato0211
3
220
Re:REPL-Driven Development
ayato0211
3
1.2k
Meta Template Engine
ayato0211
2
970
超変換! Hiccup data structure!!
ayato0211
2
540
About Integrant
ayato0211
0
470
Muscle Assert
ayato0211
0
210
翻訳にまつわるエトセトラ
ayato0211
6
1.2k
Ring Middleware の基礎
ayato0211
2
240
Other Decks in Programming
See All in Programming
僕が思い描くTypeScriptの未来を勝手に先取りする
yukukotani
9
2.4k
Regular Expressions, REXML, Automata Learning
makenowjust
0
220
意外とフォントが大事だった話 / Font Issues on Internationalization
fumi23
0
110
長期運用プロダクトの開発速度を維持し続けるためのリファクタリング実践例
wataruss
8
2.7k
Scala におけるコンパイラエラーとの付き合い方
chencmd
2
430
Kotlin 2.0 and Beyond
antonarhipov
2
150
GraphQLの魅力を引き出すAndroidクライアント実装
morux2
3
730
仮想ファイルシステムを導入して開発環境のストレージ課題を解消する
segadevtech
2
550
Ebitengineの1vs1ゲーム WebRTCの活用
ponyo877
0
380
GraphQL あるいは React における自律的なデータ取得について
quramy
11
3k
A New Era of Testing
mannodermaus
2
510
Increased Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
380
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
786
250k
10 Git Anti Patterns You Should be Aware of
lemiorhan
653
58k
Embracing the Ebb and Flow
colly
83
4.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
248
20k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
29
2.6k
Producing Creativity
orderedlist
PRO
340
39k
A Tale of Four Properties
chriscoyier
155
22k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
166
48k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
43
2k
Navigating Team Friction
lara
183
13k
Code Reviewing Like a Champion
maltzj
517
39k
Making Projects Easy
brettharned
113
5.8k
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アプリは作れる