SlideShare ist ein Scribd-Unternehmen logo
1 von 55
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

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
 

Was ist angesagt? (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
 

Andere mochten auch

Initiation à la réalité augmentée sur Windows Phone 7.5 (Mango)
Initiation à la réalité augmentée sur Windows Phone 7.5 (Mango)Initiation à la réalité augmentée sur Windows Phone 7.5 (Mango)
Initiation à la réalité augmentée sur Windows Phone 7.5 (Mango)Microsoft
 
Actor concurrency for the JVM: a case study
Actor concurrency for the JVM: a case studyActor concurrency for the JVM: a case study
Actor concurrency for the JVM: a case studySergio Bossa
 
Visual Studio 2012 Paris Summit - Cellenza/Mediapost: retour d'expérience
Visual Studio 2012 Paris Summit - Cellenza/Mediapost: retour d'expérienceVisual Studio 2012 Paris Summit - Cellenza/Mediapost: retour d'expérience
Visual Studio 2012 Paris Summit - Cellenza/Mediapost: retour d'expérienceMichel Perfetti
 
Patterns Agiles avec Visual Studio 2012 et TFS 2012
Patterns Agiles avec Visual Studio 2012 et TFS 2012Patterns Agiles avec Visual Studio 2012 et TFS 2012
Patterns Agiles avec Visual Studio 2012 et TFS 2012Microsoft
 
Quand GIT rencontre TFS, que peut-on en attendre ?
Quand GIT rencontre TFS, que peut-on en attendre ?Quand GIT rencontre TFS, que peut-on en attendre ?
Quand GIT rencontre TFS, que peut-on en attendre ?Microsoft
 
Patterns Agiles avec Visual Studio 2012 et TFS 2012 (ALM201)
Patterns Agiles avec Visual Studio 2012 et TFS 2012 (ALM201)Patterns Agiles avec Visual Studio 2012 et TFS 2012 (ALM201)
Patterns Agiles avec Visual Studio 2012 et TFS 2012 (ALM201)Olivier Conq
 
Améliorer votre productivité avec Visual Studio 2012
Améliorer votre productivité avec Visual Studio 2012Améliorer votre productivité avec Visual Studio 2012
Améliorer votre productivité avec Visual Studio 2012Microsoft
 
Agilité, Productivité et Qualité au Centre avec Visual Studio 2012
Agilité, Productivité et Qualité au Centre avec Visual Studio 2012Agilité, Productivité et Qualité au Centre avec Visual Studio 2012
Agilité, Productivité et Qualité au Centre avec Visual Studio 2012Microsoft
 

Andere mochten auch (9)

Initiation à la réalité augmentée sur Windows Phone 7.5 (Mango)
Initiation à la réalité augmentée sur Windows Phone 7.5 (Mango)Initiation à la réalité augmentée sur Windows Phone 7.5 (Mango)
Initiation à la réalité augmentée sur Windows Phone 7.5 (Mango)
 
Actor concurrency for the JVM: a case study
Actor concurrency for the JVM: a case studyActor concurrency for the JVM: a case study
Actor concurrency for the JVM: a case study
 
Visual studio 2012
Visual studio 2012Visual studio 2012
Visual studio 2012
 
Visual Studio 2012 Paris Summit - Cellenza/Mediapost: retour d'expérience
Visual Studio 2012 Paris Summit - Cellenza/Mediapost: retour d'expérienceVisual Studio 2012 Paris Summit - Cellenza/Mediapost: retour d'expérience
Visual Studio 2012 Paris Summit - Cellenza/Mediapost: retour d'expérience
 
Patterns Agiles avec Visual Studio 2012 et TFS 2012
Patterns Agiles avec Visual Studio 2012 et TFS 2012Patterns Agiles avec Visual Studio 2012 et TFS 2012
Patterns Agiles avec Visual Studio 2012 et TFS 2012
 
Quand GIT rencontre TFS, que peut-on en attendre ?
Quand GIT rencontre TFS, que peut-on en attendre ?Quand GIT rencontre TFS, que peut-on en attendre ?
Quand GIT rencontre TFS, que peut-on en attendre ?
 
Patterns Agiles avec Visual Studio 2012 et TFS 2012 (ALM201)
Patterns Agiles avec Visual Studio 2012 et TFS 2012 (ALM201)Patterns Agiles avec Visual Studio 2012 et TFS 2012 (ALM201)
Patterns Agiles avec Visual Studio 2012 et TFS 2012 (ALM201)
 
Améliorer votre productivité avec Visual Studio 2012
Améliorer votre productivité avec Visual Studio 2012Améliorer votre productivité avec Visual Studio 2012
Améliorer votre productivité avec Visual Studio 2012
 
Agilité, Productivité et Qualité au Centre avec Visual Studio 2012
Agilité, Productivité et Qualité au Centre avec Visual Studio 2012Agilité, Productivité et Qualité au Centre avec Visual Studio 2012
Agilité, Productivité et Qualité au Centre avec Visual Studio 2012
 

Mehr von Sergio Bossa

To be relational, or not to be relational? That's NOT the question!
To be relational, or not to be relational? That's NOT the question!To be relational, or not to be relational? That's NOT the question!
To be relational, or not to be relational? That's NOT the question!Sergio Bossa
 
Terrastore - A document database for developers
Terrastore - A document database for developersTerrastore - A document database for developers
Terrastore - A document database for developersSergio Bossa
 
Scalable Databases - From Relational Databases To Polyglot Persistence
Scalable Databases - From Relational Databases To Polyglot PersistenceScalable Databases - From Relational Databases To Polyglot Persistence
Scalable Databases - From Relational Databases To Polyglot PersistenceSergio Bossa
 
Scale Your Database And Be Happy
Scale Your Database And Be HappyScale Your Database And Be Happy
Scale Your Database And Be HappySergio Bossa
 
Clustering In The Wild
Clustering In The WildClustering In The Wild
Clustering In The WildSergio Bossa
 
Gridify your Spring application with Grid Gain @ Spring Italian Meeting 2008
Gridify your Spring application with Grid Gain @ Spring Italian Meeting 2008Gridify your Spring application with Grid Gain @ Spring Italian Meeting 2008
Gridify your Spring application with Grid Gain @ Spring Italian Meeting 2008Sergio Bossa
 

Mehr von Sergio Bossa (7)

To be relational, or not to be relational? That's NOT the question!
To be relational, or not to be relational? That's NOT the question!To be relational, or not to be relational? That's NOT the question!
To be relational, or not to be relational? That's NOT the question!
 
Terrastore - A document database for developers
Terrastore - A document database for developersTerrastore - A document database for developers
Terrastore - A document database for developers
 
Scalable Databases - From Relational Databases To Polyglot Persistence
Scalable Databases - From Relational Databases To Polyglot PersistenceScalable Databases - From Relational Databases To Polyglot Persistence
Scalable Databases - From Relational Databases To Polyglot Persistence
 
Scale Your Database And Be Happy
Scale Your Database And Be HappyScale Your Database And Be Happy
Scale Your Database And Be Happy
 
Clustering In The Wild
Clustering In The WildClustering In The Wild
Clustering In The Wild
 
Real Terracotta
Real TerracottaReal Terracotta
Real Terracotta
 
Gridify your Spring application with Grid Gain @ Spring Italian Meeting 2008
Gridify your Spring application with Grid Gain @ Spring Italian Meeting 2008Gridify your Spring application with Grid Gain @ Spring Italian Meeting 2008
Gridify your Spring application with Grid Gain @ Spring Italian Meeting 2008
 

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