SlideShare a Scribd company logo
re-frame	à	la	spec
Self-introduction
	/laʒenɔʁɛ̃k/	カマイルカlagénorhynque
(defprofile lagénorhynque
:name "Kent OHASHI"
:languages [Clojure Haskell Python Scala
English français Deutsch русский]
:interests [programming language-learning mathematics]
:contributing [github.com/japan-clojurians/clojure-site-ja])
1.	 Example	App
2.	 Introduction	to	re-frame
3.	 Integration	with	clojure.spec
Example	App
rock-paper-scissors	game
source	code
inspired	by	
lagenorhynque/rock-paper-scissors
Elm開発における思考フロー
demo
or
from	Emacs:	cider-jack-in-clojurescript
$ git clone git@github.com:lagenorhynque/rock-paper-scissors.git
$ cd rock-paper-scissors
$ lein figwheel dev
Game	start
Select	your	hand
Result:	lose
Select	your	hand
Result:	draw
Select	your	hand
Result:	win
Introduction	to	re-frame
re-frame
A	Reagent	Framework	For	Writing
SPAs,	in	Clojurescript.
features
based	on	Reagent
data-oriented	design
purely	functional	for	the	most	part
similar	frameworks
	(React)
	(Angular)
Elm	Architecture
Redux
ngrx
React Reagent
JSX	(React	element) Hiccup-like	DSL
React	component ClojureScript	function
props args	of	component	function
state reagent.core/atom
cf.	
Reagent
ClojureScript	&	ReagentでReact⼊⾨してみた
re-frame's	data	 ow
(a.k.a.	"dominoes")
1.	 event	dispatch
2.	 event	handling
3.	 effect	handling
4.	 query
5.	 view
6.	 DOM
1.	event	dispatch
dispatch	synchronously	to
[::events/initialize-db]
(defn ^:export init []
(re-frame/dispatch-sync [::events/initialize-db])
(dev-setup)
(mount-root))
src/cljs/rock_paper_scissors/core.cljs#L19-L22
2.	event	handling
event	handler	for	::initialize-db
(re-frame/reg-event-db
::initialize-db
(fn [_ _]
db/default-db))
src/cljs/rock_paper_scissors/events.cljs#L6-L9
3.	effect	handling
effect	handler	for	:db
(reg-fx
:db
(fn [value]
(if-not (identical? @app-db value)
(reset! app-db value))))
src/re_frame/fx.cljc#L162-L166
4.	query
subscription	for	::scene
(re-frame/reg-sub
::scene
(fn [db _]
(:scene db)))
src/cljs/rock_paper_scissors/subs.cljs#L5-L8
5.	view
subscribe	to	[::subs/scene]
(defn main-panel []
(case @(re-frame/subscribe [::subs/scene])
::db/start [start-button "Game Start"]
::db/now-playing [hands]
::db/over [:div
[:h1 @(re-frame/subscribe
[::subs/you-enemy-hands])]
[result]
[start-button "Next Game"]]))
src/cljs/rock_paper_scissors/views.cljs#L26-L33
6.	DOM
1'.	event	dispatch
dispatch	to	[::events/next-game]
(defn start-button [label]
[:input {:type "button"
:on-click #(re-frame/dispatch [::events/next-game])
:value label}])
src/cljs/rock_paper_scissors/views.cljs#L8-L11
2'.	event	handling
event	handler	for	::next-game
(re-frame/reg-event-db
::next-game
(fn [db _]
(assoc db :scene ::db/now-playing)))
src/cljs/rock_paper_scissors/events.cljs#L11-L14
3'.	effect	handling
effect	handler	for	:db
(reg-fx
:db
(fn [value]
(if-not (identical? @app-db value)
(reset! app-db value))))
src/re_frame/fx.cljc#L162-L166
4'.	query
subscription	for	::scene
(re-frame/reg-sub
::scene
(fn [db _]
(:scene db)))
src/cljs/rock_paper_scissors/subs.cljs#L5-L8
5'.	view
subscribe	to	[::subs/scene]
(defn main-panel []
(case @(re-frame/subscribe [::subs/scene])
::db/start [start-button "Game Start"]
::db/now-playing [hands]
::db/over [:div
[:h1 @(re-frame/subscribe
[::subs/you-enemy-hands])]
[result]
[start-button "Next Game"]]))
src/cljs/rock_paper_scissors/views.cljs#L26-L33
6'.	DOM
1''.	event	dispatch
dispatch	to	[::events/select-your-hand h]
(defn hands []
[:div (map (fn [h]
^{:key h}
[:input {:type "button"
:on-click
#(re-frame/dispatch
[::events/select-your-hand h])
:value h}])
[::rps/rock ::rps/paper ::rps/scissors])])
src/cljs/rock_paper_scissors/views.cljs#L13-L19
2''.	event	handling
event	handler	for	::events/select-your-hand
(re-frame/reg-event-fx
::select-your-hand
[(re-frame/inject-cofx ::cofx/select-enemy-hand)]
(fn [{:keys [db enemy-hand]} [_ h]]
{:db (assoc db
:you h
:enemy enemy-hand
:scene ::db/over)}))
src/cljs/rock_paper_scissors/events.cljs#L16-L23
3''.	effect	handling
coeffect	handler	for	::select-enemy-hand
(re-frame/reg-cofx
::select-enemy-hand
(fn [cofx _]
(assoc cofx
:enemy-hand (rps/->hand (rand-int 3)))))
src/cljs/rock_paper_scissors/cofx.cljs#L5-L9
effect	handler	for	:db
(reg-fx
:db
(fn [value]
(if-not (identical? @app-db value)
(reset! app-db value))))
src/re_frame/fx.cljc#L162-L166
4''.	query
subscription	for	::scene
(re-frame/reg-sub
::scene
(fn [db _]
(:scene db)))
src/cljs/rock_paper_scissors/subs.cljs#L5-L8
subscription	for	::you-enemy
subscription	for	::you-enemy-hands
(re-frame/reg-sub
::you-enemy
(fn [db _]
(select-keys db [:you :enemy])))
src/cljs/rock_paper_scissors/subs.cljs#L10-L13
(re-frame/reg-sub
::you-enemy-hands
:<- [::you-enemy]
(fn [{:keys [you enemy]} _]
(str (name you) "(YOU) VS " (name enemy) "(ENEMY)")))
src/cljs/rock_paper_scissors/subs.cljs#L15-L19
subscription	for	::fight-result
(re-frame/reg-sub
::fight-result
:<- [::you-enemy]
(fn [{:keys [you enemy]} _]
(rps/fight you enemy)))
src/cljs/rock_paper_scissors/subs.cljs#L21-L25
subscription	for	::result-color
(re-frame/reg-sub
::result-color
:<- [::fight-result]
(fn [r _]
(case r
::rps/win "red"
::rps/lose "blue"
::rps/draw "gray")))
src/cljs/rock_paper_scissors/subs.cljs#L27-L34
5''.	view
subscribe	to	[::subs/scene]
subscribe	to	[::subs/you-enemy-hands]
(defn main-panel []
(case @(re-frame/subscribe [::subs/scene])
::db/start [start-button "Game Start"]
::db/now-playing [hands]
::db/over [:div
[:h1 @(re-frame/subscribe
[::subs/you-enemy-hands])]
[result]
[start-button "Next Game"]]))
src/cljs/rock_paper_scissors/views.cljs#L26-L33
subscribe	to	[::subs/fight-result]
subscribe	to	[::subs/result-color]
(defn result []
(let [r @(re-frame/subscribe [::subs/fight-result])]
[:h1 {:style {:color @(re-frame/subscribe
[::subs/result-color])}}
r]))
src/cljs/rock_paper_scissors/views.cljs#L21-L24
6''.	DOM
Integration	with	clojure.spec
speccing	policy
split	directories/namespaces	for	specs
use	clojure.spec	in	development	only
spec	domain	logic
spec	db	data
split	directories/namespaces	for	specs
directory	structure
rock-paper-scissors
├── specs
│ └── cljs
│ └── rock_paper_scissors
│ └── *
│ └── specs.cljs
├── src
│ └── cljs
│ └── rock_paper_scissors
│ └── *.cljs
└── test
└── cljs
└── rock_paper_scissors
├── *_test.cljs
└── runner.cljs
use	clojure.spec	in	development	only
cljsbuild	settings
:cljsbuild
{:builds
[{:id "dev"
:source-paths ["src/cljs" "specs/cljs"]
,,,}
{:id "min"
:source-paths ["src/cljs"]
,,,}
{:id "test"
:source-paths ["src/cljs" "specs/cljs" "test/cljs"]
,,,}
]}
project.clj#L40-L70
spec	domain	logic
specs	for	rock-paper-scissors	data
(s/def ::hand #{::rps/rock ::rps/paper ::rps/scissors})
(s/def ::hand-num (s/int-in 0 3))
(s/def ::result #{::rps/win ::rps/lose ::rps/draw})
specs/cljs/rock_paper_scissors/rps/specs.cljs#L5-L9
specs	for	rock-paper-scissors	functions
(s/fdef rps/<-hand
:args (s/cat :hand ::hand)
:ret ::hand-num)
(s/fdef rps/->hand
:args (s/cat :num ::hand-num)
:ret ::hand)
(s/fdef rps/fight
:args (s/cat :you ::hand
:enemy ::hand)
:ret ::result)
specs/cljs/rock_paper_scissors/rps/specs.cljs#L11-
L22
spec	db	data
(s/def ::you ::rps.specs/hand)
(s/def ::enemy ::rps.specs/hand)
(s/def ::scene #{::db/start ::db/now-playing ::db/over})
(s/def ::db (s/keys :req-un [::you ::enemy ::scene]))
specs/cljs/rock_paper_scissors/db/specs.cljs#L6-
L12
testing	policy
test	domain	logic
test	events	via	dispatch
test	subscriptions	via	subscribe
do	not	test	views
test	domain	logic
example-based	tests	with	specs	instrumented
(t/use-fixtures
:once {:before #(stest/instrument)})
(t/deftest test-fight
(t/testing "rock-paper-scissors"
(t/is (= ::sut/win (sut/fight ::sut/rock ::sut/scissors)))
(t/is (= ::sut/lose (sut/fight ::sut/scissors ::sut/rock)))
(t/is (= ::sut/draw (sut/fight ::sut/paper ::sut/paper)))))
test/cljs/rock_paper_scissors/rps_test.cljs#L10-L17
property-based	tests	using	specs
(tc/defspec prop-test-fight
1000
(let [fspec (s/get-spec #'sut/fight)]
(prop/for-all [[you enemy] (-> fspec :args s/gen)]
(s/valid? (:ret fspec)
(sut/fight you enemy)))))
test/cljs/rock_paper_scissors/rps_test.cljs#L33-L38
test	events	and	subscriptions
(t/use-fixtures ; instrument specs
:once {:before #(stest/instrument)})
(defn test-fixtures []
(re-frame/reg-fx ; mock :db effect
:db
(fn [value] ; validate db with specs
(when-not (s/valid? ::db.specs/db value)
(throw (ex-info "db spec check failed"
(s/explain-data ::db.specs/db value))))
(if-not (identical? @app-db value)
(reset! app-db value)))))
test/cljs/rock_paper_scissors/events_test.cljs#L16-
L26
(t/deftest test-initialize-db
(re-frame.test/run-test-sync
(test-fixtures)
(re-frame/dispatch [::sut/initialize-db])
(t/is ::db/start @(re-frame/subscribe [::subs/scene]))
(t/is {:you ::rps/rock
:enemy ::rps/rock}
@(re-frame/subscribe [::subs/you-enemy]))))
test/cljs/rock_paper_scissors/events_test.cljs#L28-
L35
(t/deftest test-select-your-hand
(re-frame.test/run-test-sync
(test-fixtures)
(re-frame/reg-cofx ; mock ::cofx/select-enemy-hand coeffect
::cofx/select-enemy-hand
(fn [cofx _]
(assoc cofx :enemy-hand ::rps/rock)))
(re-frame/dispatch [::sut/initialize-db])
(t/testing "draw"
(re-frame/dispatch [::sut/next-game])
(re-frame/dispatch [::sut/select-your-hand ::rps/rock])
(t/is ::db/over @(re-frame/subscribe [::subs/scene]))
(t/is "rock(YOU) VS rock(ENEMY)" @(re-frame/subscribe [::subs/you-
(t/is ::rps/draw @(re-frame/subscribe [::subs/fight-result]))
(t/is "gray" @(re-frame/subscribe [::subs/result-color])))))
test/cljs/rock_paper_scissors/events_test.cljs#L44-
L73
re-frame	x	clojure.spec
unobtrusive	use	of	clojure.spec
only	in	development
in	separate	directory/file/namespace
focus	on	domain	logic	and	db
A	little	effort	to	write	specs	and	tests	can	make	our
ClojureScript	frontend	life	much	happier!
Further	Reading
example	code
lagenorhynque/rock-paper-scissors
Reagent
:	A	minimalistic
ClojureScript	interface	to	React.js
reagent-project/reagent
Guide	to	Reagent
ClojureScript	&	ReagentでReact⼊⾨してみた	-
Qiita
re-frame
:	A	Reagent	Framework	For	Writing
SPAs,	in	Clojurescript.
:	Cross	platform	(cljs	and	clj)
utilities	for	testing	re-frame	applications
:	A	debugging	dashboard	for
re-frame	epochs.	Comes	with	free	x-ray	glasses.
Day8/re-frame
Day8/re-frame-test
Day8/re-frame-10x
Re-frame:	The	Guide	to	Building	Blocks
clojure.spec
clojure.spec	-	Rationale	and	Overview
clojure.spec	-	論理的根拠と概要
spec	Guide
やってみる!clojure.spec
Spectacular	Future	with	clojure.spec

More Related Content

PDF
Practical REPL-driven Development with Clojure
Kent Ohashi
 
PDF
Clojurian Conquest
Kent Ohashi
 
PDF
GraphQL API in Clojure
Kent Ohashi
 
PDF
"Simple Made Easy" Made Easy
Kent Ohashi
 
PDF
ClojureScript: The Good Parts
Kent Ohashi
 
PDF
Android antipatterns
Bartosz Kosarzycki
 
PDF
Interceptors: Into the Core of Pedestal
Kent Ohashi
 
PDF
Boost your productivity with Clojure REPL
Kent Ohashi
 
Practical REPL-driven Development with Clojure
Kent Ohashi
 
Clojurian Conquest
Kent Ohashi
 
GraphQL API in Clojure
Kent Ohashi
 
"Simple Made Easy" Made Easy
Kent Ohashi
 
ClojureScript: The Good Parts
Kent Ohashi
 
Android antipatterns
Bartosz Kosarzycki
 
Interceptors: Into the Core of Pedestal
Kent Ohashi
 
Boost your productivity with Clojure REPL
Kent Ohashi
 

What's hot (20)

PDF
Introduction to clojure
Abbas Raza
 
PDF
Discovering functional treasure in idiomatic Groovy
Naresha K
 
PDF
Designing with Groovy Traits - Gr8Conf India
Naresha K
 
PDF
Testing con spock
Fátima Casaú Pérez
 
PDF
Information security programming in ruby
Hiroshi Nakamura
 
PDF
[COSCUP 2020] How to use llvm frontend library-libtooling
Douglas Chen
 
PPTX
Golang basics for Java developers - Part 1
Robert Stern
 
PPTX
iSoligorsk #3 2013
Friedrich Boeckh
 
PPTX
Building native Android applications with Mirah and Pindah
Nick Plante
 
PPT
2007 09 10 Fzi Training Groovy Grails V Ws
loffenauer
 
KEY
Alfresco the clojure way
Carlo Sciolla
 
ODP
Clojure: Practical functional approach on JVM
sunng87
 
PDF
parenscript-tutorial
tutorialsruby
 
PDF
Java Full Throttle
José Paumard
 
PPT
Introduction To Groovy 2005
Tugdual Grall
 
PDF
Javascript development done right
Pawel Szulc
 
ODP
AST Transformations
HamletDRC
 
PPT
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
Guillaume Laforge
 
ODP
AST Transformations at JFokus
HamletDRC
 
PDF
NoSQL and SQL Anti Patterns
Gleicon Moraes
 
Introduction to clojure
Abbas Raza
 
Discovering functional treasure in idiomatic Groovy
Naresha K
 
Designing with Groovy Traits - Gr8Conf India
Naresha K
 
Testing con spock
Fátima Casaú Pérez
 
Information security programming in ruby
Hiroshi Nakamura
 
[COSCUP 2020] How to use llvm frontend library-libtooling
Douglas Chen
 
Golang basics for Java developers - Part 1
Robert Stern
 
iSoligorsk #3 2013
Friedrich Boeckh
 
Building native Android applications with Mirah and Pindah
Nick Plante
 
2007 09 10 Fzi Training Groovy Grails V Ws
loffenauer
 
Alfresco the clojure way
Carlo Sciolla
 
Clojure: Practical functional approach on JVM
sunng87
 
parenscript-tutorial
tutorialsruby
 
Java Full Throttle
José Paumard
 
Introduction To Groovy 2005
Tugdual Grall
 
Javascript development done right
Pawel Szulc
 
AST Transformations
HamletDRC
 
JavaOne 2008 - TS-5793 - Groovy and Grails, changing the landscape of Java EE...
Guillaume Laforge
 
AST Transformations at JFokus
HamletDRC
 
NoSQL and SQL Anti Patterns
Gleicon Moraes
 
Ad

More from Kent Ohashi (20)

PDF
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
Kent Ohashi
 
PDF
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
Kent Ohashi
 
PDF
From Scala/Clojure to Kotlin
Kent Ohashi
 
PDF
TDD with RDD: Clojure/LispのREPLで変わる開発体験
Kent Ohashi
 
PDF
🐬の推し本紹介2024: 『脱・日本語なまり 英語(+α)実践音声学』
Kent Ohashi
 
PDF
do Notation Equivalents in JVM languages: Scala, Kotlin, Clojure
Kent Ohashi
 
PDF
map関数の内部実装から探るJVM言語のコレクション: Scala, Kotlin, Clojureコレクションの基本的な設計を理解しよう
Kent Ohashi
 
PDF
Kotlin Meets Data-Oriented Programming: Kotlinで実践する「データ指向プログラミング」
Kent Ohashi
 
PDF
RDBでのツリー表現入門2024
Kent Ohashi
 
PDF
ミュータビリティとイミュータビリティの狭間: 関数型言語使いから見たKotlinコレクション
Kent Ohashi
 
PDF
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
Kent Ohashi
 
PDF
Team Geek Revisited
Kent Ohashi
 
PDF
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
Kent Ohashi
 
PDF
Clojureコレクションで探るimmutableでpersistentな世界
Kent Ohashi
 
PDF
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
Kent Ohashi
 
PDF
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
Kent Ohashi
 
PDF
実用のための語源学入門
Kent Ohashi
 
PDF
メタプログラミング入門
Kent Ohashi
 
PDF
労働法の世界
Kent Ohashi
 
PDF
Clojureで作る"simple"なDSL
Kent Ohashi
 
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
Kent Ohashi
 
純LISPから考える関数型言語のプリミティブ: Clojure, Elixir, Haskell, Scala
Kent Ohashi
 
From Scala/Clojure to Kotlin
Kent Ohashi
 
TDD with RDD: Clojure/LispのREPLで変わる開発体験
Kent Ohashi
 
🐬の推し本紹介2024: 『脱・日本語なまり 英語(+α)実践音声学』
Kent Ohashi
 
do Notation Equivalents in JVM languages: Scala, Kotlin, Clojure
Kent Ohashi
 
map関数の内部実装から探るJVM言語のコレクション: Scala, Kotlin, Clojureコレクションの基本的な設計を理解しよう
Kent Ohashi
 
Kotlin Meets Data-Oriented Programming: Kotlinで実践する「データ指向プログラミング」
Kent Ohashi
 
RDBでのツリー表現入門2024
Kent Ohashi
 
ミュータビリティとイミュータビリティの狭間: 関数型言語使いから見たKotlinコレクション
Kent Ohashi
 
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
Kent Ohashi
 
Team Geek Revisited
Kent Ohashi
 
Scala vs Clojure?: The Rise and Fall of Functional Languages in Opt Technologies
Kent Ohashi
 
Clojureコレクションで探るimmutableでpersistentな世界
Kent Ohashi
 
英語学習者のためのフランス語文法入門: フランス語完全理解(?)
Kent Ohashi
 
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
Kent Ohashi
 
実用のための語源学入門
Kent Ohashi
 
メタプログラミング入門
Kent Ohashi
 
労働法の世界
Kent Ohashi
 
Clojureで作る"simple"なDSL
Kent Ohashi
 
Ad

Recently uploaded (20)

PPTX
AZ900_SLA_Pricing_2025_LondonIT (1).pptx
chumairabdullahph
 
PDF
Microsoft Teams Essentials; The pricing and the versions_PDF.pdf
Q-Advise
 
PDF
Key Features to Look for in Arizona App Development Services
Net-Craft.com
 
PPTX
Explanation about Structures in C language.pptx
Veeral Rathod
 
PDF
PFAS Reporting Requirements 2026 Are You Submission Ready Certivo.pdf
Certivo Inc
 
PPTX
Web Testing.pptx528278vshbuqffqhhqiwnwuq
studylike474
 
PDF
ShowUs: Pharo Stream Deck (ESUG 2025, Gdansk)
ESUG
 
PPTX
Why Use Open Source Reporting Tools for Business Intelligence.pptx
Varsha Nayak
 
PDF
Build Multi-agent using Agent Development Kit
FadyIbrahim23
 
PDF
A REACT POMODORO TIMER WEB APPLICATION.pdf
Michael624841
 
PPTX
Save Business Costs with CRM Software for Insurance Agents
Insurance Tech Services
 
PPTX
AI-Ready Handoff: Auto-Summaries & Draft Emails from MQL to Slack in One Flow
bbedford2
 
PPTX
PFAS Reporting Requirements 2026 Are You Submission Ready Certivo.pptx
Certivo Inc
 
PPTX
Visualising Data with Scatterplots in IBM SPSS Statistics.pptx
Version 1 Analytics
 
PDF
Teaching Reproducibility and Embracing Variability: From Floating-Point Exper...
University of Rennes, INSA Rennes, Inria/IRISA, CNRS
 
DOCX
The Future of Smart Factories Why Embedded Analytics Leads the Way
Varsha Nayak
 
PDF
Why Use Open Source Reporting Tools for Business Intelligence.pdf
Varsha Nayak
 
PDF
The Role of Automation and AI in EHS Management for Data Centers.pdf
TECH EHS Solution
 
PDF
Become an Agentblazer Champion Challenge
Dele Amefo
 
PPTX
Odoo Integration Services by Candidroot Solutions
CandidRoot Solutions Private Limited
 
AZ900_SLA_Pricing_2025_LondonIT (1).pptx
chumairabdullahph
 
Microsoft Teams Essentials; The pricing and the versions_PDF.pdf
Q-Advise
 
Key Features to Look for in Arizona App Development Services
Net-Craft.com
 
Explanation about Structures in C language.pptx
Veeral Rathod
 
PFAS Reporting Requirements 2026 Are You Submission Ready Certivo.pdf
Certivo Inc
 
Web Testing.pptx528278vshbuqffqhhqiwnwuq
studylike474
 
ShowUs: Pharo Stream Deck (ESUG 2025, Gdansk)
ESUG
 
Why Use Open Source Reporting Tools for Business Intelligence.pptx
Varsha Nayak
 
Build Multi-agent using Agent Development Kit
FadyIbrahim23
 
A REACT POMODORO TIMER WEB APPLICATION.pdf
Michael624841
 
Save Business Costs with CRM Software for Insurance Agents
Insurance Tech Services
 
AI-Ready Handoff: Auto-Summaries & Draft Emails from MQL to Slack in One Flow
bbedford2
 
PFAS Reporting Requirements 2026 Are You Submission Ready Certivo.pptx
Certivo Inc
 
Visualising Data with Scatterplots in IBM SPSS Statistics.pptx
Version 1 Analytics
 
Teaching Reproducibility and Embracing Variability: From Floating-Point Exper...
University of Rennes, INSA Rennes, Inria/IRISA, CNRS
 
The Future of Smart Factories Why Embedded Analytics Leads the Way
Varsha Nayak
 
Why Use Open Source Reporting Tools for Business Intelligence.pdf
Varsha Nayak
 
The Role of Automation and AI in EHS Management for Data Centers.pdf
TECH EHS Solution
 
Become an Agentblazer Champion Challenge
Dele Amefo
 
Odoo Integration Services by Candidroot Solutions
CandidRoot Solutions Private Limited
 

re-frame à la spec