SlideShare ist ein Scribd-Unternehmen logo
1 von 78
Downloaden Sie, um offline zu lesen
Open Source Modeling




                   Bernd Kolb               Markus Voelter
                   b.kolb@kolbware.de       voelter@acm.org
                   http://www.kolbware.de   www.voelter.de
Overview over Eclipse Modeling
Intro to Textual DSLs
Getting Started with Xtext
Intro to Example
Defining the Grammar
Simple Editor Customization
More Advanced Customization
Processing the Models
Summary
                                 © Bernd Kolb, Markus Voelter 2008
Eclipse Modeling is the umbrella project for all things
modeling that happen on the Eclipse platform:
   The Eclipse Modeling Project focuses on the evolution and promotion
   of model-based development technologies within the Eclipse
   community by providing a unified set of modeling frameworks, tooling,
   and standards implementations.

Eclipse Modeling is not formally related to OMG, but
implements several of their standards.
It is fair to say that many leading edge modeling tools are
hosted/developed at Eclipse Modeling.
Everything Open Source under the Eclipse Public License
                                                         © Bernd Kolb, Markus Voelter 2008
The Eclipse Modeling Framework (EMF) serves as the
foundation: It provides the Ecore Metametamodel and
frameworks and tools around it for tasks such as
  Editing
  Transactions
  Validation
  Query
  Distribution/Persistence (CDO, Net4j, Teneo)




                                                 © Bernd Kolb, Markus Voelter 2008
The Graphical Modeling Framework (GMF) is used for
building custom graphical editors based on meta models
defined via EMF.
  It is currently in version 2.x
  Proven technology, used in many industrial-strength systems
  Based on Eclipse GEF

The Textual Modeling Framework is used for building
custom textual editors.
  Project is currently being set up
  Will be populated initially from oAW Xtext and INRIA TCS.

                                                    © Bernd Kolb, Markus Voelter 2008
UML 2.x: An implementation of the UML 2 meta model
based on EMF
  UML 2 Tools: GMF editors for the UML 2 models

OCL: APIs for OCL expression syntax for implementing
queries and contraints.

XSD Infoset: reference library that provides an API for use
with any code that examines, creates or modifies W3C XML
Schema.



                                                  © Bernd Kolb, Markus Voelter 2008
M2M (Model-to-Model) : delivers an extensible framework
for model-to-model transformation languages.
  ATL: M2M language from INRIA
  QVT implementations

M2T (Model-to-Text) : focuses on technologies for
transforming models into text (code generation)
  JET : provides code generation framework & facilities that are
  used by EMF.
  Xpand: oAW’s code generation engine, to be part of M2T in the
  Ganymede release


                                                   © Bernd Kolb, Markus Voelter 2008
An integrated, tested, one-stop toolkit for MDSD
Version 4.2.1 is current (4.3 beta for Xtext)
Proven track record in various domains & project contexts
Stable, productive and helpful developer, support and user
communities
www.openarchitectureware.org and eclipse.org/gmt/oaw
Integration with Eclipse:
  Uses EMF as a basis
  Graphical editors based on GMF
  All editors and tooling based on Eclipse
                                                © Bernd Kolb, Markus Voelter 2008
Version 5 currently under development:
Migration of oAW Components to Eclipse Modeling proper:
  Xpand, Xtend, Check Model-to-Text (M2T)
  Xtext Textual Modeling Framework (TMF)
  Workflow Modeling Workflow Engine (MWE)

More features
  New backend: a VM for M2T (and maybe more languages)
  Mixing Languages: Xpand, Xtend, Check in one file
  Xtext: Grammar Fragments and the stuff from the 4.3 beta
  Generic Tree/Form Editor, mixing editors
  Wizard Framework
                                                  © Bernd Kolb, Markus Voelter 2008
© Bernd Kolb, Markus Voelter 2008
Overview over Eclipse Modeling
Intro to Textual DSLs
Getting Started with Xtext
Intro to Example
Defining the Grammar
Simple Editor Customization
More Advanced Customization
Processing the Models
Summary
                                 © Bernd Kolb, Markus Voelter 2008
A Domain Specific Language (DSL) is a focused, processable
language for describing a specific concern when building a
system in a specific domain. The abstractions and
notations used are tailored to the stakeholders who specify
that particular concern.

DSLs can be classified in many ways:
  Configuration vs. Customization
  Internal vs. External
  Graphical vs.textual

We concentrate on external textual customization DSLs
                                               © Bernd Kolb, Markus Voelter 2008
Aspects/Concerns/Viewpoints of a system can be modeled
formally, independent of others
(avoiding the legacy system problem)

Formal models can be processed automatically by tools
(analysis/check, transformation, generation/Interpretation)
potentially leading to
  technology independence of implementation code
  More efficient development
  More reusable systems
  Better software quality

                                                © Bernd Kolb, Markus Voelter 2008
A big barrier to adoption of DSLs is tool integration:
how to integrate tool that stores its data in repositories?
Textual DSLs completely removes this problem:
  Human-readable models are stored, versioned, searched and
  diffed like any other text file, integrating with CVS and SVN.
  Also, we know from working with traditional source code that
  text is a useful representation for even large systems.

The big advantage compared to internal DSLs (in Ruby,
Groovy) is that you can have DSL-specfic constraint checks
and language support in editors
  This talk is about how leverage these advantages
                                                     © Bernd Kolb, Markus Voelter 2008
Sometimes it is useful to show things graphically:
Dependency Structures, Temporal Aspects, Signal Flow

In this case there are several alternatives:
  Visualize a subset of the model, e.g. using graphviz or prefuse
  (typically read-only, but superb auto layouting)

  Use different viewpoints, some of them using graphical editor
  (requires cross-refs between textual and graphical models)

  Edit the same model textually and graphically
  (textual format is used as the serialization format for the
  graphical editor; requires writeability of textual model!)
                                                       © Bernd Kolb, Markus Voelter 2008
Typically textual DSLs are build using one of the many parser
generators (ANTLR, JavaCC, Lex/yacc), or even by a hand-
writing a custom parser
Parser: match text and try to create a parse tree




Parser Generator: Generate a parser from a grammar
                                                    © Bernd Kolb, Markus Voelter 2008
Typically, transformed into an
Abstract Syntax Tree (AST)
  No whitespace, reified nodes,
  often binary tree
The AST can be considered the model
  The node types of the AST act as the
  metamodel
Programs processing the “sentence” are typically written
against the AST – they usually don’t care about the parse
tree


                                                © Bernd Kolb, Markus Voelter 2008
Writing a parser is non-trivial
Using a parser generator makes it easier, but still not for
everybody

Also: out of the box, a parser generator only creates a
matcher and/or a simplistic AST. You still need to
  Transform the model into a form that is easily processable
  Create an editor with syntax highlighting, code completion, etc.


A lot of work! Only few people are willing to do that


                                                     © Bernd Kolb, Markus Voelter 2008
Overview over Eclipse Modeling
Intro to Textual DSLs
Getting Started with Xtext
Intro to Example
Defining the Grammar
Simple Editor Customization
More Advanced Customization
Processing the Models
Summary
                                 © Bernd Kolb, Markus Voelter 2008
Xtext makes this much more feasible.
Based on an EBNF grammar it generates
  ANTLR3-based parser
  EMF-based metamodel
  Eclipse editor with
  ▪   syntax highlighting
  ▪   code completion
  ▪   customizable outline
  ▪   code folding
  ▪   real-time constraint checking

Xtext is part of openArchitectureWare / Eclipse Modeling
                                              © Bernd Kolb, Markus Voelter 2008
© Bernd Kolb, Markus Voelter 2008
Main Project Name:
  name of language project
  .editor project contains editor

Language Name: package
name of generated meta model
DSL File Extension: file extension used to associate editor
nsURI: full namespace URI of the generated meta model
Base Package: all code will be in or below this package
Code Gen Project: See last section of this presentation

                                                 © Bernd Kolb, Markus Voelter 2008
© Bernd Kolb, Markus Voelter 2008
© Bernd Kolb, Markus Voelter 2008
Overview over Eclipse Modeling
Intro to Textual DSLs
Getting Started with Xtext
Intro to Example
Defining the Grammar
Simple Editor Customization
More Advanced Customization
Processing the Models
Summary
                                 © Bernd Kolb, Markus Voelter 2008
DSL for importing data: common        P001 Voelter,Markus,*14.02.1974
                                      A001 Grabenstrasse 4, 73033, Goeppingen
problem in large enterprises          V001 Futuristic Insurance,123456767
                                      T001 49,07161,12334454
(e.g. hospitals)                      T001 49,171,8601869
                                      S001 01.02.2004,IN25
                                      S002 03.02.2004,CH52
Problem: read data like the one on    S003 05.02.2004
                                      S001 22.03.2005,NE02
the right into Java Beans             S002 25.03.2005,NE04
                                      S002 27.03.2005,NE05
                                      S003 28.03.2004
  Example is about patients, stays,   P001 Somebody,Else,*23.05.1960
  wards, insurance data               A001 Ziegelaecker 11, 89520, Heidenheim
                                      V001 Some Other Insurance GmbH,124345
                                      T001 49,07321,973344
Record Structure:                     S001 23.02.1999,IN25
                                      S003 02.03.1999
<Type> <Fd1>,<Fd2>, … <Fdn>           P001 Person,Else,*23.05.1960
                                      A001 Ziegelaecker 11, 89520, Heidenheim
                                      V001 Some Other Insurance GmbH,124345
                                      T001 49,07321,973344
Different Record Types have           S001 23.02.1999,IN25
                                      S003 02.03.1999
different fields
                                                     © Bernd Kolb, Markus Voelter 2008
Define data structures (à la Java Beans)
  Entities
  Attributes, References (:1, :n)

Define parser
  Checks record order
  Instantiates data structures
  Maps fields to attributes
  Assembles references

Backend: Generate Java code for
beans as well as parser

                                           © Bernd Kolb, Markus Voelter 2008
© Bernd Kolb, Markus Voelter 2008
Overview over Eclipse Modeling
Intro to Textual DSLs
Getting Started with Xtext
Intro to Example
Defining the Grammar
Simple Editor Customization
More Advanced Customization
Processing the Models
Summary
                                 © Bernd Kolb, Markus Voelter 2008
Grammar is defined
in an EBNF-like format
in the Xtext editor.
The editor provides
code completion and
constraint checking
for the grammars
themselves
Grammar is a collection
of Rules. Rules start with
their name followed by
: and ending with ;
                             © Bernd Kolb, Markus Voelter 2008
The Xtext generator builds
an EMF meta model from
the grammar.
The generated parser then
instantiates the meta
model from a model.
Processing Xtext models is
based on this meta model:
all existing EMF tooling is
suitable for processing.
  We’ll show a code gen
  template later
                              © Bernd Kolb, Markus Voelter 2008
Type Rule
  For each rule Xtext creates a class in the metamodel
  Each rule property results in a property of the metaclass
String Rule
  String rules are parsed to a String.
  They are in effect custom lexer rules (recognizing string patterns)
Enum Rule
  Limited set of alternatives; mapped to an Ecore enum
Native Rule
  A lexer rule is directly interpreted by ANTLR; mapped to a String

                                                      © Bernd Kolb, Markus Voelter 2008
ID


STRING




INT



         © Bernd Kolb, Markus Voelter 2008
Multiline comment


Single line comment


Whitespace


The content of those rules is not transformed
into the meta model


                                                © Bernd Kolb, Markus Voelter 2008
Reference


File Reference/Import: Xtext derives the default Linking
information from here (more later)




                                                    © Bernd Kolb, Markus Voelter 2008
A type rule is mapped to a metaclass in the metamodel
It may contain keywords (using string literal syntax)
It also contains properties which will result in properties of
the respective metaclass
  The property type is derived from the called rule

There are different kinds              There are different
of properties                          property cardinalities
  = (single assign)                      ? (0..1)
  += (multiple assign/add)               * (0..n)
  ?= (boolean assign)                    + (1..n)
                                         nothing (1..1)
                                                      © Bernd Kolb, Markus Voelter 2008
© Bernd Kolb, Markus Voelter 2008
ImportSpec:
  Keywords: import,
  ext, =, { and }
  Expects one occurrence
  of DataSection rule
  assigned to the
  dataSection property

DataStructure:
  Expects any number of Attribute or Reference occurences and
  assigns them to the attributes and references property,
  respectively

                                                     © Bernd Kolb, Markus Voelter 2008
By default, execution of rules results in a tree of data
You can reference other elements via a reference rule
  In textual languages a reference has to be by name
  During linking, Xtext “dereferences” these by name-references
  Target’s name property is used here (customization: see later)


Example:
reference to a
DataStructure.
ID is is the lexer
used for the
referencing token
                                                   © Bernd Kolb, Markus Voelter 2008
A resource reference can be used to import another model
file (typically of the same DSL)
When customizing e.g. content assist, Xtext automatically
provides a global view on the contents of all imported files




                                                 © Bernd Kolb, Markus Voelter 2008
A type rule can be abstract
An abstract type rule is basically a collection of OR-ed
alternatives: R1 | R2 | R3
Mapped to an abstract metaclass
  The or-ed alternatives become concrete subclasses
  Common properties of the alternatives are lifted into the
  abstract superclass
The same rule can be or-ed in several abstract rules in
which case the metaclass has several superclasses.


                                                     © Bernd Kolb, Markus Voelter 2008
Property is the
abstract rule.

Can be a Reference
or an Attribute

The DataStructure
has a collection of
Properties, referencing
the abstract rule
In the meta model, name has
been be lifted, type has not
                               © Bernd Kolb, Markus Voelter 2008
String rules are lexer rules (i.e. used to define rules for
custom character sequences)
Declared via the String keyword



String rules can be composed from other lexer rules.
  Other String rules
  Built-in lexer rules (e.g. ID)
  Native rules (see Xtext Reference Manual)


                                                     © Bernd Kolb, Markus Voelter 2008
A Enum Rule is used to define a limited set of defined
alternatives
It is mapped to an Enum in the metamodel
It is declared via the Enum keyword and contains Enum
Literals
  An Enum Literal has a token name and a string representation




It can be used just like any other rule.

                                                   © Bernd Kolb, Markus Voelter 2008
A native rule contains a string which is passed to ANTLR
without further processing it.
It is typically used to define lexer rules that cannot be
expressed using Xtext syntax
  E.g. whitespace-aware lexer rules, such as define custom
  comment syntax
It is declared via the
Native keyword
The example introduces a
comment (# till end of line)
that is preserved into the model
                                                    © Bernd Kolb, Markus Voelter 2008
As a default, Xtext is used to define grammars and derive
the meta model (the ecore file) from this grammar.
  You start with the concrete syntax.
However, sometimes you want define a textual grammar for
an existing meta model.
To do this, you have to import the existing meta model:


You can then associate the rules with an exsiting meta class:



                                                 © Bernd Kolb, Markus Voelter 2008
In case all of your rules refer
to meta classes in existing
meta models, you do not need
any meta model generation:
use preventMMGeneration
One of the imported meta
models may be imported
without an alias.
  if rule name and meta class
  name are the same, you do
  not have to use the explicit
  meta class reference ([…])
                                  © Bernd Kolb, Markus Voelter 2008
Overview over Eclipse Modeling
Intro to Textual DSLs
Getting Started with Xtext
Intro to Example
Defining the Grammar
Simple Editor Customization
More Advanced Customization
Processing the Models
Summary
                                 © Bernd Kolb, Markus Voelter 2008
OCL-like expression language used throughout oAW
  Can be used in constraint checks, model transformations and generators
  Add “methods” to meta types (Java calls are possible if necessary)
  path expressions, set operations, (some) higher order functions
  Polymorphism (multiple dispatch)
  Tool support
  (syntax highlighting, code completion, debugger)




                                                             © Bernd Kolb, Markus Voelter 2008
Uses the oAW Check language, based on Xtend
  Used to validate the static semantics of the models
Report Warnings and Errors
Based completely on the generated meta model,
no concrete syntax hassles
Tool support (syntax highlighting, code completion, …)




                                                         © Bernd Kolb, Markus Voelter 2008
The constraints defined
for the language are
evaluated in the editor
on the fly.

Constraints can also be
checked as part of a work-
flow that processes the
models.




                             © Bernd Kolb, Markus Voelter 2008
Xtext supports the customization of
the Outline View structure and icons/labels
Labels and icons are changed by overriding
label(…) and image(…) for your meta types.




                                              Actual image files (.gif)
                                              go into editor project’s
                                              icons directory
                                                  © Bernd Kolb, Markus Voelter 2008
Press Ctrl-O to show the
outline as a pop-up

You can then start typing to
filter the visible elements by
name.

Pressing enter on any element
will navigate to the respective
element.



                                  © Bernd Kolb, Markus Voelter 2008
Overview over Eclipse Modeling
Intro to Textual DSLs
Getting Started with Xtext
Intro to Example
Defining the Grammar
Simple Editor Customization
More Advanced Customization
Processing the Models
Summary
                                 © Bernd Kolb, Markus Voelter 2008
By default, the structure of the outline view corresponds to
the structure of the document.
  This default structure can be changed
  Additional structures (“viewpoints”) can be defined

Default                             Types
Viewpoint                           Viewpoint
                                    (shows data
                                     types and
                                     instances)




                                                    © Bernd Kolb, Markus Voelter 2008
© Bernd Kolb, Markus Voelter 2008
Repeatedly pressing Ctrl-O shows the sequence of the
various viewpoints in the popup.

 Ctrl-O once:          Ctrl-O again:




                                              © Bernd Kolb, Markus Voelter 2008
Content Assist / Code Completion is customized via
overwriting certain extension functions:
   List[Proposal] complete<MyType>_<propName>
           (emf::Eobject ctx, String prefix)
A Proposal
consists of a
label, an icon
and the text to
insert



                                               © Bernd Kolb, Markus Voelter 2008
By default, if you use references in your DSL, you can use Go
To Definition and Find References out of the box
(it works cross-resource, see next section)




                                                 © Bernd Kolb, Markus Voelter 2008
To customize navigation, overwrite the following extension
in the Navigation.ext file.
(you do NOT have to do this for DSL references!)
Find the Definition of a “string” in a context:
emf::EObject findDeclaration(String s, emf::EObject ctx)

Find the References of a “string” in a context:
List[UIContentNode] findReferences(String s, emf::EObject ctx)

Create the node for the list of results:
create UIContentNode createNode(RuleName tr)




                                                           © Bernd Kolb, Markus Voelter 2008
It is possible to customize the font
style for keywords (and only keywords)
You can customize bold, italic, underline,
strikethrough as well as foreground and background colors
Override the fontstyle() extension for a specific meta class:

                                                 Also override the
                                                 delayContextSensitiveS
                                                 tyling() extension and
                                                 return the number of
                                                 milliseconds of delay
                                                 before the styling is
                                                 done. Performance!
                                                 A good number is 500.

                                                 © Bernd Kolb, Markus Voelter 2008
Often you want to integrate an Xtext textual model with
other, (possibly non-Xtext) models
  For example, you want to “annotate” an existing UML or GMF
  model
  Or you want to define a number of Xtext languages separately
  and integrate the models via refereneces

To do this, you first have to make the referencing Xtext
grammar aware of the referenced meta model:


At the moment the metamodel has to be deployed into the “surrounding” Eclipse
to make the editor work correctly, but we are working on a solution to that.

                                                             © Bernd Kolb, Markus Voelter 2008
You can then reference “external” meta classes using the
reference syntax introduced before:




To import the actual data, use a Resource Reference (the
URI grammar keyword).




                                               © Bernd Kolb, Markus Voelter 2008
The Linker is used to wire different models
In most cases the automatically created grammar-derived
Linker is sufficient
However it is possible to customize the behavior further:
Override link(emf::EObject this)




                                                © Bernd Kolb, Markus Voelter 2008
It is necessary in several cases to uniquely identify model
elements by one of their properties. Used by
  Linker
  findReference/ findDeclaration
  …
Default property is name
To customize this, you can
override the id() extension
in the Extensions.ext file.


                                                  © Bernd Kolb, Markus Voelter 2008
Overview over Eclipse Modeling
Intro to Textual DSLs
Getting Started with Xtext
Intro to Example
Defining the Grammar
Simple Editor Customization
More Advanced Customization
Processing the Models
Summary
                                 © Bernd Kolb, Markus Voelter 2008
Since Xtext instantiates Ecore metamodels, the models can
be processed with any EMF tool – e.g. oAW.
  We will not explain those here.
You can process them with oAW Workflows, use them like
any other EMF resource and parse them into your own Java
programs.
You can check the Create Generator Project checkbox in the
projection creation wizard to get a sample generator as a
starting point.



                                                © Bernd Kolb, Markus Voelter 2008
The only Xtext-specific aspect is
using the generated parser.




                                    © Bernd Kolb, Markus Voelter 2008
oAW’s Xpand template
language is a powerful
and well established
code generation facility
with nice tooling.
You can easily traverse
the model/meta model
using the Xtend
language (à la OCL)




                           © Bernd Kolb, Markus Voelter 2008
Use EMF’s native resource mechanism
  ▪ Xtext registers a ResourceFactory for the DSL’s file extension
  ▪ Simply pass the uri of the file you want to read to getResource()
  ▪ Note that you cannot write the model back!




                                                          © Bernd Kolb, Markus Voelter 2008
Use the generated parser
  This is what the ResourceFactory does internally
  with some default behavior for error handling
  Note how parse
  errors and constraint
  violations are
  handled.




                                                     © Bernd Kolb, Markus Voelter 2008
Typically you you are only working on the AST (ecore file)
However, sometimes you need data from the parse tree
  Location of an element in the source file
  The text for a certain element
  The parse tree node at a certain offset

Here is an example of how to get the
location of an element in the source file:




                                                © Bernd Kolb, Markus Voelter 2008
Overview over Eclipse Modeling
Intro to Textual DSLs
Getting Started with Xtext
Intro to Example
Defining the Grammar
Simple Editor Customization
More Advanced Customization
Processing the Models
Summary
                                 © Bernd Kolb, Markus Voelter 2008
Designing good languages is not easy – and Xtext cannot
simplify that process.
However, building good tools for good languages is also
not easy, and often a reason for not trying to build a
language.
Xtext makes that second challenge – the tooling – much
much easier, thereby making language development a real
practical option.
Go ahead, give it a try!


                                              © Bernd Kolb, Markus Voelter 2008
oAW Xtext is currently in the process of transitioning into the
(relatively) new Textual Modeling Framework project.

Together with INRIA’s TCS, it serves as the basis for TMF.

See also
  http://www.eclipse.org/proposals/tmf/
  http://wiki.eclipse.org/TMF




                                                  © Bernd Kolb, Markus Voelter 2008
It is not yet possible to specify custom action code in the
parser
  This sometimes results in “ugly” meta models
  Becomes apparent when building expression languages
  [This is a plan item for TMF]




                                                  © Bernd Kolb, Markus Voelter 2008
www.openarchitectureware.org
  Specifically the reference docs contain more info about Xtext

www.eclipse.org/modeling/
  EMF and all the other related tooling
  Future home of Eclipse TMF

Podcast: Software Engineering Radio
  www.se-radio.net
  Several Episodes on MDSD



                                                    © Bernd Kolb, Markus Voelter 2008
Thanks for your attention!



                 Questions?


        Bernd Kolb             Markus Voelter
        b.kolb@kolbware.de     voelter@acm.org
        http://www.kolbware.de http://www.voelter.de

                                                       © Bernd Kolb, Markus Voelter 2008

Weitere ähnliche Inhalte

Andere mochten auch

Paisajes Y Monumentos
Paisajes Y MonumentosPaisajes Y Monumentos
Paisajes Y Monumentosamfelisa
 
Day 2 2nd_weekcris
Day 2 2nd_weekcrisDay 2 2nd_weekcris
Day 2 2nd_weekcriscristiarnau
 
Sustainability lab 2015/ Chimica tessile e sostenibilità
Sustainability lab 2015/ Chimica tessile e sostenibilitàSustainability lab 2015/ Chimica tessile e sostenibilità
Sustainability lab 2015/ Chimica tessile e sostenibilitàfranztunda
 
mulleres matemáticas 3
mulleres matemáticas 3mulleres matemáticas 3
mulleres matemáticas 3biblioxograr
 
Improving audience engagement in your ILTA 2011 conference sessions
Improving audience engagement in your ILTA 2011 conference sessionsImproving audience engagement in your ILTA 2011 conference sessions
Improving audience engagement in your ILTA 2011 conference sessionsPeter Buck
 
Sketches for Book
Sketches for BookSketches for Book
Sketches for Bookcaterwauler
 
5 top tips for compelling, relevant blog content
5 top tips for compelling, relevant blog content5 top tips for compelling, relevant blog content
5 top tips for compelling, relevant blog contentSimon Young
 
Skanska 20111021 horizontal leadership, managing change and complexity handout
Skanska 20111021 horizontal leadership, managing change and complexity handoutSkanska 20111021 horizontal leadership, managing change and complexity handout
Skanska 20111021 horizontal leadership, managing change and complexity handoutGunnar Westling
 
Un MóN De Sentiments
Un MóN De SentimentsUn MóN De Sentiments
Un MóN De Sentimentslalvar25
 
Survival Tips for Nonprofit Marketers
Survival Tips for Nonprofit MarketersSurvival Tips for Nonprofit Marketers
Survival Tips for Nonprofit MarketersKivi Leroux Miller
 
DÍA DE LA BANDERA
DÍA DE LA BANDERADÍA DE LA BANDERA
DÍA DE LA BANDERAguestd659a7
 
Content4 Nuthin CSEM version
Content4 Nuthin CSEM versionContent4 Nuthin CSEM version
Content4 Nuthin CSEM versionTerri Bays
 

Andere mochten auch (20)

Xtext Best Practices
Xtext Best PracticesXtext Best Practices
Xtext Best Practices
 
Paisajes Y Monumentos
Paisajes Y MonumentosPaisajes Y Monumentos
Paisajes Y Monumentos
 
Day 2 2nd_weekcris
Day 2 2nd_weekcrisDay 2 2nd_weekcris
Day 2 2nd_weekcris
 
Sustainability lab 2015/ Chimica tessile e sostenibilità
Sustainability lab 2015/ Chimica tessile e sostenibilitàSustainability lab 2015/ Chimica tessile e sostenibilità
Sustainability lab 2015/ Chimica tessile e sostenibilità
 
mulleres matemáticas 3
mulleres matemáticas 3mulleres matemáticas 3
mulleres matemáticas 3
 
Barbatii
BarbatiiBarbatii
Barbatii
 
Chitarra Romana
Chitarra RomanaChitarra Romana
Chitarra Romana
 
Dont Hug Me
Dont Hug MeDont Hug Me
Dont Hug Me
 
Improving audience engagement in your ILTA 2011 conference sessions
Improving audience engagement in your ILTA 2011 conference sessionsImproving audience engagement in your ILTA 2011 conference sessions
Improving audience engagement in your ILTA 2011 conference sessions
 
Usagility
UsagilityUsagility
Usagility
 
Sketches for Book
Sketches for BookSketches for Book
Sketches for Book
 
5 top tips for compelling, relevant blog content
5 top tips for compelling, relevant blog content5 top tips for compelling, relevant blog content
5 top tips for compelling, relevant blog content
 
Skanska 20111021 horizontal leadership, managing change and complexity handout
Skanska 20111021 horizontal leadership, managing change and complexity handoutSkanska 20111021 horizontal leadership, managing change and complexity handout
Skanska 20111021 horizontal leadership, managing change and complexity handout
 
Un MóN De Sentiments
Un MóN De SentimentsUn MóN De Sentiments
Un MóN De Sentiments
 
Survival Tips for Nonprofit Marketers
Survival Tips for Nonprofit MarketersSurvival Tips for Nonprofit Marketers
Survival Tips for Nonprofit Marketers
 
DÍA DE LA BANDERA
DÍA DE LA BANDERADÍA DE LA BANDERA
DÍA DE LA BANDERA
 
Content4 Nuthin CSEM version
Content4 Nuthin CSEM versionContent4 Nuthin CSEM version
Content4 Nuthin CSEM version
 
Mikstreet Pr-2010
Mikstreet Pr-2010Mikstreet Pr-2010
Mikstreet Pr-2010
 
Interactive Marketing
Interactive MarketingInteractive Marketing
Interactive Marketing
 
Presentation Part III
Presentation Part IIIPresentation Part III
Presentation Part III
 

Ähnlich wie Markus Voelter Textual DSLs

mbeddr meets IncQuer - Combining the Best Features of Two Modeling Worlds
mbeddr meets IncQuer - Combining the Best Features of Two Modeling Worldsmbeddr meets IncQuer - Combining the Best Features of Two Modeling Worlds
mbeddr meets IncQuer - Combining the Best Features of Two Modeling WorldsIstvan Rath
 
Modeling With Eclipse @SoftShake 2011
Modeling With Eclipse @SoftShake 2011Modeling With Eclipse @SoftShake 2011
Modeling With Eclipse @SoftShake 2011Mickael Istria
 
MODIGEN: MODEL-DRIVEN GENERATION OF GRAPHICAL EDITORS IN ECLIPSE
MODIGEN: MODEL-DRIVEN GENERATION OF GRAPHICAL EDITORS IN ECLIPSEMODIGEN: MODEL-DRIVEN GENERATION OF GRAPHICAL EDITORS IN ECLIPSE
MODIGEN: MODEL-DRIVEN GENERATION OF GRAPHICAL EDITORS IN ECLIPSEijcsit
 
How to Create Your Own Product-Modeling Environment
How to Create Your Own Product-Modeling EnvironmentHow to Create Your Own Product-Modeling Environment
How to Create Your Own Product-Modeling EnvironmentTim Geisler
 
MDD and modeling tools research
MDD and modeling tools researchMDD and modeling tools research
MDD and modeling tools researchRoger Xia
 
Domain Driven Design and Model Driven Software Development
Domain Driven Design and Model Driven Software DevelopmentDomain Driven Design and Model Driven Software Development
Domain Driven Design and Model Driven Software DevelopmentBahram Maravandi
 
Eclipse DemoCamp Toulouse 2017 - Mr. Robot : The modeling Society
Eclipse DemoCamp Toulouse 2017 - Mr. Robot : The modeling SocietyEclipse DemoCamp Toulouse 2017 - Mr. Robot : The modeling Society
Eclipse DemoCamp Toulouse 2017 - Mr. Robot : The modeling Societymelbats
 
Office OpenXML: a technical approach for OOo.
Office OpenXML: a technical approach for OOo.Office OpenXML: a technical approach for OOo.
Office OpenXML: a technical approach for OOo.Alexandro Colorado
 
The Economics of OptimJ
The Economics of OptimJThe Economics of OptimJ
The Economics of OptimJPatrick Viry
 
The Design, Evolution and Use of KernelF
The Design, Evolution and Use of KernelFThe Design, Evolution and Use of KernelF
The Design, Evolution and Use of KernelFMarkus Voelter
 
New microsoft office word document
New microsoft office word documentNew microsoft office word document
New microsoft office word documentSIVAJISADHANA
 
New microsoft office word document
New microsoft office word documentNew microsoft office word document
New microsoft office word documentSIVAJISADHANA
 
New microsoft office word document
New microsoft office word documentNew microsoft office word document
New microsoft office word documentSIVAJISADHANA
 
dotNET frameworks
dotNET frameworksdotNET frameworks
dotNET frameworksnawal saad
 
Re-implementing Thrift using MDE
Re-implementing Thrift using MDERe-implementing Thrift using MDE
Re-implementing Thrift using MDESina Madani
 

Ähnlich wie Markus Voelter Textual DSLs (20)

mbeddr meets IncQuer - Combining the Best Features of Two Modeling Worlds
mbeddr meets IncQuer - Combining the Best Features of Two Modeling Worldsmbeddr meets IncQuer - Combining the Best Features of Two Modeling Worlds
mbeddr meets IncQuer - Combining the Best Features of Two Modeling Worlds
 
Modeling With Eclipse @SoftShake 2011
Modeling With Eclipse @SoftShake 2011Modeling With Eclipse @SoftShake 2011
Modeling With Eclipse @SoftShake 2011
 
ALT
ALTALT
ALT
 
MODIGEN: MODEL-DRIVEN GENERATION OF GRAPHICAL EDITORS IN ECLIPSE
MODIGEN: MODEL-DRIVEN GENERATION OF GRAPHICAL EDITORS IN ECLIPSEMODIGEN: MODEL-DRIVEN GENERATION OF GRAPHICAL EDITORS IN ECLIPSE
MODIGEN: MODEL-DRIVEN GENERATION OF GRAPHICAL EDITORS IN ECLIPSE
 
How to Create Your Own Product-Modeling Environment
How to Create Your Own Product-Modeling EnvironmentHow to Create Your Own Product-Modeling Environment
How to Create Your Own Product-Modeling Environment
 
MDD and modeling tools research
MDD and modeling tools researchMDD and modeling tools research
MDD and modeling tools research
 
01 overview
01 overview01 overview
01 overview
 
01 overview
01 overview01 overview
01 overview
 
Epsilon
EpsilonEpsilon
Epsilon
 
Domain Driven Design and Model Driven Software Development
Domain Driven Design and Model Driven Software DevelopmentDomain Driven Design and Model Driven Software Development
Domain Driven Design and Model Driven Software Development
 
Eclipse DemoCamp Toulouse 2017 - Mr. Robot : The modeling Society
Eclipse DemoCamp Toulouse 2017 - Mr. Robot : The modeling SocietyEclipse DemoCamp Toulouse 2017 - Mr. Robot : The modeling Society
Eclipse DemoCamp Toulouse 2017 - Mr. Robot : The modeling Society
 
Office OpenXML: a technical approach for OOo.
Office OpenXML: a technical approach for OOo.Office OpenXML: a technical approach for OOo.
Office OpenXML: a technical approach for OOo.
 
The Economics of OptimJ
The Economics of OptimJThe Economics of OptimJ
The Economics of OptimJ
 
Inside.Net
Inside.NetInside.Net
Inside.Net
 
The Design, Evolution and Use of KernelF
The Design, Evolution and Use of KernelFThe Design, Evolution and Use of KernelF
The Design, Evolution and Use of KernelF
 
New microsoft office word document
New microsoft office word documentNew microsoft office word document
New microsoft office word document
 
New microsoft office word document
New microsoft office word documentNew microsoft office word document
New microsoft office word document
 
New microsoft office word document
New microsoft office word documentNew microsoft office word document
New microsoft office word document
 
dotNET frameworks
dotNET frameworksdotNET frameworks
dotNET frameworks
 
Re-implementing Thrift using MDE
Re-implementing Thrift using MDERe-implementing Thrift using MDE
Re-implementing Thrift using MDE
 

Mehr von deimos

Aspect Orientated Programming in Ruby
Aspect Orientated Programming in RubyAspect Orientated Programming in Ruby
Aspect Orientated Programming in Rubydeimos
 
Randy Shoup eBays Architectural Principles
Randy Shoup eBays Architectural PrinciplesRandy Shoup eBays Architectural Principles
Randy Shoup eBays Architectural Principlesdeimos
 
Remy Sharp The DOM scripting toolkit jQuery
Remy Sharp The DOM scripting toolkit jQueryRemy Sharp The DOM scripting toolkit jQuery
Remy Sharp The DOM scripting toolkit jQuerydeimos
 
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 Jvmdeimos
 
Joe Walker Interactivewebsites Cometand Dwr
Joe Walker Interactivewebsites Cometand DwrJoe Walker Interactivewebsites Cometand Dwr
Joe Walker Interactivewebsites Cometand Dwrdeimos
 
Aslak Hellesoy Executable User Stories R Spec Bdd
Aslak Hellesoy Executable User Stories R Spec BddAslak Hellesoy Executable User Stories R Spec Bdd
Aslak Hellesoy Executable User Stories R Spec Bdddeimos
 
Venkat Subramaniam Building DSLs In Groovy
Venkat Subramaniam Building DSLs In GroovyVenkat Subramaniam Building DSLs In Groovy
Venkat Subramaniam Building DSLs In Groovydeimos
 
Venkat Subramaniam Blending Java With Dynamic Languages
Venkat Subramaniam Blending Java With Dynamic LanguagesVenkat Subramaniam Blending Java With Dynamic Languages
Venkat Subramaniam Blending Java With Dynamic Languagesdeimos
 
Udi Dahan Intentions And Interfaces
Udi Dahan Intentions And InterfacesUdi Dahan Intentions And Interfaces
Udi Dahan Intentions And Interfacesdeimos
 
Tim Mackinnon Agile And Beyond
Tim Mackinnon Agile And BeyondTim Mackinnon Agile And Beyond
Tim Mackinnon Agile And Beyonddeimos
 
Steve Vinoski Rest And Reuse And Serendipity
Steve Vinoski Rest And Reuse And SerendipitySteve Vinoski Rest And Reuse And Serendipity
Steve Vinoski Rest And Reuse And Serendipitydeimos
 
Stefan Tilkov Soa Rest And The Web
Stefan Tilkov Soa Rest And The WebStefan Tilkov Soa Rest And The Web
Stefan Tilkov Soa Rest And The Webdeimos
 
Stefan Tilkov Pragmatic Intro To Rest
Stefan Tilkov Pragmatic Intro To RestStefan Tilkov Pragmatic Intro To Rest
Stefan Tilkov Pragmatic Intro To Restdeimos
 
Rod Johnson Cathedral
Rod Johnson CathedralRod Johnson Cathedral
Rod Johnson Cathedraldeimos
 
Mike Stolz Dramatic Scalability
Mike Stolz Dramatic ScalabilityMike Stolz Dramatic Scalability
Mike Stolz Dramatic Scalabilitydeimos
 
Matt Youill Betfair
Matt Youill BetfairMatt Youill Betfair
Matt Youill Betfairdeimos
 
Pete Goodliffe A Tale Of Two Systems
Pete Goodliffe A Tale Of Two SystemsPete Goodliffe A Tale Of Two Systems
Pete Goodliffe A Tale Of Two Systemsdeimos
 
Paul Fremantle Restful SOA Registry
Paul Fremantle Restful SOA RegistryPaul Fremantle Restful SOA Registry
Paul Fremantle Restful SOA Registrydeimos
 
Ola Bini Evolving The Java Platform
Ola Bini Evolving The Java PlatformOla Bini Evolving The Java Platform
Ola Bini Evolving The Java Platformdeimos
 
Neal Gafter Java Evolution
Neal Gafter Java EvolutionNeal Gafter Java Evolution
Neal Gafter Java Evolutiondeimos
 

Mehr von deimos (20)

Aspect Orientated Programming in Ruby
Aspect Orientated Programming in RubyAspect Orientated Programming in Ruby
Aspect Orientated Programming in Ruby
 
Randy Shoup eBays Architectural Principles
Randy Shoup eBays Architectural PrinciplesRandy Shoup eBays Architectural Principles
Randy Shoup eBays Architectural Principles
 
Remy Sharp The DOM scripting toolkit jQuery
Remy Sharp The DOM scripting toolkit jQueryRemy Sharp The DOM scripting toolkit jQuery
Remy Sharp The DOM scripting toolkit jQuery
 
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
 
Joe Walker Interactivewebsites Cometand Dwr
Joe Walker Interactivewebsites Cometand DwrJoe Walker Interactivewebsites Cometand Dwr
Joe Walker Interactivewebsites Cometand Dwr
 
Aslak Hellesoy Executable User Stories R Spec Bdd
Aslak Hellesoy Executable User Stories R Spec BddAslak Hellesoy Executable User Stories R Spec Bdd
Aslak Hellesoy Executable User Stories R Spec Bdd
 
Venkat Subramaniam Building DSLs In Groovy
Venkat Subramaniam Building DSLs In GroovyVenkat Subramaniam Building DSLs In Groovy
Venkat Subramaniam Building DSLs In Groovy
 
Venkat Subramaniam Blending Java With Dynamic Languages
Venkat Subramaniam Blending Java With Dynamic LanguagesVenkat Subramaniam Blending Java With Dynamic Languages
Venkat Subramaniam Blending Java With Dynamic Languages
 
Udi Dahan Intentions And Interfaces
Udi Dahan Intentions And InterfacesUdi Dahan Intentions And Interfaces
Udi Dahan Intentions And Interfaces
 
Tim Mackinnon Agile And Beyond
Tim Mackinnon Agile And BeyondTim Mackinnon Agile And Beyond
Tim Mackinnon Agile And Beyond
 
Steve Vinoski Rest And Reuse And Serendipity
Steve Vinoski Rest And Reuse And SerendipitySteve Vinoski Rest And Reuse And Serendipity
Steve Vinoski Rest And Reuse And Serendipity
 
Stefan Tilkov Soa Rest And The Web
Stefan Tilkov Soa Rest And The WebStefan Tilkov Soa Rest And The Web
Stefan Tilkov Soa Rest And The Web
 
Stefan Tilkov Pragmatic Intro To Rest
Stefan Tilkov Pragmatic Intro To RestStefan Tilkov Pragmatic Intro To Rest
Stefan Tilkov Pragmatic Intro To Rest
 
Rod Johnson Cathedral
Rod Johnson CathedralRod Johnson Cathedral
Rod Johnson Cathedral
 
Mike Stolz Dramatic Scalability
Mike Stolz Dramatic ScalabilityMike Stolz Dramatic Scalability
Mike Stolz Dramatic Scalability
 
Matt Youill Betfair
Matt Youill BetfairMatt Youill Betfair
Matt Youill Betfair
 
Pete Goodliffe A Tale Of Two Systems
Pete Goodliffe A Tale Of Two SystemsPete Goodliffe A Tale Of Two Systems
Pete Goodliffe A Tale Of Two Systems
 
Paul Fremantle Restful SOA Registry
Paul Fremantle Restful SOA RegistryPaul Fremantle Restful SOA Registry
Paul Fremantle Restful SOA Registry
 
Ola Bini Evolving The Java Platform
Ola Bini Evolving The Java PlatformOla Bini Evolving The Java Platform
Ola Bini Evolving The Java Platform
 
Neal Gafter Java Evolution
Neal Gafter Java EvolutionNeal Gafter Java Evolution
Neal Gafter Java Evolution
 

Kürzlich hochgeladen

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 

Kürzlich hochgeladen (20)

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 

Markus Voelter Textual DSLs

  • 1. Open Source Modeling Bernd Kolb Markus Voelter b.kolb@kolbware.de voelter@acm.org http://www.kolbware.de www.voelter.de
  • 2. Overview over Eclipse Modeling Intro to Textual DSLs Getting Started with Xtext Intro to Example Defining the Grammar Simple Editor Customization More Advanced Customization Processing the Models Summary © Bernd Kolb, Markus Voelter 2008
  • 3. Eclipse Modeling is the umbrella project for all things modeling that happen on the Eclipse platform: The Eclipse Modeling Project focuses on the evolution and promotion of model-based development technologies within the Eclipse community by providing a unified set of modeling frameworks, tooling, and standards implementations. Eclipse Modeling is not formally related to OMG, but implements several of their standards. It is fair to say that many leading edge modeling tools are hosted/developed at Eclipse Modeling. Everything Open Source under the Eclipse Public License © Bernd Kolb, Markus Voelter 2008
  • 4. The Eclipse Modeling Framework (EMF) serves as the foundation: It provides the Ecore Metametamodel and frameworks and tools around it for tasks such as Editing Transactions Validation Query Distribution/Persistence (CDO, Net4j, Teneo) © Bernd Kolb, Markus Voelter 2008
  • 5. The Graphical Modeling Framework (GMF) is used for building custom graphical editors based on meta models defined via EMF. It is currently in version 2.x Proven technology, used in many industrial-strength systems Based on Eclipse GEF The Textual Modeling Framework is used for building custom textual editors. Project is currently being set up Will be populated initially from oAW Xtext and INRIA TCS. © Bernd Kolb, Markus Voelter 2008
  • 6. UML 2.x: An implementation of the UML 2 meta model based on EMF UML 2 Tools: GMF editors for the UML 2 models OCL: APIs for OCL expression syntax for implementing queries and contraints. XSD Infoset: reference library that provides an API for use with any code that examines, creates or modifies W3C XML Schema. © Bernd Kolb, Markus Voelter 2008
  • 7. M2M (Model-to-Model) : delivers an extensible framework for model-to-model transformation languages. ATL: M2M language from INRIA QVT implementations M2T (Model-to-Text) : focuses on technologies for transforming models into text (code generation) JET : provides code generation framework & facilities that are used by EMF. Xpand: oAW’s code generation engine, to be part of M2T in the Ganymede release © Bernd Kolb, Markus Voelter 2008
  • 8. An integrated, tested, one-stop toolkit for MDSD Version 4.2.1 is current (4.3 beta for Xtext) Proven track record in various domains & project contexts Stable, productive and helpful developer, support and user communities www.openarchitectureware.org and eclipse.org/gmt/oaw Integration with Eclipse: Uses EMF as a basis Graphical editors based on GMF All editors and tooling based on Eclipse © Bernd Kolb, Markus Voelter 2008
  • 9. Version 5 currently under development: Migration of oAW Components to Eclipse Modeling proper: Xpand, Xtend, Check Model-to-Text (M2T) Xtext Textual Modeling Framework (TMF) Workflow Modeling Workflow Engine (MWE) More features New backend: a VM for M2T (and maybe more languages) Mixing Languages: Xpand, Xtend, Check in one file Xtext: Grammar Fragments and the stuff from the 4.3 beta Generic Tree/Form Editor, mixing editors Wizard Framework © Bernd Kolb, Markus Voelter 2008
  • 10. © Bernd Kolb, Markus Voelter 2008
  • 11. Overview over Eclipse Modeling Intro to Textual DSLs Getting Started with Xtext Intro to Example Defining the Grammar Simple Editor Customization More Advanced Customization Processing the Models Summary © Bernd Kolb, Markus Voelter 2008
  • 12. A Domain Specific Language (DSL) is a focused, processable language for describing a specific concern when building a system in a specific domain. The abstractions and notations used are tailored to the stakeholders who specify that particular concern. DSLs can be classified in many ways: Configuration vs. Customization Internal vs. External Graphical vs.textual We concentrate on external textual customization DSLs © Bernd Kolb, Markus Voelter 2008
  • 13. Aspects/Concerns/Viewpoints of a system can be modeled formally, independent of others (avoiding the legacy system problem) Formal models can be processed automatically by tools (analysis/check, transformation, generation/Interpretation) potentially leading to technology independence of implementation code More efficient development More reusable systems Better software quality © Bernd Kolb, Markus Voelter 2008
  • 14. A big barrier to adoption of DSLs is tool integration: how to integrate tool that stores its data in repositories? Textual DSLs completely removes this problem: Human-readable models are stored, versioned, searched and diffed like any other text file, integrating with CVS and SVN. Also, we know from working with traditional source code that text is a useful representation for even large systems. The big advantage compared to internal DSLs (in Ruby, Groovy) is that you can have DSL-specfic constraint checks and language support in editors This talk is about how leverage these advantages © Bernd Kolb, Markus Voelter 2008
  • 15. Sometimes it is useful to show things graphically: Dependency Structures, Temporal Aspects, Signal Flow In this case there are several alternatives: Visualize a subset of the model, e.g. using graphviz or prefuse (typically read-only, but superb auto layouting) Use different viewpoints, some of them using graphical editor (requires cross-refs between textual and graphical models) Edit the same model textually and graphically (textual format is used as the serialization format for the graphical editor; requires writeability of textual model!) © Bernd Kolb, Markus Voelter 2008
  • 16. Typically textual DSLs are build using one of the many parser generators (ANTLR, JavaCC, Lex/yacc), or even by a hand- writing a custom parser Parser: match text and try to create a parse tree Parser Generator: Generate a parser from a grammar © Bernd Kolb, Markus Voelter 2008
  • 17. Typically, transformed into an Abstract Syntax Tree (AST) No whitespace, reified nodes, often binary tree The AST can be considered the model The node types of the AST act as the metamodel Programs processing the “sentence” are typically written against the AST – they usually don’t care about the parse tree © Bernd Kolb, Markus Voelter 2008
  • 18. Writing a parser is non-trivial Using a parser generator makes it easier, but still not for everybody Also: out of the box, a parser generator only creates a matcher and/or a simplistic AST. You still need to Transform the model into a form that is easily processable Create an editor with syntax highlighting, code completion, etc. A lot of work! Only few people are willing to do that © Bernd Kolb, Markus Voelter 2008
  • 19. Overview over Eclipse Modeling Intro to Textual DSLs Getting Started with Xtext Intro to Example Defining the Grammar Simple Editor Customization More Advanced Customization Processing the Models Summary © Bernd Kolb, Markus Voelter 2008
  • 20. Xtext makes this much more feasible. Based on an EBNF grammar it generates ANTLR3-based parser EMF-based metamodel Eclipse editor with ▪ syntax highlighting ▪ code completion ▪ customizable outline ▪ code folding ▪ real-time constraint checking Xtext is part of openArchitectureWare / Eclipse Modeling © Bernd Kolb, Markus Voelter 2008
  • 21. © Bernd Kolb, Markus Voelter 2008
  • 22. Main Project Name: name of language project .editor project contains editor Language Name: package name of generated meta model DSL File Extension: file extension used to associate editor nsURI: full namespace URI of the generated meta model Base Package: all code will be in or below this package Code Gen Project: See last section of this presentation © Bernd Kolb, Markus Voelter 2008
  • 23. © Bernd Kolb, Markus Voelter 2008
  • 24. © Bernd Kolb, Markus Voelter 2008
  • 25. Overview over Eclipse Modeling Intro to Textual DSLs Getting Started with Xtext Intro to Example Defining the Grammar Simple Editor Customization More Advanced Customization Processing the Models Summary © Bernd Kolb, Markus Voelter 2008
  • 26. DSL for importing data: common P001 Voelter,Markus,*14.02.1974 A001 Grabenstrasse 4, 73033, Goeppingen problem in large enterprises V001 Futuristic Insurance,123456767 T001 49,07161,12334454 (e.g. hospitals) T001 49,171,8601869 S001 01.02.2004,IN25 S002 03.02.2004,CH52 Problem: read data like the one on S003 05.02.2004 S001 22.03.2005,NE02 the right into Java Beans S002 25.03.2005,NE04 S002 27.03.2005,NE05 S003 28.03.2004 Example is about patients, stays, P001 Somebody,Else,*23.05.1960 wards, insurance data A001 Ziegelaecker 11, 89520, Heidenheim V001 Some Other Insurance GmbH,124345 T001 49,07321,973344 Record Structure: S001 23.02.1999,IN25 S003 02.03.1999 <Type> <Fd1>,<Fd2>, … <Fdn> P001 Person,Else,*23.05.1960 A001 Ziegelaecker 11, 89520, Heidenheim V001 Some Other Insurance GmbH,124345 T001 49,07321,973344 Different Record Types have S001 23.02.1999,IN25 S003 02.03.1999 different fields © Bernd Kolb, Markus Voelter 2008
  • 27. Define data structures (à la Java Beans) Entities Attributes, References (:1, :n) Define parser Checks record order Instantiates data structures Maps fields to attributes Assembles references Backend: Generate Java code for beans as well as parser © Bernd Kolb, Markus Voelter 2008
  • 28. © Bernd Kolb, Markus Voelter 2008
  • 29. Overview over Eclipse Modeling Intro to Textual DSLs Getting Started with Xtext Intro to Example Defining the Grammar Simple Editor Customization More Advanced Customization Processing the Models Summary © Bernd Kolb, Markus Voelter 2008
  • 30. Grammar is defined in an EBNF-like format in the Xtext editor. The editor provides code completion and constraint checking for the grammars themselves Grammar is a collection of Rules. Rules start with their name followed by : and ending with ; © Bernd Kolb, Markus Voelter 2008
  • 31. The Xtext generator builds an EMF meta model from the grammar. The generated parser then instantiates the meta model from a model. Processing Xtext models is based on this meta model: all existing EMF tooling is suitable for processing. We’ll show a code gen template later © Bernd Kolb, Markus Voelter 2008
  • 32. Type Rule For each rule Xtext creates a class in the metamodel Each rule property results in a property of the metaclass String Rule String rules are parsed to a String. They are in effect custom lexer rules (recognizing string patterns) Enum Rule Limited set of alternatives; mapped to an Ecore enum Native Rule A lexer rule is directly interpreted by ANTLR; mapped to a String © Bernd Kolb, Markus Voelter 2008
  • 33. ID STRING INT © Bernd Kolb, Markus Voelter 2008
  • 34. Multiline comment Single line comment Whitespace The content of those rules is not transformed into the meta model © Bernd Kolb, Markus Voelter 2008
  • 35. Reference File Reference/Import: Xtext derives the default Linking information from here (more later) © Bernd Kolb, Markus Voelter 2008
  • 36. A type rule is mapped to a metaclass in the metamodel It may contain keywords (using string literal syntax) It also contains properties which will result in properties of the respective metaclass The property type is derived from the called rule There are different kinds There are different of properties property cardinalities = (single assign) ? (0..1) += (multiple assign/add) * (0..n) ?= (boolean assign) + (1..n) nothing (1..1) © Bernd Kolb, Markus Voelter 2008
  • 37. © Bernd Kolb, Markus Voelter 2008
  • 38. ImportSpec: Keywords: import, ext, =, { and } Expects one occurrence of DataSection rule assigned to the dataSection property DataStructure: Expects any number of Attribute or Reference occurences and assigns them to the attributes and references property, respectively © Bernd Kolb, Markus Voelter 2008
  • 39. By default, execution of rules results in a tree of data You can reference other elements via a reference rule In textual languages a reference has to be by name During linking, Xtext “dereferences” these by name-references Target’s name property is used here (customization: see later) Example: reference to a DataStructure. ID is is the lexer used for the referencing token © Bernd Kolb, Markus Voelter 2008
  • 40. A resource reference can be used to import another model file (typically of the same DSL) When customizing e.g. content assist, Xtext automatically provides a global view on the contents of all imported files © Bernd Kolb, Markus Voelter 2008
  • 41. A type rule can be abstract An abstract type rule is basically a collection of OR-ed alternatives: R1 | R2 | R3 Mapped to an abstract metaclass The or-ed alternatives become concrete subclasses Common properties of the alternatives are lifted into the abstract superclass The same rule can be or-ed in several abstract rules in which case the metaclass has several superclasses. © Bernd Kolb, Markus Voelter 2008
  • 42. Property is the abstract rule. Can be a Reference or an Attribute The DataStructure has a collection of Properties, referencing the abstract rule In the meta model, name has been be lifted, type has not © Bernd Kolb, Markus Voelter 2008
  • 43. String rules are lexer rules (i.e. used to define rules for custom character sequences) Declared via the String keyword String rules can be composed from other lexer rules. Other String rules Built-in lexer rules (e.g. ID) Native rules (see Xtext Reference Manual) © Bernd Kolb, Markus Voelter 2008
  • 44. A Enum Rule is used to define a limited set of defined alternatives It is mapped to an Enum in the metamodel It is declared via the Enum keyword and contains Enum Literals An Enum Literal has a token name and a string representation It can be used just like any other rule. © Bernd Kolb, Markus Voelter 2008
  • 45. A native rule contains a string which is passed to ANTLR without further processing it. It is typically used to define lexer rules that cannot be expressed using Xtext syntax E.g. whitespace-aware lexer rules, such as define custom comment syntax It is declared via the Native keyword The example introduces a comment (# till end of line) that is preserved into the model © Bernd Kolb, Markus Voelter 2008
  • 46. As a default, Xtext is used to define grammars and derive the meta model (the ecore file) from this grammar. You start with the concrete syntax. However, sometimes you want define a textual grammar for an existing meta model. To do this, you have to import the existing meta model: You can then associate the rules with an exsiting meta class: © Bernd Kolb, Markus Voelter 2008
  • 47. In case all of your rules refer to meta classes in existing meta models, you do not need any meta model generation: use preventMMGeneration One of the imported meta models may be imported without an alias. if rule name and meta class name are the same, you do not have to use the explicit meta class reference ([…]) © Bernd Kolb, Markus Voelter 2008
  • 48. Overview over Eclipse Modeling Intro to Textual DSLs Getting Started with Xtext Intro to Example Defining the Grammar Simple Editor Customization More Advanced Customization Processing the Models Summary © Bernd Kolb, Markus Voelter 2008
  • 49. OCL-like expression language used throughout oAW Can be used in constraint checks, model transformations and generators Add “methods” to meta types (Java calls are possible if necessary) path expressions, set operations, (some) higher order functions Polymorphism (multiple dispatch) Tool support (syntax highlighting, code completion, debugger) © Bernd Kolb, Markus Voelter 2008
  • 50. Uses the oAW Check language, based on Xtend Used to validate the static semantics of the models Report Warnings and Errors Based completely on the generated meta model, no concrete syntax hassles Tool support (syntax highlighting, code completion, …) © Bernd Kolb, Markus Voelter 2008
  • 51. The constraints defined for the language are evaluated in the editor on the fly. Constraints can also be checked as part of a work- flow that processes the models. © Bernd Kolb, Markus Voelter 2008
  • 52. Xtext supports the customization of the Outline View structure and icons/labels Labels and icons are changed by overriding label(…) and image(…) for your meta types. Actual image files (.gif) go into editor project’s icons directory © Bernd Kolb, Markus Voelter 2008
  • 53. Press Ctrl-O to show the outline as a pop-up You can then start typing to filter the visible elements by name. Pressing enter on any element will navigate to the respective element. © Bernd Kolb, Markus Voelter 2008
  • 54. Overview over Eclipse Modeling Intro to Textual DSLs Getting Started with Xtext Intro to Example Defining the Grammar Simple Editor Customization More Advanced Customization Processing the Models Summary © Bernd Kolb, Markus Voelter 2008
  • 55. By default, the structure of the outline view corresponds to the structure of the document. This default structure can be changed Additional structures (“viewpoints”) can be defined Default Types Viewpoint Viewpoint (shows data types and instances) © Bernd Kolb, Markus Voelter 2008
  • 56. © Bernd Kolb, Markus Voelter 2008
  • 57. Repeatedly pressing Ctrl-O shows the sequence of the various viewpoints in the popup. Ctrl-O once: Ctrl-O again: © Bernd Kolb, Markus Voelter 2008
  • 58. Content Assist / Code Completion is customized via overwriting certain extension functions: List[Proposal] complete<MyType>_<propName> (emf::Eobject ctx, String prefix) A Proposal consists of a label, an icon and the text to insert © Bernd Kolb, Markus Voelter 2008
  • 59. By default, if you use references in your DSL, you can use Go To Definition and Find References out of the box (it works cross-resource, see next section) © Bernd Kolb, Markus Voelter 2008
  • 60. To customize navigation, overwrite the following extension in the Navigation.ext file. (you do NOT have to do this for DSL references!) Find the Definition of a “string” in a context: emf::EObject findDeclaration(String s, emf::EObject ctx) Find the References of a “string” in a context: List[UIContentNode] findReferences(String s, emf::EObject ctx) Create the node for the list of results: create UIContentNode createNode(RuleName tr) © Bernd Kolb, Markus Voelter 2008
  • 61. It is possible to customize the font style for keywords (and only keywords) You can customize bold, italic, underline, strikethrough as well as foreground and background colors Override the fontstyle() extension for a specific meta class: Also override the delayContextSensitiveS tyling() extension and return the number of milliseconds of delay before the styling is done. Performance! A good number is 500. © Bernd Kolb, Markus Voelter 2008
  • 62. Often you want to integrate an Xtext textual model with other, (possibly non-Xtext) models For example, you want to “annotate” an existing UML or GMF model Or you want to define a number of Xtext languages separately and integrate the models via refereneces To do this, you first have to make the referencing Xtext grammar aware of the referenced meta model: At the moment the metamodel has to be deployed into the “surrounding” Eclipse to make the editor work correctly, but we are working on a solution to that. © Bernd Kolb, Markus Voelter 2008
  • 63. You can then reference “external” meta classes using the reference syntax introduced before: To import the actual data, use a Resource Reference (the URI grammar keyword). © Bernd Kolb, Markus Voelter 2008
  • 64. The Linker is used to wire different models In most cases the automatically created grammar-derived Linker is sufficient However it is possible to customize the behavior further: Override link(emf::EObject this) © Bernd Kolb, Markus Voelter 2008
  • 65. It is necessary in several cases to uniquely identify model elements by one of their properties. Used by Linker findReference/ findDeclaration … Default property is name To customize this, you can override the id() extension in the Extensions.ext file. © Bernd Kolb, Markus Voelter 2008
  • 66. Overview over Eclipse Modeling Intro to Textual DSLs Getting Started with Xtext Intro to Example Defining the Grammar Simple Editor Customization More Advanced Customization Processing the Models Summary © Bernd Kolb, Markus Voelter 2008
  • 67. Since Xtext instantiates Ecore metamodels, the models can be processed with any EMF tool – e.g. oAW. We will not explain those here. You can process them with oAW Workflows, use them like any other EMF resource and parse them into your own Java programs. You can check the Create Generator Project checkbox in the projection creation wizard to get a sample generator as a starting point. © Bernd Kolb, Markus Voelter 2008
  • 68. The only Xtext-specific aspect is using the generated parser. © Bernd Kolb, Markus Voelter 2008
  • 69. oAW’s Xpand template language is a powerful and well established code generation facility with nice tooling. You can easily traverse the model/meta model using the Xtend language (à la OCL) © Bernd Kolb, Markus Voelter 2008
  • 70. Use EMF’s native resource mechanism ▪ Xtext registers a ResourceFactory for the DSL’s file extension ▪ Simply pass the uri of the file you want to read to getResource() ▪ Note that you cannot write the model back! © Bernd Kolb, Markus Voelter 2008
  • 71. Use the generated parser This is what the ResourceFactory does internally with some default behavior for error handling Note how parse errors and constraint violations are handled. © Bernd Kolb, Markus Voelter 2008
  • 72. Typically you you are only working on the AST (ecore file) However, sometimes you need data from the parse tree Location of an element in the source file The text for a certain element The parse tree node at a certain offset Here is an example of how to get the location of an element in the source file: © Bernd Kolb, Markus Voelter 2008
  • 73. Overview over Eclipse Modeling Intro to Textual DSLs Getting Started with Xtext Intro to Example Defining the Grammar Simple Editor Customization More Advanced Customization Processing the Models Summary © Bernd Kolb, Markus Voelter 2008
  • 74. Designing good languages is not easy – and Xtext cannot simplify that process. However, building good tools for good languages is also not easy, and often a reason for not trying to build a language. Xtext makes that second challenge – the tooling – much much easier, thereby making language development a real practical option. Go ahead, give it a try! © Bernd Kolb, Markus Voelter 2008
  • 75. oAW Xtext is currently in the process of transitioning into the (relatively) new Textual Modeling Framework project. Together with INRIA’s TCS, it serves as the basis for TMF. See also http://www.eclipse.org/proposals/tmf/ http://wiki.eclipse.org/TMF © Bernd Kolb, Markus Voelter 2008
  • 76. It is not yet possible to specify custom action code in the parser This sometimes results in “ugly” meta models Becomes apparent when building expression languages [This is a plan item for TMF] © Bernd Kolb, Markus Voelter 2008
  • 77. www.openarchitectureware.org Specifically the reference docs contain more info about Xtext www.eclipse.org/modeling/ EMF and all the other related tooling Future home of Eclipse TMF Podcast: Software Engineering Radio www.se-radio.net Several Episodes on MDSD © Bernd Kolb, Markus Voelter 2008
  • 78. Thanks for your attention! Questions? Bernd Kolb Markus Voelter b.kolb@kolbware.de voelter@acm.org http://www.kolbware.de http://www.voelter.de © Bernd Kolb, Markus Voelter 2008