Submit Search
Upload
REPLライフをもっと快適に
•
9 likes
•
14,631 views
S
sohta
Follow
Clojure夜会で発表したスライドです。Stuart Sierraが提案しているClojureワークフローについて紹介しています。
Read less
Read more
Technology
Report
Share
Report
Share
1 of 21
Download now
Download to read offline
Recommended
super_unkoをスーパーキレイにした
super_unkoをスーパーキレイにした
jiro4989
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
sohta
会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと
Recruit Technologies
高速!Clojure Web 開発入門
高速!Clojure Web 開発入門
Kazuki Tsutsumi
とにかく始めるClojure
とにかく始めるClojure
Masayuki Muto
Light TableでClojure入門
Light TableでClojure入門
Tokusei Noborio
java-oneの話
java-oneの話
Recruit Technologies
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
sohta
Recommended
super_unkoをスーパーキレイにした
super_unkoをスーパーキレイにした
jiro4989
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
sohta
会社でClojure使ってみて分かったこと
会社でClojure使ってみて分かったこと
Recruit Technologies
高速!Clojure Web 開発入門
高速!Clojure Web 開発入門
Kazuki Tsutsumi
とにかく始めるClojure
とにかく始めるClojure
Masayuki Muto
Light TableでClojure入門
Light TableでClojure入門
Tokusei Noborio
java-oneの話
java-oneの話
Recruit Technologies
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
sohta
イマドキのExcelスクショの撮り方
イマドキのExcelスクショの撮り方
Yoshitaka Kawashima
Who moved my cheese
Who moved my cheese
AmplifiedSteve
Use Video to Communicate
Use Video to Communicate
e mixon
ClojureではじめるSTM入門
ClojureではじめるSTM入門
sohta
AndroidでScalaを使う際の問題点と対策
AndroidでScalaを使う際の問題点と対策
Mogi Isamu
AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発
AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発
Mogi Isamu
React系(別言語含む)の サーバーサイドレンダリング について考えよう
React系(別言語含む)の サーバーサイドレンダリング について考えよう
Kazuhiro Hara
はてなブックマークに基づく関連記事レコメンドエンジンの開発
はてなブックマークに基づく関連記事レコメンドエンジンの開発
Shunsuke Kozawa
MVC 1.0 JSR-371を通してAdopt a JSRに知ろう #jjug_ccc #ccc_r57
MVC 1.0 JSR-371を通してAdopt a JSRに知ろう #jjug_ccc #ccc_r57
Toshiaki Maki
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
Yoshitaka Kawashima
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
Masahiro Nagano
Aerospike on IDCF Cloud
Aerospike on IDCF Cloud
IDC Frontier
Mackerel & Norikra mackerel meetup #4 LT
Mackerel & Norikra mackerel meetup #4 LT
Masahiro Nagano
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Masahiro Nagano
Big Master Data PHP BLT #1
Big Master Data PHP BLT #1
Masahiro Nagano
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Masahiro Nagano
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
Masahiro Nagano
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Kazuhiro Hara
JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行
Yoshitaka Kawashima
キメるClojure
キメるClojure
Yoshitaka Kawashima
入門Transducers
入門Transducers
sohta
Clojure Language Update (2015)
Clojure Language Update (2015)
sohta
More Related Content
Viewers also liked
イマドキのExcelスクショの撮り方
イマドキのExcelスクショの撮り方
Yoshitaka Kawashima
Who moved my cheese
Who moved my cheese
AmplifiedSteve
Use Video to Communicate
Use Video to Communicate
e mixon
ClojureではじめるSTM入門
ClojureではじめるSTM入門
sohta
AndroidでScalaを使う際の問題点と対策
AndroidでScalaを使う際の問題点と対策
Mogi Isamu
AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発
AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発
Mogi Isamu
React系(別言語含む)の サーバーサイドレンダリング について考えよう
React系(別言語含む)の サーバーサイドレンダリング について考えよう
Kazuhiro Hara
はてなブックマークに基づく関連記事レコメンドエンジンの開発
はてなブックマークに基づく関連記事レコメンドエンジンの開発
Shunsuke Kozawa
MVC 1.0 JSR-371を通してAdopt a JSRに知ろう #jjug_ccc #ccc_r57
MVC 1.0 JSR-371を通してAdopt a JSRに知ろう #jjug_ccc #ccc_r57
Toshiaki Maki
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
Yoshitaka Kawashima
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
Masahiro Nagano
Aerospike on IDCF Cloud
Aerospike on IDCF Cloud
IDC Frontier
Mackerel & Norikra mackerel meetup #4 LT
Mackerel & Norikra mackerel meetup #4 LT
Masahiro Nagano
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Masahiro Nagano
Big Master Data PHP BLT #1
Big Master Data PHP BLT #1
Masahiro Nagano
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Masahiro Nagano
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
Masahiro Nagano
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Kazuhiro Hara
JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行
Yoshitaka Kawashima
キメるClojure
キメるClojure
Yoshitaka Kawashima
Viewers also liked
(20)
イマドキのExcelスクショの撮り方
イマドキのExcelスクショの撮り方
Who moved my cheese
Who moved my cheese
Use Video to Communicate
Use Video to Communicate
ClojureではじめるSTM入門
ClojureではじめるSTM入門
AndroidでScalaを使う際の問題点と対策
AndroidでScalaを使う際の問題点と対策
AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発
AndroidStudioとGradleを利用したScala言語によるAndroidアプリの開発
React系(別言語含む)の サーバーサイドレンダリング について考えよう
React系(別言語含む)の サーバーサイドレンダリング について考えよう
はてなブックマークに基づく関連記事レコメンドエンジンの開発
はてなブックマークに基づく関連記事レコメンドエンジンの開発
MVC 1.0 JSR-371を通してAdopt a JSRに知ろう #jjug_ccc #ccc_r57
MVC 1.0 JSR-371を通してAdopt a JSRに知ろう #jjug_ccc #ccc_r57
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
Aerospike on IDCF Cloud
Aerospike on IDCF Cloud
Mackerel & Norikra mackerel meetup #4 LT
Mackerel & Norikra mackerel meetup #4 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Big Master Data PHP BLT #1
Big Master Data PHP BLT #1
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
Clojure の各種React系ラッパーライブラリのサーバーサイドレンダリングの現状について
JobStreamerではじめるJavaBatchのクラウド分散実行
JobStreamerではじめるJavaBatchのクラウド分散実行
キメるClojure
キメるClojure
More from sohta
入門Transducers
入門Transducers
sohta
Clojure Language Update (2015)
Clojure Language Update (2015)
sohta
入門ClojureScript
入門ClojureScript
sohta
入門core.async
入門core.async
sohta
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
sohta
Macros in Clojure
Macros in Clojure
sohta
Clojureによるバイトコードプログラミング
Clojureによるバイトコードプログラミング
sohta
More from sohta
(7)
入門Transducers
入門Transducers
Clojure Language Update (2015)
Clojure Language Update (2015)
入門ClojureScript
入門ClojureScript
入門core.async
入門core.async
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
Macros in Clojure
Macros in Clojure
Clojureによるバイトコードプログラミング
Clojureによるバイトコードプログラミング
Recently uploaded
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
Toru Tamaki
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
Hiroki Ichikura
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
Toru Tamaki
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Yuma Ohgami
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
taisei2219
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
iPride Co., Ltd.
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
Toru Tamaki
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
Recently uploaded
(12)
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
REPLライフをもっと快適に
1.
REPLライフをもっと快適に! ∼Stuart SierraのClojureワークフローの紹介∼ Clojure夜会 2014/10/10 @athos0220
2.
REPL! 使ってますか?
3.
user=> 評価 入力した式の結果がすぐ確認できる! 高速なフィードバックループ
4.
Check user=> (ns example) (defn fib
[x] ...) Edit 評価
5.
Check user=> (ns example) (defn fib
[x] ...) Edit 評価 ロード! or! リロード
6.
Check user=> (ns example) (defn fib
[x] ...) Edit 評価 修正! or ! 次のステップへ ロード! or! リロード
7.
Check user=> (ns example) (defn fib
[x] ...) Edit 評価 修正! or ! 次のステップへ ロード! or! リロード 失敗
8.
Check user=> (ns example) (defn fib
[x] ...) Edit 修正・確認のフィードバックループを高速に! 回すにはリロードが重要! 評価 修正! or ! 次のステップへ ロード! or! リロード 失敗
9.
リロードにまつわる問題 • プロトコルやマルチメソッド、マクロ等に対する 変更が正しく反映されない • 名前空間のロード順に制約がある場合に、制約 を満たさない順でロードが実行される •
通信コネクションの切断・接続やスレッドの停 止・開始等が正しく実行されない これらを解決するには! ツールのサポートと設計の工夫が必要
10.
快適なREPLライフへの3ステップ • tools.namespaceを使おう • user.cljを作ろう •
コンポーネント単位でシステムを作ろう
11.
tools.namespaceを使おう • 名前空間の依存関係を解析して適切な順番でロードし直す • リロードによって不整合が起こらないようにしてくれる •
平たくいえば (require … :reload) の強化版 A! B! A’! ! C A’! B! C (require … :reload) A! B! A’! ! C A’! ! C tools.namespace 例
12.
tools.namespaceを使おう • 依存ライブラリとして以下を追加(2014/10現在) ! • (require
… :reload) の代わりに (refresh) を使う ! ! [org.clojure/tools.namespace “0.2.7”] user=> (require ‘[clojure.tools.namespace.repl :refer [refresh]]) nil user=> (refresh) :reloading (reacta.script reacta.scripts.hello) :ok user=>
13.
user.cljを作ろう • tools.namespaceはリロード毎に名前空間を作り 直すので… • REPLで定義した変数・関数が消える •
REPLでrequireした名前空間も見えなくなる • REPLがクラスパス中のuser.cljを自動で読み込む ことを利用して、そこに必要なものを定義
14.
user.cljを作ろう • (準備) :devプロファイルでのみ有効になるパスを作る •
リリース版JARファイルにuser.cljが含まれないように (defproject foobar "0.1.0-SNAPSHOT" :description "TODO" :url "TODO" :license {:name "TODO: Choose a license" :url "http://choosealicense.com/"} :dependencies [[org.clojure/clojure "1.6.0"]] :profiles {:dev {:dependencies [[org.clojure/tools.namespace "0.2.7"]] :source-paths ["dev"]}})
15.
(ns user (:require [clojure.tools.namespace.repl
:refer [refresh]] [clojure.repl :refer :all] [clojure.pprint :refer [pp pprint]] [foobar.core :refer :all])) ! (def system nil) ! (defn init [] (alter-var-root #’system (システム初期化))) ! (defn start [] (alter-var-root #'system (システムスタート))) ! (defn stop [] (alter-var-root #'system (システムストップ))) ! (defn go [] (init) (start)) ! (defn reset [] (stop) (refresh :after 'user/go)) dev/user.cljの例
16.
コンポーネント単位でシステムを作ろう • Componentライブラリ • システムを“コンポーネント”に分割 •
コンポーネント=状態を共有する関数群 • DBアクセス、外部サービス、atomやref, etc. • コンポーネントの起動・停止方法を提供し、依存 関係を考慮した順序で呼び出す
17.
コンポーネント単位でシステムを作ろう System DB Users! API Email! Service Queue! Service
18.
コンポーネント単位でシステムを作ろう (ns example.db (:require [com.stuartsierra.component
:as comp] …)) ! (defrecord Database [host port conn] comp/Lifecycle (start [component] (assoc component :conn (db/connect host port))) (stop [component] (.close conn) component)) コンポーネントに関する副作用は! start/stopメソッド内にまとめる
19.
コンポーネント単位でシステムを作ろう (ns example.core (:require [com.stuartsierra.component
:as comp] …)) ! (defn new-system [config] (let [{:keys [host port]} (:db config)] (comp/system-map :database (database host port) :queue-service (queue-service …) :email-service (email-service …) :users-api (comp/using (users-api) [:database :email-service])))) コンポーネント間の依存関係をデータで表現! Componentが依存関係を考えて各コンポーネントを起動・停止
20.
まとめ • 動的に変更を取り込むのは動的言語の醍醐味 • 各ステップを単独で導入するだけでも効果あり •
高速なフィードバックループを実現し、快適な REPLライフを!
21.
参考文献 • My Clojure
Workflow, Reloaded • Clojure in the Large [InfoQ] • tools.namespace [GitHub] • Component Library [GitHub]
Download now