SlideShare une entreprise Scribd logo
1  sur  39
Stephen Chin | Oracle      @steveonjava
       Andrew Phillips | jclouds   @jclouds




JavaFX and Scala in the Cloud
+
Heaven




Photo by Alberto Fernandez Fernandez
When This Architecture
        Makes Sense
• Data is mostly read-only
  – Transactional updates still require a server (but
    can be simpler/smaller)
• User's view of data is small to medium
  – Initial DB download of < 10K records is reasonable
  – Not total DB size, but subset of data visible to user


            Conference App has 3K
            large records and
            compresses to only 330KB
            DB size
Cloud Data Advantages
• Offline Operation
   – Once DB is cached, application works 100% offline
• Responsive Client Performance
   – All DB queries are fast and local
• High Availability & Scalability
   – 99.99% Availability
   – Easily scales up to 100s of requests per second

         But, with proper hashes scales up
         to millions of requests per second!
Cloud Data Advantages (continued)
• Insanely cheap server costs!
 Number of Users                Monthly Cost*
 3,000                          Free (S3 free tier)


 10,000                         $0.28


 100,000                        $3.84


 1,000,000                      $39.48


* For 330KB of hosted data in Amazon S3
Cloud Data Advantages (continued)
• Insanely cheap server costs!
 Number of Users                Monthly Cost*
 3,000                          Free (S3 free tier)


 10,000                         $0.28


 100,000                        $3.84


 1,000,000                      $39.48


* For 330KB of hosted data in Amazon S3
Cloud Data Advantages (continued)
• Insanely cheap server costs!
 Number of Users                Monthly Cost*
 3,000                          Free (S3 free tier)


 10,000                         $0.28


 100,000                        $3.84


 1,000,000                      $39.48


* For 330KB of hosted data in Amazon S3
Cloud Data Advantages (continued)
• Insanely cheap server costs!
 Number of Users                Monthly Cost*
 3,000                          Free (S3 free tier)


 10,000                         $0.28


 100,000                        $3.84


 1,000,000                      $39.48


* For 330KB of hosted data in Amazon S3
UI
JavaFX 2.0 Platform
Immersive Application Experience

Leverage your Java skills with modern
JavaFX APIs

• Cross-platform Animation, Video,
  Charting

• Integrate Java, JavaScript, and HTML5
  in the same application

• New graphics stack takes advantage of
  hardware acceleration for 2D and 3D
  applications

• Use your favorite IDE: NetBeans,
  Eclipse, IntelliJ, etc.
What is Scala
    2001                             2006
    • Scala Started                  • Scala v2.0




                      2003/2004                     2011
                      • Scala v1.0                  • Scala 2.9.2 (latest)




•   Started in 2001 by Martin Odersky
•   Compiles to Java bytecodes
•   Pure object-oriented language
•   Also a functional programming language
Why Scala?
• Shares many language features with
  JavaFX Script that make GUI
  programming easier:
  – Static Type Checking – Catch your errors
    at compile time
  – Closures – Wrap behavior and pass it by
    reference
  – Declarative – Express the UI by describing
    what it should look like
Why Scala?          (continued)


• Scala also supports Type Safe DSLs!
  – Implicit Conversions – type safe class
    extension
  – Operator Overloading – with standard
    precedence rules
  – DelayedInit / @specialized – advanced
    language features
Java vs. Scala DSL
public class JavaFXEEDemo extends Application {                                                                              object ConferenceUI extends JFXApp {
                                                                                                                               val model = ConferenceModel
    public static void main(String[] args) {                                                                                   stage = new Stage {
        launch(JavaFXEEDemo.class, args);                                                                                        width = 625
    }                                                                                                                            height = 700
                                                                                                                                 scene = new Scene(new StackPane()) {
    private SpeakerModel speakerModel = getInstance();                                                                             fill = "#fcfcfc"
    private TextField filter;                                                                                                      children = Seq(
    private ChoiceBox<String> items;                                                                                                 new VBox {
                                                                                                                                       children = Seq(
    @Override                                                                                                                            new ImageView {
    public void start(Stage primaryStage) {                                                                                                image = new Image(getClass().getResourceAsStream("JavaOneLogo.png"))
        primaryStage.setTitle("JavaOne Speaker List");                                                                                   },
        speakerModel.load();                                                                                                             new Rectangle {
        EventHandler<ActionEvent> filterAction = new EventHandler<ActionEvent>() {                                                         width = 625
            public void handle(ActionEvent event) {                                                                                        height = 50
                String field = items.selectionModelProperty().getValue().getSelectedItem();                                                fill = new LinearGradient(
                String text = filter.getText();                                                                                              endX = 0,
                speakerModel.filter(field, text);                                                                                            stops = Stops(WHITE, "#d0cbc8")
            }                                                                                                                              )
        };                                                                                                                               }
        primaryStage.setScene(SceneBuilder.create()                                                                                    )
            .width(625)                                                                                                              },
            .height(700)                                                                                                             new VBox {
            .fill(Color.web("#fcfcfc"))                                                                                                padding = Insets(100, 20, 20, 20)
            .root(StackPaneBuilder.create().children(                                                                                  spacing = 30
                // Background image and gradient                                                                                       children = Seq(
                VBoxBuilder.create().children(                                                                                           new HBox {
                    ImageViewBuilder.create()                                                                                              val filter = new TextField();




                          83 Lines                                                                                                                        88 Lines
                        .image(new Image(getClass().getResourceAsStream("JavaOneLogo.png"))).build(),                                      val items = new ChoiceBox[ruco.TextField[Speaker]]() {
                    RectangleBuilder.create().width(625).height(50).fill(LinearGradientBuilder.create().endX(0).stops(                       items = ObservableBuffer(Speaker.firstName, Speaker.lastName, Speaker.jobTitle, Speaker.company)
                        StopBuilder.create().color(Color.WHITE).offset(0).build(),                                                           converter = StringConverter.toStringConverter({s:ruco.TextField[Speaker] => s.name})
                        StopBuilder.create().color(Color.web("#d0cbc8")).offset(1).build()                                                 }
                    ).build()).build()                                                                                                     alignment = Pos.BASELINE_LEFT
                ).build(),                                                                                                                 spacing = 15
                // Foreground controls                                                                                                     children = Seq(
                VBoxBuilder.create()                                                                                                         items,




                          2622 Characters                                                                                                                 1452 Characters
                    .padding(new Insets(100, 20, 20, 20))                                                                                    filter,
                    .spacing(30)                                                                                                             new Button("Filter") {
                    .children(HBoxBuilder.create()                                                                                              onAction = { e:ActionEvent =>
                        .alignment(Pos.BASELINE_LEFT)                                                                                             model.filter(items.selectionModel().getSelectedItem(), filter.text())
                        .spacing(15)                                                                                                            }
                        .children(                                                                                                           },
                            items = new ChoiceBox<String>(                                                                                   new Button("Clear") {
                                FXCollections.observableArrayList(FIRST_NAME, LAST_NAME, JOB_TITLE, COMPANY)                                    onAction = { e:ActionEvent =>
                            ),                                                                                                                    filter.text = ""
                            filter = TextFieldBuilder.create().prefColumnCount(20).onAction(filterAction).build(),                                model.clear()
                            ButtonBuilder.create().text("Filter").onAction(filterAction).build(),                                               }
                            ButtonBuilder.create().text("Clear").onAction(new EventHandler<ActionEvent>() {                                  },
                                public void handle(ActionEvent event) {                                                                      new Button("Reload") {
                                    speakerModel.clearFilter();                                                                                 onAction = { e:ActionEvent =>
                                }                                                                                                                 filter.text = ""
                            }).build(),                                                                                                           model.load()
                            ButtonBuilder.create().text("Reload").onAction(new EventHandler<ActionEvent>() {                                    }
                                public void handle(ActionEvent event) {                                                                      }
                                    speakerModel.load();                                                                                   )
                                }                                                                                                          items.selectionModel().selectFirst()
                            }).build()                                                                                                   },
                        ).build(),                                                                                                       new TableView[Speaker](model.filteredSpeakers) {
                        TableViewBuilder.<Speaker>create().items(speakerModel.getFilteredData()).prefHeight(1000).columns(                 columns = Seq(
                            TableColumnBuilder.<Speaker, String>create()                                                                     new TableColumn[Speaker, String] {
                                .text(FIRST_NAME)                                                                                               text = "First Name"
                                .cellValueFactory(new PropertyValueFactory<Speaker, String>(FIRST_NAME_FIELD)).build(),                         converter = {_.firstName()}
                            TableColumnBuilder.<Speaker, String>create()                                                                     },
                                .text(LAST_NAME)                                                                                             new TableColumn[Speaker, String] {
                                .cellValueFactory(new PropertyValueFactory<Speaker, String>(LAST_NAME_FIELD)).build(),                          text = "Last Name"
                            TableColumnBuilder.<Speaker, String>create()                                                                        converter = {_.lastName()}
                                .text(JOB_TITLE)                                                                                             },
                                .prefWidth(200)                                                                                              new TableColumn[Speaker, String] {
                                .cellValueFactory(new PropertyValueFactory<Speaker, String>(JOB_TITLE_FIELD)).build(),                          text = "Job Title"
                            TableColumnBuilder.<Speaker, String>create()                                                                        converter = {_.jobTitle()}
                                .text(COMPANY)                                                                                                  prefWidth = 200
                                .prefWidth(212)                                                                                              },
                                .cellValueFactory(new PropertyValueFactory<Speaker, String>(COMPANY_FIELD)).build()                          new TableColumn[Speaker, String] {
                        ).build()                                                                                                               text = "Company"
                    ).build()                                                                                                                   converter = {_.company()}
                ).build()                                                                                                                       prefWidth = 212
            ).build()                                                                                                                        }
        );                                                                                                                                 )
        items.getSelectionModel().selectFirst();                                                                                           prefHeight = 1000
        primaryStage.show();                                                                                                             }
    }                                                                                                                                  )
}                                                                                                                                    }
                                                                                                                                   )
                                                                                                                                 }
                                                                                                                                 onCloseRequest = {_:Any => Platform.exit}
                                                                                                                               }
                                                                                                                             }
ScalaFX Application
object ConferenceUI extends JFXApp {
  val model = ConferenceModel
  stage = new Stage {
    width = 625
    height = 700
    scene = new Scene(new StackPane()) {
      fill = "#fcfcfc"
      children = Seq(
        // create background
        // create foreground
      )
    }
  }
}
Loading Images
new ImageView {
  image = new Image(
    getClass().getResourceAsStream(
      "JavaOneLogo.png"
    )
  )
}
Creating Buttons
new Button("Filter") {
  onAction = { e:ActionEvent =>
    model.filter(items.selectionModel().getSelectedItem(),
                 filter.text())
  }
}

new Button("Clear") {
  onAction = { e:ActionEvent =>
    filter.text = ""
    model.clear()
  }
}
ScalaFX Table Construction
new TableView[Speaker](model.filteredSpeakers) {
  columns = Seq(
    new TableColumn[Speaker, String] {
       text = "First Name"
       converter = {_.firstName()}
    },
    new TableColumn[Speaker, String] {
       text = "Last Name"
       converter = {_.lastName()}
    }
    …
  )
  prefHeight = 1000
}
DATABASE
By RRZEicons (Own work) [CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons
Java DB / Apache Derby
•   Embedded Database
•   Small Footprint (2.7MB)
•   Standards Based (Java, JDBC, SQL)
•   Extremely Easy to Configure
    – With JDBC 4 / SE 6, just drop in the jar!
Circumflex ORM
• Scala-based ORM
  (Object-Relational
  Mapping)
• SQL-based Query Syntax
• DSL for Domain Object Definition
• Lazy and Eager Fetch Strategies
Embedded DB Config
orm.connection.driver=
  org.apache.derby.jdbc.EmbeddedDriver
orm.connection.url=jdbc:derby:conferenceData
orm.connection.username=user1
orm.connection.password=user1
orm.defaultSchema=APP
Speaker Domain Object
class   Speaker extends Record[String, Speaker] {
  val   id = "id".VARCHAR(255).NOT_NULL
  val   company = "company".VARCHAR(255)
  val   firstName = "firstName".VARCHAR(255)
  val   jobTitle = "jobTitle".VARCHAR(255)
  val   lastName = "lastName".VARCHAR(255)

 def PRIMARY_KEY = id
 def relation = Speaker
}
object Speaker extends Speaker with Table[String,
Speaker]
Query the Database
def clear() {
  val speakers = Speaker.criteria.list()
  filteredSpeakers.setAll(speakers)
}

def filter(field: TextField[Speaker],
           filterString: String) {
  val speakers = Speaker.criteria.add(
    field LIKE "%" + filterString + "%").list()
  filteredSpeakers.setAll(speakers)
}
CLOUD
An OSSM Persistence Store

 •   On-demand
 •   Self-service
 •   Scalable
 •   Measurable


 • ™ Dave Nielsen, CloudCamp
@jclouds
open source
simple: feels like java (and clojure)unit testable
tested across multiple clouds
vibrant community
Portable APIs

      BlobStore   LoadBalancer

                   What do you
      Compute
                     want?

Provider-Specific Hooks
Embeddable

                  github jclouds-examples
Anatomy of a BlobStore Project

1.Create context
2.Get BlobStore API
3.Do stuff
4.Close context


@jclouds
jclouds modularity

APIs are software
focused Providers are
offering focused
API + location + defaults
= Provider
Cloud Access in Scala
val context = ContextBuilder.newBuilder("aws-s3")
  .credentials("identity", "secret")
  .buildView(classOf[BlobStoreContext])

def loadFromCloud(container:String,
                  resource:String):InputStream = {
  val blobStore = context.getBlobStore
  val blob = blobStore.getBlob(container, resource)
  blob.getPayload.getInput
}

def close() {
  context.close()
}
Why jclouds?
• Data Portability
  o APIs are not as compatible as they might appear
• Code Portability
  o Currently 33 cloud providers
• Enterprise-grade
  o Move petabytes of data
• Parallel operations without threading
  concerns
  o Outperforms many native SDKs
  o GAE compatible
  o Many tuning options

@jclouds
Why jclouds?
• OSGi compatible
• Clojure binding
• “Invented” many standard SDK features
  o e.g. sync/async APIs
• Tested!
  o “official” TCK for a number of cloud providers
  o also supports offline/local testing


@jclouds
Why jclouds?
• Location metadata
  o Don’t get locked in to a provider’s deployment policy
• Does the hard work so you don’t have to
  o Multi-part in native SDKs vs. .multipart() in
    jclouds
• Strong & active community
  o ~65 contributors, commercial support


@jclouds
Conference App Demo
Stephen Chin <stephen.chin@oracle.com> | Oracle @steveonjava
Andrew Phillips <andrew@jclouds.org> | jclouds @jclouds


                   Thank You!

Contenu connexe

Tendances

JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter PilgrimJavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association
 

Tendances (19)

Hacking JavaFX with Groovy, Clojure, Scala, and Visage
Hacking JavaFX with Groovy, Clojure, Scala, and VisageHacking JavaFX with Groovy, Clojure, Scala, and Visage
Hacking JavaFX with Groovy, Clojure, Scala, and Visage
 
JavaFX and Scala in the Cloud: Stephen Chin
JavaFX and Scala in the Cloud: Stephen ChinJavaFX and Scala in the Cloud: Stephen Chin
JavaFX and Scala in the Cloud: Stephen Chin
 
JavaFX and Scala - Like Milk and Cookies
JavaFX and Scala - Like Milk and CookiesJavaFX and Scala - Like Milk and Cookies
JavaFX and Scala - Like Milk and Cookies
 
55 New Features in Java 7
55 New Features in Java 755 New Features in Java 7
55 New Features in Java 7
 
Hibernate
Hibernate Hibernate
Hibernate
 
Scala for scripting
Scala for scriptingScala for scripting
Scala for scripting
 
Spring data requery
Spring data requerySpring data requery
Spring data requery
 
Starting with Scala : Frontier Developer's Meetup December 2010
Starting with Scala : Frontier Developer's Meetup December 2010Starting with Scala : Frontier Developer's Meetup December 2010
Starting with Scala : Frontier Developer's Meetup December 2010
 
BASTA 2013: Custom OData Provider
BASTA 2013: Custom OData ProviderBASTA 2013: Custom OData Provider
BASTA 2013: Custom OData Provider
 
Demystifying Oak Search
Demystifying Oak SearchDemystifying Oak Search
Demystifying Oak Search
 
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter PilgrimJavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
 
Building a Unified Data Pipline in Spark / Apache Sparkを用いたBig Dataパイプラインの統一
Building a Unified Data Pipline in Spark / Apache Sparkを用いたBig Dataパイプラインの統一Building a Unified Data Pipline in Spark / Apache Sparkを用いたBig Dataパイプラインの統一
Building a Unified Data Pipline in Spark / Apache Sparkを用いたBig Dataパイプラインの統一
 
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディングXitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
 
Oracle 10g
Oracle 10gOracle 10g
Oracle 10g
 
#36.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_재직자환급교육,실업자교육,국비지원교육, 자바교육,구...
#36.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_재직자환급교육,실업자교육,국비지원교육, 자바교육,구...#36.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_재직자환급교육,실업자교육,국비지원교육, 자바교육,구...
#36.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_재직자환급교육,실업자교육,국비지원교육, 자바교육,구...
 
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
 
Stepping Up : A Brief Intro to Scala
Stepping Up : A Brief Intro to ScalaStepping Up : A Brief Intro to Scala
Stepping Up : A Brief Intro to Scala
 
scala
scalascala
scala
 
Scala in practice
Scala in practiceScala in practice
Scala in practice
 

En vedette

Raspberry pi gaming 4 kids
Raspberry pi gaming 4 kidsRaspberry pi gaming 4 kids
Raspberry pi gaming 4 kids
Stephen Chin
 

En vedette (20)

JCrete Embedded Java Workshop
JCrete Embedded Java WorkshopJCrete Embedded Java Workshop
JCrete Embedded Java Workshop
 
Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)
 
Raspberry Pi with Java (JJUG)
Raspberry Pi with Java (JJUG)Raspberry Pi with Java (JJUG)
Raspberry Pi with Java (JJUG)
 
Confessions of a Former Agile Methodologist
Confessions of a Former Agile MethodologistConfessions of a Former Agile Methodologist
Confessions of a Former Agile Methodologist
 
Raspberry Pi à la GroovyFX
Raspberry Pi à la GroovyFXRaspberry Pi à la GroovyFX
Raspberry Pi à la GroovyFX
 
Internet of Things Magic Show
Internet of Things Magic ShowInternet of Things Magic Show
Internet of Things Magic Show
 
Java on Raspberry Pi Lab
Java on Raspberry Pi LabJava on Raspberry Pi Lab
Java on Raspberry Pi Lab
 
DukeScript
DukeScriptDukeScript
DukeScript
 
Zombie Time - JSR 310 for the Undead
Zombie Time - JSR 310 for the UndeadZombie Time - JSR 310 for the Undead
Zombie Time - JSR 310 for the Undead
 
Raspberry Pi Gaming 4 Kids - Dutch Version
Raspberry Pi Gaming 4 Kids - Dutch VersionRaspberry Pi Gaming 4 Kids - Dutch Version
Raspberry Pi Gaming 4 Kids - Dutch Version
 
Raspberry pi gaming 4 kids
Raspberry pi gaming 4 kidsRaspberry pi gaming 4 kids
Raspberry pi gaming 4 kids
 
RetroPi Handheld Raspberry Pi Gaming Console
RetroPi Handheld Raspberry Pi Gaming ConsoleRetroPi Handheld Raspberry Pi Gaming Console
RetroPi Handheld Raspberry Pi Gaming Console
 
OpenJFX on Android and Devices
OpenJFX on Android and DevicesOpenJFX on Android and Devices
OpenJFX on Android and Devices
 
JavaFX on Mobile (by Johan Vos)
JavaFX on Mobile (by Johan Vos)JavaFX on Mobile (by Johan Vos)
JavaFX on Mobile (by Johan Vos)
 
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
 
Confessions of a Former Agile Methodologist (JFrog Edition)
Confessions of a Former Agile Methodologist (JFrog Edition)Confessions of a Former Agile Methodologist (JFrog Edition)
Confessions of a Former Agile Methodologist (JFrog Edition)
 
Oracle IoT Kids Workshop
Oracle IoT Kids WorkshopOracle IoT Kids Workshop
Oracle IoT Kids Workshop
 
Java 8 for Tablets, Pis, and Legos
Java 8 for Tablets, Pis, and LegosJava 8 for Tablets, Pis, and Legos
Java 8 for Tablets, Pis, and Legos
 
Devoxx4Kids NAO Workshop
Devoxx4Kids NAO WorkshopDevoxx4Kids NAO Workshop
Devoxx4Kids NAO Workshop
 
Devoxx4Kids Lego Workshop
Devoxx4Kids Lego WorkshopDevoxx4Kids Lego Workshop
Devoxx4Kids Lego Workshop
 

Similaire à JavaFX and Scala in the Cloud

Soa development using javascript
Soa development using javascriptSoa development using javascript
Soa development using javascript
DsixE Inc
 

Similaire à JavaFX and Scala in the Cloud (20)

Hacking JavaFX with Groovy, Clojure, Scala, and Visage: Stephen Chin
Hacking JavaFX with Groovy, Clojure, Scala, and Visage: Stephen ChinHacking JavaFX with Groovy, Clojure, Scala, and Visage: Stephen Chin
Hacking JavaFX with Groovy, Clojure, Scala, and Visage: Stephen Chin
 
Spring Day | Spring and Scala | Eberhard Wolff
Spring Day | Spring and Scala | Eberhard WolffSpring Day | Spring and Scala | Eberhard Wolff
Spring Day | Spring and Scala | Eberhard Wolff
 
BOF2644 Developing Java EE 7 Scala apps
BOF2644 Developing Java EE 7 Scala appsBOF2644 Developing Java EE 7 Scala apps
BOF2644 Developing Java EE 7 Scala apps
 
Liferay (DXP) 7 Tech Meetup for Developers
Liferay (DXP) 7 Tech Meetup for DevelopersLiferay (DXP) 7 Tech Meetup for Developers
Liferay (DXP) 7 Tech Meetup for Developers
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotation
 
Scala and Spring
Scala and SpringScala and Spring
Scala and Spring
 
DataFX 8 (JavaOne 2014)
DataFX 8 (JavaOne 2014)DataFX 8 (JavaOne 2014)
DataFX 8 (JavaOne 2014)
 
Not your Grandma's XQuery
Not your Grandma's XQueryNot your Grandma's XQuery
Not your Grandma's XQuery
 
Serverless archtiectures
Serverless archtiecturesServerless archtiectures
Serverless archtiectures
 
Scripting with Java FX - Cédric Tabin - December 2007
Scripting with Java FX - Cédric Tabin - December 2007Scripting with Java FX - Cédric Tabin - December 2007
Scripting with Java FX - Cédric Tabin - December 2007
 
NoSQL Endgame DevoxxUA Conference 2020
NoSQL Endgame DevoxxUA Conference 2020NoSQL Endgame DevoxxUA Conference 2020
NoSQL Endgame DevoxxUA Conference 2020
 
Soa development using javascript
Soa development using javascriptSoa development using javascript
Soa development using javascript
 
Using the Tooling API to Generate Apex SOAP Web Service Clients
Using the Tooling API to Generate Apex SOAP Web Service ClientsUsing the Tooling API to Generate Apex SOAP Web Service Clients
Using the Tooling API to Generate Apex SOAP Web Service Clients
 
Dropwizard
DropwizardDropwizard
Dropwizard
 
Scala in a wild enterprise
Scala in a wild enterpriseScala in a wild enterprise
Scala in a wild enterprise
 
Cutting Edge Data Processing with PHP & XQuery
Cutting Edge Data Processing with PHP & XQueryCutting Edge Data Processing with PHP & XQuery
Cutting Edge Data Processing with PHP & XQuery
 
Backbone.js: Run your Application Inside The Browser
Backbone.js: Run your Application Inside The BrowserBackbone.js: Run your Application Inside The Browser
Backbone.js: Run your Application Inside The Browser
 
DataFX - JavaOne 2013
DataFX - JavaOne 2013DataFX - JavaOne 2013
DataFX - JavaOne 2013
 
JavaFX for Business Application Developers
JavaFX for Business Application DevelopersJavaFX for Business Application Developers
JavaFX for Business Application Developers
 
Entity Framework: Nakov @ BFU Hackhaton 2015
Entity Framework: Nakov @ BFU Hackhaton 2015Entity Framework: Nakov @ BFU Hackhaton 2015
Entity Framework: Nakov @ BFU Hackhaton 2015
 

Plus de Stephen Chin

Plus de Stephen Chin (9)

DevOps Tools for Java Developers v2
DevOps Tools for Java Developers v2DevOps Tools for Java Developers v2
DevOps Tools for Java Developers v2
 
10 Ways Everyone Can Support the Java Community
10 Ways Everyone Can Support the Java Community10 Ways Everyone Can Support the Java Community
10 Ways Everyone Can Support the Java Community
 
Java Clients and JavaFX: The Definitive Guide
Java Clients and JavaFX: The Definitive GuideJava Clients and JavaFX: The Definitive Guide
Java Clients and JavaFX: The Definitive Guide
 
DevOps Tools for Java Developers
DevOps Tools for Java DevelopersDevOps Tools for Java Developers
DevOps Tools for Java Developers
 
Java Clients and JavaFX - Presented to LJC
Java Clients and JavaFX - Presented to LJCJava Clients and JavaFX - Presented to LJC
Java Clients and JavaFX - Presented to LJC
 
LUGOD Raspberry Pi Hacking
LUGOD Raspberry Pi HackingLUGOD Raspberry Pi Hacking
LUGOD Raspberry Pi Hacking
 
Moving to the Client - JavaFX and HTML5
Moving to the Client - JavaFX and HTML5Moving to the Client - JavaFX and HTML5
Moving to the Client - JavaFX and HTML5
 
JavaFX 2 - A Java Developer's Guide (San Antonio JUG Version)
JavaFX 2 - A Java Developer's Guide (San Antonio JUG Version)JavaFX 2 - A Java Developer's Guide (San Antonio JUG Version)
JavaFX 2 - A Java Developer's Guide (San Antonio JUG Version)
 
JavaFX 2 Using the Spring Framework
JavaFX 2 Using the Spring FrameworkJavaFX 2 Using the Spring Framework
JavaFX 2 Using the Spring Framework
 

Dernier

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
vu2urc
 

Dernier (20)

Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
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...
 
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
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
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
 
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?
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
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
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
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
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
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
 
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...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 

JavaFX and Scala in the Cloud

  • 1. Stephen Chin | Oracle @steveonjava Andrew Phillips | jclouds @jclouds JavaFX and Scala in the Cloud
  • 2. +
  • 3. Heaven Photo by Alberto Fernandez Fernandez
  • 4.
  • 5.
  • 6. When This Architecture Makes Sense • Data is mostly read-only – Transactional updates still require a server (but can be simpler/smaller) • User's view of data is small to medium – Initial DB download of < 10K records is reasonable – Not total DB size, but subset of data visible to user Conference App has 3K large records and compresses to only 330KB DB size
  • 7. Cloud Data Advantages • Offline Operation – Once DB is cached, application works 100% offline • Responsive Client Performance – All DB queries are fast and local • High Availability & Scalability – 99.99% Availability – Easily scales up to 100s of requests per second But, with proper hashes scales up to millions of requests per second!
  • 8. Cloud Data Advantages (continued) • Insanely cheap server costs! Number of Users Monthly Cost* 3,000 Free (S3 free tier) 10,000 $0.28 100,000 $3.84 1,000,000 $39.48 * For 330KB of hosted data in Amazon S3
  • 9. Cloud Data Advantages (continued) • Insanely cheap server costs! Number of Users Monthly Cost* 3,000 Free (S3 free tier) 10,000 $0.28 100,000 $3.84 1,000,000 $39.48 * For 330KB of hosted data in Amazon S3
  • 10. Cloud Data Advantages (continued) • Insanely cheap server costs! Number of Users Monthly Cost* 3,000 Free (S3 free tier) 10,000 $0.28 100,000 $3.84 1,000,000 $39.48 * For 330KB of hosted data in Amazon S3
  • 11. Cloud Data Advantages (continued) • Insanely cheap server costs! Number of Users Monthly Cost* 3,000 Free (S3 free tier) 10,000 $0.28 100,000 $3.84 1,000,000 $39.48 * For 330KB of hosted data in Amazon S3
  • 12. UI
  • 13. JavaFX 2.0 Platform Immersive Application Experience Leverage your Java skills with modern JavaFX APIs • Cross-platform Animation, Video, Charting • Integrate Java, JavaScript, and HTML5 in the same application • New graphics stack takes advantage of hardware acceleration for 2D and 3D applications • Use your favorite IDE: NetBeans, Eclipse, IntelliJ, etc.
  • 14. What is Scala 2001 2006 • Scala Started • Scala v2.0 2003/2004 2011 • Scala v1.0 • Scala 2.9.2 (latest) • Started in 2001 by Martin Odersky • Compiles to Java bytecodes • Pure object-oriented language • Also a functional programming language
  • 15. Why Scala? • Shares many language features with JavaFX Script that make GUI programming easier: – Static Type Checking – Catch your errors at compile time – Closures – Wrap behavior and pass it by reference – Declarative – Express the UI by describing what it should look like
  • 16. Why Scala? (continued) • Scala also supports Type Safe DSLs! – Implicit Conversions – type safe class extension – Operator Overloading – with standard precedence rules – DelayedInit / @specialized – advanced language features
  • 17. Java vs. Scala DSL public class JavaFXEEDemo extends Application { object ConferenceUI extends JFXApp { val model = ConferenceModel public static void main(String[] args) { stage = new Stage { launch(JavaFXEEDemo.class, args); width = 625 } height = 700 scene = new Scene(new StackPane()) { private SpeakerModel speakerModel = getInstance(); fill = "#fcfcfc" private TextField filter; children = Seq( private ChoiceBox<String> items; new VBox { children = Seq( @Override new ImageView { public void start(Stage primaryStage) { image = new Image(getClass().getResourceAsStream("JavaOneLogo.png")) primaryStage.setTitle("JavaOne Speaker List"); }, speakerModel.load(); new Rectangle { EventHandler<ActionEvent> filterAction = new EventHandler<ActionEvent>() { width = 625 public void handle(ActionEvent event) { height = 50 String field = items.selectionModelProperty().getValue().getSelectedItem(); fill = new LinearGradient( String text = filter.getText(); endX = 0, speakerModel.filter(field, text); stops = Stops(WHITE, "#d0cbc8") } ) }; } primaryStage.setScene(SceneBuilder.create() ) .width(625) }, .height(700) new VBox { .fill(Color.web("#fcfcfc")) padding = Insets(100, 20, 20, 20) .root(StackPaneBuilder.create().children( spacing = 30 // Background image and gradient children = Seq( VBoxBuilder.create().children( new HBox { ImageViewBuilder.create() val filter = new TextField(); 83 Lines 88 Lines .image(new Image(getClass().getResourceAsStream("JavaOneLogo.png"))).build(), val items = new ChoiceBox[ruco.TextField[Speaker]]() { RectangleBuilder.create().width(625).height(50).fill(LinearGradientBuilder.create().endX(0).stops( items = ObservableBuffer(Speaker.firstName, Speaker.lastName, Speaker.jobTitle, Speaker.company) StopBuilder.create().color(Color.WHITE).offset(0).build(), converter = StringConverter.toStringConverter({s:ruco.TextField[Speaker] => s.name}) StopBuilder.create().color(Color.web("#d0cbc8")).offset(1).build() } ).build()).build() alignment = Pos.BASELINE_LEFT ).build(), spacing = 15 // Foreground controls children = Seq( VBoxBuilder.create() items, 2622 Characters 1452 Characters .padding(new Insets(100, 20, 20, 20)) filter, .spacing(30) new Button("Filter") { .children(HBoxBuilder.create() onAction = { e:ActionEvent => .alignment(Pos.BASELINE_LEFT) model.filter(items.selectionModel().getSelectedItem(), filter.text()) .spacing(15) } .children( }, items = new ChoiceBox<String>( new Button("Clear") { FXCollections.observableArrayList(FIRST_NAME, LAST_NAME, JOB_TITLE, COMPANY) onAction = { e:ActionEvent => ), filter.text = "" filter = TextFieldBuilder.create().prefColumnCount(20).onAction(filterAction).build(), model.clear() ButtonBuilder.create().text("Filter").onAction(filterAction).build(), } ButtonBuilder.create().text("Clear").onAction(new EventHandler<ActionEvent>() { }, public void handle(ActionEvent event) { new Button("Reload") { speakerModel.clearFilter(); onAction = { e:ActionEvent => } filter.text = "" }).build(), model.load() ButtonBuilder.create().text("Reload").onAction(new EventHandler<ActionEvent>() { } public void handle(ActionEvent event) { } speakerModel.load(); ) } items.selectionModel().selectFirst() }).build() }, ).build(), new TableView[Speaker](model.filteredSpeakers) { TableViewBuilder.<Speaker>create().items(speakerModel.getFilteredData()).prefHeight(1000).columns( columns = Seq( TableColumnBuilder.<Speaker, String>create() new TableColumn[Speaker, String] { .text(FIRST_NAME) text = "First Name" .cellValueFactory(new PropertyValueFactory<Speaker, String>(FIRST_NAME_FIELD)).build(), converter = {_.firstName()} TableColumnBuilder.<Speaker, String>create() }, .text(LAST_NAME) new TableColumn[Speaker, String] { .cellValueFactory(new PropertyValueFactory<Speaker, String>(LAST_NAME_FIELD)).build(), text = "Last Name" TableColumnBuilder.<Speaker, String>create() converter = {_.lastName()} .text(JOB_TITLE) }, .prefWidth(200) new TableColumn[Speaker, String] { .cellValueFactory(new PropertyValueFactory<Speaker, String>(JOB_TITLE_FIELD)).build(), text = "Job Title" TableColumnBuilder.<Speaker, String>create() converter = {_.jobTitle()} .text(COMPANY) prefWidth = 200 .prefWidth(212) }, .cellValueFactory(new PropertyValueFactory<Speaker, String>(COMPANY_FIELD)).build() new TableColumn[Speaker, String] { ).build() text = "Company" ).build() converter = {_.company()} ).build() prefWidth = 212 ).build() } ); ) items.getSelectionModel().selectFirst(); prefHeight = 1000 primaryStage.show(); } } ) } } ) } onCloseRequest = {_:Any => Platform.exit} } }
  • 18. ScalaFX Application object ConferenceUI extends JFXApp { val model = ConferenceModel stage = new Stage { width = 625 height = 700 scene = new Scene(new StackPane()) { fill = "#fcfcfc" children = Seq( // create background // create foreground ) } } }
  • 19. Loading Images new ImageView { image = new Image( getClass().getResourceAsStream( "JavaOneLogo.png" ) ) }
  • 20. Creating Buttons new Button("Filter") { onAction = { e:ActionEvent => model.filter(items.selectionModel().getSelectedItem(), filter.text()) } } new Button("Clear") { onAction = { e:ActionEvent => filter.text = "" model.clear() } }
  • 21. ScalaFX Table Construction new TableView[Speaker](model.filteredSpeakers) { columns = Seq( new TableColumn[Speaker, String] { text = "First Name" converter = {_.firstName()} }, new TableColumn[Speaker, String] { text = "Last Name" converter = {_.lastName()} } … ) prefHeight = 1000 }
  • 22. DATABASE By RRZEicons (Own work) [CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons
  • 23. Java DB / Apache Derby • Embedded Database • Small Footprint (2.7MB) • Standards Based (Java, JDBC, SQL) • Extremely Easy to Configure – With JDBC 4 / SE 6, just drop in the jar!
  • 24. Circumflex ORM • Scala-based ORM (Object-Relational Mapping) • SQL-based Query Syntax • DSL for Domain Object Definition • Lazy and Eager Fetch Strategies
  • 25. Embedded DB Config orm.connection.driver= org.apache.derby.jdbc.EmbeddedDriver orm.connection.url=jdbc:derby:conferenceData orm.connection.username=user1 orm.connection.password=user1 orm.defaultSchema=APP
  • 26. Speaker Domain Object class Speaker extends Record[String, Speaker] { val id = "id".VARCHAR(255).NOT_NULL val company = "company".VARCHAR(255) val firstName = "firstName".VARCHAR(255) val jobTitle = "jobTitle".VARCHAR(255) val lastName = "lastName".VARCHAR(255) def PRIMARY_KEY = id def relation = Speaker } object Speaker extends Speaker with Table[String, Speaker]
  • 27. Query the Database def clear() { val speakers = Speaker.criteria.list() filteredSpeakers.setAll(speakers) } def filter(field: TextField[Speaker], filterString: String) { val speakers = Speaker.criteria.add( field LIKE "%" + filterString + "%").list() filteredSpeakers.setAll(speakers) }
  • 28. CLOUD
  • 29. An OSSM Persistence Store • On-demand • Self-service • Scalable • Measurable • ™ Dave Nielsen, CloudCamp @jclouds
  • 30. open source simple: feels like java (and clojure)unit testable tested across multiple clouds vibrant community
  • 31. Portable APIs BlobStore LoadBalancer What do you Compute want? Provider-Specific Hooks Embeddable github jclouds-examples
  • 32. Anatomy of a BlobStore Project 1.Create context 2.Get BlobStore API 3.Do stuff 4.Close context @jclouds
  • 33. jclouds modularity APIs are software focused Providers are offering focused API + location + defaults = Provider
  • 34. Cloud Access in Scala val context = ContextBuilder.newBuilder("aws-s3") .credentials("identity", "secret") .buildView(classOf[BlobStoreContext]) def loadFromCloud(container:String, resource:String):InputStream = { val blobStore = context.getBlobStore val blob = blobStore.getBlob(container, resource) blob.getPayload.getInput } def close() { context.close() }
  • 35. Why jclouds? • Data Portability o APIs are not as compatible as they might appear • Code Portability o Currently 33 cloud providers • Enterprise-grade o Move petabytes of data • Parallel operations without threading concerns o Outperforms many native SDKs o GAE compatible o Many tuning options @jclouds
  • 36. Why jclouds? • OSGi compatible • Clojure binding • “Invented” many standard SDK features o e.g. sync/async APIs • Tested! o “official” TCK for a number of cloud providers o also supports offline/local testing @jclouds
  • 37. Why jclouds? • Location metadata o Don’t get locked in to a provider’s deployment policy • Does the hard work so you don’t have to o Multi-part in native SDKs vs. .multipart() in jclouds • Strong & active community o ~65 contributors, commercial support @jclouds
  • 39. Stephen Chin <stephen.chin@oracle.com> | Oracle @steveonjava Andrew Phillips <andrew@jclouds.org> | jclouds @jclouds Thank You!

Notes de l'éditeur

  1. Stage.add??