Your SlideShare is downloading. ×
0
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Scala und Lift
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Scala und Lift

1,957

Published on

Slides of my first Tech Talk at adesso AG, Berlin.

Slides of my first Tech Talk at adesso AG, Berlin.

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,957
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
30
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Scala und Lift<br />Felix Müller<br />15.07.2011<br />
  • 2. Mein Background<br />7 Jahre Java, 2 Jahre C# und andere Sprachen<br />4Monate Scala<br />3Monate Lift<br />Studentischer Mitarbeiter<br />Bachelorarbeit bei adesso zum Thema: „Vergleich des Scala Web-Frameworks Lift mit dem Java EE Programmiermodell “<br />Twitter: @fmueller_bln<br />Mail: felix.mueller@adesso.de<br />15.07.2011<br />Scala und Lift<br />2<br />
  • 3. Erwartungen und Ziele<br />Eure Erwartungen<br />Scala sehen und verstehen<br />Feeling für Scala entwickeln<br />Ideen für die Anwendung von Scala bekommen<br />Lift kennenlernen<br />Einsatzszenarien für Lift erfahren<br />Meine Ziele<br />eure Erwartungen erfüllen ;-)<br />den Spaß an Scala vermitteln<br />praktische Einführung in Scala geben<br />15.07.2011<br />Scala und Lift<br />3<br />
  • 4. Agenda<br />15.07.2011<br />Scala und Lift<br />4<br />
  • 5. 15.07.2011<br />Scala<br />Eine ausführliche Einführung<br />
  • 6. Agenda – Scala<br />15.07.2011<br />Scala und Lift<br />6<br />
  • 7. Was ist Scala?<br />eine objektfunktionale Programmiersprache<br />Programmiersprache für die JVM (und .Net)<br />2003 in Version 1 veröffentlicht  aktuell: 2.9<br />ursprünglich akademischer Kontext: entwickeltan École polytechnique fédérale de Lausanne<br />seit Version 2.9: Enterprise KontextdurchTypesafe(Martin Odersky, James Gosling, Doug Lea, HeikoSeebergeru.a.)<br />15.07.2011<br />Scala und Lift<br />7<br />Martin Odersky,<br />Scala Erfinder<br />Top Java Ambassador,<br />JAX Innovation Awards 2011<br />
  • 8. Was ist Scala?<br />Scala ist…<br />vollständig objektorientiert, funktional und imperativ.<br />eine Skript- sowie moderne Applikationssprache.<br />interoperabel mit Java und ein aufgeräumtes Java.<br />ein Toolkit zum Erstellen von eigenen Sprachen (DSLs).<br />das was Java schon lange sein sollte, aber vielleicht erst in 10 Jahren ist.<br />15.07.2011<br />Scala und Lift<br />8<br />
  • 9. Was ist Scala?<br />Was kann man mit Scala?<br />Beliebige Problemstellungen ausdrücken und per Typsystem prüfen<br />Für jeden Anwendungsfall einen optimalen Kontext schaffen<br />Vorhandenen Code zu jeder beliebigen Zeit flexibel und sicher erweitern<br />Direkt auf der JVM aufsetzen und beliebige Java-Libraries nutzen<br />Einfache Aufgaben erledigen, komplexe einfach machen<br />Mit den Aufgaben und Anforderungen wachsen  Scalable<br />15.07.2011<br />Scala und Lift<br />9<br />
  • 10. Warum Scala?<br />Entwicklersicht<br />statisch typisierte Sprache mit vielen Vorteilen von dynamisch typisierten<br />keine Java-Krücken, aber die reiche Spielwiese von Java (Libraries)<br />„Jedes Jahr eine neue Sprache“ (Pragmatic Programmers)<br />(„Weil wir es können…“)<br />Managementsicht<br />weniger Code  weniger Fehler  weniger Aufwand<br />„Faster Time to Market“<br />100 % Java Kompatibilität  Integration mit bestehender Codebasis<br />Attract smarter programmer<br />15.07.2011<br />Scala und Lift<br />10<br />
  • 11. Warum Scala?<br />15.07.2011<br />Scala und Lift<br />11<br />Vergleich der wichtigsten JVM-Sprachen<br />
  • 12. Warum Scala?<br />15.07.2011<br />Scala und Lift<br />12<br />Vergleich der wichtigsten JVM-Sprachen<br />
  • 13. Warum Scala?<br />15.07.2011<br />Scala und Lift<br />13<br />Stackoverflow Rankings als Relevanzindikator (Stand: 5. Juli 2011)<br />
  • 14. Wo wird Scala eingesetzt?<br />15.07.2011<br />Scala und Lift<br />14<br />
  • 15. Hands on! Spracheinführung in Scala<br />Deklaration und Definition von Werten, Variablen, Methoden und Funktionen<br />15.07.2011<br />Scala und Lift<br />15<br />val meaningOfLife: Int = 42 // immutable<br />var maybeImportantNumber: Double = 3.14 // mutable<br />// Methode<br />defprintNumber(number: Int) {<br />println(&quot;Number: &quot; + number)<br />}<br />// Funktion<br />def incNumber(number: Int) : Int = {<br />number + 1 // entspricht: number.+(1)<br />}<br />printNumber(meaningOfLife)<br />printNumber(incNumber(meaningOfLife))<br />
  • 16. Typinferenz<br />Viele Typangaben sind überflüssig. Der Compiler leitet sie eh selbst her!<br />15.07.2011<br />Scala und Lift<br />16<br />val meaningOfLife: Int = 42 // immutable<br />var maybeImportantNumber: Double = 3.14 // mutable<br />// Methode<br />defprintNumber(number: Int) {<br />println(&quot;Number: &quot; + number)<br />}<br />// Funktion<br />def incNumber(number: Int) : Int= {<br />number + 1 // entspricht: number.+(1)<br />}<br />printNumber(meaningOfLife)<br />printNumber(incNumber(meaningOfLife))<br />
  • 17. Typinferenz<br />In der Tat: die meisten Typangaben können entfallen.<br />15.07.2011<br />Scala und Lift<br />17<br />valmeaningOfLife = 42 // immutable<br />varmaybeImportantNumber = 3.14 // mutable<br />// Methode<br />def printNumber(number: Int) {<br />println(&quot;Number: &quot; + number)<br />}<br />// Funktion<br />def incNumber(number: Int) = {<br />number + 1 // entspricht: number.+(1)<br />}<br />printNumber(meaningOfLife)<br />printNumber(incNumber(meaningOfLife))<br />
  • 18. Klassen und Objekte<br />Ihr kommt nicht drumrum: ein HelloWorld-Beispiel, aber ein schönes<br />15.07.2011<br />Scala und Lift<br />18<br />// einfache Scala Klasse, ist immutable<br />// Konstruktor und “Getter” werden automatisch generiert<br />class Person(val name: String, val surname: String)<br />// greeting ist ein privater Wert, kein Zugriff von außen<br />classHelloWorld(greeting: String) {<br />defsayHelloTo(p: Person) = println(greeting+p.name)<br />}<br />// Ausgabe: Hallo Felix<br />valfelix = new Person(&quot;Felix&quot;, &quot;Müller&quot;)<br />newHelloWorld(&quot;Hallo &quot;).sayHelloTo(felix)<br />
  • 19. Klassen und Objekte<br />Zur Übersicht: Umwandlung von Klasse HelloWorld zum Objekt<br />15.07.2011<br />Scala und Lift<br />19<br />// einfache Scala Klasse, ist immutable<br />// Konstruktor und “Getter” werden automatisch generiert<br />class Person(val name: String, val surname: String)<br />// greeting ist ein privater Wert, kein Zugriff von außen<br />class HelloWorld(greeting: String) {<br />defsayHelloTo(p: Person) = println(greeting+p.name)<br />}<br />// Ausgabe: Hallo Felix<br />valfelix = new Person(&quot;Felix&quot;, &quot;Müller&quot;)<br />newHelloWorld(&quot;Hallo &quot;).sayHelloTo(felix)<br />
  • 20. Klassen und Objekte<br />Jetzt ist HelloWorld ein Singleton Objekt  Scalas Ersatz für Java‘s Statics<br />15.07.2011<br />Scala und Lift<br />20<br />// einfache Scala Klasse, ist immutable<br />// Konstruktor und “Getter” werden automatisch generiert<br />class Person(val name: String, val surname: String)<br />objectHelloWorld {<br /> // greeting ist public (Standard-Scope in Scala)<br />val greeting = &quot;Hallo &quot;<br />defsayHelloTo(p: Person) = println(greeting+p.name)<br />}<br />// Ausgabe: Hallo Felix<br />valfelix = new Person(&quot;Felix&quot;, &quot;Müller&quot;)<br />HelloWorld.sayHelloTo(felix)<br />
  • 21. Companion Objekte<br />Klassen können einen Gefährten haben: Companion Objekte<br />15.07.2011<br />Scala und Lift<br />21<br />// wird zu Person.apply(“Felix”, “Müller”) ergänzt<br />valfelix = Person(&quot;Felix&quot;, &quot;Müller&quot;)<br />classPerson(val surname: String, val name: String,<br /> age: Int) {<br />require(age &gt;= 18, &quot;age must not be less than 18&quot;)<br />}<br />// beinhaltet alle Statics u. apply-Funktionen für Person<br />object Person {<br />defapply(name: String, surname: String) = {<br />new Person(name, surname, 18)<br /> }<br />}<br />
  • 22. Traits<br />Traits sind wie Java Interfaces, aber mit Implementierung<br />15.07.2011<br />Scala und Lift<br />22<br />// Traits ermöglichen flache u. breite Klassenhierarchien<br />// Beispiel: Zutaten für eine glückliche Person<br />trait Person {<br />val name: String<br />}<br />trait HasHobby {<br />def myHobby: String<br />}<br />trait HasFoundMeaningOfLife {<br /> valmeaningOfLife = &quot;5&quot;<br />def calculateMeaningOfLife = 2 + 3<br />}<br />
  • 23. Traits<br />Traits sind Mixins und gestatten eine sichere Mehrfachvererbung<br />15.07.2011<br />Scala und Lift<br />23<br />// Konstruktor-Parameter name implementiert Person.name<br />classHappyPerson(val name: String) extendsPerson<br />withHasHobby with HasFoundMeaningOfLife {<br /> // in Scala gibt es kein @Override, sondern ein<br /> // Schlüsselwort für das Überschreiben<br />overrideval meaningOfLife = &quot;42&quot;<br />overridedef calculateMeaningOfLife = 42<br /> // hier ist override optional, da in HasHobby keine<br /> // Implementierung vorhanden ist<br />def myHobby = &quot;Programming in Scala&quot;<br />}<br />
  • 24. Self-Type Annotationen<br />ermöglichen weitere Modularisierung und einfache Dependency Injection<br />15.07.2011<br />Scala und Lift<br />24<br />// this ist in Analyzer mit Backend typisiert<br />traitAnalyzer { this: Backend =&gt;<br />// Analyzer hat Zugriff auf alle Member von Backend<br />}<br />// Ergebnis:<br />//  Analyzer kann Backend erweitern um Funktionen<br />//  Analyzer definiert Abhängigkeit zu Backend<br />trait Backend extends Analyzer {<br />// ...<br />}<br />
  • 25. Funktionen<br />Funktionen sind in Scala First-Class Citizens<br />15.07.2011<br />Scala und Lift<br />25<br />defdec(i: Int) = i – 1 // Signatur: Int =&gt; Int<br />// dec als Funktionsliteral<br />(i: Int) =&gt; i – 1<br />// der Compiler macht daraus ein Objekt<br />newFunction[Int, Int]() { defapply(i: Int) = i - 1 }<br />// Zuweisung des Funktionsliterals zu einem Wert<br />valdecFunction = (i: Int) =&gt; i – 1<br />// macht beim Aufruf keinen Unterschied<br />println(dec(2)) // Ausgabe: 1<br />println(decFunction(3)) // Ausgabe: 2<br />
  • 26. Funktionen höherer Ordnung<br />Funktionen, die andere Funktionen als Parameter oder Rückgabewert haben<br />15.07.2011<br />Scala und Lift<br />26<br />defdec(i: Int) = i – 1 // Signatur: Int =&gt; Int<br />// wendet eine Funktion auf alle Listenelemente an<br />defdoWithListOfNumbers(list: List[Int],<br /> function: Int =&gt; Int) = {<br /> // map ist nur eine Funktion der reichhaltigen<br /> // Collection API von Scala<br />list.map(function)<br />}<br />// dec kann als Wert einfach übergeben werden<br />// List(1, 2, 3) wird zu List.apply(1, 2, 3)  Companion<br />println(doWithListOfNumbers(List(1, 2, 3), dec))<br />// Ausgabe: List(0, 1, 2)<br />
  • 27. Currying<br />Mehr ist immer besser: Scala unterstützt mehrere Parameterlisten<br />15.07.2011<br />Scala und Lift<br />27<br />def sub(x: Int)(y: Int) = x – y<br />println(sub(2)(3))// Ausgabe: -1<br />// Das ist keine Magie! Anders definiert werden:<br />def sub(x: Int) = (y: Int) =&gt; x – y<br />// Aber: Wozu?<br />
  • 28. Eigene Kontrollstrukturen<br />Currying + partiell angewandte Funktionen + Syntactic Sugar<br />15.07.2011<br />Scala und Lift<br />28<br />def sub(x: Int)(y: Int) = x – y<br />defsubTowWith= sub(2) _<br />// Ausgabe: -10<br />println(subTowWith{<br />valfive = 5<br />valseven = 7<br />five + seven<br />})<br />
  • 29. Eigene Kontrollstrukturen deluxe<br />Java 7 Auto-Closeable mit Scala nachgebaut<br />15.07.2011<br />Scala und Lift<br />29<br />// Java 7: close() wird automatisch aufgerufen<br />try (InputStream is = new FileInputStream(&quot;File.txt&quot;)) {<br />// Daten vom Stream lesen und verarbeiten<br /> // z.B. is.read();<br />}<br />// Wir wollen sowas auch in Scala haben!<br />// try als Schlüsselwort ist schon besetzt,<br />// also using wie in C#  Das Ziel:<br />using(newFileInputStream(&quot;File.txt&quot;)) { stream =&gt;<br />// Daten vom Stream lesen und verarbeiten<br /> // z.B. stream.read()<br />}<br />
  • 30. Eigene Kontrollstrukturen deluxe<br />Java 7 Auto-Closeable mit Scala nachgebaut<br />15.07.2011<br />Scala und Lift<br />30<br />// Volle Scala Power:<br />//  Statisches Ducktyping mit strukturellen Typen<br />//  Currying<br />//  Funktionen höherer Ordnung<br />defusing[T &lt;: { def close() }](resource: T)<br /> (block: T =&gt; Unit) {<br />try{<br /> block(resource)<br />} finally {<br />if(resource != null)<br />resource.close()<br />}<br />}<br />
  • 31. Case Klassen<br />Abstrakte Datentypen durch Case Klassen<br />15.07.2011<br />Scala und Lift<br />31<br />// Case Klassenhabenautomatischein Companion Objekt<br />// mitpassender apply-Funktion<br />// equals, hashCode und toStringwerdenebenfalls<br />// automatischgeneriert<br />abstractsealedclass Frucht<br />caseclassApfel(sauer: Boolean) extendsFrucht<br />caseclassBirne(sorte: String) extendsFrucht<br />// miteinerabstrakten, versiegeltenKlassekann der<br />// Scala Compiler sichereTypchecksmachen (z.B. beim<br />// Pattern Matching)<br />
  • 32. Pattern Matching<br />Switch auf Steroiden<br />15.07.2011<br />Scala und Lift<br />32<br />// Switch-ähnlich, abermehrMöglichkeiten:<br />//  MustervergleichnachWerten, Typen, Tupeln,<br />// regulärenAusdrücken<br />//  Formulierung von Mustern, z.B: (1, _, x: Double)<br />//  Wildcard, der Unterstrich _<br />defwelcheFrucht(frucht: Frucht) = fruchtmatch{<br />case Apfel(true) =&gt; println(&quot;Saurer Apfel.&quot;)<br />case Apfel(false) =&gt; println(&quot;Nicht saurer Apfel.&quot;)<br />case Birne(sorte) =&gt; println(&quot;Birnensorte: &quot; + sorte)<br />}<br />
  • 33. Implicit Conversions<br />selbstdefinierte Typumwandlungen (ermöglichen das Pimp my Library Pattern)<br />15.07.2011<br />Scala und Lift<br />33<br />// List wird um headOr Funktion erweitert („gepimpt“)<br />classListExtensions[A](list : List[A]) {<br />def headOr(f: =&gt; A): A = list match {<br />case h :: _ =&gt; h<br />case Nil =&gt; f<br /> }<br />}<br />object ListExtensions {<br />implicitdef listExtensions[A](list : List[A]) =<br />new ListExtensions(list)<br />}<br />
  • 34. Implicit Conversions<br />Anwendung der definierten Implicit Conversion<br />15.07.2011<br />Scala und Lift<br />34<br />// ImplicitConversion wird in den Scope importiert<br />importListExtensions._<br />// durch ImplicitConversion kann headOr auf List<br />// aufgerufen werden<br />// Ausgabe: 1<br />println(List(1,2,3).headOr(0))<br />//  println(newListExtensions(List(1, 2, 3)).headOr(0))<br />// Ausgabe: 0<br />println(Nil.asInstanceOf[List[Int]].headOr(0))<br />
  • 35. Scala im Vergleich zu Java<br />15.07.2011<br />Scala und Lift<br />35<br />u.a. durch Scala Standardbibliothek implementiert: enums, break, continue<br />
  • 36. Scala im Vergleich zu Java<br /><ul><li>Scala’s Typsystem ist stark und statisch.
  • 37. Es sind viel mehr Ausdrücke prüfbar als in Java:
  • 38. einfaches Refactoring
  • 39. ermöglicht guten IDE-Support
  • 40. Scala Code wirkt dynamisch
  • 41. Typangaben entfallen meist
  • 42. Ausnahme: Schnittstellen
  • 43. Vorteil v.a. bei Typparametern (Generics)
  • 44. Implizite Konvertierungen</li></ul>15.07.2011<br />Scala und Lift<br />36<br />You&apos;ve got the best of both worlds, don&apos;t you?<br />All our strengths, none of our weaknesses.<br />
  • 45. Beispielanwendung<br />Rewrite einer Java Applikation in Scala<br />15.07.2011<br />
  • 46. Tool Chain<br />MavenPlugin für Scala<br />alle Scala Libraries lassen sich mit Maven (und Ant) integrieren<br />Scala hat eigenes Build- und Deployment Tool: SBT, Simple Build Tool<br />SBT ist eine goldene Mischung aus Maven und Ant<br />deklarativ und imperativ zugleich (ähnlich zu Gradle)<br />nutzt Scala für die Konfiguration  viele Möglichkeiten für Anpassungen ohne XML-Hölle<br />Scala Plugins für Eclipse, IDEA und Netbeans:<br />15.07.2011<br />Scala und Lift<br />38<br />
  • 47. Fazit<br />Pro<br />Scala unterstützt FP ohne dabei mit der OOP zu brechen.<br />Scala ermöglicht verständlicheren Code als Java.<br />Scala ist weniger komplex als Java.<br />Scala ist besonders gut geeignet für:<br />Datenverarbeitung<br />Nebenläufige Programmierung<br />Domain SpecificLanguages<br />Contra<br />Tool Chain<br />(schlechte) Integration mit Java Tooling<br />im Vergleich zu Java schlechter IDE-Support<br />jedoch positiver Trend zu erkennen<br />viele Sprachfeatures sind für Library-Designer gedacht  seltene Verwendung in Applikationsentwicklung<br />15.07.2011<br />Scala und Lift<br />39<br />
  • 48. 15.07.2011<br />Lift<br />Vorstellung des funktionalen Scala Full-Stack<br />Web-Frameworks<br />
  • 49. Agenda – Lift<br />15.07.2011<br />Scala und Lift<br />41<br />
  • 50. Was ist Lift?<br />funktionales Web-Framework für Scala<br />seit 2007 in Entwicklung, aktuell: Version 2.4-M1<br />Full-Stack: deckt Frontend- und Backend-Belange ab<br />unterstützte als eines der ersten Frameworks Comet (Ajax-Push, in HTML5: WebSocket)<br />15.07.2011<br />Scala und Lift<br />42<br />David Pollak,<br />Lift Initiator und Maintainer<br />
  • 51. Was ist Lift?<br />15.07.2011<br />Scala und Lift<br />43<br />Full-Stack Web-Framework<br />
  • 52. Warum Lift?<br />Standard für Web-Entwicklung mit Scala<br />setzt auf der Java EE Plattform auf<br />interessante Konzepte<br />vereint viele Ideen anderer Frameworks<br />wird in „richtigen“ Projekte eingesetzt  läuft produktiv und skaliert gut<br />15.07.2011<br />Scala und Lift<br />44<br />
  • 53. Wo wird Lift eingesetzt?<br />15.07.2011<br />Scala und Lift<br />45<br />
  • 54. View-First-Konzept<br />Seitenbeschreibungen in Standard XHTML-Tags<br />Ziel:<br />Designer friendly Templates<br />keine Logik im View<br />kein MVC, eigenes Entwurfsmuster: View-ViewModel-Model<br />15.07.2011<br />Scala und Lift<br />46<br />
  • 55. Snippets<br />Snippets sind das ViewModel<br />Snippets sind Funktionen, die XML-Knoten transformieren:<br />NodeSeq =&gt; NodeSeq<br />XML-Prozessoren, die das Markup direkt verändern<br />Snippets sorgen für dynamische Seiteninhalte und Anbindung des Backends<br />Snippets können zustandsbehaftet sein<br />15.07.2011<br />Scala und Lift<br />47<br />
  • 56. Persistenz<br />15.07.2011<br />Scala und Lift<br />48<br />2 Persistenz-Bibliotheken: Mapper und Record<br />Mapper baut auf JDBC auf und ist Quasi-Standard in Lift<br />Record ist Abstraktionsschicht für andere ORM-Frameworks<br />
  • 57. Beispielanwendung<br />Twitter nachgebaut mit Lift von Heiko Seeberger<br />15.07.2011<br />
  • 58. Fazit<br />Pro<br />Alleinstellungsmerkmale:<br />Comet Support<br />JavaScript und Ajax Abstraktion<br />herausragende Community<br />gut geeignet für:<br />Echtzeit Web-Apps<br />typische Web 2.0 Apps<br />Social Networks<br />Contra<br />Vermischung von Schichten<br />enge Kopplung zwischen Komponenten<br />keine Komponentenbibliothek (nur einige Widgets)<br />kein Mehrwert für typische Enterprise-Anwendungen<br />15.07.2011<br />Scala und Lift<br />50<br />
  • 59. 15.07.2011<br />Ausblick<br />Weitere interessante Themen<br />
  • 60. Ausblick – What‘s next?<br />Scala<br />(Advanced) Sprachfeatures:<br />implizite Argumente und vieles mehr<br />DSLs erstellen<br />Akka als Middleware Framework<br />Spring Integration Scala DSL<br />Play Web-Framework mit Scala Modul<br />CloudFoundry Integration<br />Lift<br />Web-Services mit Lift<br />BigTop als Lift Extension<br />Komponentenbibliothek<br />Squeryl Anbindung<br />15.07.2011<br />Scala und Lift<br />52<br />
  • 61. Ausblick – Buchtipps<br />Scala<br />Lift<br />15.07.2011<br />Scala und Lift<br />53<br />
  • 62. Ausblick – Scala vs. Java<br />Und wo ist jetzt der Java Rant?!<br />Hier, aber in zivilisierter Form:<br />https://www.adesso.de/wiki/index.php/Datei:Scala%C3%9Cbersicht.pdf<br />15.07.2011<br />Scala und Lift<br />54<br />
  • 63. 15.07.2011<br />Vielen Dank für eure Aufmerksamkeit.<br />Fragen?<br />
  • 64. Quellen<br />http://scala-boss.heroku.com<br />http://www.slideshare.net/Odersky/fosdem-2009-1013261<br />http://www.mate.it/en/component/content/article/84-perche-scala<br />https://www.adesso.de/wiki/index.php/Datei:Scala_Pr%C3%A4sentation_Nightsession.ppt<br />http://www.scala-lang.org/node/1658<br />http://scala.sygneca.com/patterns/pimp-my-library<br />15.07.2011<br />Scala und Lift<br />56<br />
  • 65. Go and start coding Scala!<br />felix.mueller@adesso.de<br />www.adesso.de<br />

×