Scala で書くコンソール・ゲーム

リッチなコンソールアプリの基盤は、1970年代の VT100 のような物理端末、そしてそれらのカーソル制御、テキスト整形のためのバイトシーケンスを標準化した ANSI X3.64 制御シーケンスにある。現代のターミナルアプリケーションはこれらターミナルのふるまいをエミュレートする。

そのため、良いターミナルアプリを前提とすれば、制御シーケンスprintln(...) して、標準入力を読み込む能力さえあればリッチなコンソールアプリを書くことができる。これは、どのプログラミング言語でも可能なはずだ。

console5

sbt 1.2.0

in

@eed3si9n

皆さんこんにちは。Lightbend Tooling team にかわって sbt 1.2.0 をアナウンスします。これは sbt 1 のフィーチャーリリース第二弾で、バイナリ互換性は維持しつつ新機能にフォーカスを当てたリリースとなっている。sbt 1 は Semantic Versioning にもとづいてリリースされるので、プラグインは sbt 1.x シリーズ中機能することが期待されている。

  • 2018年7月31日に 1.2.0 final 版がリリースされた。
  • 2018年7月6日までに大きな問題が見つからなければ、1.2.0-RC1 は 1.2.0 final 版となる予定だ。

sbt 1.2 の主な新機能はクロスJDK forking、composite project、そして実験的な thin client だ。sbt 1.1 から 6ヶ月の間他にも色々なバグ修正や改善点がたまっていた。

プラグイン開発のための SbtPlugin

君達の JDK は全て jabba がいただいた

OpenJDK 11-ea, GraalVM, Eclipse OpenJ9 を試してみたり、未だに OpenJDK 6 でビルドしなければいけなかったりしたとしても jabba なら万全だ。jabba は Stanley Shyiko (@shyiko) さんが作ったクロスプラットフォームな Java のバージョンマネージャーだ。

以下は jabba を使って Travis CI 上で Azul Zulu OpenJDK 6 を用いてビルドする方法だ:

sudo: false
dist: trusty
group: stable
 
language: scala
 
env:
  global:
    - TRAVIS_JDK=zulu@1.6.107
    - JABBA_HOME=/home/travis/.jabba
  matrix:
    - SCRIPT_TEST="; mimaReportBinaryIssues; test"
 
before_install:

2018.06 mixtape

Spotify: https://open.spotify.com/user/1235450353/playlist/4jqNCyUylGh9zCYt0JHqEv...
YouTube: https://www.youtube.com/playlist?list=PLSUh6oJ5ZotVoTIXr6OBeLuUSor-PDN_p

  • The Seed - ANIMA!
  • Looped - Kiasmos
  • Naive - RKCB
  • Making Distractions - Kllo
  • Lights - YOSIE, LO
  • CR-V - Cuco
  • Arisen My Senses - Björk
  • Hush - Tourist
  • You and Me - Shallou
  • Last Day… - Shallou
  • Life, Life (Andy Stott Remodel) - Ryuichi Sakamoto
  • Nix - Dawn of Midi
  • A Meaningful Moment Through a Meaning(less) Process - Stars Of The Lid
  • Obfuse - Floating Points

Expecty を用いた power assert を復活させる

僕は Expecty を試してみたかったので、eed3si9n/expecty にフォークして、sbt ビルドを追加して、コードが Scala 2.10、2.11、2.12、2.13.0-M4 で動作するようにパッチを当てて、上流にプルリクを還元した後でパッケージ名を変更して、Maven Central に公開した:

libraryDependencies += "com.eed3si9n.expecty" %% "expecty" % "0.11.0" % Test

Scala.JS か Scala Native の場合は:

libraryDependencies += "com.eed3si9n.expecty" %%% "expecty" % "0.11.0" % Test

以下のように使うことができる:

scala> import com.eed3si9n.expecty.Expecty.assert
import com.eed3si9n.expecty.Expecty.assert
 
scala> assert(a * b == 7)
java.lang.AssertionError:
 
assert(a * b == 7)
       | | | |
       1 3 3 false
 
  at com.eed3si9n.expecty.Expecty$ExpectyListener.expressionRecorded(Expecty.scala:25)
  at com.eed3si9n.expecty.RecorderRuntime.recordExpression(RecorderRuntime.scala:34)
  ... 38 elide

上のように、ナイスなエラーメッセージが自動的に得られる。

sbt-sriracha を用いたホットなソース依存

in

ソース依存性はかなり前から sbt に存在するが、あまりドキュメント化されていない機能の一つだ。

sbt-sriracha を使って、µTest へのハイブリッド依存性は以下のように定義できる:

lazy val utestJVMRef = ProjectRef(uri("git://github.com/eed3si9n/utest.git#5b19f47c"), "utestJVM")
lazy val utestJVMLib = "com.lihaoyi" %% "utest" % "0.6.4"
 
lazy val root = (project in file("."))
  .sourceDependency(utestJVMRef % Test, utestJVMLib % Test)
  .settings(
    name := "Hello world",
    testFrameworks += new TestFramework("utest.runner.Framework"),
  )

これらの変更によって改造版の µTest を Scala 2.13.0-M4 上で走らせられるようになった。

Bash からの Java バージョンの検知

昨日 Travis CI を用いてクロス JVM テスト する方法を書いた。

Travis CI を用いた macOS 上での Scala アプリのテスト

Travis CI を用いて macOS 上で Scala アプリのテストを行うことも可能だ。これは Lars さんと Muuki さんの方法 Testing Scala programs with Travis CI on OS X をアレンジしたものだ。

dist: trusty
 
language: scala
 
matrix:
  include:
    ## build using JDK 8, test using JDK 8
    - script:
        - sbt universal:packageBin

Travis CI を用いたクロス JVM テスト

in

Oracle は non-LTS JDK を 6ヶ月おき、LTS JDK を 3年おきにリリースする計画だ。また、今後は OpenJDK に集約されていくらしい。計画どおりにいけば、JDK 9 は 2018年3月に EOL、JDK 10 は 2018年3月にリリースされ、2018年9月に EOL、そして 2018年9月に JDK8 をリプレースする LTS JDK 11 は 2021年まで続くということになる。

今後立て続けにリリースされる JDK に備えて、Travis CI を使ってアプリを JDK 8, JDK 9, そして JDK 10 Early Access でテストする方法を紹介する。

dist: trusty
 
language: scala
 
matrix:
  include:
    ## build using JDK 8, test using JDK 8
    - script:
        - sbt universal:packageBin
        - cd citest && ./test.sh
 
    ## build using JDK 8, test using JDK 9

sbt-nocomma を用いたカンマの消去

in

本稿は build.sbt からカンマを消去する nocomma { ... } マクロを導入する sbt-nocomma を紹介する。

import Dependencies._
 
lazy val root = (project in file("."))
  .settings(nocomma {
    ThisBuild / organization := "com.example"
    ThisBuild / scalaVersion := "2.12.4"
    ThisBuild / version      := "0.1.0-SNAPSHOT"
 
    name := "Hello"
 
    // comment works
    libraryDependencies += scalaTest % Test
  })

sbt-sticker

in

以前ツイートしたとおり、sbt ステッカーを自作した。

自分が欲しいから作ったわけだが、sbt エコシステムのコントリビューターの皆さんにも配っている。

過去にバグ報告したり、Stackoverflow や社内で質問に答えたり、プラグイン作ったり、sbt の勉強会をやったり、プルリクを送ってくれた人は是非 ScalaMatsuri や Scala Days で声をかけてください。

Syndicate content