SP02/17: Dies und Das
Scala Profis
German - February 27, 2017 19:52 - 1 hour - 45.8 MBTechnology 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
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).