SlideShare a Scribd company logo
goals
•  DSL Fundamentals
•  Some Ruby Basics
•  DSL construction with Ruby
•  Advanced Topics - A step further
•  Summary
•  Q & A
problem?
Problem
Solution
reduce the gap
Customer
Programmer
01000001
evolution
expressive
?
Object Oriented
Procedural
Assembly
100101010
Emergence of
language
C
C++ Java
Problem
GAP
Solution
•  Arm Ball
•  Around the wicket
•  Cow Corner
•  Duck
•  Fly Slip
•  Googly
http://en.wikipedia.org/wiki/List_of_cricket_terms - an long list of cricket terms
the power of language
evolution
expressive
DSL
Object Oriented
Procedural
Assembly
100101010
Emergence of
language
C
C++ Java
Problem
GAP
Solution
example
Monit – automatic management and monitoring - http://mmonit.com/
definition
a computer programming language of limited
expressiveness focused on a particular
domain
- Martin Fowler
Martin Fowlers book on DSLs - http://martinfowler.com/dslwip/
definition
a computer programming language of
limited expressiveness focused on a
particular domain
- Martin Fowler
Martin Fowlers book on DSLs - http://martinfowler.com/dslwip/
definition
a computer programming language of
limited expressiveness focused on a
particular domain
- Martin Fowler
Martin Fowlers book on DSLs - http://martinfowler.com/dslwip/
definition
a computer programming language of
limited expressiveness focused on a
particular domain
- Martin Fowler
Martin Fowlers book on DSLs - http://martinfowler.com/dslwip/
Domain Specific Languages
vs.
General Purpose
Languages
what DSLs bring to the table
•  Quality
•  Productivity
•  Reliability
•  Maintainability
•  Reusability
what DSLs bring to the table
•  Quality
•  Productivity
•  Reliability
•  Maintainability
•  Reusability
•  Social impact
what DSLs bring to the table
•  Quality
•  Productivity
•  Reliability
•  Maintainability
•  Reusability
•  Social impact
•  Validation at the domain level
no silver bullet!
no silver bullet!
•  Learning curve
no silver bullet!
•  Learning curve
•  Good language design is hard
no silver bullet!
•  Learning curve
•  Good language design is hard
•  Cost of building
no silver bullet!
•  Learning curve
•  Good language design is hard
•  Cost of building
•  Limited applicability
no silver bullet!
•  Learning curve
•  Good language design is hard
•  Cost of building
•  Limited applicability
•  Maintenance
no silver bullet!
•  Learning curve
•  Good language design is hard
•  Cost of building
•  Limited applicability
•  Maintenance
•  Could be overused or abused
Types of DSL
external DSL
Need to build a parser to process the custom
syntax
sql, make files, xml config files, regular
expressions
advantages
•  Free to use any syntax
advantages
•  Free to use any syntax
•  Run time evaluation
disadvantages
•  Starts simple, can get ugly and complex
disadvantages
•  Starts simple, can get ugly and complex
•  Building parsers is difficult
disadvantages
•  Starts simple, can get ugly and complex
•  Building parsers is difficult
•  Lack of tooling support
internal DSL
Extends the host language
advantages
•  Don't have to write and debug a new
language
advantages
•  Don't have to write and debug a new
language
•  Full power of base language is available
advantages
•  Don't have to write and debug a new
language
•  Full power of base language is available
•  Tooling support available
disadvantages
•  constrained by the host language.
Ruby based DSLs are
internal
DSLs - not special to Ruby
Ruby is special
why is ruby special
•  minimally intrusive Syntax to allow for more
concise code
why is ruby special
•  minimally intrusive Syntax to allow for more
concise code
•  Ruby culture - values expressiveness in
code
why is ruby special
•  minimally intrusive Syntax to allow for more
concise code
•  Ruby culture - values expressiveness in
code
•  Dynamic and Reflective
* Working code writing using RSpec, a testing frame work
DSL goodness
OPTIONAL PUNCTUATION
concise code
vs.
SYMBOLS
less noisy than strings
or
BLOCKS
delayed evaluation of code
OPEN CLASSES
build your language
some code here
METAPROGRAMMING
expand your mind
define_method
eval
module_eval
class_eval
instance_eval
alias_method
‘whenever’
a DSL for cron jobs
30 4 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31 * * reboot
http://github.com/javan/whenever
language constructs
hour
day
month
year
reboot
weekend
weekday
sunday
monday
a.m
p.m
expressive
30 4 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31 * * reboot
http://github.com/javan/whenever
The fascinating thing is that, in my
experience, most well-written Ruby
programs are already a DSL, just by nature
of Ruby’s syntax.”
- Jamis Buck, 37signals
THE PROCESS
Writing DSLs in Ruby
Application Programming Interface
try {
Socket client = new Socket(“www.google.com”,80);
} catch(IOException e) {
System.out.println(e);
}
Example 1
Application Programming Interface
try {
Socket client = new Socket(“www.google.com”,80);
} catch(IOException e) {
System.out.println(e);
}
Customer.find :all, :condition => [ :age >= 25 ]
Example 1
Example 2
Application Programming Interface
try {
Socket client = new Socket(“www.google.com”,80);
} catch(IOException e) {
System.out.println(e);
}
Customer.find :all, :condition => [ :age >= 25 ]
•  Libraries give a sense of domain-specificity because
of vocabulary
•  Nouns / verbs / adverbs / adjectives
Example 1
Example 2
Application Programming Interface
try {
Socket client = new Socket(“www.google.com”,80);
} catch(IOException e) {
System.out.println(e);
}
Customer.find :all, :condition => [ :age >= 25 ]
•  Libraries give a sense of domain-specificity because
of vocabulary
•  Nouns / verbs / adverbs / adjectives
•  They are all internal DSLs
Example 1
Example 2
DSL
Abstractions
Interfaces
Patterns
“But, I believe a DSL is a healthy bi-product
of a good object-oriented design.”
Blaine Buxton (Smalltalk developer)
Capture vocabulary and processes
of the domain
Discover desired syntax
Define DSL interface (API)
Define classes and abstractions
Implement validations
Internal DSLs – A coarse process
Capture vocabulary
•  Task scheduling is the domain of ‘cron’
•  Tasks
•  Timing
•  Frequency
Capture vocabulary
•  Task scheduling is the domain of ‘cron’
•  Tasks (e.g. ‘reboot’, ‘send mail’, ‘alert’, etc)
•  Timing (e.g. ‘5 pm’, ‘4.30 am’, etc)
•  Frequency (e.g. ‘yearly’, ‘weekend’, etc)
Capture vocabulary
•  Task scheduling is the domain of ‘cron’
•  Tasks (e.g. ‘reboot’, ‘send mail’, ‘alert’, etc)
•  Timing (e.g. ‘5 pm’, ‘4.30.am’, etc)
•  Frequency (e.g. ‘yearly’, ‘weekend’, etc)
•  Discover keywords
•  Special words (‘yearly’, ‘reboot’, etc)
•  Domain values (‘5 pm’, etc)
•  A good design would decide ownership of these keywords
monday
hourly
day
month
year
reboot
weekend
weekday
sunday
a.m.
p.m.
runner
at
every
annually
Discover syntax
Discuss
with
DSL user
Experiment
around
keywords
Design a
syntax
Define
constructs
Define
ownership
of keywords
Write
extended
methods
(e.g.
2.days)
Design considerations
•  “Follow good design principles”
–  Entities as classes
•  As nouns
–  Operations as methods
•  Typically as verbs
•  Adaptive interfaces (wrappers) to instantiate aggregations
•  Accept hash as argument to simulate ‘call by name’
Using Ruby
features to realize
DSL constructs
Purpose
(what)
Getter/setter
Pattern matching
Alternative interfaces
Context
Code generation
Execution
Arbitrary interfaces/
attributes
Ruby feature
(how)
Function calls w/o
parentheses
Regular expressions
‘alias_method’
Closure/block
Strings
‘load’, ‘require’, ‘eval’
‘method_missing’
Writing ‘Whenever’
every 2.days, :at => '4:30 am‘ do
runner “/usr/bin/reboot”
end
Writing ‘Whenever’
every 2.days, :at => '4:30 am‘ do
runner “/usr/bin/reboot”
end
every(2.days(),{:at => '4:30 am’}) do
runner(“/usr/bin/reboot”)
end
Writing ‘Whenever’
Class JobList
def every(frequency, option={})
…
yield #handles block
end
def runner(task, options={})
…
end
end
2.days()
{ :at => ‘4.30.am ‘ }
A TALE OF TWO DSLS
Real examples
EXAMPLE 1: DSL FOR GMRT
Giant Metrewave Radio Telescope
System
30
Antennae
http://gmrt.ncra.tifr.res.in
GMRT Prototype
•  Objective
–  Re-engineering ‘ABC’ and ‘Teleset’
–  Collaboration among TCS, NCRA and CoEP
•  Challenges
–  Scientists need a simple, extensible interface to
•  Monitor and control antennae
•  Schedule experiments
•  Approach
–  ABC as collection of Rails web services
–  Teleset re-designed as a Ruby DSL
‘Teleset’ as DSL: Version 1.0
a1 = AntennaClient.new (“http://antenna1”)
a1.reboot
a1.monitor 2.mhz
Single antenna
‘Teleset’ as DSL : Version 1.1
a1 = AntennaClient.new (“http://antenna1”)
a1.reboot
a1.monitor 2.mhz
Simultaneously,
for antennae
a1 and a2
engine.register_participant :antenna do | antenna |
reboot
monitor 2.mhz
end
concurrent_iterator on_value => [:a1,:a2], to_variable => ‘antenna’ do
participant :antenna => ’${antenna}’
end #Using openwferu engine
Complex !!!
Single antenna
http://openwferu.rubyforge.org - Using OpenWFEru Workflow engine
‘Teleset’ as DSL : Version 2.0
with antenna :a1, :a2 do
reboot
monitor 2.mhz
end
Much
simpler !
engine.register_participant :antenna do | antenna |
reboot
monitor 2.mhz
end
concurrent_iterator on_value => [:a1,:a2], to_variable => ‘antenna’ do
participant :antenna => ’${antenna}’
end
Suggested prototype
EXAMPLE 2: DSL FOR
VISUALIZATION
DSL for visualization
•  Objective
–  A specification-driven dashboard
•  Visualization metaphors (charts, data grids, etc)
•  Organization using layouts (window, tab, portal, etc)
•  Navigation (page flows)
•  Challenge
–  Consistent API
–  Integration with other components and environment
•  Ruby was chosen
application ‘ThoughtWorks MCS Demo’ do
add grid ‘Actors list’ do
data_source table do
table_name ‘actor’
end # data_source
end # grid
end # application
application ‘Thoughtworks MCS Demo’ do
add grid ‘Actors list’ do
data_source table do
table_name ‘actor’
end # data_source
add view ‘Show movies’ do | actor |
add grid “Movies for actor #{actor}” do
data_source query do
text “SELECT …
WHERE actor_id=#{actor.actor_id}”
end # data_source
end # grid
end # view
end # grid
end # application
A STEP FURTHER
Advanced topics
Evolution of a DSL
•  Generalization versus specialization
•  “expressiveness x scope = constant” [3]
DSL
GPL
External
DSL
Internal
DSLs
ASM GPL
scopescope
expressiveness
expressiveness
Three aspects
Domain
aspect
Specification
aspect
Language
aspect
Domain-specific
Language
Three aspects
Domain
•  CRUD of
•  Domain entities
•  Relationships
•  Processes
•  Constraints
Specification
•  Conditionality (if/
switch)
•  Automation
(loops)
•  Reusability
(function/classes)
•  Data structures
•  Error handling
Language
•  Natural
•  Syntactic noise
•  Semantic noise
Three aspects
Domain
•  CRUD of
•  Domain entities
•  Relationships
•  Processes
•  Constraints
Specification
•  Conditionality (if/
switch)
•  Automation
(loops)
•  Reusability
(function/classes)
•  Data structures
•  Error handling
Language
•  Natural
•  Syntactic noise
•  Semantic noise
Three aspects
Domain
•  CRUD of
•  Domain entities
•  Relationships
•  Processes
•  Constraints
Specification
•  Conditionality (if/
switch)
•  Automation
(loops)
•  Reusability
(function/classes)
•  Data structures
•  Error handling
Language
•  Natural
•  Syntactic noise
•  Semantic noise
Evolution of a DSL
Entities
(numbers
+ strings)
Entities (+
relationships)
Conditions and
loops
Reusability
Specialization
(inheritance)
Crossroads and crosswords
•  “No domain is an island”
•  Interoperability in DSLs
•  DSLs need to talk one-another
•  Achilles’ Heel for external DSLs
•  Parallel development of different DSLs needs early
standardization
•  Chicken-egg problem
Future of DSLs
•  UML and DSL
•  DSL as front-end to UML (or alternative)[5]
Book “MDA Distilled” (page 16)
Future of DSLs
•  UML and DSL
•  DSL as front-end to UML (or alternative)[5]
•  High assurance systems
•  Minimal code, relevant code
Future of DSLs
•  UML and DSL
•  DSL as front-end to UML (or alternative)[5]
•  High assurance systems
•  Minimal code, relevant code
•  Multi-core revolution
•  Multi-threading
•  Message passing
The Free Lunch Is Over – Herb Sutter’s article on Multi-core Revolution
References and resources
1.  Interview of Bjarne Stroustrup
2.  Presentation by Martin Fowler (at InfoQ.com)
3.  Domain-Specific Languages in Perspective
4.  A Picture is Worth a 1000 Words?
5.  Book “MDA Distilled” (page 16)
6.  The Free Lunch Is Over
Language Design
is
Library Design
Library Design
is
Language Design
Bjarne Stroustrup[1]
Contacts
iamharshal@yahoo.com
rohan.kini@gmail.com

More Related Content

What's hot

Xebia Knowledge Exchange (feb 2011) - Large Scale Web Development
Xebia Knowledge Exchange (feb 2011) - Large Scale Web DevelopmentXebia Knowledge Exchange (feb 2011) - Large Scale Web Development
Xebia Knowledge Exchange (feb 2011) - Large Scale Web Development
Michaël Figuière
 
Zero-Copy Event-Driven Servers with Netty
Zero-Copy Event-Driven Servers with NettyZero-Copy Event-Driven Servers with Netty
Zero-Copy Event-Driven Servers with Netty
Daniel Bimschas
 
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
Mike Harris
 
Ola Bini J Ruby Power On The Jvm
Ola Bini J Ruby Power On The JvmOla Bini J Ruby Power On The Jvm
Ola Bini J Ruby Power On The Jvm
deimos
 

What's hot (20)

Xebia Knowledge Exchange (feb 2011) - Large Scale Web Development
Xebia Knowledge Exchange (feb 2011) - Large Scale Web DevelopmentXebia Knowledge Exchange (feb 2011) - Large Scale Web Development
Xebia Knowledge Exchange (feb 2011) - Large Scale Web Development
 
Improve extension API: C++ as better language for extension
Improve extension API: C++ as better language for extensionImprove extension API: C++ as better language for extension
Improve extension API: C++ as better language for extension
 
Pragmatic Smalltalk
Pragmatic SmalltalkPragmatic Smalltalk
Pragmatic Smalltalk
 
CBOR - The Better JSON
CBOR - The Better JSONCBOR - The Better JSON
CBOR - The Better JSON
 
Serialization and performance in Java
Serialization and performance in JavaSerialization and performance in Java
Serialization and performance in Java
 
Modern Java Concurrency (OSCON 2012)
Modern Java Concurrency (OSCON 2012)Modern Java Concurrency (OSCON 2012)
Modern Java Concurrency (OSCON 2012)
 
High performance network programming on the jvm oscon 2012
High performance network programming on the jvm   oscon 2012 High performance network programming on the jvm   oscon 2012
High performance network programming on the jvm oscon 2012
 
Zero-Copy Event-Driven Servers with Netty
Zero-Copy Event-Driven Servers with NettyZero-Copy Event-Driven Servers with Netty
Zero-Copy Event-Driven Servers with Netty
 
DConf2015 - Using D for Development of Large Scale Primary Storage
DConf2015 - Using D for Development  of Large Scale Primary StorageDConf2015 - Using D for Development  of Large Scale Primary Storage
DConf2015 - Using D for Development of Large Scale Primary Storage
 
Software Design: Impact of Memory Usage (Copying, Cloning and Aliases)
Software Design: Impact of Memory Usage (Copying, Cloning and Aliases)Software Design: Impact of Memory Usage (Copying, Cloning and Aliases)
Software Design: Impact of Memory Usage (Copying, Cloning and Aliases)
 
Puppet NBLUG 2008-09
Puppet NBLUG 2008-09Puppet NBLUG 2008-09
Puppet NBLUG 2008-09
 
Object-oriented Design: Polymorphism via Inheritance (vs. Delegation)
Object-oriented Design: Polymorphism via Inheritance (vs. Delegation)Object-oriented Design: Polymorphism via Inheritance (vs. Delegation)
Object-oriented Design: Polymorphism via Inheritance (vs. Delegation)
 
Concurrent Programming with Ruby and Tuple Spaces
Concurrent Programming with Ruby and Tuple SpacesConcurrent Programming with Ruby and Tuple Spaces
Concurrent Programming with Ruby and Tuple Spaces
 
ZING: the Next Generation of Z39.50
ZING: the Next Generation of Z39.50ZING: the Next Generation of Z39.50
ZING: the Next Generation of Z39.50
 
Serialization (Avro, Message Pack, Kryo)
Serialization (Avro, Message Pack, Kryo)Serialization (Avro, Message Pack, Kryo)
Serialization (Avro, Message Pack, Kryo)
 
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
 
FOSDEM2016 - Ruby and OMR
FOSDEM2016 - Ruby and OMRFOSDEM2016 - Ruby and OMR
FOSDEM2016 - Ruby and OMR
 
Ola Bini J Ruby Power On The Jvm
Ola Bini J Ruby Power On The JvmOla Bini J Ruby Power On The Jvm
Ola Bini J Ruby Power On The Jvm
 
Browser Internals for JS Devs: WebU Toronto 2016 by Alex Blom
Browser Internals for JS Devs: WebU Toronto 2016 by Alex BlomBrowser Internals for JS Devs: WebU Toronto 2016 by Alex Blom
Browser Internals for JS Devs: WebU Toronto 2016 by Alex Blom
 
Sugar Presentation - YULHackers March 2009
Sugar Presentation - YULHackers March 2009Sugar Presentation - YULHackers March 2009
Sugar Presentation - YULHackers March 2009
 

Viewers also liked

Lecture 9 evolution of life
Lecture 9   evolution of life Lecture 9   evolution of life
Lecture 9 evolution of life
Punith M
 
The history of the earth
The history of the earthThe history of the earth
The history of the earth
Jennyfer Bañez
 
P2h Big Bang
P2h Big BangP2h Big Bang
P2h Big Bang
M F Ebden
 

Viewers also liked (20)

From Zurich to the Cosmos, by Artist Steve Carpenter
From Zurich to the Cosmos, by Artist Steve CarpenterFrom Zurich to the Cosmos, by Artist Steve Carpenter
From Zurich to the Cosmos, by Artist Steve Carpenter
 
Lecture 9 evolution of life
Lecture 9   evolution of life Lecture 9   evolution of life
Lecture 9 evolution of life
 
Holt Modern Biology Chapter 49 Nervous System and Sense Organ Vocab
Holt Modern Biology Chapter 49 Nervous System and Sense Organ VocabHolt Modern Biology Chapter 49 Nervous System and Sense Organ Vocab
Holt Modern Biology Chapter 49 Nervous System and Sense Organ Vocab
 
The history of the earth
The history of the earthThe history of the earth
The history of the earth
 
Biology : Chapter 1 : The Science of Life
Biology : Chapter 1 : The Science of LifeBiology : Chapter 1 : The Science of Life
Biology : Chapter 1 : The Science of Life
 
Anatomy--Circulatory and Cardiovascular Systems Notes
Anatomy--Circulatory and Cardiovascular Systems NotesAnatomy--Circulatory and Cardiovascular Systems Notes
Anatomy--Circulatory and Cardiovascular Systems Notes
 
P2h Big Bang
P2h Big BangP2h Big Bang
P2h Big Bang
 
Understanding Evolution - Life goes on
Understanding Evolution - Life goes onUnderstanding Evolution - Life goes on
Understanding Evolution - Life goes on
 
Biology Unit 1 Chapter 1 Lecture
Biology Unit 1 Chapter 1 LectureBiology Unit 1 Chapter 1 Lecture
Biology Unit 1 Chapter 1 Lecture
 
Scheme for perfect score module 2012
Scheme for perfect score module 2012Scheme for perfect score module 2012
Scheme for perfect score module 2012
 
Important formula for physics form 4
Important formula for physics form 4Important formula for physics form 4
Important formula for physics form 4
 
The Big Bang
The Big Bang The Big Bang
The Big Bang
 
Basic Trigonometry (Lower Sec)
Basic Trigonometry (Lower Sec)Basic Trigonometry (Lower Sec)
Basic Trigonometry (Lower Sec)
 
Earth Science Astronomy - The big bang theory
Earth Science Astronomy - The big bang theoryEarth Science Astronomy - The big bang theory
Earth Science Astronomy - The big bang theory
 
Unit8: Origin and Evolution of Life
Unit8: Origin and Evolution of LifeUnit8: Origin and Evolution of Life
Unit8: Origin and Evolution of Life
 
Important formula for physics form 5
Important formula for physics form 5Important formula for physics form 5
Important formula for physics form 5
 
The origin and evolution of life on earth
The origin and evolution of life on earthThe origin and evolution of life on earth
The origin and evolution of life on earth
 
The Big Bang Theory
The Big Bang TheoryThe Big Bang Theory
The Big Bang Theory
 
Unit 5 Nervous System
Unit 5 Nervous SystemUnit 5 Nervous System
Unit 5 Nervous System
 
The Future of Everything
The Future of EverythingThe Future of Everything
The Future of Everything
 

Similar to DSL Construction with Ruby - ThoughtWorks Masterclass Series 2009

Javascript done right - Open Web Camp III
Javascript done right - Open Web Camp IIIJavascript done right - Open Web Camp III
Javascript done right - Open Web Camp III
Dirk Ginader
 
Java jdk-update-nov10-sde-v3m
Java jdk-update-nov10-sde-v3mJava jdk-update-nov10-sde-v3m
Java jdk-update-nov10-sde-v3m
Steve Elliott
 
Bdd and dsl как способ построения коммуникации на проекте
Bdd and dsl как способ построения коммуникации на проектеBdd and dsl как способ построения коммуникации на проекте
Bdd and dsl как способ построения коммуникации на проекте
ISsoft
 
Web Development using Ruby on Rails
Web Development using Ruby on RailsWeb Development using Ruby on Rails
Web Development using Ruby on Rails
Avi Kedar
 

Similar to DSL Construction with Ruby - ThoughtWorks Masterclass Series 2009 (20)

The details of CI/CD environment for Ruby
The details of CI/CD environment for RubyThe details of CI/CD environment for Ruby
The details of CI/CD environment for Ruby
 
Important work-arounds for making ASS multi-lingual
Important work-arounds for making ASS multi-lingualImportant work-arounds for making ASS multi-lingual
Important work-arounds for making ASS multi-lingual
 
EKON27-FrameworksExpressiveness.pdf
EKON27-FrameworksExpressiveness.pdfEKON27-FrameworksExpressiveness.pdf
EKON27-FrameworksExpressiveness.pdf
 
How DSL works on Ruby
How DSL works on RubyHow DSL works on Ruby
How DSL works on Ruby
 
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
 
groovy DSLs from beginner to expert
groovy DSLs from beginner to expertgroovy DSLs from beginner to expert
groovy DSLs from beginner to expert
 
Building DSLs with Scala
Building DSLs with ScalaBuilding DSLs with Scala
Building DSLs with Scala
 
Javascript done right - Open Web Camp III
Javascript done right - Open Web Camp IIIJavascript done right - Open Web Camp III
Javascript done right - Open Web Camp III
 
Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)
 
Software Engineering
Software EngineeringSoftware Engineering
Software Engineering
 
Java jdk-update-nov10-sde-v3m
Java jdk-update-nov10-sde-v3mJava jdk-update-nov10-sde-v3m
Java jdk-update-nov10-sde-v3m
 
Going to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific Languages
 
Bdd and dsl как способ построения коммуникации на проекте
Bdd and dsl как способ построения коммуникации на проектеBdd and dsl как способ построения коммуникации на проекте
Bdd and dsl как способ построения коммуникации на проекте
 
BDD or DSL как способ построения коммуникации на проекте - опыт комплексного ...
BDD or DSL как способ построения коммуникации на проекте - опыт комплексного ...BDD or DSL как способ построения коммуникации на проекте - опыт комплексного ...
BDD or DSL как способ построения коммуникации на проекте - опыт комплексного ...
 
Guide to Destroying Codebases The Demise of Clever Code
Guide to Destroying Codebases   The Demise of Clever CodeGuide to Destroying Codebases   The Demise of Clever Code
Guide to Destroying Codebases The Demise of Clever Code
 
Web Development using Ruby on Rails
Web Development using Ruby on RailsWeb Development using Ruby on Rails
Web Development using Ruby on Rails
 
GR8Conf 2009: Practical Groovy DSL by Guillaume Laforge
GR8Conf 2009: Practical Groovy DSL by Guillaume LaforgeGR8Conf 2009: Practical Groovy DSL by Guillaume Laforge
GR8Conf 2009: Practical Groovy DSL by Guillaume Laforge
 
Road to sbt 1.0: Paved with server (2015 Amsterdam)
Road to sbt 1.0: Paved with server (2015 Amsterdam)Road to sbt 1.0: Paved with server (2015 Amsterdam)
Road to sbt 1.0: Paved with server (2015 Amsterdam)
 
Wider than rails
Wider than railsWider than rails
Wider than rails
 
Simple Ruby DSL Techniques: Big Project Impact!
Simple Ruby DSL Techniques: Big Project Impact!Simple Ruby DSL Techniques: Big Project Impact!
Simple Ruby DSL Techniques: Big Project Impact!
 

Recently uploaded

Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns
 
AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...
AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...
AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...
Alluxio, Inc.
 

Recently uploaded (20)

Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...
Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...
Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...
 
Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
 
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBroker
 
AI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in MichelangeloAI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in Michelangelo
 
Top Mobile App Development Companies 2024
Top Mobile App Development Companies 2024Top Mobile App Development Companies 2024
Top Mobile App Development Companies 2024
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
 
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERRORTROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERROR
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
 
Accelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with PlatformlessAccelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with Platformless
 
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
 
GraphAware - Transforming policing with graph-based intelligence analysis
GraphAware - Transforming policing with graph-based intelligence analysisGraphAware - Transforming policing with graph-based intelligence analysis
GraphAware - Transforming policing with graph-based intelligence analysis
 
How Does XfilesPro Ensure Security While Sharing Documents in Salesforce?
How Does XfilesPro Ensure Security While Sharing Documents in Salesforce?How Does XfilesPro Ensure Security While Sharing Documents in Salesforce?
How Does XfilesPro Ensure Security While Sharing Documents in Salesforce?
 
Using IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New ZealandUsing IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New Zealand
 
Crafting the Perfect Measurement Sheet with PLM Integration
Crafting the Perfect Measurement Sheet with PLM IntegrationCrafting the Perfect Measurement Sheet with PLM Integration
Crafting the Perfect Measurement Sheet with PLM Integration
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
 
Advanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should KnowAdvanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should Know
 
AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...
AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...
AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...
 
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.ILBeyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
 
Breaking the Code : A Guide to WhatsApp Business API.pdf
Breaking the Code : A Guide to WhatsApp Business API.pdfBreaking the Code : A Guide to WhatsApp Business API.pdf
Breaking the Code : A Guide to WhatsApp Business API.pdf
 

DSL Construction with Ruby - ThoughtWorks Masterclass Series 2009