Scala Profis artwork

SP02/17: Dies und Das

Scala Profis

German - February 27, 2017 19:52 - 1 hour - 45.8 MB
Technology News Tech News Homepage Download Apple Podcasts Google Podcasts Overcast Castro Pocket Casts RSS feed


SP02/17: Dies und Das



Feedback zur letzten Episode

Paul hat geschrieben.


Seine Highlights 2016:

Unser Podcast (vielen Dank!)
Hat endlich Zeit und Muße gefunden Scala-Anwendungen im funktionalen Stil zu schreiben.

Seine Wünsche für 2017:

Schneller Scala Compiler. Wird nie kommen. Aber man darf doch träumen.
Ich verstehe endlich was Monoiden und Kleislis sind und finde heraus ob Monoiden wirklich als Monaden zur Kategorie der Endofunktoren gehören… danach haue ich in den Sack und lerne Clojure. So wie ich es eigentlich vor hatte.
Java9 kommt. Pünktlich. Mit Graal und Truffle. Ruby, Scala und Java laufen somit konfliktfrei auf der JVM. Überall glückliche, produktive Menschen.
Weltfrieden

Scala Center Advisory Board and SIP-Meeting-Results Dezember 2016
Scala Center Advisory Board
Neue Mitglieder

Das Scala Center Advisory Board hat zwei neue Mitglieder:

James Belsey von Morgan Stanley
Lars Hupel von Typelevel als zusätzlicher Vertreter der Community

Meeting vom 13. Dezember 2016

Folgende Empfehlungen wurden beschlossen:

Redesign und Neu-Implementierung der Scala Collections für Scala 2.13 auf Basis der Implementierung für Dotty
Fortsetzung der Verwaltung der Webseiten scala-lang.org, docs.scala-lang.org und scala.epfl.ch
SCP-009

SIP-Meeting vom 25. Oktober 2016

SIP-27 (trailing commans) wurde nach ein paar letzten Änderungen akzeptiert.


Für SIP-20 (improved lazy val initialization) gibt es eine Implementierung für Dotty und es wird jemand gesucht, der sich um eine Implementierung für scalac kümmert.


Links

Scala Center Advisory Board and SIP-Meeting Results
SCP-007: Collaborative redesign and implementation of Scala 2.13’s collections library
SCP-008: Maintain scala-lang, docs.scala-lang, scala.epfl.ch websites
SCP-009: Improve user experience for builds that use only direct dependencies
SIP-27 — Trailing Commas
SIP-20 — Improved Lazy Vals Initialization

Scastie

Scastie ist eine vom Scala Center Team betriebene interaktive Web-Seite, die es Dir ermöglicht Scala-Code im Browser auszuprobieren, auf den Servern zu speichern und zu teilen (ähnlich wie bei JSFiddle & Co. — wenn auch noch nicht so komfortabel).


Ursprünglich wurde Scastie von Aleh Aleshka als kollaborative Plattform zum Reproduzieren von Fehlern im Scala-Compiler erstellt. Seit neuestem steht das Ergebnis jedem interessierten als Beta-Version zur Verfügung (Login via Github).


Dein Code wird zu den Scala-Center-Servern geschickt, dort mittels SBT compiliert und ausgeführt und der Output zurück zum Server gestreamt.


Cool dabei:

Mit einem Click kannst Du das Scala-Target wählen. Zur Auswahl stehen nicht nur die verschiedenen Scala-Versionsn (2.10, 2.11 und 2.12) inklusive aller releasten Sub-Funktionen, sondern auch Dotty und der Typelevel-Scala-Compiler.
Über eine interaktive Suche kannst Du sämtliche im scaladex geführte Bibliotheken mit einem Klick hinzufügen und ausprobieren.
Wenn das immer noch nicht reicht kannst Du direkt das SBT-Script beeinflussen und so zum Beispiel beliebige Dependencies hinzufügen

Links

Scastie
Introducing Scastie — an interactive Playground for Scala

Scala Days 2017

Die Agenda für die Scala Days 2017 in Kopenhagen ist online.


Es gibt gleich zwei Vorträge aus der Berliner Scala Community:


Daniel Jentsch hält einen Vortrag über eine ScalaTest Erweiterung zum testen von Abfrageketten mit Futures und externen Systemen.


Oleg Ilyenko stellt seine GraphQL Implementierung Sangria vor.


Links

Scala Days 2017
GraphQL — a type system for your API
Sangria
When all abstraction is lost

Let by-name implicit parameters have lazy semantics

Es gibt in Scala bisher keine impliziten lazy Parameter. Das kann im Zusammenhang mit generischer Programmierung zu Problemen führen, die Shapeless mit dem Lazy Pseudo-Typ umgeht (mit Macro-Magie dahinter).


Zur Vereinfachung gibt es in dotty jetzt die Möglichkeit implizite ›by-name‹ Parameter zu verwenden (def fun(implicit a => String)).


Links

First class lazy values tie implicit recursive knots
Let by-name implicit parameters have lazy semantics

Play 2.6 M1

Das Play-Team hat den ersten Milestone des 2.6.0‑Releases der Allgemeinheit zum Testen zur Verfügung gestellt. Geplantes Release-Datum ist gemäß dem Roadmap-Dokument März bis April 2017.


Neuheiten

Keine Notwendigkeit mehr eine statische Application (Play.current) zur Verfügung zu stellen. Ziel ist es, dass mehrere Applications parallel ausgeführt und getestet werden können ohne sich gegenseitig zu beeinflussen. In diesem Zuge wurden diverse bisher globale Objekte auf Dependency-Injection verschoben (z.B. Action, BodyParser)
Unterstützung für Scala 2.12
Akka HTTP wird jetzt standardmäßig als HTTP-Server genutzt. Auf Wunsch kann weiterhin Netty (in Version 4.1) genutzt werden.
Typsichere Request-Attribute
Folgende Libraries wurden als eigenständige Bibliotheken mit unabhängigen Release-Zyklus aus Play herausgelöst:

play-json (Unterstützt auch ScalaJS!)
play-ws
play-iteratees

Folgende Funktionalitäten wurden ebenfalls als Module herausgelöst, bleiben aber an Play und dessen Release-Zyklus gekoppelt:

Guice-Support (play-guice)
Java Forms (play-java-forms)

Fehlende 2.6 Features

Gemäß dem Roadmap-Dokument sind die folgenden weiteren Features für Play 2.6 geplant, derzeit aber noch nicht verfügbar:

Typsichere Variante bekannter Request-Header
Unterstützung von HTTP/2

Aussicht auf Play 3

In dem Roadmap-Dokument findet sich auch ein Ausblick auf Play 3 (ETA Januar 2018)


Links

Play 2.6.0‑M1 released!
Play Roadmap-Dokument

Contextual

John Pretty hat die erste Version von Contextual vorgestellt. Mit Contextual kann man sich einfach einen String-Interpolator implementieren, der schon beim kompilieren überprüft ob ein gegebener String bestimmte Bedingungen erfüllt.


Das folgende Beispiel von der Homepage zeigt einen einfachen String-Interpolator für URLs (wobei die Funktion checkValidUrl(...) noch irgendwo anders implementiert werden muss):


import contextual._

case class Url(url: String)

object UrlInterpolator extends Interpolator {

def contextualize(interpolation: StaticInterpolation) = {
val lit@Literal(_, urlString) = interpolation.parts.head
if(!checkValidUrl(urlString))
interpolation.abort(lit, 0, "not a valid URL")

Nil
}

def evaluate(interpolation: RuntimeInterpolation): Url =
Url(interpolation.literals.head)
}

implicit class UrlStringContext(sc: StringContext) {
val url = Prefix(UrlInterpolator, sc)
}

Mit diesem Interpolator führt dann z.B. url"foobar" zu einem Compiler-Fehler, wäheren url"http://co.ntextu.al" ohne Fehler compiliert.


Links

Contextual

Scala Enumerations

Es gibt verschiedene Möglichkeiten Enumerations in Scala umzusetzen. Pedro Rijo einen lesenswerten Artikel geschrieben in dem er die verschiedenen Möglichkeiten mit Ihren Vor- und Nachteilen beleuchtet. In einem zweiten Artikel bezieht er auch Java Enumerations in die Betrachtung mit ein.


scala.Enumerations
object Gender extends Enumeration {
val Female, Male = Value
}

Features:

(De)Serialisierung
(Anpassbare) String-Representation
Auflistung der verfügbaren Werte- Sortierung
Sortierung

Probleme:

Unterschiedliche Enumerations haben den selben Typ (nach Type-Erasure)
Kein Matching-Check auf Vollständigkeit zur Compile-Zeit

Sealed case objects
sealed trait Gender
case object Female
case object Male

Features:

Löst die beiden Probleme von scala.Enumeration
Möglichkeit zusätzliche vals hinzuzufügen

Probleme:

Keine automatische Lösung um alle Werte zu erhalten
Keine Standard-(De)Serialisierung
Keine Standard-Sortierung

Library itemized

itemized erzeugt mit Hilfe von Macros sealed Trait-Hierarchien:


@enum trait Gender {
object Female
object Male
}

Features:

Auflistung aller möglichen Werte
Standard (De)Serialisierung

Probleme:

Keine Möglichkeit zusätzliche Eigenschaften hinzuzufügen
Unterstützt zwar indizierte Werte, aber keine Standard-Sortierung

Library enumeratum
sealed trait Gender extends EnumEntry
object Gender extends Enum[Gender] {
val values = findValues

case object Female extends Gender
case object Male extends Gender
}

Features:

Prüfung auf Vollständigkeit von Matches
Auflistung der verfügbaren Werte
Standard (De)Serialisierung
Möglichkeit zusätzliche Werte hinzuzufügen

Nachteile:

Sortierung ist möglich erfordert aber eine manuelle Implementierung des Ordered-Traits

Java Enumerations

Der Artikel von Pedro führte zu einer interessanten Diskussion auf Reddit, der unter anderem die klassischen Java-Enumerations als Alternative vorschlugen.


public enum Gender {
Female, Male
}

Features:

Prüfung auf Vollständigkeit von Matches
Auflistung der verfügbaren Werte
Standard (De)Serialisierung
Keine Type-Erasure
Möglichkeit zusätzliche Werte hinzuzufügen
Kein Overhead bei der Ausführung auf der JVM

Nachteile:

Keine automatische Standard-Sortierung
Die Enumeration muss in Java-Code definiert werden. Ggf. eingeschränkte Typ-Nutzung.

Fazit

scala.Enumeration taugt für die meisten Fälle. Wenn das nicht reicht scheint die Library enumeratum eine interessante Alternative zu sein.


Links

Scala Enumerations
Java Enumerations in Scala

Gib uns Dein Feedback als Kommentar auf unserer Web-Site, via Twitter oder Google+.



Kapitel

Intro (00:00:00.000)
Einleitung (00:00:37.165)
Hörerfeedback (00:01:44.035)
Scala Center Advisory Board and SIP-Meeting-Results Dezember 2016 (00:04:57.379)
Scastie (00:10:45.389)
ScalaDays 2017 (00:16:48.664)
Let by-name implicit parameters have lazy semantics (00:19:21.880)
Play 2.6 M1 (00:21:37.229)
Contextual (00:41:04.259)
Scala Enumerations (00:48:02.989)
Outro (01:01:02.352)

Lizenz


Scala Profis von Benjamin Hagemeister & Sven Wiegand ist lizenziert unter einer Creative Commons Namensnennung — Keine Bearbeitungen 4.0 International Lizenz.


Über diese Lizenz hinausgehende Erlaubnisse kannst Du unter http://scalaprofis.de erhalten.


Titelsong basierend auf Wish You Were Here von THE.MADPIX.PROJECT lizensiert unter Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0).

Twitter Mentions