SlideShare a Scribd company logo
You are in a maze of deeply
nested maps, all alike
Eric Normand
IN/Clojure 2019
Symptoms
Symptom:
I can’t remember what keys belong in this map
Symptom:
I don’t even know what kind of entity I have
Symptom:
Working with deeply nested data is awkward
{:date #inst "1984-04-03T13:08:42.020"
:name "Soyuz T-11"
:spacecraft "Soyuz"
:destination "Salyut 7"
:crew [{:name "Yuri Malyshev"
:position "Commander"}
{:name "Gennadi Strekalov"
:position "Flight Engineer"}
{:name "Rakesh Sharma"
:position "Research Cosmonaut"}]}
(mapv (fn [mission]
(update mission :crew
(fn [crews]
(mapv (fn [crew]
(update crew :name
string/upper-case))
crews))))
missions)
(mapv (fn [mission]
(update mission :crew
(fn [crews]
(mapv (fn [crew]
(update crew :name
string/upper-case))
crews))))
missions)
maps
(mapv (fn [mission]
(update mission :crew
(fn [crews]
(mapv (fn [crew]
(update crew :name
string/upper-case))
crews))))
missions)
maps update
(mapv (fn [mission]
(update mission :crew
(fn [crews]
(mapv (fn [crew]
(update crew :name
string/upper-case))
crews))))
missions)
maps update
anonymous
functions
(mapv (fn [mission]
(update mission :crew
(fn [crews]
(mapv (fn [crew]
(update crew :name
string/upper-case))
crews))))
missions)
Symptom:
Long, convoluted functions
Technological Solutions
Spec
Specter
Symptoms Spec Specter
What keys?
Deep nesting
What entity?
✔
✔
✔
Long functions
Symptoms Spec Specter
What keys?
Deep nesting
What entity?
✔
✔
✔
Long functions
Underlying Problem:
You're working at the wrong level of
meaning
It’s just data
{:date #inst "1984-04-03T13:08:42.020"
:name "Soyuz T-11"
:spacecraft "Soyuz"
:destination "Salyut 7"
:crew [{:name "Yuri Malyshev"
:position "Commander"}
{:name "Gennadi Strekalov"
:position "Flight Engineer"}
{:name "Rakesh Sharma"
:position "Research Cosmonaut"}]}
{:date #inst "1984-04-03T13:08:42.020"
:name "Soyuz T-11"
:spacecraft "Soyuz"
:destination "Salyut 7"
:crew [{:name "Yuri Malyshev"
:position "Commander"}
{:name "Gennadi Strekalov"
:position "Flight Engineer"}
{:name "Rakesh Sharma"
:position "Research Cosmonaut"}]}
map
{:date #inst "1984-04-03T13:08:42.020"
:name "Soyuz T-11"
:spacecraft "Soyuz"
:destination "Salyut 7"
:crew [{:name "Yuri Malyshev"
:position "Commander"}
{:name "Gennadi Strekalov"
:position "Flight Engineer"}
{:name "Rakesh Sharma"
:position "Research Cosmonaut"}]}
character
Space travel
Bytes
Characters
Clojure Syntax
Clojure Semantics
Space travel (domain)
Bytes
Characters
Clojure Syntax
Clojure Semantics
Reader
read
eval
your code
Clojure core
Libraries
Domain code
(def user-info (reagent/atom {}))
(defn favorite-color-button [color] ;; reagent component
[:button {:on-click (fn []
(swap! user-info assoc :favorite-color color))
:style {:background-color color}}
color])
(defn favorite-color-panel []
[:div
[:h2 "Favorite color"]
[:h3 "Current: " (:favorite-color @user-info)]
[:h3 "Change it by clicking below"]
[favorite-color-button "green"]
[favorite-color-button "blue"]
[favorite-color-button "red"]])
(def user-info (reagent/atom {}))
(defn favorite-color-button [color] ;; reagent component
[:button {:on-click (fn []
(swap! user-info assoc :favorite-color color))
:style {:background-color color}}
color])
(defn favorite-color-panel []
[:div
[:h2 "Favorite color"]
[:h3 "Current: " (:favorite-color @user-info)]
[:h3 "Change it by clicking below"]
[favorite-color-button "green"]
[favorite-color-button "blue"]
[favorite-color-button "red"]])
user-info
favorite-color-button
assoc :favorite-color
(String)
user-info
favorite-color-button
assoc :favorite-color
(String)
favorite-animal-selector
assoc :favorite-animal
(Keyword)
user-info
favorite-color-button
assoc :favorite-color
(String)
favorite-animal-selector
assoc :favorite-animal
(Keyword)
favorite-fruit-selector
assoc :favorite-fruit
(Keyword)
marital-status-indicator
assoc :marital-status
(Keyword)
elementary-school-chooser
assoc :elementary-school
(Integer)
user-info
favorite-color-button
assoc :favorite-color
(String)
favorite-animal-selector
assoc :favorite-animal
(Keyword)
favorite-fruit-selector
assoc :favorite-fruit
(Keyword)
Clojure core
Libraries
Domain code
your head is up here
Clojure core
Libraries
Domain code
your head is up here
your code is down here
(assoc user-info :favorite-color color)
Clojure core and libraries
(defn set-favorite-color [user-info color]
(assoc user-info :favorite-color color))
Clojure core and libraries
domain
(def user-info (reagent/atom {}))
(defn favorite-color-button [color] ;; reagent component
[:button {:on-click (fn []
(swap! user-info assoc :favorite-color color))
:style {:background-color color}}
color])
(defn favorite-color-panel []
[:div
[:h2 "Favorite color"]
[:h3 "Current: " (:favorite-color @user-info)]
[:h3 "Change it by clicking below"]
[favorite-color-button "green"]
[favorite-color-button "blue"]
[favorite-color-button "red"]])
(def user-info (reagent/atom {}))
(defn favorite-color-button [color] ;; reagent component
[:button {:on-click (fn []
(swap! user-info set-favorite-color color))
:style {:background-color color}}
color])
(defn favorite-color-panel []
[:div
[:h2 "Favorite color"]
[:h3 "Current: " (:favorite-color @user-info)]
[:h3 "Change it by clicking below"]
[favorite-color-button "green"]
[favorite-color-button "blue"]
[favorite-color-button "red"]])
(ns my-app.user-info)
(defn set-favorite-color [user-info color]
(assoc user-info :favorite-color color))
(ns my-app.user-info)
(defn set-favorite-color [user-info color]
(assoc user-info :favorite-color color))
(defn set-favorite-animal [user-info animal]
(assoc user-info :favorite-animal animal))
(defn set-favorite-fruit [user-info fruit]
(assoc user-info :favorite-fruit fruit))
Objection:
But Eric, isn't that a lot of code?
(def user-info (reagent/atom {}))
(defn favorite-color-button [color] ;; reagent component
[:button {:on-click (fn []
(swap! user-info assoc :favorite-color color))
:style {:background-color color}}
color])
(defn favorite-color-panel []
[:div
[:h2 "Favorite color"]
[:h3 "Current: " (:favorite-color @user-info)]
[:h3 "Change it by clicking below"]
[favorite-color-button "green"]
[favorite-color-button "blue"]
[favorite-color-button "red"]])
(def user-info (reagent/atom {}))
(defn set-favorite-color [user-info color]
(assoc user-info :favorite-color color))
(defn favorite-color-button [color] ;; reagent component
[:button {:on-click (fn []
(swap! user-info set-favorite-color color))
:style {:background-color color}}
color])
(defn favorite-color-panel []
[:div
[:h2 "Favorite color"]
[:h3 "Current: " (:favorite-color @user-info)]
[:h3 "Change it by clicking below"]
[favorite-color-button "green"]
[favorite-color-button "blue"]
[favorite-color-button "red"]])
Con:
3x the code
Con:
3x the code
Pro:
Find things in ⅓ the time
Probably duplicated operations
Parts can evolve separately
Less to keep in your head
Clojure core
Libraries
Domain code
The biggest regret I hear frequently is
doing data operations everywhere.
Clojure core
Libraries
Domain code
Clojure core
Libraries
Domain code
Clojure core
Libraries
Domain code
Clojure core
Libraries
Domain code
Clojure core
Libraries
Domain Layer 1
Domain Layer 2
Domain Layer 3
Domain Layer 4
{:date #inst "1984-04-03T13:08:42.020"
:name "Soyuz T-11"
:spacecraft "Soyuz"
:destination "Salyut 7"
:crew {:commander {:name "Yuri Malyshev"
:favorite-color "blue"}
:flight-engineer {:name "Gennadi Strekalov"
:favorite-fruit :banana}
:research-cosmonaut {:name "Rakesh Sharma"
:favorite-animal :sheep}}}
You are in a maze of deeply nested maps, all alike
You are in a maze of deeply nested maps, all alike
(assoc-in mission [:crew :research-cosmonaut :training :centrifuge :status] :pass)
(assoc-in mission [:crew :research-cosmonaut :training :centrifuge :status] :pass)
mission
(update-in mission [:crew :research-cosmonaut :training :centrifuge :status] :pass)
person training
(ns my-app.training)
(defn set-status [record training status]
(assoc record training status))
(ns my-app.person
(:require [my-app.training :as training])
(defn set-training-status [person training status]
(update person :training training/set-status training status))
(ns my-app.mission
(:require [my-app.person :as person]))
(defn set-training-status [mission position training status]
(update-in mission [:crew position] person/set-training-status training status))
Clojure core
Libraries
Training
Person
Mission
UI
Law of Demeter
a given object should assume as little as possible about
the structure or properties of anything else (including its
subcomponents)
Objection:
But Eric, aren't you encapsulating?
Isn't the point of Clojure that it's all data?
Summary:
We are encapsulating and it's still data.
Map Entitytension
Map Entitytension
● enumerate keys
● serialize to json
● print
● compare with =
● hash code
● try out data operations at
REPL
Map Entitytension
● enumerate keys
● serialize to json
● print
● compare with =
● hash code
● try out data operations at
REPL
● domain operations
● maintain invariants
● program at a high level
● easier to understand
Chemistry (heat, acids, proteins, starches, etc)
Applying heat
Ingredients (vegetables, meats, oils, spices)
Basics (sauces, masalas, dough)
Dishes
Stratified Design
Chopping
Chemistry (heat, acids, proteins, starches, etc)
Applying heat
Ingredients (vegetables, meats, oils, spices)
Basics (sauces, masalas, dough)
Dishes
Stratified Design
Chopping
changes faster
changes slower
Principle:
separate things according to rates of change
Chemistry (heat, acids, proteins, starches, etc)
Applying heat
Ingredients (vegetables, meats, oils, spices)
Basics (sauces, masalas, dough)
Dishes
Stratified Design
Chopping
Principle:
each layer can only require downward
Chemistry (heat, acids, proteins, starches, etc)
Applying heat
Ingredients (vegetables, meats, oils, spices)
Basics (sauces, masalas, dough)
Dishes
Stratified Design
Chopping
Principle:
each layer can only require downward
Chemistry (heat, acids, proteins, starches, etc)
Applying heat
Ingredients (vegetables, meats, oils, spices)
Basics (sauces, masalas, dough)
Dishes
Stratified Design
Chopping
Principle:
each layer can only require downward
Chemistry (heat, acids, proteins, starches, etc)
Applying heat
Ingredients (vegetables, meats, oils, spices)
Basics (sauces, masalas, dough)
Dishes
Stratified Design
Chopping
Principle:
be careful if you skip layers
Chemistry (heat, acids, proteins, starches, etc)
Applying heat
Ingredients (vegetables, meats, oils, spices)
Basics (sauces, masalas, dough)
Dishes
Stratified Design
Chopping
Principle:
be careful if you skip layers
Constructors
Functions for generating entities
Benefits
● Define the entity's keys
● Check required keys
● Check types
● Check invariants
● Default values
● Calculated values
Constructors
(defn ->person [& {:keys [name
trainings]
:or {trainings []}}]
(assert (string? name))
(let [name (string/trim name)]
(assert (not (empty? name)))
{:name name
:trainings trainings}))
key names
default
type + required
calculation
invariant
Combining Operations
Functions that combine 2 or more entities of the same type
Benefits
● Hardest type of operation first
● Constrain the design (good thing)
● Biggest potential for algebraic reasoning
Combining operations
(ns my-app.training)
(defn combine-training-status [a b]
(cond
(= :pass a) :pass
(= :pass b) :pass
:else :fail))
(defn combine-trainings [a b]
(merge-with combine-training-status a b))
two statuses
two training records
Meaning
Implementation
Sounds
Meaning
Software
Characters
Meaning
Data
you want to be working up here
Meaning
Data
you want to be working up here
but you're stuck down here
Code Smells
Smell:
Deep paths with get-in, update-in, assoc-in
Smell:
Large hashmaps with lots of keys
{:id 1232
:email "eric@lispcast.com"
:phone "504-982-9167"
:street1 "332 Main St"
:street2 "Apartment 54"
:city "New Orleans"
:state "LA"
:zip "70117"
:favorite-color "blue"
:favorite-animal :orangutan
:favorite-fruit :apple}
{:id 1232
:email "eric@lispcast.com"
:phone "504-982-9167"
:street1 "332 Main St"
:street2 "Apartment 54"
:city "New Orleans"
:state "LA"
:zip "70117"
:favorite-color "blue"
:favorite-animal :orangutan
:favorite-fruit :apple}
do these go together?
{:id 1232
:contact-info {:email "eric@lispcast.com"
:phone "504-982-9167"
:address {:street1 "332 Main St"
:street2 "Apartment 54"
:city "New Orleans"
:state "LA"
:zip "70117"}}
:favorites {:color "blue"
:animal :orangutan
:fruit :apple}}
Smell:
Using 3rd party API results directly
{:tags [21 134 353 386 388],
:format "standard",
:date "2017-04-24T11:59:33",
:slug "kjetil-valle-and-bendik-solheim-lambdaconf-2017-interview",
:meta {:_edd_button_behavior []},
:ping_status "closed",
:yst_prominent_words [3680 979 1318 497 505 849 3783 495 3938],
:featured_media 8087,
:content
{:rendered
"<p>......",
:protected false},
:modified_gmt "2018-04-11T11:31:44",
:excerpt
{:rendered
"<p>......",
:protected false},
:type "post",
:custom
{:seen_in_lesson_rss "0",
:markdown_content
"......",
:s3_filename "",
:availability "Paid",
:wistia_download_link "",
:tweet_ids "",
:tweet
"....",
:video_length "",
:footer_script "",
:language "a:1:{i:0;s:7:"Clojure";}",
:inline_featured_image "0",
:last_tweet_time "",
:git_tag "",
:github_repo "",
:header_script "",
:wistia_id "",
:autopause_times ""},
:template "",
:modified "2018-04-11T11:31:44",
:title
{:rendered
"# ...."},
:author 652,
:date_gmt "2017-04-24T11:59:33",
:comment_status "closed",
:categories [123],
:sticky false,
:status "draft",
:link "https://purelyfunctional.tv/?p=8086",
:id 8086,
:_links
{:version-history
{:id 143
:video-id "44fvv3"
:sequence-number "003"
:name "Concurrent Clojure"
:duration 34223
:programming-language 4
:cover nil
:course-id 74
:s3-links {:original {:filename "ConcurrentClojure.mp4"
:filesize 321554}
:hd {:filename "ConcurrentClojure.mp4"
:filesize 321443}
:md {:filename "ConcurrentClojure.mp4"
:filesize 54443}
:phone {:filename "ConcurrentClojure.mp4"
:filesize 3223}}}
Know what level of meaning you are at
● Look for semantic layers
● Avoid crossing semantic layers
● Organize your entities and operations
● Think about combining operations
● Add a layer of indirection between your service and other systems
● Use constructors to make getting it right easier
● Name operations to give things meaning
Eric Normand
Follow Eric on:
Eric Normand @EricNormand
eric@lispcast.comlispcast.com

More Related Content

What's hot (20)

TXT
Mkscript sh
Ben Pope
 
ODP
Making a simple jQuery plug-in
Dylan Fogarty-MacDonald
 
KEY
Getting started with Pod::Weaver
Joshua Keroes
 
PDF
An (Inaccurate) Introduction to Python
Nicholas Tollervey
 
PPTX
Migrating to Puppet 4.0
Puppet
 
PPTX
Chap 5 php files part-2
monikadeshmane
 
PDF
Simple Ways To Be A Better Programmer (OSCON 2007)
Michael Schwern
 
PDF
Procesamiento del lenguaje natural con python
Facultad de Ciencias y Sistemas
 
PDF
WordCamp Portland 2018: PHP for WordPress
Alena Holligan
 
PDF
Thu bernstein key_warp_speed
eswcsummerschool
 
PDF
MongoDB: Replication,Sharding,MapReduce
Takahiro Inoue
 
PDF
WordPress Cuztom Helper
slicejack
 
PDF
Cleanliness is Next to Domain-Specificity
Ben Scofield
 
PDF
Talk NullByteCon 2015
Roberto Soares
 
PDF
A Python Crash Course
Alex-P. Natsios
 
PDF
TDC São Paulo 2016 - Become a jedi with php streams
Matheus Marabesi
 
PPT
Application Modeling with Graph Databases
Josh Adell
 
PPTX
python chapter 1
Raghu nath
 
PPTX
Python chapter 2
Raghu nath
 
PDF
Mengembalikan data yang terhapus atau rusak pada hardisk menggunakan ubuntu
Alferizhy Chalter
 
Mkscript sh
Ben Pope
 
Making a simple jQuery plug-in
Dylan Fogarty-MacDonald
 
Getting started with Pod::Weaver
Joshua Keroes
 
An (Inaccurate) Introduction to Python
Nicholas Tollervey
 
Migrating to Puppet 4.0
Puppet
 
Chap 5 php files part-2
monikadeshmane
 
Simple Ways To Be A Better Programmer (OSCON 2007)
Michael Schwern
 
Procesamiento del lenguaje natural con python
Facultad de Ciencias y Sistemas
 
WordCamp Portland 2018: PHP for WordPress
Alena Holligan
 
Thu bernstein key_warp_speed
eswcsummerschool
 
MongoDB: Replication,Sharding,MapReduce
Takahiro Inoue
 
WordPress Cuztom Helper
slicejack
 
Cleanliness is Next to Domain-Specificity
Ben Scofield
 
Talk NullByteCon 2015
Roberto Soares
 
A Python Crash Course
Alex-P. Natsios
 
TDC São Paulo 2016 - Become a jedi with php streams
Matheus Marabesi
 
Application Modeling with Graph Databases
Josh Adell
 
python chapter 1
Raghu nath
 
Python chapter 2
Raghu nath
 
Mengembalikan data yang terhapus atau rusak pada hardisk menggunakan ubuntu
Alferizhy Chalter
 

Similar to You are in a maze of deeply nested maps, all alike (20)

PDF
Programming Lisp Clojure - 2장 : 클로저 둘러보기
JangHyuk You
 
PPTX
The groovy puzzlers (as Presented at JavaOne 2014)
GroovyPuzzlers
 
PDF
The Curious Clojurist - Neal Ford (Thoughtworks)
jaxLondonConference
 
DOCX
findextensions(2).py#!usrlocalbinpython3import sysim.docx
AKHIL969626
 
PPT
Scala presentation by Aleksandar Prokopec
Loïc Descotte
 
ODP
Clojure made really really simple
John Stevenson
 
PDF
Clojure for Data Science
henrygarner
 
PDF
Pune Clojure Course Outline
Baishampayan Ghose
 
PDF
コミュニケーションとしてのコード
Atsushi Shibata
 
ODP
Introduction to R
agnonchik
 
PDF
From Java To Clojure (English version)
Kent Ohashi
 
PDF
Introduction to Scala
Aleksandar Prokopec
 
ODP
Clojure made simple - Lightning talk
John Stevenson
 
PDF
Swift - Krzysztof Skarupa
Sunscrapers
 
PDF
Music as data
John Vlachoyiannis
 
PDF
David Kopal - Unleash the power of the higher-order components
OdessaJS Conf
 
PDF
Swift & JSON
John Sundell
 
PDF
Clojure for Java developers - Stockholm
Jan Kronquist
 
PDF
Intro to programming games with clojure
Juio Barros
 
PDF
talk at Virginia Bioinformatics Institute, December 5, 2013
ericupnorth
 
Programming Lisp Clojure - 2장 : 클로저 둘러보기
JangHyuk You
 
The groovy puzzlers (as Presented at JavaOne 2014)
GroovyPuzzlers
 
The Curious Clojurist - Neal Ford (Thoughtworks)
jaxLondonConference
 
findextensions(2).py#!usrlocalbinpython3import sysim.docx
AKHIL969626
 
Scala presentation by Aleksandar Prokopec
Loïc Descotte
 
Clojure made really really simple
John Stevenson
 
Clojure for Data Science
henrygarner
 
Pune Clojure Course Outline
Baishampayan Ghose
 
コミュニケーションとしてのコード
Atsushi Shibata
 
Introduction to R
agnonchik
 
From Java To Clojure (English version)
Kent Ohashi
 
Introduction to Scala
Aleksandar Prokopec
 
Clojure made simple - Lightning talk
John Stevenson
 
Swift - Krzysztof Skarupa
Sunscrapers
 
Music as data
John Vlachoyiannis
 
David Kopal - Unleash the power of the higher-order components
OdessaJS Conf
 
Swift & JSON
John Sundell
 
Clojure for Java developers - Stockholm
Jan Kronquist
 
Intro to programming games with clojure
Juio Barros
 
talk at Virginia Bioinformatics Institute, December 5, 2013
ericupnorth
 
Ad

More from Eric Normand (9)

PDF
The elements of a functional mindset
Eric Normand
 
PDF
All I Needed for Functional Programming I Learned in High School Algebra
Eric Normand
 
PDF
Lies My OO Teacher Told Me
Eric Normand
 
PDF
What is Functional Programming?
Eric Normand
 
PDF
Functional Programming for Business
Eric Normand
 
PDF
A Theory of Functional Programming LambdUp
Eric Normand
 
PDF
Testing stateful, concurrent, and async systems using test.check
Eric Normand
 
PDF
Building Composable Abstractions
Eric Normand
 
PDF
ClojureScript: I can't believe this is JavaScript
Eric Normand
 
The elements of a functional mindset
Eric Normand
 
All I Needed for Functional Programming I Learned in High School Algebra
Eric Normand
 
Lies My OO Teacher Told Me
Eric Normand
 
What is Functional Programming?
Eric Normand
 
Functional Programming for Business
Eric Normand
 
A Theory of Functional Programming LambdUp
Eric Normand
 
Testing stateful, concurrent, and async systems using test.check
Eric Normand
 
Building Composable Abstractions
Eric Normand
 
ClojureScript: I can't believe this is JavaScript
Eric Normand
 
Ad

Recently uploaded (20)

PDF
Jual GPS Geodetik CHCNAV i93 IMU-RTK Lanjutan dengan Survei Visual
Budi Minds
 
PDF
Zero Carbon Building Performance standard
BassemOsman1
 
PPTX
Online Cab Booking and Management System.pptx
diptipaneri80
 
PDF
4 Tier Teamcenter Installation part1.pdf
VnyKumar1
 
PDF
IEEE EMBC 2025 「Improving electrolaryngeal speech enhancement via a represent...
NU_I_TODALAB
 
PPTX
business incubation centre aaaaaaaaaaaaaa
hodeeesite4
 
PPTX
22PCOAM21 Session 1 Data Management.pptx
Guru Nanak Technical Institutions
 
PDF
Natural_Language_processing_Unit_I_notes.pdf
sanguleumeshit
 
PDF
20ME702-Mechatronics-UNIT-1,UNIT-2,UNIT-3,UNIT-4,UNIT-5, 2025-2026
Mohanumar S
 
PPTX
00-ClimateChangeImpactCIAProcess_PPTon23.12.2024-ByDr.VijayanGurumurthyIyer1....
praz3
 
PPTX
UNIT III CONTROL OF PARTICULATE CONTAMINANTS
sundharamm
 
PDF
Zero carbon Building Design Guidelines V4
BassemOsman1
 
PPTX
Ground improvement techniques-DEWATERING
DivakarSai4
 
PPTX
Unit 2 Theodolite and Tachometric surveying p.pptx
satheeshkumarcivil
 
PDF
STUDY OF NOVEL CHANNEL MATERIALS USING III-V COMPOUNDS WITH VARIOUS GATE DIEL...
ijoejnl
 
PPTX
Inventory management chapter in automation and robotics.
atisht0104
 
PDF
Construction of a Thermal Vacuum Chamber for Environment Test of Triple CubeS...
2208441
 
PPTX
Information Retrieval and Extraction - Module 7
premSankar19
 
PPTX
Fluid statistics and Numerical on pascal law
Ravindra Kolhe
 
PDF
2025 Laurence Sigler - Advancing Decision Support. Content Management Ecommer...
Francisco Javier Mora Serrano
 
Jual GPS Geodetik CHCNAV i93 IMU-RTK Lanjutan dengan Survei Visual
Budi Minds
 
Zero Carbon Building Performance standard
BassemOsman1
 
Online Cab Booking and Management System.pptx
diptipaneri80
 
4 Tier Teamcenter Installation part1.pdf
VnyKumar1
 
IEEE EMBC 2025 「Improving electrolaryngeal speech enhancement via a represent...
NU_I_TODALAB
 
business incubation centre aaaaaaaaaaaaaa
hodeeesite4
 
22PCOAM21 Session 1 Data Management.pptx
Guru Nanak Technical Institutions
 
Natural_Language_processing_Unit_I_notes.pdf
sanguleumeshit
 
20ME702-Mechatronics-UNIT-1,UNIT-2,UNIT-3,UNIT-4,UNIT-5, 2025-2026
Mohanumar S
 
00-ClimateChangeImpactCIAProcess_PPTon23.12.2024-ByDr.VijayanGurumurthyIyer1....
praz3
 
UNIT III CONTROL OF PARTICULATE CONTAMINANTS
sundharamm
 
Zero carbon Building Design Guidelines V4
BassemOsman1
 
Ground improvement techniques-DEWATERING
DivakarSai4
 
Unit 2 Theodolite and Tachometric surveying p.pptx
satheeshkumarcivil
 
STUDY OF NOVEL CHANNEL MATERIALS USING III-V COMPOUNDS WITH VARIOUS GATE DIEL...
ijoejnl
 
Inventory management chapter in automation and robotics.
atisht0104
 
Construction of a Thermal Vacuum Chamber for Environment Test of Triple CubeS...
2208441
 
Information Retrieval and Extraction - Module 7
premSankar19
 
Fluid statistics and Numerical on pascal law
Ravindra Kolhe
 
2025 Laurence Sigler - Advancing Decision Support. Content Management Ecommer...
Francisco Javier Mora Serrano
 

You are in a maze of deeply nested maps, all alike