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

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 VisageStephen Chin
 
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 Chinjaxconf
 
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 CookiesStephen Chin
 
Hibernate
Hibernate Hibernate
Hibernate Sunil OS
 
Scala for scripting
Scala for scriptingScala for scripting
Scala for scriptingmichid
 
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 2010Derek Chen-Becker
 
BASTA 2013: Custom OData Provider
BASTA 2013: Custom OData ProviderBASTA 2013: Custom OData Provider
BASTA 2013: Custom OData ProviderRainer Stropek
 
Demystifying Oak Search
Demystifying Oak SearchDemystifying Oak Search
Demystifying Oak SearchJustin Edelson
 
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パイプラインの統一scalaconfjp
 
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 ライブコーディングscalaconfjp
 
#36.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_재직자환급교육,실업자교육,국비지원교육, 자바교육,구...
#36.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_재직자환급교육,실업자교육,국비지원교육, 자바교육,구...#36.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_재직자환급교육,실업자교육,국비지원교육, 자바교육,구...
#36.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_재직자환급교육,실업자교육,국비지원교육, 자바교육,구...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
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...Eelco Visser
 
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 ScalaDerek Chen-Becker
 

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

JCrete Embedded Java Workshop
JCrete Embedded Java WorkshopJCrete Embedded Java Workshop
JCrete Embedded Java WorkshopStephen Chin
 
Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)Mary Had a Little λ (QCon)
Mary Had a Little λ (QCon)Stephen Chin
 
Raspberry Pi with Java (JJUG)
Raspberry Pi with Java (JJUG)Raspberry Pi with Java (JJUG)
Raspberry Pi with Java (JJUG)Stephen Chin
 
Confessions of a Former Agile Methodologist
Confessions of a Former Agile MethodologistConfessions of a Former Agile Methodologist
Confessions of a Former Agile MethodologistStephen Chin
 
Raspberry Pi à la GroovyFX
Raspberry Pi à la GroovyFXRaspberry Pi à la GroovyFX
Raspberry Pi à la GroovyFXStephen Chin
 
Internet of Things Magic Show
Internet of Things Magic ShowInternet of Things Magic Show
Internet of Things Magic ShowStephen Chin
 
Java on Raspberry Pi Lab
Java on Raspberry Pi LabJava on Raspberry Pi Lab
Java on Raspberry Pi LabStephen Chin
 
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 UndeadStephen Chin
 
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 VersionStephen Chin
 
Raspberry pi gaming 4 kids
Raspberry pi gaming 4 kidsRaspberry pi gaming 4 kids
Raspberry pi gaming 4 kidsStephen Chin
 
RetroPi Handheld Raspberry Pi Gaming Console
RetroPi Handheld Raspberry Pi Gaming ConsoleRetroPi Handheld Raspberry Pi Gaming Console
RetroPi Handheld Raspberry Pi Gaming ConsoleStephen Chin
 
OpenJFX on Android and Devices
OpenJFX on Android and DevicesOpenJFX on Android and Devices
OpenJFX on Android and DevicesStephen Chin
 
JavaFX on Mobile (by Johan Vos)
JavaFX on Mobile (by Johan Vos)JavaFX on Mobile (by Johan Vos)
JavaFX on Mobile (by Johan Vos)Stephen Chin
 
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)Raspberry Pi Gaming 4 Kids (Devoxx4Kids)
Raspberry Pi Gaming 4 Kids (Devoxx4Kids)Stephen Chin
 
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)Stephen Chin
 
Oracle IoT Kids Workshop
Oracle IoT Kids WorkshopOracle IoT Kids Workshop
Oracle IoT Kids WorkshopStephen Chin
 
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 LegosStephen Chin
 
Devoxx4Kids NAO Workshop
Devoxx4Kids NAO WorkshopDevoxx4Kids NAO Workshop
Devoxx4Kids NAO WorkshopStephen Chin
 
Devoxx4Kids Lego Workshop
Devoxx4Kids Lego WorkshopDevoxx4Kids Lego Workshop
Devoxx4Kids Lego WorkshopStephen 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

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 Chinjaxconf
 
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 WolffJAX London
 
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 appsPeter Pilgrim
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotationjavatwo2011
 
DataFX 8 (JavaOne 2014)
DataFX 8 (JavaOne 2014)DataFX 8 (JavaOne 2014)
DataFX 8 (JavaOne 2014)Hendrik Ebbers
 
Serverless archtiectures
Serverless archtiecturesServerless archtiectures
Serverless archtiecturesIegor Fadieiev
 
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 2007JUG Lausanne
 
NoSQL Endgame DevoxxUA Conference 2020
NoSQL Endgame DevoxxUA Conference 2020NoSQL Endgame DevoxxUA Conference 2020
NoSQL Endgame DevoxxUA Conference 2020Thodoris Bais
 
Soa development using javascript
Soa development using javascriptSoa development using javascript
Soa development using javascriptDsixE Inc
 
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 ClientsSalesforce Developers
 
Scala in a wild enterprise
Scala in a wild enterpriseScala in a wild enterprise
Scala in a wild enterpriseRafael Bagmanov
 
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 & XQueryWilliam Candillon
 
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 BrowserHoward Lewis Ship
 
JavaFX for Business Application Developers
JavaFX for Business Application DevelopersJavaFX for Business Application Developers
JavaFX for Business Application DevelopersMichael Heinrichs
 
Entity Framework: Nakov @ BFU Hackhaton 2015
Entity Framework: Nakov @ BFU Hackhaton 2015Entity Framework: Nakov @ BFU Hackhaton 2015
Entity Framework: Nakov @ BFU Hackhaton 2015Svetlin Nakov
 

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

DevOps Tools for Java Developers v2
DevOps Tools for Java Developers v2DevOps Tools for Java Developers v2
DevOps Tools for Java Developers v2Stephen Chin
 
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 CommunityStephen Chin
 
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 GuideStephen Chin
 
DevOps Tools for Java Developers
DevOps Tools for Java DevelopersDevOps Tools for Java Developers
DevOps Tools for Java DevelopersStephen Chin
 
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 LJCStephen Chin
 
LUGOD Raspberry Pi Hacking
LUGOD Raspberry Pi HackingLUGOD Raspberry Pi Hacking
LUGOD Raspberry Pi HackingStephen Chin
 
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 HTML5Stephen Chin
 
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)Stephen Chin
 
JavaFX 2 Using the Spring Framework
JavaFX 2 Using the Spring FrameworkJavaFX 2 Using the Spring Framework
JavaFX 2 Using the Spring FrameworkStephen 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

Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 

Dernier (20)

Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
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
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
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
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 

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??