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
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
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 mehrereApplication
s 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
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
val
s 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
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).
Boris
| #
Weiss nicht ob ich was falsch verstanden habe, aber beim »alten« HTTP ist es nicht so, dass Bilder base64-codiert werden. Das »binaere« in HTTP2 bezieht sich auf das Protokoll selber, das vorher zeilenbasiertes plaintext war, bei HTTP 1 konnte der Payload schon vorher binaer sein. Sonst wuerde ja auch jeder Download viel groesser sein als die eigentliche Datei.
https://http2.github.io/faq/#why-is-http2-binary
Alles in allem uebrigens wieder eine interessante Folge, vorallem der Vergleich der verschiedenen Enum-Moeglichkeiten war erhellend.
Reply
Sven
| #
Du hast natürlich vollkommen Recht: Auch bei HTTP 1 ist ein binärer Transfer möglich. Da hatte ich kurzzeitig was mit E‑Mails und MIME verwechselt. Vielen Dank für Deine Korrektur, wir werden das in der nächsten Episode korrigieren.
Reply
Benjamin
| #
Hi,
Kleine Korrektur: Java enums haben sehr wohl eine natürliche Ordnung, nämlich die ihrer Deklaration und implementieren entsprechend auch das Comparable interface:
https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html
Das ist aber in dem verlinkten Artikel auch falsch dargestellt.
Ich hab das übrigens auch schon mal benutzt gesehen, dass die Ordnung der enums verwendet wird, und zwar so: In der Applikation wurden sets von Aktionen ausgeführt (die aus der DB kamen), jede Aktion hatte einen bestimmten Typ und die Ordnung der Aktionenstypen war relevant. Die Ordnung der Aktionen eines einzelnen Typs aber nicht. Also wurden die Aktionen eben nur nach dem Typ sortiert.
Ich fand das aber keine besonders schöne Lösung: Intuitiv würde ich eigentlich nicht erwarten dass eine Umsortierung von enum werten eine logische Bedeutung hat (bzw. haben sollte).
Reply
Sven
| #
Vielen Dank für den Hinweis. Da hätte ich wohl selbst genauer recherchieren, anstatt nur ablesen sollen 😉
Bezüglich Deinem Beispiel stimme ich Dir zu: Als Entwickler würde ich nicht erwarten, dass die Umsortierung von Enum-Einträgen eine technische Auswirkung hat. Interessant finde ich die Sortierung, aber wenn es darum geht eine Wertemenge für einen Anwender in der Benutzeroberfläche anzuzeigen (z.B. als Dropdown-Liste) — da kann so eine Sortierung schon nützlich sein (Parade-Beispiel sind natürlich Wochentage, Monate, etc.).
Reply