SlideShare a Scribd company logo
高速!
Clojure Web 開発入門
2016/07/21
Nishi-Shinju-Clojure #0
堤 一樹
自己紹介
The RedMonk Programming Language Rankings: January 2016
http://redmonk.com/sogrady/2016/02/19/language-rankings-1-16/
本日話す内容
 Clojure / Script に興味があるという人は増えている印象だが
Web アプリケーション採用事例はあまり聞かない...
• 採用事例:
• CircleCI (Clojurescript)
• kawasima-san products
• job-streamer, back-channeling, axebomber-clj etc.
• Clojure / Script で作ったはいいけど保守できる人がいない
 Clojure / Script 開発者の裾野を広げたい
• Clojure / Script を採用する利点として Web 開発の高速さを紹介
• component / duct を例に紹介
本日話す内容
 component / duct
• component / duct とは
• RDD (REPL Driven Development)
• 他のライブラリ / ツールとの組み合わせ
• figwheel
• garden
• reagent
 Clojure / Script による Web アプリケーション開発サイクル
 cljc (Reader Conditionals)
component / duct とは
 component - https://github.com/stuartsierra/component
• アプリケーションの状態を一元管理するためのフレームワーク
 duct - https://github.com/duct-framework/duct
• component 上に Web アプリを構築するためのフレームワーク
(プロジェクトテンプレートと少量のライブラリ)
• 12-factor app に従ったアプリケーション構築が可能
component / duct とは
 component を使わない場合
• Web アプリのような多数の状態を持つアプリケーションを atom / ref で
構築すると...
• 状態が散らばりどこを参照しているのか分からなくなる
• 状態間の依存関係によりリセットが上手くいないことも
atom atom
atom
atom
atom
ref
ref
ref
ref 参照
依存
 component を使った場合
• ソフトウェアをコンポーネントという単位に分割
• ソフトウェア内の状態をコンポーネント単位で管理
• コンポーネント間の依存関係を定義できる
component / duct とは
状態 状態
状態 状態
ring-jetty-component
db-component
handler-component
endpoint-component
system-map
endpoint-component db-component に依存
handler-component db-component に依存
service-component に依存
ring-jetty-component handler-componentに依存
system-using
 component を使った場合
• 各コンポーネントにライフサイクルを定義できる
• ライフサイクルと依存関係から適切にソフトウェア全体の状態を適切
に初期化・リセットできるようになる
component / duct とは
状態
ring-jetty-component
状態
db-component
start 設定(handler含む)からjettyサーバ起動
起動したサーバは状態として保持
stop 状態として保持されたサーバを停止
handlerも破棄
start 設定(handler含む)からDBへ接続
接続情報は状態として保持
stop DBとの接続解除
接続情報も破棄
component / duct とは
 実際の定義例
system-map
定義
component 間
の依存関係
from job-streamer-control-bus - https://github.com/job-streamer/job-streamer-control-bus
component / duct とは
 component FW 上で ring-clojure のアプリを構築するための
ライブラリ(コンポーネント)+ プロジェクトテンプレート
• ミドルウェア定義(handler)とルート定義(endpoint)を
コンポーネント化
• その他 figwheel(後述)等による開発プロセスもコンポーネント化
• コンポーネント初期化時の設定を共通設定 / 環境依存設定に分けて
定義することで 12-factor app に従ったアプリケーションを簡単に構築
できる
component / duct とは
 handler component 実際の定義例
ミドルウェア定義
定義を元にハンドラ
をコンポーネント化
component / duct とは
 endpoint component 実際の定義例
ルート定義
(compojure)
ルート定義を元に
エンドポイントを
コンポーネント化
component / duct とは
 12-factor app に従い環境依存の設定は環境変数に切り出す
環境依存する設定(及びデフォルト)
➡ 環境変数として設定 / 取得
環境に依存しない設定
➡ ハードコーディング
マージした設定を元に
コンポーネントを生成して起動
component / duct での RDD
 RDD (REPL Driven Development)
 component / duct で構築した Web アプリケーション操作は全て
Clojure REPL から実行可能
• 初期化(設定読み込み)
• 起動
• 停止
• リセット
• ...
 Web アプリケーションの変更をすぐに確認可能
 起動
component / duct での RDD
component / duct での RDD
 リセット
component / duct での RDD
 RDD に組み合わせると便利なライブラリ
• eftest - https://github.com/weavejester/eftest
• テストコード検索 / テストランナー
• REPL から実行可能
• alembic - https://github.com/pallet/alembic
• project.clj (leiningen によるプロジェクト定義)の再読み込み
• 依存ライブラリを追加 / 変更した際に即反映できる
他のライブラリ / ツールとの組み合わせについて
 garden – https://github.com/noprompt/garden
• Clojure の list から css を生成するライブラリ
• Clojure / Script 両対応のため、cljs に直接埋め込むことも可
他のライブラリ / ツールとの組み合わせについて
 reagent - https://github.com/reagent-project/reagent
• A simple ClojureScript interface to React.
• hiccup 記法で React.js の VDOM が表現できる
他のライブラリ / ツールとの組み合わせについて
 figwheel - https://github.com/bhauman/lein-figwheel
• cljs のビルドとブラウザへのホットロードを行う leiningen plugin
• duct より figwheel-component が提供されている
• 前述の garden もコンポーネント化することで、
css ビルド ➡ js ビルド ➡ js / css ブラウザプッシュ
という流れが実現できる
style
clj
 以上のライブラリを組み合わせると下記が全て REPL から
実行可能になる
• サーバサイドロジック(clj)の変更とブラウザでの確認
• js(cljs)の変更 / ビルドとブラウザでの確認
• css(clj)の変更 / ビルドとブラウザでの確認
Clojure / Script による Web アプリケーション開発サイクル
Clojure / Script による Web アプリケーション開発サイクル
REPL 起動
Clojure / Script による Web アプリケーション開発サイクル
Remote REPL
接続
Clojure / Script による Web アプリケーション開発サイクル
duct-figwheel-component
cljs
garden-component
clj css
js
build
build
ring-jetty-component
db-component
handler-component
endpoint-component
user=> (go)
Remote REPL
Clojure / Script による Web アプリケーション開発サイクル
duct-figwheel-component
cljs
request
garden-component
clj
ring-jetty-component
db-component
handler-component
endpoint-component
index.html
app.js
screen.css
Remote REPL
css
js
Clojure / Script による Web アプリケーション開発サイクル
duct-figwheel-component
cljs
websocket
garden-component
clj
ring-jetty-component
db-component
handler-component
endpoint-component
index.html
app.js
screen.css
Remote REPL
css
js
Clojure / Script による Web アプリケーション開発サイクル
duct-figwheel-component
cljs
garden-component
clj css
css
js
build
build
ring-jetty-component
db-component
handler-component
endpoint-component
user=> (reset)
Remote REPL
clj cljs
websocket index.html
app.js
screen.cssapp.js push
screen.css push
style
clj
Clojure / Script による Web アプリケーション開発サイクル
duct-figwheel-component
cljs
garden-component
clj css
css
js
build
build
ring-jetty-component
db-component
handler-component
endpoint-component
Remote REPL
clj cljs
style
clj
websocket index.html
app.js
screen.css
:on-jsload
(reagent/render ...)
user=> (reset)
 以降は下記の手順を繰り返すだけで開発可能
1. clj, cljs ファイル修正
2. REPL からリセット
3. ブラウザ確認
 依存ライブラリを増やす場合
• project.clj を修正して REPL より alembic/load-project
 複雑なロジックに対してテストを追加した場合
• テストコードを追加して REPL より eftest/find-tests, eftest/run-tests
 後は “REPL を切ったら負け” という思いで開発する
Clojure / Script による Web アプリケーション開発サイクル
cljc (Reader Conditionals)
 JVM / Javascript クロスプラットフォームを実現する仕組み
• cljc ファイルは Clojure / Script のいずれからも読み込める
• コード中のプラットフォーム依存部分をReader Conditionals
にて切り替え可能
• 精査、ユーティリティなどを Clojure / Script で共通化できる
JVM / js
で切替
cljc (Reader Conditionals)
components
figwheel-component
server-component
handler-component
endpoint-component
garden-component
reagent
cljc
(utility, validation,
style...)
clj cljs
duct
参照
How to start
 duct がプロジェクトテンプレートを提供
• プロジェクト作成時にオプションで cljs やexample endpoint の追加など
が行える
• プロジェクト生成後も leiningen プラグインから endpoint や component
の追加が可能
まとめ
 Clojure / Script を Web 開発に採用すれば...
• component / duct による状態の一元管理により簡潔な Web アプリケー
ションを構築出来る
• REPL による高速な開発プロセス
• cljc によるクロスプラットフォームでのコード共有が可能
Try Clojure!

More Related Content

What's hot

Elasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライドElasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライド
崇介 藤井
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話
KEISUKE KONISHI
 
nginx入門
nginx入門nginx入門
nginx入門
Takashi Takizawa
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
Shohei Okada
 
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったPHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
Hironobu Saitoh
 
NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話
Hitachi, Ltd. OSS Solution Center.
 
100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみた100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみた
Keita Tsukamoto
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
Go Miyasaka
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
Preferred Networks
 
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
Koichiro Matsuoka
 
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
NTT DATA Technology & Innovation
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
Takuto Wada
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編
なべ
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
sohta
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
 
What's new in Spring Batch 5
What's new in Spring Batch 5What's new in Spring Batch 5
What's new in Spring Batch 5
ikeyat
 
プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話
Shohei Okada
 
PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説
Masahiko Sawada
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
増田 亨
 

What's hot (20)

Elasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライドElasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライド
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話
 
nginx入門
nginx入門nginx入門
nginx入門
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
 
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったPHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
 
NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話
 
100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみた100%Kotlin ORM Ktormを試してみた
100%Kotlin ORM Ktormを試してみた
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
 
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
 
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
What's new in Spring Batch 5
What's new in Spring Batch 5What's new in Spring Batch 5
What's new in Spring Batch 5
 
プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話
 
PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 

Similar to 高速!Clojure Web 開発入門

GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけねGitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
Naoto TAKAHASHI
 
JavaScript on GitHub (#kyotojs)
JavaScript on GitHub  (#kyotojs)JavaScript on GitHub  (#kyotojs)
JavaScript on GitHub (#kyotojs)y_uuki
 
Docker PaaSとしての OpenShift, Deis, Flynn比較
Docker PaaSとしての OpenShift, Deis, Flynn比較Docker PaaSとしての OpenShift, Deis, Flynn比較
Docker PaaSとしての OpenShift, Deis, Flynn比較
Kazuto Kusama
 
DevOps on Azure Kubernetes
DevOps on Azure KubernetesDevOps on Azure Kubernetes
DevOps on Azure Kubernetes
Issei Hiraoka
 
Multibranch Pipeline with Docker 入門編
Multibranch Pipeline with Docker 入門編Multibranch Pipeline with Docker 入門編
Multibranch Pipeline with Docker 入門編
kimulla
 
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状についてClojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Kazuhiro Hara
 
xUnitハンズオン第2回テキスト
xUnitハンズオン第2回テキストxUnitハンズオン第2回テキスト
xUnitハンズオン第2回テキスト
mizuky fujitani
 
いまからでも遅くない Docker事始め&愉快な仲間達
いまからでも遅くない Docker事始め&愉快な仲間達いまからでも遅くない Docker事始め&愉快な仲間達
いまからでも遅くない Docker事始め&愉快な仲間達
softlayerjp
 
Micronaut on Azure 試してみた
Micronaut on Azure 試してみたMicronaut on Azure 試してみた
Micronaut on Azure 試してみた
拓将 平林
 
新しいOpenShiftのしくみを調べてみた
新しいOpenShiftのしくみを調べてみた新しいOpenShiftのしくみを調べてみた
新しいOpenShiftのしくみを調べてみた
Kazuto Kusama
 
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
R S
 
JavaScript And Keywords
JavaScript And KeywordsJavaScript And Keywords
JavaScript And Keywords
uupaa
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングterurou
 
Hatena blogdevelopmentflow
Hatena blogdevelopmentflowHatena blogdevelopmentflow
Hatena blogdevelopmentflow
Yasuhiro Onishi
 
Odl intro20141029
Odl intro20141029Odl intro20141029
Odl intro20141029
NEC Corporation
 
Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)
Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)
Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)kojiokb
 
Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作
terurou
 
xUnitハンズオン第3回テキスト
xUnitハンズオン第3回テキストxUnitハンズオン第3回テキスト
xUnitハンズオン第3回テキスト
mizuky fujitani
 
SwaggerとAPIのデザイン
SwaggerとAPIのデザインSwaggerとAPIのデザイン
SwaggerとAPIのデザイン
Kazuhiro Hara
 
Apache CloudStack Documentation
Apache CloudStack DocumentationApache CloudStack Documentation
Apache CloudStack DocumentationKimihiko Kitase
 

Similar to 高速!Clojure Web 開発入門 (20)

GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけねGitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
 
JavaScript on GitHub (#kyotojs)
JavaScript on GitHub  (#kyotojs)JavaScript on GitHub  (#kyotojs)
JavaScript on GitHub (#kyotojs)
 
Docker PaaSとしての OpenShift, Deis, Flynn比較
Docker PaaSとしての OpenShift, Deis, Flynn比較Docker PaaSとしての OpenShift, Deis, Flynn比較
Docker PaaSとしての OpenShift, Deis, Flynn比較
 
DevOps on Azure Kubernetes
DevOps on Azure KubernetesDevOps on Azure Kubernetes
DevOps on Azure Kubernetes
 
Multibranch Pipeline with Docker 入門編
Multibranch Pipeline with Docker 入門編Multibranch Pipeline with Docker 入門編
Multibranch Pipeline with Docker 入門編
 
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状についてClojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
 
xUnitハンズオン第2回テキスト
xUnitハンズオン第2回テキストxUnitハンズオン第2回テキスト
xUnitハンズオン第2回テキスト
 
いまからでも遅くない Docker事始め&愉快な仲間達
いまからでも遅くない Docker事始め&愉快な仲間達いまからでも遅くない Docker事始め&愉快な仲間達
いまからでも遅くない Docker事始め&愉快な仲間達
 
Micronaut on Azure 試してみた
Micronaut on Azure 試してみたMicronaut on Azure 試してみた
Micronaut on Azure 試してみた
 
新しいOpenShiftのしくみを調べてみた
新しいOpenShiftのしくみを調べてみた新しいOpenShiftのしくみを調べてみた
新しいOpenShiftのしくみを調べてみた
 
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
 
JavaScript And Keywords
JavaScript And KeywordsJavaScript And Keywords
JavaScript And Keywords
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミング
 
Hatena blogdevelopmentflow
Hatena blogdevelopmentflowHatena blogdevelopmentflow
Hatena blogdevelopmentflow
 
Odl intro20141029
Odl intro20141029Odl intro20141029
Odl intro20141029
 
Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)
Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)
Google Cloud Messaging for Android ことはじめ(Eclipseから動かしてみる編)
 
Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作
 
xUnitハンズオン第3回テキスト
xUnitハンズオン第3回テキストxUnitハンズオン第3回テキスト
xUnitハンズオン第3回テキスト
 
SwaggerとAPIのデザイン
SwaggerとAPIのデザインSwaggerとAPIのデザイン
SwaggerとAPIのデザイン
 
Apache CloudStack Documentation
Apache CloudStack DocumentationApache CloudStack Documentation
Apache CloudStack Documentation
 

Recently uploaded

FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 

Recently uploaded (14)

FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 

高速!Clojure Web 開発入門

  • 3. The RedMonk Programming Language Rankings: January 2016 http://redmonk.com/sogrady/2016/02/19/language-rankings-1-16/
  • 4. 本日話す内容  Clojure / Script に興味があるという人は増えている印象だが Web アプリケーション採用事例はあまり聞かない... • 採用事例: • CircleCI (Clojurescript) • kawasima-san products • job-streamer, back-channeling, axebomber-clj etc. • Clojure / Script で作ったはいいけど保守できる人がいない  Clojure / Script 開発者の裾野を広げたい • Clojure / Script を採用する利点として Web 開発の高速さを紹介 • component / duct を例に紹介
  • 5. 本日話す内容  component / duct • component / duct とは • RDD (REPL Driven Development) • 他のライブラリ / ツールとの組み合わせ • figwheel • garden • reagent  Clojure / Script による Web アプリケーション開発サイクル  cljc (Reader Conditionals)
  • 6. component / duct とは  component - https://github.com/stuartsierra/component • アプリケーションの状態を一元管理するためのフレームワーク  duct - https://github.com/duct-framework/duct • component 上に Web アプリを構築するためのフレームワーク (プロジェクトテンプレートと少量のライブラリ) • 12-factor app に従ったアプリケーション構築が可能
  • 7. component / duct とは  component を使わない場合 • Web アプリのような多数の状態を持つアプリケーションを atom / ref で 構築すると... • 状態が散らばりどこを参照しているのか分からなくなる • 状態間の依存関係によりリセットが上手くいないことも atom atom atom atom atom ref ref ref ref 参照 依存
  • 8.  component を使った場合 • ソフトウェアをコンポーネントという単位に分割 • ソフトウェア内の状態をコンポーネント単位で管理 • コンポーネント間の依存関係を定義できる component / duct とは 状態 状態 状態 状態 ring-jetty-component db-component handler-component endpoint-component system-map endpoint-component db-component に依存 handler-component db-component に依存 service-component に依存 ring-jetty-component handler-componentに依存 system-using
  • 9.  component を使った場合 • 各コンポーネントにライフサイクルを定義できる • ライフサイクルと依存関係から適切にソフトウェア全体の状態を適切 に初期化・リセットできるようになる component / duct とは 状態 ring-jetty-component 状態 db-component start 設定(handler含む)からjettyサーバ起動 起動したサーバは状態として保持 stop 状態として保持されたサーバを停止 handlerも破棄 start 設定(handler含む)からDBへ接続 接続情報は状態として保持 stop DBとの接続解除 接続情報も破棄
  • 10. component / duct とは  実際の定義例 system-map 定義 component 間 の依存関係 from job-streamer-control-bus - https://github.com/job-streamer/job-streamer-control-bus
  • 11. component / duct とは  component FW 上で ring-clojure のアプリを構築するための ライブラリ(コンポーネント)+ プロジェクトテンプレート • ミドルウェア定義(handler)とルート定義(endpoint)を コンポーネント化 • その他 figwheel(後述)等による開発プロセスもコンポーネント化 • コンポーネント初期化時の設定を共通設定 / 環境依存設定に分けて 定義することで 12-factor app に従ったアプリケーションを簡単に構築 できる
  • 12. component / duct とは  handler component 実際の定義例 ミドルウェア定義 定義を元にハンドラ をコンポーネント化
  • 13. component / duct とは  endpoint component 実際の定義例 ルート定義 (compojure) ルート定義を元に エンドポイントを コンポーネント化
  • 14. component / duct とは  12-factor app に従い環境依存の設定は環境変数に切り出す 環境依存する設定(及びデフォルト) ➡ 環境変数として設定 / 取得 環境に依存しない設定 ➡ ハードコーディング マージした設定を元に コンポーネントを生成して起動
  • 15. component / duct での RDD  RDD (REPL Driven Development)  component / duct で構築した Web アプリケーション操作は全て Clojure REPL から実行可能 • 初期化(設定読み込み) • 起動 • 停止 • リセット • ...  Web アプリケーションの変更をすぐに確認可能
  • 16.  起動 component / duct での RDD
  • 17. component / duct での RDD  リセット
  • 18. component / duct での RDD  RDD に組み合わせると便利なライブラリ • eftest - https://github.com/weavejester/eftest • テストコード検索 / テストランナー • REPL から実行可能 • alembic - https://github.com/pallet/alembic • project.clj (leiningen によるプロジェクト定義)の再読み込み • 依存ライブラリを追加 / 変更した際に即反映できる
  • 19. 他のライブラリ / ツールとの組み合わせについて  garden – https://github.com/noprompt/garden • Clojure の list から css を生成するライブラリ • Clojure / Script 両対応のため、cljs に直接埋め込むことも可
  • 20. 他のライブラリ / ツールとの組み合わせについて  reagent - https://github.com/reagent-project/reagent • A simple ClojureScript interface to React. • hiccup 記法で React.js の VDOM が表現できる
  • 21. 他のライブラリ / ツールとの組み合わせについて  figwheel - https://github.com/bhauman/lein-figwheel • cljs のビルドとブラウザへのホットロードを行う leiningen plugin • duct より figwheel-component が提供されている • 前述の garden もコンポーネント化することで、 css ビルド ➡ js ビルド ➡ js / css ブラウザプッシュ という流れが実現できる style clj
  • 22.  以上のライブラリを組み合わせると下記が全て REPL から 実行可能になる • サーバサイドロジック(clj)の変更とブラウザでの確認 • js(cljs)の変更 / ビルドとブラウザでの確認 • css(clj)の変更 / ビルドとブラウザでの確認 Clojure / Script による Web アプリケーション開発サイクル
  • 23. Clojure / Script による Web アプリケーション開発サイクル REPL 起動
  • 24. Clojure / Script による Web アプリケーション開発サイクル Remote REPL 接続
  • 25. Clojure / Script による Web アプリケーション開発サイクル duct-figwheel-component cljs garden-component clj css js build build ring-jetty-component db-component handler-component endpoint-component user=> (go) Remote REPL
  • 26. Clojure / Script による Web アプリケーション開発サイクル duct-figwheel-component cljs request garden-component clj ring-jetty-component db-component handler-component endpoint-component index.html app.js screen.css Remote REPL css js
  • 27. Clojure / Script による Web アプリケーション開発サイクル duct-figwheel-component cljs websocket garden-component clj ring-jetty-component db-component handler-component endpoint-component index.html app.js screen.css Remote REPL css js
  • 28. Clojure / Script による Web アプリケーション開発サイクル duct-figwheel-component cljs garden-component clj css css js build build ring-jetty-component db-component handler-component endpoint-component user=> (reset) Remote REPL clj cljs websocket index.html app.js screen.cssapp.js push screen.css push style clj
  • 29. Clojure / Script による Web アプリケーション開発サイクル duct-figwheel-component cljs garden-component clj css css js build build ring-jetty-component db-component handler-component endpoint-component Remote REPL clj cljs style clj websocket index.html app.js screen.css :on-jsload (reagent/render ...) user=> (reset)
  • 30.  以降は下記の手順を繰り返すだけで開発可能 1. clj, cljs ファイル修正 2. REPL からリセット 3. ブラウザ確認  依存ライブラリを増やす場合 • project.clj を修正して REPL より alembic/load-project  複雑なロジックに対してテストを追加した場合 • テストコードを追加して REPL より eftest/find-tests, eftest/run-tests  後は “REPL を切ったら負け” という思いで開発する Clojure / Script による Web アプリケーション開発サイクル
  • 31. cljc (Reader Conditionals)  JVM / Javascript クロスプラットフォームを実現する仕組み • cljc ファイルは Clojure / Script のいずれからも読み込める • コード中のプラットフォーム依存部分をReader Conditionals にて切り替え可能 • 精査、ユーティリティなどを Clojure / Script で共通化できる JVM / js で切替
  • 33. How to start  duct がプロジェクトテンプレートを提供 • プロジェクト作成時にオプションで cljs やexample endpoint の追加など が行える • プロジェクト生成後も leiningen プラグインから endpoint や component の追加が可能
  • 34. まとめ  Clojure / Script を Web 開発に採用すれば... • component / duct による状態の一元管理により簡潔な Web アプリケー ションを構築出来る • REPL による高速な開発プロセス • cljc によるクロスプラットフォームでのコード共有が可能 Try Clojure!