sbt 1.0.0 はじめました

in

Lightbend の技術系ブログ Tech Hub blog に sbt 1.0.0 is now available という記事を書いたので、訳しました。
詳細は sbt 1.0.0 リリースノートを見てください。

Eugene Yokota (@eed3si9n) 2017年8月11日 著

Lightbend社 Tooling チームに代わって sbt 1.0.0 のリリースを発表します!

Mark Harrah さんが 2008 年に最初にリリースした sbt から数えると、sbt 1 は何年もかけて開発された大きな里程標であると言える。直近のメジャーリリースの sbt 0.13.x も、最初のリリースが 2013年8月なので 4年間続いたことになる。

Travis-CI からの自動公開

in

GitHub Pages は OSS プロジェクトのドキュメントをホスティングするのに便利だ。
ここでは Travis CI を使って pull request の merge 時に自動デプロイする方法を説明する。

1. 新しい RSA キーを適当なディレクトリ内で生成する。

プロジェクト外にまずはディレクトリを作る。
キーの名前は deploy_yourproject_rsa などとつけて、他のキーと区別できるようにする。

$ mkdir keys
$ cd keys
$ ssh-keygen -t rsa -b 4096 -C "yours@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xxx/.ssh/id_rsa): deploy_website_rsa
Enter passphrase (empty for no passphrase):

パスフレーズは空のままにする。

2. ウェブサイトプロジェクトに移動する。

プロジェクトに移動して、ブランチを立てて、.travis という名前のディレクトリを作る。

Atreus のためのトレイ

image

前回 Atreus の組み立てについて書いたときに、キーボードの配置についてちょっと書いた。

さらにたとえレイアウトを克服して様々なシンボルの場所を暗記しても残っている問題が一つあって、それは置き場所だ。ラップトップと自分の間に置くと画面が遠すぎる気がする。

この問題の解決方法として、MacBook Pro のキーボード上に Atreus を配置できるようにトレーを作ってみた。

Atreus

in

しばらく前にキットで買った Atreus を昨日の夜作り終えた。詳細はこんな感じ:

  • Matias Quiet Click スイッチのオプションを選んだ(スライダーはグレー)。クリックという名前は付いているがクリック感は無いことに注意。
  • 修飾キーには Matias Quiet Linear スイッチを使用(スライダーは赤)。
  • いわゆる ortholinear 系の格子状の、スプリットレイアウトで、42 のキーがある。
  • マホガニー材の合板。

材料

キットには Arteus キーボードを組み立てるのに必要なものはほぼそろっている。自分で用意する必要があるのはラッカー、半田ごて、ハンダ、とニッパーだ。

Gigahorse 0.3.0

Gigahorse 0.3.0 をリリースした。Gigahorse が何かはドキュメンテーションをみてほしい。

OkHttp サポート

0.3.0 は Square OkHttp サポートを追加する。 Gigahorse-OkHttp は Scala 2.10, 2.11, 2.12 向けにクロスビルドされている。

JavaDoc によると、OkHttpClient のインスタンスは close しなくてもいいらしい。

scala> import gigahorse._, support.okhttp.Gigahorse
import gigahorse._
import support.okhttp.Gigahorse
 
scala> import scala.concurrent._, duration._
import scala.concurrent._
import duration._

sbt 1.0 ロードマップと beta-1

in

Lightbend の技術系ブログ Tech Hub blog に sbt 1.0 roadmap and beta-1 という記事を書いたので、訳しました。

@eed3si9n

sbt 1.0 はかれこれ数年間制作中という状態が続いていて、コミュニティーの中には「もう出ないのでは」という懐疑派がいてもおかしくない。そのような懸念は以下の論点によって払拭できると思っている:

  • 本来 1.0 に予定していた (AutoPlugin や Dotty サポートのような) 機能はすでにテクノロジー・プレビューとして 0.13 系にてリリースされている。
  • 1.0 に予定されていた機能のうち、より意欲的なものは延期または機能を縮小して 1.0 が早期に実現できるようにした。(キャッシュ化されたコンパイルや Ivy の置き換えなど)
  • sbt 1.0 はベーパーウェアではない。最新だと 1.0.0-M5 などマイルストーンが出ていて、今すぐ試すことができる。

そのため、2017年夏までに sbt 1.0 プランを実現可能だと思っている。

sbt-sidedish を使ったアプリのダウンロードと実行

sbt プラグインから JAR をダウンロードしてそれを実行したいという要望が出てきてる。
最近だと Brooklyn での nescala で Shane Delmore (@shanedelmore) さんに聞かれた。

アンカンファレンスのセッションでデモっぽいものをやっつけで作ったけども、家に帰ってからも色々いじったのでここに報告する。

sbt-sidedish

sbt-sidedish はアプリをサイドメニュー的に落としてきて実行するためのプラグイン作者のためのツールキットだ。それそのものは特にプラグインを定義しない。

rewritedemo、コマンドラインアプリ

サイドで走らせたいアプリを作る。これは Scala 2.11 や 2.12 を使ってもいい。

猫番: 16日目

猫番: 16日目書いた。

sbt 0.13.15 リリースノート

in

互換性に影響のある新機能、変更点、バグ修正

  • sbt 0.13.15 は Maven のバージョンレンジをできる限り取り除く。詳細は後ほど。

改善点

  • 予備として JDK 9 との互換性を追加した。この機能は 0.13.15 以降のネイティブパッケージを必要とする。 #2951/143 by @retronym
  • オフライン・インストール用に "local-preloaded" レポジトリを追加する。詳細は後ほど。
  • ウォーミングアップされた JVM に留まるように、バッチモードで sbt を実行すると [ENTER] を押して shell に切り替えるよう通知するようにした。 #2987/#2996 by @dwijnand
  • .taskValue を使わずに sourceGenerators += Def.task { ... } と書けるようにするために Append のインスタンスを追加した。 #2943 by @eed3si9n
  • JUnitXmlTestsListener が生成する XML が無視、スキップ、保留状態のテストにそれぞれフラグを立てるようにした。 #2198/#2854 by @ashleymercer
  • プロジェクトが Dotty を使ってコンパイルしていると検知した場合に、自動的に scalaCompilerBridgeSource を設定して、Dotty プロジェクトのボイラープレートを軽減するようにした。ただし、sbt における Dotty サポートは現在実験的であり、正式にはサポートされていないことに注意。詳細は dotty.epfl.ch 参照。 #2902 by @smarter
  • sbt new のレファレンス実装である Giter8 を 0.7.2 にアップデートした。

Contraband、case class の代替案

in

しばらく考えている疑問がいくつかある:

  • データや API はどう書かれるべきだろうか?
  • そのデータは Java や Scala ではどう表現されるべきか?
  • そのデータは JSON などのワイヤーフォーマットにどう変換することができるか?
  • そのデータをどうやってバイナリ互換性を崩さずに進化させることができるか?

case class の限界

Scala でデータ型を表現する慣用的な方法は sealed trait と case class だが、バイナリ互換性を保ったままフィールドを追加することができない。簡単な Greeting という case class を例に取って、それがどのようなクラスとコンパニオンオブジェクトに展開されるか考察してみよう:

package com.example
 
class Greeting(name: String) {
  override def equals(o: Any): Boolean = ???
  override def hashCode: Int = ???
  override def toString: String = ???
  def copy(name: String = name): Greeting = ???
}
Syndicate content