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
3.2k
Clojureを用いたWebアプリケーション開発
ayato
December 02, 2016
Tweet
Share
More Decks by ayato
See All by ayato
マイクロサービス内で動くAPIをF#で書いている
ayato0211
1
1.4k
Clojureという言語が私逹にもたらしたもの
ayato0211
6
3.2k
3年間考え続けてきたWebアプリケーションにおけるテストの話
ayato0211
3
300
Re:REPL-Driven Development
ayato0211
3
1.4k
Meta Template Engine
ayato0211
2
1.2k
超変換! Hiccup data structure!!
ayato0211
2
650
About Integrant
ayato0211
0
590
Muscle Assert
ayato0211
0
300
翻訳にまつわるエトセトラ
ayato0211
6
1.3k
Other Decks in Programming
See All in Programming
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
950
SourceGeneratorのマーカー属性問題について
htkym
0
210
モックわからないマン卒業記 ~振る舞いを起点に見直した、フロントエンドテストにおけるモックの使いどころ~
tasukuwatanabe
3
420
ファインチューニングせずメインコンペを解く方法
pokutuna
0
140
今年もTECHSCOREブログを書き続けます!
hiraoku101
0
120
脱 雰囲気実装!AgentCoreを良い感じにWEBアプリケーションに組み込むために
takuyay0ne
3
390
「接続」—パフォーマンスチューニングの最後の一手 〜点と点を結ぶ、その一瞬のために〜
kentaroutakeda
3
1.9k
Agentic AI: Evolution oder Revolution
mobilelarson
PRO
0
190
Java 21/25 Virtual Threads 소개
debop
0
260
new(1.26) ← これすき / kamakura.go #8
utgwkk
0
2.7k
Claude Code Skill入門
mayahoney
0
420
OTP を自動で入力する裏技
megabitsenmzq
0
120
Featured
See All Featured
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
340
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
200
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.5k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
91
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
330
A Modern Web Designer's Workflow
chriscoyier
698
190k
Making the Leap to Tech Lead
cromwellryan
135
9.8k
Technical Leadership for Architectural Decision Making
baasie
3
300
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
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アプリは作れる