SlideShare une entreprise Scribd logo
1  sur  55
Télécharger pour lire hors ligne
Three languages
                         in thirty minutes or so...



                                                Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Three languages


    Who are we?
              • Fabio   Marinelli
                        •   Project manager @ Poste Italiane
                        •   twitter @fmarinelli
              • Sergio      Bossa
                        •   Senior Software Engineer @ Bwin Italy
                        •   (Micro-)Blogger @sbtourist
              • Massimiliano         Dessí
                        •   Architect/Developer @ Pronetics/Sourcesense
                        •   twitter @desmax74

                                                                      Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Three languages


    Why this challenge?
              More languages means:
                       • Right tool for your problems
                       • Different mindsets improve your problem solving
                            skills
                       • ... and it’s cool!




                                                                 Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Three languages


    How we do this? Let us talk about ...
                                                 Variables
                        Data structures
                                          Objects and Functions

                                 Flow control

                         Concurrency




                                                              Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript
                               Fabio Marinelli



                                           Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript - Variables

    • Loosely typed language

    • Types: number, string, boolean, function and object

    • Everything is an Object

    • Function scoped!!




                                                            Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript - Variables


    Declare and initialize:
    var a;

    var a = 1; //number

    var a = “string”;

    var a = ‘string’;

    var a = true || false;

    var a = {name:{first:”Fabio”, last:”M.”}, age:33};

    var a = function (text) { alert(text);};




                                                         Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript - Variables


      False values:
              • false
              •   null
              •   undefined
              •   empty string
              •   0
              •   NaN


                                                  Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript - Flow control


                       Is this C?
                       if (expression) { ... } else { ... }

                       while (expression) { ... }

                       do { ... } while (expression);

                       for (initialization; condition; increment) { ... }

                       for (name in object) { ... }

                       try { ... } catch (variable) { ... }




                                                  9                    Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript - Data structures


                       Javascript object is a mutable key-value map.
                       var object = {
                            “name”: value,
                            “other”: function (text) {
                                alert(text);
                            }
                       };

                       Values can be also a function. Everything is an object.


                                                     10                      Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript - Objects and functions

                       Functions are first class objects
                       var numbers = [1,5,2,12,7,9];
                       numbers.sort(function(a, b) {
                         return a-b;
                       });
                       //Output a sorted array
                       //1,2,5,7,9,12
                       numbers.sort(function(a, b) {
                         return b-a;
                       });
                       //Output a sorted array
                       //12,9,7,5,2,1




                                                 11              Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript - Objects and functions


                       Functions has access to context in which they are created
                       var counter = function (value) {
                            return {
                                 getAndInc : function () { return value++; }
                            };
                       };
                       var myCounter = counter(1);
                       alert(myCounter.getAndInc()); // Output 1
                       alert(myCounter.getAndInc()); // Output 2

                                              This is called closure

                                                      12                       Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript - Objects and functions

                       Let’s use the closure.
                       var Foo = function() {
                          var value = 1; //private to the function
                          this.inc = function() { ++value; };
                          this.print = function() { alert(value); };
                          return this;
                       };

                       var b = new Foo();
                       b.print(); //Output 1
                       b.inc();
                       b.print(); //Output 2

                       alert(b.value); //undefined




                                                 13                    Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript - Objects and functions

                       Javascript is a prototypal language
                       var Foo = function() {
                          this.value = 1; //public value
                          return this;
                       };
                       Foo.prototype.inc = function() {
                          ++this.value;
                       };
                       Foo.prototype.print = function() {
                          alert(this.value);
                       };
                       var b = new Foo();
                       b.print(); //Output 1
                       b.inc();
                       b.print(); //Output 2


                                                 14              Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript - Objects and functions

                       Developer can add responsibilities to any object
                       var b = 1;
                       Number.prototype.inc = function() {
                          return new Number(this+1);
                       };
                       Number.prototype.print = function() {
                          alert(this);
                       };
                       b.print();
                       //Output 1
                       b.inc().print();
                       //Output 2

                       Again, everything is an object.

                                                 15                       Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript - Concurrency



                       • Specification says nothing about concurrency
                       • Browser engine is single threaded
                       • Node.js offers event model concurrency




                                                16                      Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript - Concurrency



                                             Node.js
                       var sys = require("sys");
                       setTimeout(function () {
                         sys.puts("world");
                       }, 1000);
                       sys.puts("hello");


                           Evented model with non blocking I/O


                                               17            Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Javascript - Concurrency



                                            ...output
                       hello

                                         after 1 second
                       world




                                               18         Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure
                            Sergio Bossa



                                     Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Three Words


                                    Homoiconic
                                     Functional
                                      Dynamic



                                                  Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Basics


                       From “Programming Clojure”, by Stuart Halloway:
                            Form              Example(s)
                            Boolean           true, false
                            Character         a
                            Keyword           :tag, :doc
                            List              (1 2 3), (println “foo”)
                            Map               (:name “Bill”, :age 42)
                            Nil               nil
                            Number            1, 4.2
                            Set               #(:snap :crackle :pop)
                            String            “hello”
                            Symbol            user/foo, java.lang.String
                            Vector            [1 2 3]




                                                                           Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Functions (Definition)


                                         Standard
                       (defn my-fun [name] (println “Hello, ” name “!”))

                                        Anonymous I
                           (fn [name] (println “Hello, ” name “!”))

                                        Anonymous II
                                  #(println “Hello, ” %1 “!”)

                                                                           Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Functions (Invocation)


                                           Standard
                                       (my-fun “Sergio”)

                                          Anonymous I
                       ((fn [name] (println “Hello, ” name “!”)) “Sergio”)

                                         Anonymous II
                             (#(println “Hello, ” %1 “!”) “Sergio”)

                                                                             Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Variables (Basics)


                                   Namespace-scoped
                                (def my-variable “value”)

                                     Locally-scoped
                               (let [my-variable “value”])

                                           Use
                                  (println my-variable)

                                                             Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Variables (Destructuring)


                                             Definition
                       (defn my-fun [{name:name}] (println “Hello, ” name “!”))

                                            Invocation
                               (my-fun {:name “Sergio” :city “Rome”})

                                              Result
                                          => Hello, Sergio!

                                                                           Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Control Structures (Conditionals)


                                     Single choice
                                 (when (= n 0) “zero!”)

                                      Double choice
                             (if (= n 0) “zero!” “not zero!”)

                                  Multiple choice
      (cond (< n 0) ‘less than zero!’ (= n 0) ‘zero!’ :else ‘greater than zero!’)

                                                                      Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Control Structures (Loops)


                                              NO FOR LOOPS
                                                (almost)

                                            Explicit recursion
          (defn sum-a [array] (loop [a array s 0] (if (empty? a) s (recur (rest a) (+ s (first a))))))




                                                                                           Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Data Structures (Concepts)


                         Everything is (treated as) a Sequence

                                       Immutable

                                    (Possibly) Lazy




                                                                 Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Data structures (Basics)


                                               Essentials
                                      first, rest, cons, conj, into

                                          Comprehension
                                (for [m [1 2 3] n [4 5 6]] (+ m n))

                                              Map/Reduce
               (reduce #(merge-with + %1 %2) (map #(hash-map %1 1) [‘pippo’ ‘pluto’ ‘pluto’]))


                                                                                       Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Concurrency (Concepts)


                                    Explicit support

                                      Coordinated

                                     Uncoordinated

                                     Asynchronous



                                                          Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Concurrency (Coordinated)


                                     References (aka STM)
                       (def person (ref {:name ‘Sergio Bossa’ :age 28}))

                                             Get
                                           @person

                                            Update
                            (dosync (alter person conj {:age 29}))

                                                                           Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Concurrency (Uncoordinated)


                                             Atoms
                       (def person (atom {:name ‘Sergio Bossa’ :age 28}))

                                             Get
                                           @person

                                            Update
                                 (swap! person conj {:age 29})

                                                                        Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Concurrency (Asynchronous)


                                             Agents
                       (def person (agent {:name ‘Sergio Bossa’ :age 28}))

                                              Get
                                            @person

                                            Update
                                  (send person conj {:age 29})

                                                                         Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Clojure - Final Words


                                         KISS
                                      Powerful
                                    Concurrent


                                                 Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Scala
                          Massimiliano Dessì



                                         Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Scala variables


                       Scala is a hybrid functional/object-oriented language.
              Scala runs on the JVM and in- teroperates with all Java libraries.
                              Scala is statically typed with inference
                Powerful language for designing internal DSLs (DSL In Action)
                       Good for Event Driven Architecture/CQRS (Akka actors)



                                                                           Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Scala variables


    In functional programming, variables' values are immutable, as
        consequence of the mathematical orientation
    Immutability = no side effect
    No side effect = no shared state, better concurrency


    Scala allows you to decide whether a variable is immutable or not.


                                                                 Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Variable declaration


    An immutable “variable” it's declared with val keyword (Value Object),
       the reference can not be changed, but the object itself can be
       modified.
    val myArray[String]:Array= new Array(3)
    array: Array[String] = Array(null, null, null)

    A mutable “variable” it's declared with var keyword, You can assign a
       new value to a var as often as you want
    var price: Double = 100
    price = 10


                                                                 Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Control structures
     Function and      if, while, for, try, match         in the base syntax, higher-level control
     structure other than these in the libraries

    •Function
    Functional programming is based on the behavior of functions in the mathematical sense, with
        all the implications that starting point implies.
    (x: Int) => x + 1

    functions have no side effects
    When a function takes other functions as arguments or returns a function, it is called a higher-
       order function.
    List(1, 2, 3, 4, 5) reduceLeft { _ * _ }



                                                                                       Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Control structures
    • Closure
       var factor = 3
       val multiplier = (i:Int) => i * factor

    • For Comphresion
       val dogs = List("Lassie", "Rex", "Rin tin tin")
       for (dog <- dogs) println(dog)

    • Currying
       def add(x:Int) = (y:Int) => x + y
       println(add(2)(3))
       val addCurried = curried(add _)



                                                         Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Control structures
    • Composition
       val f = (x: Int) => x + 1
       val g = (x: Int) => x * 3.3
       val h = (x: Double) => x + 0.1
       val result = h compose g compose f



    • Pattern matching
       def factorial(i: BigInt): BigInt = i match {
            case _ if i == 1 => i
            case _ => i * factorial(i - 1)
       }




                                                      Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Control structures
    • Precondition
       class Rational(n: Int, d: Int) {
            require(d != 0) ….
       }

    • Filtering
       for (file <- filesHere if file.getName.endsWith(".scala"))

    • Folding and reducing
       List(1,2,3,4,5,6) reduceLeft(_ + _)
       List(1,2,3,4,5,6).foldLeft(10)(_ * _)




                                                              Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Specification
    class ElementSpec extends FlatSpec with ShouldMatchers {
         "A UniformElement" should
         "have a width equal to the passed value" in {
                 val ele = elem('x', 2, 3)
                 ele.width should be (2)
         }
         it should "have a height equal to the passed value" in {
                 val ele = elem('x', 2, 3)
                 ele.height should be (3)
         }
         it should "throw an IAE if passed a negative width" in {
                 evaluating {
                       elem('x', -2, 3) } should produce [IllegalArgumentException]
             }
    }


                                                                          Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Collection


    • Sequences (List, Array, ListBuffer) Immutable and mutable
    • Set and Maps Immutable and mutable
    • Tuples,          a tuple combines a fixed number of items together
            (1, "hello", Console)




                                                                           Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Concurrency
    • Actor and messages
    class McQueen extends Actor {
             loop {
                   react {
                             case "how many?" => {
                                 println("I've got " + mailboxSize.toString
                                 + " messages in my mailbox.")
                   }
         }
    }


    Every Actor has a mailbox in which messages sent to that Actor are
    queued
                                                                        Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Concurrency
    Actors can receive any sort of object as a message
    val fussyActor = actor {
         loop {
              receive {
                       case s: String => println("I got a String: " + s)
                       case i: Int => println("I got an Int: " + i.toString)
                       case _ => println("I have no idea what I just got.")
              }
         }
    }
    fussyActor ! "hi there"
    fussyActor ! 23
    fussyActor ! 3.33



                                                                           Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Concurrency
    A strategy to keep your Actor-based code asynchronous is the use of futures
    A future is a placeholder object for a value that hasn’t yet been returned from an asyn-
        chronous process
    the double-bang (!!) on Actor causes operation to return a future
    /**
            * Asynchronous message send. Send-and-receive eventually. Waits
            on a Future for the reply message.
            * If recevied within the Actor default timeout interval then it
            returns Some(result) and
            *          if a timeout
            * has occured None.
            */
         def !!(message: T): Box[R]




                                                                                       Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Trait
    Traits are like interfaces in Java, but they can also have method
       implementations and even fields.
    Objects are constructed by mixin composition
    class Animal trait HasLegs
    class Frog extends Animal with Philosophical with HasLegs {
         override def toString = "green"
    }




                                                                   Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Now ... what?!?!
                            Quick (really!) start



                                              Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Quickstart - Javascript


    • Download and install Nodejs.
    • Write your first example.js
        var sys = require("sys");
        setTimeout(function () { sys.puts("world"); }, 1000);
        sys.puts("hello");

    • Run example
        % node example.js

    • Or easily start node console by running
        % node-repl



                                                                Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Quickstart - Clojure

                                     Download JDK >= 5.x and Clojure jars
                  http://www.sun.com http://www.oracle.com http://clojure.org/downloads
                                  Download and install Leiningen build tool
                                http://github.com/technomancy/leiningen
                                             $> lein self-install
                                             Start new project
                                          $> lein new my-project
                                             Start project REPL
                                                $> lein repl

                                                                                     Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Quickstart - Scala

              The SBT can be used for Scala projects as Maven for Java Projects. SBT enable
              Dependency management. It support multiple project/subproject, and mixed project
              Scala/Java. It also has built-in support for generating Scaladocs and for testing with
              ScalaTest, Specs, and ScalaCheck.
              class Project(info: ProjectInfo) extends DefaultWebProject(info) with IdeaProject {

                  lazy val scalaTest = "org.scalatest" % "scalatest" % "1.3" % "test"

                  lazy val scalateCore = "org.fusesource.scalate" % "scalate-core" % "1.4.0"

                  lazy val casbah = "com.mongodb.casbah" %% "casbah" % "2.0.3"

                  lazy val salat = "com.novus" %% "salat" % "0.0.5"

                  lazy val junit = "junit" % "junit" % "4.8.2" % "test"

                  lazy val sfl4japi = "org.slf4j" % "slf4j-api" % "1.6.1" % "runtime"

                  lazy val logback = "ch.qos.logback" % "logback-classic" % "0.9.27"

                val scalaTools = "Scala Tools Repository snapshot" at "http://nexus.scala-tools.org/content/
              repositories/public/"

              }




                                                                                                        Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
Quickstart - Scala

              1) Download JDK >= 5.x (and set the env vars) http://www.oracle.com
              2) Download Scala installer jar http://www.scala-lang.org/downloads
              and set the environment $SCALA_HOME (ie: /usr/local/share/scala) and
              $PATH:$SCALA_HOME/bin
              3) Use scala with
              -shell
              -Intellij idea community with scala plugin
              - eclipse with scala plugin



                                                                                     Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
References

                               Bossa - Dessì - Marinelli
venerdì 4 marzo 2011
References

              • Javascript
              •   Douglas Crockford (Javascript the good parts) http://www.crockford.com/
              •   Nodejs http://nodejs.org/
              •   John Resig (JQuery, Pro Javascript and Javascript secrets books) http://ejohn.org/


              • Clojure
              •   Clojure Web Site: http://clojure.org
              •   Clojure Online Docs: http://clojuredocs.org/
              •   Programming Clojure Book: http://pragprog.com/titles/shcloj/programming-clojure


              • Scala
              •   Scala site : http://www.scala-lang.org
              •   Scala docs: http://www.scala-lang.org/node/197
              •   Scala Books : http://www.scala-lang.org/node/959




                                                                                                       Bossa - Dessì - Marinelli
venerdì 4 marzo 2011

Contenu connexe

Tendances

Java Persistence API
Java Persistence APIJava Persistence API
Java Persistence APIIlio Catallo
 
DISE - Windows Based Application Development in Java
DISE - Windows Based Application Development in JavaDISE - Windows Based Application Development in Java
DISE - Windows Based Application Development in JavaRasan Samarasinghe
 
Clean code - Agile Software Craftsmanship
Clean code - Agile Software CraftsmanshipClean code - Agile Software Craftsmanship
Clean code - Agile Software CraftsmanshipYukti Kaura
 
14.jun.2012
14.jun.201214.jun.2012
14.jun.2012Tech_MX
 
pointers,virtual functions and polymorphism
pointers,virtual functions and polymorphismpointers,virtual functions and polymorphism
pointers,virtual functions and polymorphismrattaj
 
Sdtl manual
Sdtl manualSdtl manual
Sdtl manualqaz8989
 

Tendances (8)

Java Persistence API
Java Persistence APIJava Persistence API
Java Persistence API
 
DISE - Windows Based Application Development in Java
DISE - Windows Based Application Development in JavaDISE - Windows Based Application Development in Java
DISE - Windows Based Application Development in Java
 
Clean code - Agile Software Craftsmanship
Clean code - Agile Software CraftsmanshipClean code - Agile Software Craftsmanship
Clean code - Agile Software Craftsmanship
 
14.jun.2012
14.jun.201214.jun.2012
14.jun.2012
 
04 variables
04 variables04 variables
04 variables
 
pointers,virtual functions and polymorphism
pointers,virtual functions and polymorphismpointers,virtual functions and polymorphism
pointers,virtual functions and polymorphism
 
Sdtl manual
Sdtl manualSdtl manual
Sdtl manual
 
JavaYDL17
JavaYDL17JavaYDL17
JavaYDL17
 

En vedette

Escape From Amazon: Tips/Techniques for Reducing AWS Dependencies
Escape From Amazon: Tips/Techniques for Reducing AWS DependenciesEscape From Amazon: Tips/Techniques for Reducing AWS Dependencies
Escape From Amazon: Tips/Techniques for Reducing AWS DependenciesSoam Acharya
 
May 2010 - Infinispan
May 2010 - InfinispanMay 2010 - Infinispan
May 2010 - InfinispanJBug Italy
 
May 2010 - Hibernate search
May 2010 - Hibernate searchMay 2010 - Hibernate search
May 2010 - Hibernate searchJBug Italy
 
Camel and JBoss
Camel and JBossCamel and JBoss
Camel and JBossJBug Italy
 
Embedding social media to effectively support OU learning with Eric Stoller
Embedding social media to effectively support OU learning with Eric StollerEmbedding social media to effectively support OU learning with Eric Stoller
Embedding social media to effectively support OU learning with Eric StollerOpen University
 
JBoss Wise: breaking barriers to WS testing
JBoss Wise: breaking barriers to WS testingJBoss Wise: breaking barriers to WS testing
JBoss Wise: breaking barriers to WS testingJBug Italy
 

En vedette (8)

Escape From Amazon: Tips/Techniques for Reducing AWS Dependencies
Escape From Amazon: Tips/Techniques for Reducing AWS DependenciesEscape From Amazon: Tips/Techniques for Reducing AWS Dependencies
Escape From Amazon: Tips/Techniques for Reducing AWS Dependencies
 
MongoDB dessi-codemotion
MongoDB dessi-codemotionMongoDB dessi-codemotion
MongoDB dessi-codemotion
 
RESTEasy
RESTEasyRESTEasy
RESTEasy
 
May 2010 - Infinispan
May 2010 - InfinispanMay 2010 - Infinispan
May 2010 - Infinispan
 
May 2010 - Hibernate search
May 2010 - Hibernate searchMay 2010 - Hibernate search
May 2010 - Hibernate search
 
Camel and JBoss
Camel and JBossCamel and JBoss
Camel and JBoss
 
Embedding social media to effectively support OU learning with Eric Stoller
Embedding social media to effectively support OU learning with Eric StollerEmbedding social media to effectively support OU learning with Eric Stoller
Embedding social media to effectively support OU learning with Eric Stoller
 
JBoss Wise: breaking barriers to WS testing
JBoss Wise: breaking barriers to WS testingJBoss Wise: breaking barriers to WS testing
JBoss Wise: breaking barriers to WS testing
 

Plus de Massimiliano Dessì

When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...Massimiliano Dessì
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Massimiliano Dessì
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudMassimiliano Dessì
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineMassimiliano Dessì
 
Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMMassimiliano Dessì
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Massimiliano Dessì
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCMassimiliano Dessì
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayMassimiliano Dessì
 
Why we cannot ignore functional programming
Why we cannot ignore functional programmingWhy we cannot ignore functional programming
Why we cannot ignore functional programmingMassimiliano Dessì
 
Jaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesJaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesMassimiliano Dessì
 

Plus de Massimiliano Dessì (20)

Code One 2018 maven
Code One 2018   mavenCode One 2018   maven
Code One 2018 maven
 
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
 
Hacking Maven Linux day 2017
Hacking Maven Linux day 2017Hacking Maven Linux day 2017
Hacking Maven Linux day 2017
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloud
 
Docker dDessi november 2015
Docker dDessi november 2015Docker dDessi november 2015
Docker dDessi november 2015
 
Docker linuxday 2015
Docker linuxday 2015Docker linuxday 2015
Docker linuxday 2015
 
Openshift linuxday 2014
Openshift linuxday 2014Openshift linuxday 2014
Openshift linuxday 2014
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community Online
 
Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVM
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVC
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_spray
 
Why we cannot ignore functional programming
Why we cannot ignore functional programmingWhy we cannot ignore functional programming
Why we cannot ignore functional programming
 
Scala linux day 2012
Scala linux day 2012 Scala linux day 2012
Scala linux day 2012
 
MongoDB Webtech conference 2010
MongoDB Webtech conference 2010MongoDB Webtech conference 2010
MongoDB Webtech conference 2010
 
Spring Roo Internals Javaday IV
Spring Roo Internals Javaday IVSpring Roo Internals Javaday IV
Spring Roo Internals Javaday IV
 
Spring Roo JaxItalia09
Spring Roo JaxItalia09Spring Roo JaxItalia09
Spring Roo JaxItalia09
 
Jaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesJaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best Practices
 
Spring3.0 JaxItalia09
Spring3.0 JaxItalia09Spring3.0 JaxItalia09
Spring3.0 JaxItalia09
 

Dernier

How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integrationmarketing932765
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesManik S Magar
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 

Dernier (20)

How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 

Three languages in thirty minutes

  • 1. Three languages in thirty minutes or so... Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 2. Three languages Who are we? • Fabio Marinelli • Project manager @ Poste Italiane • twitter @fmarinelli • Sergio Bossa • Senior Software Engineer @ Bwin Italy • (Micro-)Blogger @sbtourist • Massimiliano Dessí • Architect/Developer @ Pronetics/Sourcesense • twitter @desmax74 Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 3. Three languages Why this challenge? More languages means: • Right tool for your problems • Different mindsets improve your problem solving skills • ... and it’s cool! Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 4. Three languages How we do this? Let us talk about ... Variables Data structures Objects and Functions Flow control Concurrency Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 5. Javascript Fabio Marinelli Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 6. Javascript - Variables • Loosely typed language • Types: number, string, boolean, function and object • Everything is an Object • Function scoped!! Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 7. Javascript - Variables Declare and initialize: var a; var a = 1; //number var a = “string”; var a = ‘string’; var a = true || false; var a = {name:{first:”Fabio”, last:”M.”}, age:33}; var a = function (text) { alert(text);}; Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 8. Javascript - Variables False values: • false • null • undefined • empty string • 0 • NaN Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 9. Javascript - Flow control Is this C? if (expression) { ... } else { ... } while (expression) { ... } do { ... } while (expression); for (initialization; condition; increment) { ... } for (name in object) { ... } try { ... } catch (variable) { ... } 9 Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 10. Javascript - Data structures Javascript object is a mutable key-value map. var object = { “name”: value, “other”: function (text) { alert(text); } }; Values can be also a function. Everything is an object. 10 Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 11. Javascript - Objects and functions Functions are first class objects var numbers = [1,5,2,12,7,9]; numbers.sort(function(a, b) { return a-b; }); //Output a sorted array //1,2,5,7,9,12 numbers.sort(function(a, b) { return b-a; }); //Output a sorted array //12,9,7,5,2,1 11 Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 12. Javascript - Objects and functions Functions has access to context in which they are created var counter = function (value) { return { getAndInc : function () { return value++; } }; }; var myCounter = counter(1); alert(myCounter.getAndInc()); // Output 1 alert(myCounter.getAndInc()); // Output 2 This is called closure 12 Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 13. Javascript - Objects and functions Let’s use the closure. var Foo = function() { var value = 1; //private to the function this.inc = function() { ++value; }; this.print = function() { alert(value); }; return this; }; var b = new Foo(); b.print(); //Output 1 b.inc(); b.print(); //Output 2 alert(b.value); //undefined 13 Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 14. Javascript - Objects and functions Javascript is a prototypal language var Foo = function() { this.value = 1; //public value return this; }; Foo.prototype.inc = function() { ++this.value; }; Foo.prototype.print = function() { alert(this.value); }; var b = new Foo(); b.print(); //Output 1 b.inc(); b.print(); //Output 2 14 Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 15. Javascript - Objects and functions Developer can add responsibilities to any object var b = 1; Number.prototype.inc = function() { return new Number(this+1); }; Number.prototype.print = function() { alert(this); }; b.print(); //Output 1 b.inc().print(); //Output 2 Again, everything is an object. 15 Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 16. Javascript - Concurrency • Specification says nothing about concurrency • Browser engine is single threaded • Node.js offers event model concurrency 16 Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 17. Javascript - Concurrency Node.js var sys = require("sys"); setTimeout(function () { sys.puts("world"); }, 1000); sys.puts("hello"); Evented model with non blocking I/O 17 Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 18. Javascript - Concurrency ...output hello after 1 second world 18 Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 19. Clojure Sergio Bossa Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 20. Clojure - Three Words Homoiconic Functional Dynamic Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 21. Clojure - Basics From “Programming Clojure”, by Stuart Halloway: Form Example(s) Boolean true, false Character a Keyword :tag, :doc List (1 2 3), (println “foo”) Map (:name “Bill”, :age 42) Nil nil Number 1, 4.2 Set #(:snap :crackle :pop) String “hello” Symbol user/foo, java.lang.String Vector [1 2 3] Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 22. Clojure - Functions (Definition) Standard (defn my-fun [name] (println “Hello, ” name “!”)) Anonymous I (fn [name] (println “Hello, ” name “!”)) Anonymous II #(println “Hello, ” %1 “!”) Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 23. Clojure - Functions (Invocation) Standard (my-fun “Sergio”) Anonymous I ((fn [name] (println “Hello, ” name “!”)) “Sergio”) Anonymous II (#(println “Hello, ” %1 “!”) “Sergio”) Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 24. Clojure - Variables (Basics) Namespace-scoped (def my-variable “value”) Locally-scoped (let [my-variable “value”]) Use (println my-variable) Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 25. Clojure - Variables (Destructuring) Definition (defn my-fun [{name:name}] (println “Hello, ” name “!”)) Invocation (my-fun {:name “Sergio” :city “Rome”}) Result => Hello, Sergio! Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 26. Clojure - Control Structures (Conditionals) Single choice (when (= n 0) “zero!”) Double choice (if (= n 0) “zero!” “not zero!”) Multiple choice (cond (< n 0) ‘less than zero!’ (= n 0) ‘zero!’ :else ‘greater than zero!’) Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 27. Clojure - Control Structures (Loops) NO FOR LOOPS (almost) Explicit recursion (defn sum-a [array] (loop [a array s 0] (if (empty? a) s (recur (rest a) (+ s (first a)))))) Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 28. Clojure - Data Structures (Concepts) Everything is (treated as) a Sequence Immutable (Possibly) Lazy Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 29. Clojure - Data structures (Basics) Essentials first, rest, cons, conj, into Comprehension (for [m [1 2 3] n [4 5 6]] (+ m n)) Map/Reduce (reduce #(merge-with + %1 %2) (map #(hash-map %1 1) [‘pippo’ ‘pluto’ ‘pluto’])) Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 30. Clojure - Concurrency (Concepts) Explicit support Coordinated Uncoordinated Asynchronous Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 31. Clojure - Concurrency (Coordinated) References (aka STM) (def person (ref {:name ‘Sergio Bossa’ :age 28})) Get @person Update (dosync (alter person conj {:age 29})) Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 32. Clojure - Concurrency (Uncoordinated) Atoms (def person (atom {:name ‘Sergio Bossa’ :age 28})) Get @person Update (swap! person conj {:age 29}) Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 33. Clojure - Concurrency (Asynchronous) Agents (def person (agent {:name ‘Sergio Bossa’ :age 28})) Get @person Update (send person conj {:age 29}) Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 34. Clojure - Final Words KISS Powerful Concurrent Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 35. Scala Massimiliano Dessì Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 36. Scala variables Scala is a hybrid functional/object-oriented language. Scala runs on the JVM and in- teroperates with all Java libraries. Scala is statically typed with inference Powerful language for designing internal DSLs (DSL In Action) Good for Event Driven Architecture/CQRS (Akka actors) Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 37. Scala variables In functional programming, variables' values are immutable, as consequence of the mathematical orientation Immutability = no side effect No side effect = no shared state, better concurrency Scala allows you to decide whether a variable is immutable or not. Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 38. Variable declaration An immutable “variable” it's declared with val keyword (Value Object), the reference can not be changed, but the object itself can be modified. val myArray[String]:Array= new Array(3) array: Array[String] = Array(null, null, null) A mutable “variable” it's declared with var keyword, You can assign a new value to a var as often as you want var price: Double = 100 price = 10 Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 39. Control structures Function and if, while, for, try, match in the base syntax, higher-level control structure other than these in the libraries •Function Functional programming is based on the behavior of functions in the mathematical sense, with all the implications that starting point implies. (x: Int) => x + 1 functions have no side effects When a function takes other functions as arguments or returns a function, it is called a higher- order function. List(1, 2, 3, 4, 5) reduceLeft { _ * _ } Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 40. Control structures • Closure var factor = 3 val multiplier = (i:Int) => i * factor • For Comphresion val dogs = List("Lassie", "Rex", "Rin tin tin") for (dog <- dogs) println(dog) • Currying def add(x:Int) = (y:Int) => x + y println(add(2)(3)) val addCurried = curried(add _) Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 41. Control structures • Composition val f = (x: Int) => x + 1 val g = (x: Int) => x * 3.3 val h = (x: Double) => x + 0.1 val result = h compose g compose f • Pattern matching def factorial(i: BigInt): BigInt = i match { case _ if i == 1 => i case _ => i * factorial(i - 1) } Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 42. Control structures • Precondition class Rational(n: Int, d: Int) { require(d != 0) …. } • Filtering for (file <- filesHere if file.getName.endsWith(".scala")) • Folding and reducing List(1,2,3,4,5,6) reduceLeft(_ + _) List(1,2,3,4,5,6).foldLeft(10)(_ * _) Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 43. Specification class ElementSpec extends FlatSpec with ShouldMatchers { "A UniformElement" should "have a width equal to the passed value" in { val ele = elem('x', 2, 3) ele.width should be (2) } it should "have a height equal to the passed value" in { val ele = elem('x', 2, 3) ele.height should be (3) } it should "throw an IAE if passed a negative width" in { evaluating { elem('x', -2, 3) } should produce [IllegalArgumentException] } } Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 44. Collection • Sequences (List, Array, ListBuffer) Immutable and mutable • Set and Maps Immutable and mutable • Tuples, a tuple combines a fixed number of items together (1, "hello", Console) Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 45. Concurrency • Actor and messages class McQueen extends Actor { loop { react { case "how many?" => { println("I've got " + mailboxSize.toString + " messages in my mailbox.") } } } Every Actor has a mailbox in which messages sent to that Actor are queued Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 46. Concurrency Actors can receive any sort of object as a message val fussyActor = actor { loop { receive { case s: String => println("I got a String: " + s) case i: Int => println("I got an Int: " + i.toString) case _ => println("I have no idea what I just got.") } } } fussyActor ! "hi there" fussyActor ! 23 fussyActor ! 3.33 Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 47. Concurrency A strategy to keep your Actor-based code asynchronous is the use of futures A future is a placeholder object for a value that hasn’t yet been returned from an asyn- chronous process the double-bang (!!) on Actor causes operation to return a future /** * Asynchronous message send. Send-and-receive eventually. Waits on a Future for the reply message. * If recevied within the Actor default timeout interval then it returns Some(result) and * if a timeout * has occured None. */ def !!(message: T): Box[R] Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 48. Trait Traits are like interfaces in Java, but they can also have method implementations and even fields. Objects are constructed by mixin composition class Animal trait HasLegs class Frog extends Animal with Philosophical with HasLegs { override def toString = "green" } Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 49. Now ... what?!?! Quick (really!) start Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 50. Quickstart - Javascript • Download and install Nodejs. • Write your first example.js var sys = require("sys"); setTimeout(function () { sys.puts("world"); }, 1000); sys.puts("hello"); • Run example % node example.js • Or easily start node console by running % node-repl Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 51. Quickstart - Clojure Download JDK >= 5.x and Clojure jars http://www.sun.com http://www.oracle.com http://clojure.org/downloads Download and install Leiningen build tool http://github.com/technomancy/leiningen $> lein self-install Start new project $> lein new my-project Start project REPL $> lein repl Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 52. Quickstart - Scala The SBT can be used for Scala projects as Maven for Java Projects. SBT enable Dependency management. It support multiple project/subproject, and mixed project Scala/Java. It also has built-in support for generating Scaladocs and for testing with ScalaTest, Specs, and ScalaCheck. class Project(info: ProjectInfo) extends DefaultWebProject(info) with IdeaProject { lazy val scalaTest = "org.scalatest" % "scalatest" % "1.3" % "test" lazy val scalateCore = "org.fusesource.scalate" % "scalate-core" % "1.4.0" lazy val casbah = "com.mongodb.casbah" %% "casbah" % "2.0.3" lazy val salat = "com.novus" %% "salat" % "0.0.5" lazy val junit = "junit" % "junit" % "4.8.2" % "test" lazy val sfl4japi = "org.slf4j" % "slf4j-api" % "1.6.1" % "runtime" lazy val logback = "ch.qos.logback" % "logback-classic" % "0.9.27" val scalaTools = "Scala Tools Repository snapshot" at "http://nexus.scala-tools.org/content/ repositories/public/" } Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 53. Quickstart - Scala 1) Download JDK >= 5.x (and set the env vars) http://www.oracle.com 2) Download Scala installer jar http://www.scala-lang.org/downloads and set the environment $SCALA_HOME (ie: /usr/local/share/scala) and $PATH:$SCALA_HOME/bin 3) Use scala with -shell -Intellij idea community with scala plugin - eclipse with scala plugin Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 54. References Bossa - Dessì - Marinelli venerdì 4 marzo 2011
  • 55. References • Javascript • Douglas Crockford (Javascript the good parts) http://www.crockford.com/ • Nodejs http://nodejs.org/ • John Resig (JQuery, Pro Javascript and Javascript secrets books) http://ejohn.org/ • Clojure • Clojure Web Site: http://clojure.org • Clojure Online Docs: http://clojuredocs.org/ • Programming Clojure Book: http://pragprog.com/titles/shcloj/programming-clojure • Scala • Scala site : http://www.scala-lang.org • Scala docs: http://www.scala-lang.org/node/197 • Scala Books : http://www.scala-lang.org/node/959 Bossa - Dessì - Marinelli venerdì 4 marzo 2011