SlideShare a Scribd company logo
Getting the most out of
          Java
    Sebastian Zarnekow - Sven Efftinge
                  itemis
Topics
Topics
Construction of Data Objects
Topics
Construction of Data Objects
   Dependency Injection
Topics
Construction of Data Objects
   Dependency Injection
      Fluent Interfaces
Topics
Construction of Data Objects
   Dependency Injection
      Fluent Interfaces
   Polymorphic Dispatch
Topics
Construction of Data Objects
   Dependency Injection
      Fluent Interfaces
   Polymorphic Dispatch
   Annotation-based APIs
Java is getting old
Java is Ceremonial
Java is Ceremonial


public String greeting(final String name) {
  return "Hello "+name+"!";
}
Java is Ceremonial
Public visibility should be default


public String greeting(final String name) {
  return "Hello "+name+"!";
}
Java is Ceremonial


public String greeting(final String name) {
  return "Hello "+name+"!";
}
Java is Ceremonial
Local variables and arguments should
          be nal by default

 public String greeting(final String name) {
   return "Hello "+name+"!";
 }
Java is Ceremonial


public String greeting(final String name) {
  return "Hello "+name+"!";
}
Java is Ceremonial
  Return type can be inferred


public String greeting(final String name) {
  return "Hello "+name+"!";
}
Java is Ceremonial


public String greeting(final String name) {
  return "Hello "+name+"!";
}
Java is Ceremonial


public String greeting(final String name) :
  return "Hello "+name+"!";
}
Java is Ceremonial

public String greeting(final String name) {
  return "Hello "+name+"!";
}

greeting(String name) :
  "Hello "+name+"!";
Java’s Syntax is Inflexible
Java’s Syntax is Inflexible
All inx operators work for built-in types only.
Java’s Syntax is Inflexible
All inx operators work for built-in types only.


                2 / 4 * 13;
Java’s Syntax is Inflexible
All inx operators work for built-in types only.


                2 / 4 * 13;

      new BigDecimal(2)
        .divide(new BigDecimal(4))
        .multiply(new BigDecimal(13));
Java lacks Closures
Java lacks Closures
    Working with collections in Java (i.e. without closures):
	   public List<String> fourLetterWords(List<String> words) {
	   	 List<String> fourLetterWords = Lists.newArrayList();
	   	 for (String string : words) {
	   	 	 if (string.length()==4)
	   	 	 	 fourLetterWords.add(string);
	   	 }
	   	 return fourLetterWords;
	   }
Java lacks Closures
  Working with collections in Java (i.e. with closures):



	 public List<String> fourLetterWords(List<String> words) {
	 	 return words.select(#{s->s.length()==4});
	 }
...but Java is also great!
...but Java is also great!
•Lots of developers
...but Java is also great!
•Lots of developers
•JVM is a great platform
...but Java is also great!
•Lots of developers
•JVM is a great platform
•Big open-source community
...but Java is also great!
•Lots of developers
•JVM is a great platform
•Big open-source community
•Leading edge tooling
 (Eclipse, IntelliJ IDEA)
What can we do about the
  “not-so-nice things”
        in Java?
Object Instantiation
Object Categories
Object Categories
•   Short Living, Data Objects
Object Categories
•   Short Living, Data Objects
    •   Collections (ArrayList, HashSet, Iterator)
Object Categories
•   Short Living, Data Objects
    •   Collections (ArrayList, HashSet, Iterator)
    •   Immutable Objects (BigInteger, String)
Object Categories
•   Short Living, Data Objects
    •   Collections (ArrayList, HashSet, Iterator)
    •   Immutable Objects (BigInteger, String)
    •   Others (LayoutManager, Runnables)
Object Categories
•   Short Living, Data Objects
    •   Collections (ArrayList, HashSet, Iterator)
    •   Immutable Objects (BigInteger, String)
    •   Others (LayoutManager, Runnables)
•   Components
Object Categories
•   Short Living, Data Objects
    •   Collections (ArrayList, HashSet, Iterator)
    •   Immutable Objects (BigInteger, String)
    •   Others (LayoutManager, Runnables)
•   Components
    •   Singletons (ConnectionPool, Scheduler, ...)
Object Categories
•   Short Living, Data Objects
    •   Collections (ArrayList, HashSet, Iterator)
    •   Immutable Objects (BigInteger, String)
    •   Others (LayoutManager, Runnables)
•   Components
    •   Singletons (ConnectionPool, Scheduler, ...)
    •   Services (URLValidator, BillingService, ...)
Construction of
Data Objects
Construction of
    Data Objects

•   Convenience
Construction of
    Data Objects

•   Convenience
•   Readability
Construction of
    Data Objects

•   Convenience
•   Readability

Map<String,Foo> foos = new HashMap<String, Foo>();
Use Type Inference
Map<String,Foo> foos = new HashMap<String, Foo>();
Use Type Inference
Map<String,Foo> foos = new HashMap<String, Foo>();


Map<String,Foo> foos = Maps.newHashMap();
Use Type Inference
Map<String,Foo> foos = new HashMap<String, Foo>();


Map<String,Foo> foos = Maps.newHashMap();


public static <K, V> HashMap<K, V> newHashMap() {
  return new HashMap<K, V>();
}
Use Static Imports
Map<String,Foo> foos = Maps.newHashMap();
Use Static Imports
Map<String,Foo> foos = Maps.newHashMap();




Map<String,Foo> foos = newHashMap();
Use Static Imports
Map<String,Foo> foos = Maps.newHashMap();


import static com.google.common.collect.Maps.*;
...
Map<String,Foo> foos = newHashMap();
Use Var Args
List<String> names = newArrayList();
names.add("Foo");
names.add("Bar");
names.add("Baz");
Use Var Args
List<String> names = newArrayList();
names.add("Foo");
names.add("Bar");
names.add("Baz");


List<String> names = newArrayList("Foo","Bar","Baz");
Use Var Args
List<String> names = newArrayList();
names.add("Foo");
names.add("Bar");
names.add("Baz");


List<String> names = newArrayList("Foo","Bar","Baz");


public static <E> ArrayList<E> newArrayList(E... elements) {
   ...
}
Component Instantiation
 - Classical Approach -
Constructor Invocation
Constructor Invocation
 public class TwitterClient {
   void send(String message) {
     if (message.length() > 140) {
       Shortener shortener = new TinyUrlShortener();
       message = shortener.shorten(message);
     }
     if (message.length() <= 140) {
       Tweeter tweeter = new SmsTweeter();
       tweeter.send(message);
     }
   }
 }
Constructor Invocation

   Shortener shortener = new TinyUrlShortener();




   Tweeter tweeter = new SmsTweeter();
Constructor Invocation

• Strong Dependencies
• Not Testable
       Shortener shortener = new TinyUrlShortener();
       Tweeter tweeter = new SmsTweeter();
Component Instantiation
- Dependency Injection -
Constructor Parameters
Constructor Parameters
public class TwitterClient {
  private Shortener shortener; private Tweeter tweeter;
  public TwitterClient(Shortener shortener, Tweeter tweeter) {
    this.shortener = shortener;
    this.tweeter = tweeter;
  }
  void send(String message) {
    if (message.length() > 140) {
      message = shortener.shorten(message);
    }
    if (message.length() <= 140) {
      tweeter.send(message);
    }
  }
}
Constructor Parameters

// Initialize the component graph
Shortener shortener = new TinyUrlShortener();
Tweeter tweeter = new SmsTweeter();
TwitterClient client = new TwitterClient(shortener, tweeter);
// Do Something meaningful
client.send(“Hello World”);
Constructor Parameters
           ... Have Advantages
Constructor Parameters
                     ... Have Advantages

• Components Depend on Interfaces
Constructor Parameters
                     ... Have Advantages

• Components Depend on Interfaces
• Testable Code
Constructor Parameters
                       ... Have Advantages

• Components Depend on Interfaces
• Testable Code
• Dependencies are No Longer Burried in the
  Core of Your Application
Constructor Parameters
 ... Leave the Burden to the Client
Constructor Parameters
       ... Leave the Burden to the Client

HttpConnection http = new HttpConnection(“..”);
Constructor Parameters
       ... Leave the Burden to the Client

HttpConnection http = new HttpConnection(“..”);
SoapConnection soap = new SoapConnection(http);
Constructor Parameters
       ... Leave the Burden to the Client

HttpConnection http = new HttpConnection(“..”);
SoapConnection soap = new SoapConnection(http);
Shortener shortener = new TinyUrlShortener(soap);
Constructor Parameters
       ... Leave the Burden to the Client

HttpConnection http = new   HttpConnection(“..”);
SoapConnection soap = new   SoapConnection(http);
Shortener shortener = new   TinyUrlShortener(soap);
AndroidSmsSender sender =   new AndroidSmsSender();
Constructor Parameters
       ... Leave the Burden to the Client

HttpConnection http = new HttpConnection(“..”);
SoapConnection soap = new SoapConnection(http);
Shortener shortener = new TinyUrlShortener(soap);
AndroidSmsSender sender = new AndroidSmsSender();
Tweeter tweeter = new SmsTweeter(sender);
Constructor Parameters
       ... Leave the Burden to the Client

HttpConnection http = new HttpConnection(“..”);
SoapConnection soap = new SoapConnection(http);
Shortener shortener = new TinyUrlShortener(soap);
AndroidSmsSender sender = new AndroidSmsSender();
Tweeter tweeter = new SmsTweeter(sender);
TwitterClient client = new TwitterClient(shortener, tweeter);
Constructor Parameters
       ... Leave the Burden to the Client

HttpConnection http = new HttpConnection(“..”);
SoapConnection soap = new SoapConnection(http);
Shortener shortener = new TinyUrlShortener(soap);
AndroidSmsSender sender = new AndroidSmsSender();
Tweeter tweeter = new SmsTweeter(sender);
TwitterClient client = new TwitterClient(shortener, tweeter);
client.send(“Hello World”);
Constructor Parameters
                                             ... Revisited
public class TwitterClient {
  private Shortener shortener; private Tweeter tweeter;


    public TwitterClient(Shortener shortener, Tweeter tweeter) {
      this.shortener = shortener;
      this.tweeter = tweeter;
    }
    void send(String message) {
      ..
    }
}
Constructor Parameters
                                             ... Revisited
public class TwitterClient {
  private Shortener shortener; private Tweeter tweeter;
    @Inject
    public TwitterClient(Shortener shortener, Tweeter tweeter) {
      this.shortener = shortener;
      this.tweeter = tweeter;
    }
    void send(String message) {
      ..
    }
}
Constructor Parameters
                                           ... Revisited

// Initialize the component graph
Injector i = Guice.createInjector(new TweetModule());
// Obtain main component
TwitterClient client = i.getInstance(TwitterClient.class);
// Do something meaningful
client.send(“Hello Guice!”);
Remember This?
Encapsulated Dependencies


class TweetModule extends AbstractModule {
  protected void configure() {
    bind(Shortener.class).to(TinyUrlShortener.class);
    bind(Tweeter.class).to(SmsTweeter.class);
  }
}
Modern API
Design
Modern API
Design

        Easy To Use
Modern API
Design

        Easy To Use
         Consistent
Modern API
Design

         Easy To Use
          Consistent
        Hard To Misuse
Modern API
Design

         Easy To Use
          Consistent
        Hard To Misuse
        Easy To Read !
Half-caf venti
non-fat Latte to go.
Half-caf venti
non-fat Latte to go.
Fluent Interfaces


Half-caf venti
non-fat Latte to go.
Fluent Interfaces

CoffeeOrder order = new Latte();
order.setSize(Size.VENTI);
order.setCaffeine(Caffeine.HALF);
order.setMilk(MilkType.NONFAT);
order.setFoam(false);
Coffee coffee = order.prepare(true);
Fluent Interfaces

Coffee coffee = new Latte()
  .venti()
  .halfCaf()
  .nonFat()
  .prepare(TO_GO);
Fluent Interfaces

Chained Method-
Calls That Read Like
Natural Language
Fluent Interfaces

Chained Method-
Calls That Read Like
Natural Language


   http://www.wikihow.com/Order-at-Starbucks
Fluent Interfaces

StringBuilder builder = ..;
return builder
  .append(“The result is “)
  .append(result)
  .append(‘.’)
  .toString();
Fluent Interfaces
How To:
Fluent Interfaces
 How To:


1. Methods Modify Internal State and
Fluent Interfaces
 How To:


1. Methods Modify Internal State and
2. Return self or new Object
Fluent Interfaces
 How To:


1. Methods Modify Internal State and
2. Return self or new Object
3. Until Result is Returned
Fluent Interfaces
Examples: Guice Binder API




   bind(Service.class)
     .to(Implementation.class)
     .in(Scopes.REQUEST);
Fluent Interfaces
    Examples: EasyMock




LinkedList mocked = mock(LinkedList.class);
when(mocked.get(0)).thenReturn(“first”);
Fluent Interfaces
      Examples: Google Guava MapMaker

ConcurrentMap<Key, Value> map = new MapMaker()
       .softKeys()
       .weakValues()
       .expiration(30, MINUTES)
       .makeComputingMap(
           new Function<Key, Value>() {
             public Value apply(Key key) {
               return createExpensiveValue(key);
             }
           });
Fluent Interfaces
      Examples: Google Guava MapMaker
                With Closures
ConcurrentMap<Key, Value> map = new MapMaker()
       .softKeys()
       .weakValues()
       .expiration(30, MINUTES)
       .makeComputingMap(k|createExpensiveValue(k));
Visitor Pattern (GoF)


 ... separating an algorithm
from an object structure it
        operates on...
Polymorphic Dispatching
Polymorphic Dispatching


 Visitor visitor = new ExternalVisitor();
 visitor.visit(car);
 visitor.visit(bus);
 visitor.visit(engine);
 visitor.visit(wheel);
Polymorphic Dispatching

 class ExternalVisitor {
   String visit(Object o) {
     if (o instanceof Bus) {
       ..
     } else if (o instanceof Car) {
       ..
     } else if (o instanceof Engine) {
       ..
     } else ..
   }
 }
Polymorphic Dispatching

Dispatcher dispatcher = new Dispatcher(this, “doVisit”);
String visit(Object o) {
  return dispatcher.dispatch(o);
}


String   doVisit(Bus b) {return “Bus: ” + print(b.getParts());}
String   doVisit(Car c) {return “Car: ” + print(c.getParts());}
String   doVisit(Engine e) { ... }
String   doVisit(Collection<?> parts) { ... }
Polymorphic Dispatching

•   Non Invasive External Visitor
Polymorphic Dispatching

•   Non Invasive External Visitor
•   Handle Arbitrary Object Graphs
Polymorphic Dispatching

•   Non Invasive External Visitor
•   Handle Arbitrary Object Graphs
•   Eliminate if-instanceof-else Cascades
Polymorphic Dispatching

•   Non Invasive External Visitor
•   Handle Arbitrary Object Graphs
•   Eliminate if-instanceof-else Cascades
•   Dispatch According to Runtime Type of Arguments
    (Like switch-Statement on Types)
Annotation-based APIs
Annotation-based APIs
addAction(new AbstractAction(“Exit”) {
    {
      putValue(MNEMONIC_KEY, “E”);
      putValue(SHORT_DESCRIPTION, “Exit App”);
    }
    public void actionPerformed(ActionEvent e) {
      System.exit(0);
    }
});
Annotation-based APIs


@Action(“Exit”, mnemonic=”E”, desc=”Exit App”)
public void exit(ActionEvent e) {
  System.exit(0);
}
Annotation-based APIs
 Examples: Property Change Events



@PropertyChangeListener({“size”})
public void invalidateLayout(PropertyChangeEvent e) {
  ..
}
@PropertyChangeListener({“value”, “selectedItem”})
public void revalidate(PropertyChangeEvent e) {
  ..
}
Annotation-based APIs
 Examples: Validation

@Validate(OnSave, nullIsOk=true, property=”EMail”)
ValidationResult matchesPattern(String s) {
  if (!s.matches(PATTERN)) {
    return ValidationResult.createError(..);
  }
  return OK;
}
Annotation-based APIs

    •   More Concise Code
Annotation-based APIs

    •   More Concise Code
    •   Avoid Anonymous Classes
Annotation-based APIs

    •   More Concise Code
    •   Avoid Anonymous Classes
    •   Easier to Understand
Annotation-based APIs

    •   More Concise Code
    •   Avoid Anonymous Classes
    •   Easier to Understand
    •   Less Code to Maintain
Annotation-based APIs

    •   More Concise Code
    •   Avoid Anonymous Classes
    •   Easier to Understand
    •   Less Code to Maintain
    •   Method can be overwritten
        (Extensibility, Testability)
Recab
Recab
Construction of Data Objects
Recab
Construction of Data Objects
   Dependency Injection
Recab
Construction of Data Objects
   Dependency Injection
      Fluent Interfaces
Recab
Construction of Data Objects
   Dependency Injection
      Fluent Interfaces
   Polymorphic Dispatch
Recab
Construction of Data Objects
   Dependency Injection
      Fluent Interfaces
   Polymorphic Dispatch
   Annotation-based APIs
The Good News?

• One Day Java May Have
The Good News?

• One Day Java May Have
 • Closures (Java 8 - JSR 335)
The Good News?

• One Day Java May Have
 • Closures (Java 8 - JSR 335)
 • Improved Type Inference (Java 7 - JSR 334)
The Good News?

• One Day Java May Have
 • Closures (Java 8 - JSR 335)
 • Improved Type Inference (Java 7 - JSR 334)
 • ...
The Good News?

• One Day Java May Have
 • Closures (Java 8 - JSR 335)
 • Improved Type Inference (Java 7 - JSR 334)
 • ...
• Due 2011 & 2012
Thanks.

More Related Content

What's hot

Requery overview
Requery overviewRequery overview
Requery overview
Sunghyouk Bae
 
Design Patterns
Design PatternsDesign Patterns
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2KZepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2KThomas Fuchs
 
XQuery Design Patterns
XQuery Design PatternsXQuery Design Patterns
XQuery Design PatternsWilliam Candillon
 
Ajax tutorial
Ajax tutorialAjax tutorial
Ajax tutorialKat Roque
 
Using Xcore with Xtext
Using Xcore with XtextUsing Xcore with Xtext
Using Xcore with Xtext
Holger Schill
 
Scala coated JVM
Scala coated JVMScala coated JVM
Scala coated JVM
Stuart Roebuck
 
All about scala
All about scalaAll about scala
All about scala
Yardena Meymann
 
Scala in Practice
Scala in PracticeScala in Practice
Scala in Practice
Francesco Usai
 
Scala ActiveRecord
Scala ActiveRecordScala ActiveRecord
Scala ActiveRecordscalaconfjp
 
Alternatives of JPA/Hibernate
Alternatives of JPA/HibernateAlternatives of JPA/Hibernate
Alternatives of JPA/Hibernate
Sunghyouk Bae
 
Scala at HUJI PL Seminar 2008
Scala at HUJI PL Seminar 2008Scala at HUJI PL Seminar 2008
Scala at HUJI PL Seminar 2008Yardena Meymann
 
Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web Stack
GaryCoady
 
Spring data requery
Spring data requerySpring data requery
Spring data requery
Sunghyouk Bae
 
appengine java night #1
appengine java night #1appengine java night #1
appengine java night #1Shinichi Ogawa
 
Slick: Bringing Scala’s Powerful Features to Your Database Access
Slick: Bringing Scala’s Powerful Features to Your Database Access Slick: Bringing Scala’s Powerful Features to Your Database Access
Slick: Bringing Scala’s Powerful Features to Your Database Access
Rebecca Grenier
 
Scale up your thinking
Scale up your thinkingScale up your thinking
Scale up your thinking
Yardena Meymann
 
Kotlin @ Coupang Backend 2017
Kotlin @ Coupang Backend 2017Kotlin @ Coupang Backend 2017
Kotlin @ Coupang Backend 2017
Sunghyouk Bae
 
Kotlin @ Coupang Backed - JetBrains Day seoul 2018
Kotlin @ Coupang Backed - JetBrains Day seoul 2018Kotlin @ Coupang Backed - JetBrains Day seoul 2018
Kotlin @ Coupang Backed - JetBrains Day seoul 2018
Sunghyouk Bae
 

What's hot (20)

Requery overview
Requery overviewRequery overview
Requery overview
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2KZepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
 
XQuery Design Patterns
XQuery Design PatternsXQuery Design Patterns
XQuery Design Patterns
 
Ajax tutorial
Ajax tutorialAjax tutorial
Ajax tutorial
 
Using Xcore with Xtext
Using Xcore with XtextUsing Xcore with Xtext
Using Xcore with Xtext
 
Scala coated JVM
Scala coated JVMScala coated JVM
Scala coated JVM
 
Scala active record
Scala active recordScala active record
Scala active record
 
All about scala
All about scalaAll about scala
All about scala
 
Scala in Practice
Scala in PracticeScala in Practice
Scala in Practice
 
Scala ActiveRecord
Scala ActiveRecordScala ActiveRecord
Scala ActiveRecord
 
Alternatives of JPA/Hibernate
Alternatives of JPA/HibernateAlternatives of JPA/Hibernate
Alternatives of JPA/Hibernate
 
Scala at HUJI PL Seminar 2008
Scala at HUJI PL Seminar 2008Scala at HUJI PL Seminar 2008
Scala at HUJI PL Seminar 2008
 
Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web Stack
 
Spring data requery
Spring data requerySpring data requery
Spring data requery
 
appengine java night #1
appengine java night #1appengine java night #1
appengine java night #1
 
Slick: Bringing Scala’s Powerful Features to Your Database Access
Slick: Bringing Scala’s Powerful Features to Your Database Access Slick: Bringing Scala’s Powerful Features to Your Database Access
Slick: Bringing Scala’s Powerful Features to Your Database Access
 
Scale up your thinking
Scale up your thinkingScale up your thinking
Scale up your thinking
 
Kotlin @ Coupang Backend 2017
Kotlin @ Coupang Backend 2017Kotlin @ Coupang Backend 2017
Kotlin @ Coupang Backend 2017
 
Kotlin @ Coupang Backed - JetBrains Day seoul 2018
Kotlin @ Coupang Backed - JetBrains Day seoul 2018Kotlin @ Coupang Backed - JetBrains Day seoul 2018
Kotlin @ Coupang Backed - JetBrains Day seoul 2018
 

Viewers also liked

Happy New Year!
Happy New Year!Happy New Year!
Happy New Year!
Kim_Spence_49
 
2009 LA Film Festival
2009 LA Film Festival2009 LA Film Festival
2009 LA Film Festival
Kim_Spence_49
 
Domain Specific Languages (EclipseCon 2012)
Domain Specific Languages (EclipseCon 2012)Domain Specific Languages (EclipseCon 2012)
Domain Specific Languages (EclipseCon 2012)
Sven Efftinge
 
Film Independent's 2009 Spirit Awards
Film Independent's 2009 Spirit AwardsFilm Independent's 2009 Spirit Awards
Film Independent's 2009 Spirit Awards
Kim_Spence_49
 
Presentation To Cumbria Cim
Presentation To Cumbria CimPresentation To Cumbria Cim
Presentation To Cumbria Cim
Lakeland
 
Challenges In Dsl Design
Challenges In Dsl DesignChallenges In Dsl Design
Challenges In Dsl DesignSven Efftinge
 

Viewers also liked (8)

Happy New Year!
Happy New Year!Happy New Year!
Happy New Year!
 
Chromosomes
ChromosomesChromosomes
Chromosomes
 
2009 LA Film Festival
2009 LA Film Festival2009 LA Film Festival
2009 LA Film Festival
 
Domain Specific Languages (EclipseCon 2012)
Domain Specific Languages (EclipseCon 2012)Domain Specific Languages (EclipseCon 2012)
Domain Specific Languages (EclipseCon 2012)
 
Film Independent's 2009 Spirit Awards
Film Independent's 2009 Spirit AwardsFilm Independent's 2009 Spirit Awards
Film Independent's 2009 Spirit Awards
 
Xtext Webinar
Xtext WebinarXtext Webinar
Xtext Webinar
 
Presentation To Cumbria Cim
Presentation To Cumbria CimPresentation To Cumbria Cim
Presentation To Cumbria Cim
 
Challenges In Dsl Design
Challenges In Dsl DesignChallenges In Dsl Design
Challenges In Dsl Design
 

Similar to Getting the most out of Java [Nordic Coding-2010]

ASP.Net 5 and C# 6
ASP.Net 5 and C# 6ASP.Net 5 and C# 6
ASP.Net 5 and C# 6
Andy Butland
 
Android Automated Testing
Android Automated TestingAndroid Automated Testing
Android Automated Testing
roisagiv
 
"Javascript" por Tiago Rodrigues
"Javascript" por Tiago Rodrigues"Javascript" por Tiago Rodrigues
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on AndroidSven Haiges
 
Developing RESTful WebServices using Jersey
Developing RESTful WebServices using JerseyDeveloping RESTful WebServices using Jersey
Developing RESTful WebServices using Jerseyb_kathir
 
VelocityGraph Introduction
VelocityGraph IntroductionVelocityGraph Introduction
VelocityGraph Introduction
Mats Persson
 
Building a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to SpaceBuilding a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to Space
Maarten Balliauw
 
Annotation processing and code gen
Annotation processing and code genAnnotation processing and code gen
Annotation processing and code gen
koji lin
 
Property Wrappers or how Swift decided to become Java
Property Wrappers or how Swift decided to become JavaProperty Wrappers or how Swift decided to become Java
Property Wrappers or how Swift decided to become Java
Vincent Pradeilles
 
Life outside WO
Life outside WOLife outside WO
Life outside WOWO Community
 
OWASP Proxy
OWASP ProxyOWASP Proxy
OWASP Proxy
Security B-Sides
 
Lambda Chops - Recipes for Simpler, More Expressive Code
Lambda Chops - Recipes for Simpler, More Expressive CodeLambda Chops - Recipes for Simpler, More Expressive Code
Lambda Chops - Recipes for Simpler, More Expressive Code
Ian Robertson
 
Advance Java
Advance JavaAdvance Java
Advance Java
Vidyacenter
 
Data models in Angular 1 & 2
Data models in Angular 1 & 2Data models in Angular 1 & 2
Data models in Angular 1 & 2
Adam Klein
 
Refactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartRefactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartGabriele Lana
 
Painless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldPainless Persistence in a Disconnected World
Painless Persistence in a Disconnected World
Christian Melchior
 
Play ĂĄ la Rails
Play ĂĄ la RailsPlay ĂĄ la Rails
Play ĂĄ la Rails
Sebastian Nozzi
 
RIAs Done Right: Grails, Flex, and EXT GWT
RIAs Done Right: Grails, Flex, and EXT GWTRIAs Done Right: Grails, Flex, and EXT GWT
RIAs Done Right: Grails, Flex, and EXT GWT
Michael Galpin
 
Rich Internet Applications con JavaFX e NetBeans
Rich Internet Applications  con JavaFX e NetBeans Rich Internet Applications  con JavaFX e NetBeans
Rich Internet Applications con JavaFX e NetBeans Fabrizio Giudici
 

Similar to Getting the most out of Java [Nordic Coding-2010] (20)

ASP.Net 5 and C# 6
ASP.Net 5 and C# 6ASP.Net 5 and C# 6
ASP.Net 5 and C# 6
 
Android Automated Testing
Android Automated TestingAndroid Automated Testing
Android Automated Testing
 
"Javascript" por Tiago Rodrigues
"Javascript" por Tiago Rodrigues"Javascript" por Tiago Rodrigues
"Javascript" por Tiago Rodrigues
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
 
servlets
servletsservlets
servlets
 
Developing RESTful WebServices using Jersey
Developing RESTful WebServices using JerseyDeveloping RESTful WebServices using Jersey
Developing RESTful WebServices using Jersey
 
VelocityGraph Introduction
VelocityGraph IntroductionVelocityGraph Introduction
VelocityGraph Introduction
 
Building a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to SpaceBuilding a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to Space
 
Annotation processing and code gen
Annotation processing and code genAnnotation processing and code gen
Annotation processing and code gen
 
Property Wrappers or how Swift decided to become Java
Property Wrappers or how Swift decided to become JavaProperty Wrappers or how Swift decided to become Java
Property Wrappers or how Swift decided to become Java
 
Life outside WO
Life outside WOLife outside WO
Life outside WO
 
OWASP Proxy
OWASP ProxyOWASP Proxy
OWASP Proxy
 
Lambda Chops - Recipes for Simpler, More Expressive Code
Lambda Chops - Recipes for Simpler, More Expressive CodeLambda Chops - Recipes for Simpler, More Expressive Code
Lambda Chops - Recipes for Simpler, More Expressive Code
 
Advance Java
Advance JavaAdvance Java
Advance Java
 
Data models in Angular 1 & 2
Data models in Angular 1 & 2Data models in Angular 1 & 2
Data models in Angular 1 & 2
 
Refactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartRefactoring In Tdd The Missing Part
Refactoring In Tdd The Missing Part
 
Painless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldPainless Persistence in a Disconnected World
Painless Persistence in a Disconnected World
 
Play ĂĄ la Rails
Play ĂĄ la RailsPlay ĂĄ la Rails
Play ĂĄ la Rails
 
RIAs Done Right: Grails, Flex, and EXT GWT
RIAs Done Right: Grails, Flex, and EXT GWTRIAs Done Right: Grails, Flex, and EXT GWT
RIAs Done Right: Grails, Flex, and EXT GWT
 
Rich Internet Applications con JavaFX e NetBeans
Rich Internet Applications  con JavaFX e NetBeans Rich Internet Applications  con JavaFX e NetBeans
Rich Internet Applications con JavaFX e NetBeans
 

More from Sven Efftinge

Parsing Expression With Xtext
Parsing Expression With XtextParsing Expression With Xtext
Parsing Expression With Xtext
Sven Efftinge
 
Language Engineering With Xtext
Language Engineering With XtextLanguage Engineering With Xtext
Language Engineering With Xtext
Sven Efftinge
 
Future of Xtext
Future of XtextFuture of Xtext
Future of Xtext
Sven Efftinge
 
Auto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with XtendAuto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with Xtend
Sven Efftinge
 
Functional programming with Xtend
Functional programming with XtendFunctional programming with Xtend
Functional programming with Xtend
Sven Efftinge
 
Codegeneration With Xtend
Codegeneration With XtendCodegeneration With Xtend
Codegeneration With Xtend
Sven Efftinge
 
Gwt and Xtend
Gwt and XtendGwt and Xtend
Gwt and Xtend
Sven Efftinge
 
Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012
Sven Efftinge
 
Eclipse Xtend
Eclipse XtendEclipse Xtend
Eclipse Xtend
Sven Efftinge
 
This Is Not Your Father's Java
This Is Not Your Father's JavaThis Is Not Your Father's Java
This Is Not Your Father's Java
Sven Efftinge
 
Xtext at MDD Day 2010
Xtext at MDD Day 2010Xtext at MDD Day 2010
Xtext at MDD Day 2010Sven Efftinge
 
Dependency Injection for Eclipse developers
Dependency Injection for Eclipse developersDependency Injection for Eclipse developers
Dependency Injection for Eclipse developersSven Efftinge
 
Code Generation in Agile Projects
Code Generation in Agile ProjectsCode Generation in Agile Projects
Code Generation in Agile Projects
Sven Efftinge
 
Xtext Eclipse Con
Xtext Eclipse ConXtext Eclipse Con
Xtext Eclipse Con
Sven Efftinge
 
Generic Editor
Generic EditorGeneric Editor
Generic Editor
Sven Efftinge
 
Eclipse Banking Day
Eclipse Banking DayEclipse Banking Day
Eclipse Banking DaySven Efftinge
 
Bessere Softwareentwicklung (Itemis Wintercon)
Bessere Softwareentwicklung (Itemis Wintercon)Bessere Softwareentwicklung (Itemis Wintercon)
Bessere Softwareentwicklung (Itemis Wintercon)
Sven Efftinge
 
Domain-Specific Languages in der Praxis
Domain-Specific Languages in der PraxisDomain-Specific Languages in der Praxis
Domain-Specific Languages in der Praxis
Sven Efftinge
 
Xtext @ Profict Summer Camp
Xtext @ Profict Summer CampXtext @ Profict Summer Camp
Xtext @ Profict Summer CampSven Efftinge
 
Vermisste Sprachfeatures in Java (german)
Vermisste Sprachfeatures in Java (german)Vermisste Sprachfeatures in Java (german)
Vermisste Sprachfeatures in Java (german)Sven Efftinge
 

More from Sven Efftinge (20)

Parsing Expression With Xtext
Parsing Expression With XtextParsing Expression With Xtext
Parsing Expression With Xtext
 
Language Engineering With Xtext
Language Engineering With XtextLanguage Engineering With Xtext
Language Engineering With Xtext
 
Future of Xtext
Future of XtextFuture of Xtext
Future of Xtext
 
Auto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with XtendAuto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with Xtend
 
Functional programming with Xtend
Functional programming with XtendFunctional programming with Xtend
Functional programming with Xtend
 
Codegeneration With Xtend
Codegeneration With XtendCodegeneration With Xtend
Codegeneration With Xtend
 
Gwt and Xtend
Gwt and XtendGwt and Xtend
Gwt and Xtend
 
Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012
 
Eclipse Xtend
Eclipse XtendEclipse Xtend
Eclipse Xtend
 
This Is Not Your Father's Java
This Is Not Your Father's JavaThis Is Not Your Father's Java
This Is Not Your Father's Java
 
Xtext at MDD Day 2010
Xtext at MDD Day 2010Xtext at MDD Day 2010
Xtext at MDD Day 2010
 
Dependency Injection for Eclipse developers
Dependency Injection for Eclipse developersDependency Injection for Eclipse developers
Dependency Injection for Eclipse developers
 
Code Generation in Agile Projects
Code Generation in Agile ProjectsCode Generation in Agile Projects
Code Generation in Agile Projects
 
Xtext Eclipse Con
Xtext Eclipse ConXtext Eclipse Con
Xtext Eclipse Con
 
Generic Editor
Generic EditorGeneric Editor
Generic Editor
 
Eclipse Banking Day
Eclipse Banking DayEclipse Banking Day
Eclipse Banking Day
 
Bessere Softwareentwicklung (Itemis Wintercon)
Bessere Softwareentwicklung (Itemis Wintercon)Bessere Softwareentwicklung (Itemis Wintercon)
Bessere Softwareentwicklung (Itemis Wintercon)
 
Domain-Specific Languages in der Praxis
Domain-Specific Languages in der PraxisDomain-Specific Languages in der Praxis
Domain-Specific Languages in der Praxis
 
Xtext @ Profict Summer Camp
Xtext @ Profict Summer CampXtext @ Profict Summer Camp
Xtext @ Profict Summer Camp
 
Vermisste Sprachfeatures in Java (german)
Vermisste Sprachfeatures in Java (german)Vermisste Sprachfeatures in Java (german)
Vermisste Sprachfeatures in Java (german)
 

Recently uploaded

FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Jeffrey Haguewood
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
Bhaskar Mitra
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Tobias Schneck
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Product School
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
CatarinaPereira64715
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
Frank van Harmelen
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
Elena Simperl
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Ramesh Iyer
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 

Recently uploaded (20)

FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 

Getting the most out of Java [Nordic Coding-2010]

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n