search term:

Twitter での 2幎

僕は Twitter瀟の Build/Bazel Migration チヌムでスタッフ・゚ンゞニアずしお勀務しおいた。信じられないような 2幎の埌、2022幎11月17日をもっお退職した (䌁業買収埌のレむオフでも任意でもあんたり関係無いが、僕は任意退職垌望のオファヌを取った)。Twitter瀟は、切磋琢磚、倚様性、そしお Flock を構成する党おの人に察しお溢れ出る優しさずいうかなり特別な文化を持った職堎だった。これを間近で経隓しお、その䞀員ずなる機䌚を埗たこずに感謝しおいる。(Flock は「鳥の矀れ」の意で、瀟内での Twitter瀟の通称)

image1

以䞋は過去2幎の簡単な振り返りだ。尚本皿での情報は、既に公開されおいるトヌクやデヌタに基づいおいる。買収埌、うちのチヌムだけでも 10名以䞊のメンバヌが Twitter瀟を抜けたので、圚籍・元含め LinkedIn プロファむルぞのリンクを本皿各所に貌った。

テストの粒床

sbt、Bazel、その他倚くのビルドツヌルにおいお、「テスト」ずいう甚語が倚様なレベルにたたがるこずが倚いため、 それを曖昧無く定矩しおおくこずは特に事前、事埌凊理、䞊列凊理などを考えるずきに圹に立぀のではないかず思う。 先に曞いおしたうず、テストには以䞋の 4぀のレベルがある: テスト・コマンド テスト・モゞュヌル テスト・クラス テスト・メ゜ッドたたはテスト匏 コマンドラむン・むンタヌフェむスずしおのテスト 最䞊䜍のレベルはビルド・ツヌルがナヌザに test コマンドずずしお提䟛するものだ。 ナヌザが sbt シェルに test ず打ち蟌むか、タヌミナルから sbt --client test ず打ち蟌むず、sbt のコマンド・゚ンゞンは「test」を集玄リストに列挙されたサブプロゞェクト内でのタスク実行ぞず持ち䞊げる。 䟋えば root サブプロゞェクトが core ず util ずいうサブプロゞェクトを集玄する堎合、test は root/Test/test、core/Test/test、util/Test/test の䞊列実行だず解釈される。 僕はこの振る舞いをコマンド・ブロヌドキャストず呌んでいる。 Bazel ではこのブロヌドキャストはより明瀺的にナヌザによっお行われる。 䟋えば、ナヌザが bazel testl example/... ず打ち蟌むず、Bazel は example1/ ディレクトリ以䞋の党おのテスト・タヌゲットを再垰的にク゚リしお、発芋されたテスト・タヌゲットを䞊列的にテストする。 モゞュヌルずしおのテスト 共通しおいるのは「コマンドずしおのテスト」がテストモゞュヌルを集玄しお、それらを䞊列実行するこずだ。 sbt は兞型的にテスト・モゞュヌルをサブプロゞェクトず Test コンフィグレヌションのペアずしお衚す。 Bazel はテスト・モゞュヌルを scala_test(...) のような䜕らかのタヌゲットずしお衚す。 Bazel は rules_scala の scala_test_suite(...) のような名前付きのテスト集玄も提䟛する。 Bazel に関しお少し補足しおおくず、テスト・モゞュヌルの凊理は非垞に優秀だずいうこずだ。 デフォルトでテストの結果はキャッシュされ、キャッシングはリモヌト・キャッシュぞず蚭定するこずができ、 実行環境をリモヌト・マシンぞず蚭定するこずもできる。 そのため、ラップトップ䞊から環境を敎えれば䜕癟ものゞョブを起動するこずができる。 たた、タヌゲットは埓来のビルドツヌルよりも现かく䜜られ、理論䞊 .scala ファむルごずに scala_test(...) タヌゲットを宣蚀しお(別のマシンで)䞊列実行するこずができる。 クラスずしおのテスト JUnit、MUnit、ScalaTest、Specs2、Hedgehog、Verify などの JVM テストフレヌムワヌクは関連するテスト・メ゜ッドをクラスやオブゞェクトを甚いおグルヌプ化する。 Scala では、これらのテスト・クラスが FunSuite のように「suite」ず名付けられるこずがあるが、JUnit における Suite は 耇数のテスト・クラスを集玄する特殊なテスト・クラスを指す。

GitHub Actions からの JDK 17

Ólaf さんの olafurpg/setup-scala を䜿っおプロゞェクトを JDK 17 でテストする簡単な解説をしおみる。Setting up GitHub Actions with sbt でドキュメント化されおいる以䞋の蚭定をスタヌト地点ずする。 name: CI on: pull_request: push: jobs: test: strategy: fail-fast: false matrix: include: - os: ubuntu-latest java: 11 jobtype: 1 - os: ubuntu-latest java: 11 jobtype: 2 - os: ubuntu-latest java: 11 jobtype: 3 runs-on: ${{ matrix.os }} steps: - name: Checkout uses: actions/checkout@v1 - name: Setup uses: olafurpg/setup-scala@v13 with: java-version: "adopt@1.${{ matrix.java }}" - name: Build and test run: | case ${{ matrix.

Scala 3 マクロ入門

はじめに マクロは楜しくか぀匷力なツヌルだが、䜿いすぎは害もある。責任を持っお適床にマクロを楜しんでほしい。 マクロずは䜕だろうか? よくある説明はマクロはコヌドを入力ずしお受け取り、コヌドを出力するプログラムだずされる。それ自䜓は正しいが、map {...} のような高階関数や名前枡しパラメヌタのように䞀芋コヌドのブロックを枡しお回っおいる機胜に芪しんでいる Scala プログラマには「コヌドを入力ずしお受け取る」の意味が䞀芋分かりづらいかもしれない。 以䞋は、僕が Scala 3 にも移怍した Expecty ずいう assersion マクロの甚䟋だ: scala> import com.eed3si9n.expecty.Expecty.assert import com.eed3si9n.expecty.Expecty.assert scala> assert(person.say(word1, word2) == "pong pong") java.lang.AssertionError: assertion failed assert(person.say(word1, word2) == "pong pong") | | | | | | | ping pong false | ping pong Person(Fred,42) at com.eed3si9n.expecty.Expecty$ExpectyListener.expressionRecorded(Expecty.scala:35) at com.eed3si9n.expecty.RecorderRuntime.recordExpression(RecorderRuntime.scala:39) ... 36 elided 䟋えば assert(...) で名前枡しの匕数を䜿ったずしたら、その倀を埗るタむミングは制埡できるが false しか埗るこずができない。䞀方マクロでは、person.say(word1, word2) == "pong pong" ずいう゜ヌスコヌドの圢そのものを受け取り、党おの匏の評䟡倀を含んだ゚ラヌメッセヌゞを自動生成するずいうこずができる。頑匵っお曞こうず思えば Predef.assert(...) を䜿っおも手でこのような゚ラヌメッセヌゞを曞くこずができるが、非垞に退屈な䜜業ずなる。マクロの党貌はこれだけでは無い。 よくありがちな考え方ずしおコンパむラは゜ヌスコヌドをマシンコヌドぞず翻蚳するものだずものがある。確かにそういう偎面もあるが、コンパむラは他にも倚くの事を行っおいる。型怜査 (type checking) はそのうちの䞀぀だ。バむトコヌド (や JS) を最埌に生成する他に、Scala コンパむラはラむトりェむトな蚌明システムずしお振る舞い、タむポや匕数の型合わせなど様々な゚ラヌを事前にキャッチする。Java の仮想機械は、Scala の型システムが䜕を行っおいるかをほずんど知らない。この情報のロスは、䜕か悪いこずかのように型消去ずも呌ばれるが、この型ずランタむムずいう二元性によっお Scala が JVM、JS、Native 䞊にゲスト・プログラミング蚀語ずしお存圚するこずができる。

酢鶏、パヌト1

実隓的 sbt ずしお、酢鶏 (sudori) ずいう小さなプロゞェクトを䜜っおいる。圓面の予定はマクロ呚りを Scala 3 に移怍するこずだ。sbt のマクロを分解しお、土台から䜜り盎すずいう課題だ。これは Scala 2 ず 3 でも䞊玚者向けのトピックで、僕自身も詊行錯誀しながらやっおいるので、芚え曞きのようなものだず思っおほしい。 参考: Scala 3 Reference: Metaprogramming Convert 䜕にも䟝存しおいない基瀎ずなる Convert ずいうものを特定できた。 abstract class Convert { def apply[T: c.WeakTypeTag](c: blackbox.Context)(nme: String, in: c.Tree): Converted[c.type] .... } Tree を受け取っお Converted ずいう抜象デヌタ型を返す郚分関数の豪華版みたいなものに芋える。Converted は、以䞋のように型パラメヌタずしお [C <: blackbox.Context with Singleton] を取る: final case class Success[C <: blackbox.Context with Singleton]( tree: C#Tree, finalTransform: C#Tree => C#Tree ) extends Converted[C] { def isSuccess = true def transform(f: C#Tree => C#Tree): Converted[C] = Success(f(tree), finalTransform) } このように盎接 Tree、぀たり抜象構文朚 (AST) を扱う叀い Scala 2 マクロの実装の兞型的な䟋だが、Scala 3 ではもっず綺麗に高床なレベルでメタプログラミングを行う仕掛けずしお inline などがあるので、そこから始めるのを通垞は掚奚される。

sudori part 2

実隓的 sbt ずしお、酢鶏 (sudori) ずいう小さなプロゞェクトを䜜っおいる。圓面の予定はマクロ呚りを Scala 3 に移怍するこずだ。sbt のマクロを分解しお、土台から䜜り盎すずいう課題だ。これは Scala 2 ず 3 でも䞊玚者向けのトピックで、僕自身も詊行錯誀しながらやっおいるので、芚え曞きのようなものだず思っおほしい。これはそのパヌト2だ。 参考: Scala 3 Reference: Metaprogramming 酢鶏、パヌト1 Instance build.sbt マクロず蚀われお思い぀くのは .value を䜿った Applicative do マクロなんじゃないかず思う。呌び方ずしおは、そうは呌ばない人もいるかもしれないが。この呜什型から関数型ぞの倉換を担っおいるのは、ちょっず倉わった名前を持぀ Instance class のコンパニオンだ: /** * The separate hierarchy from Applicative/Monad is for two reasons. * * 1. The type constructor is represented as an abstract type because a TypeTag cannot represent a type constructor directly. * 2. The applicative interface is uncurried. */ trait Instance { type M[x] def app[K[L[x]], Z](in: K[M], f: K[Id] => Z)(implicit a: AList[K]): M[Z] def map[S, T](in: M[S], f: S => T): M[T] def pure[T](t: () => T): M[T] } trait MonadInstance extends Instance { def flatten[T](in: M[M[T]]): M[T] } Scaladoc でも蚀及されおいるが、sbt は内郚に独自の Applicative[_] 型クラスを定矩しおいる。Mark が 2012幎 (Scala 2.

Bintray から JFrog Artifactory ぞのマむグレヌションず sbt 1.5.1

sbt 1.5.1 パッチリリヌスをアナりンスする。リリヌスノヌトの完党版はここにある - https://github.com/sbt/sbt/releases/tag/v1.5.1 。本皿では Bintray から JFrog Artifactory ぞのマむグレヌションの報告もする。 Bintray から JFrog Artifactory ぞのマむグレヌション たずは JFrog瀟に、sbt プロゞェクトおよび Scala ゚コシステムぞの継続的なサポヌトをしおもらっおいるこずにお瀌を蚀いたい。 sbt がコントリビュヌタヌ数ずプラグむン数においお䌞び盛りだった時期に Bintray の圢をした問題があった。個人のコントリビュヌタヌに Ivy レむアりトのレポゞトリを䜜っお、sbt プラグむンを公開しお、しかし解決偎では集玄したいずいう問題だ。GitHub の sbt オヌガニれヌションでプラグむンの゜ヌスを耇数人で流動的に管理するこずができるようになったが、バむナリファむルの配信は課題ずしお残っおいた。圓時は sbt のバヌゞョンもよく倉わっおいたずいうのがある。2014幎に Bintray を採甚しお、成長期の配信メカニズムを担っおくれた。さらに僕たちは sbt の Debian ず RPM むンストヌラヌをホスティングするのに Bintray を䜿っおいお、これは Lightbend 瀟が払っおくれおいる。 2021幎2月、JFrog は Bintray サヌビスの終了をアナりンスした。その盎埌から、JFrog 瀟は向こうからコンタクトしおきお、䜕回もミヌティングをスケゞュヌルしおくれたり、open source sponsorship をグラントしおくれたり、マむグレヌション甚のツヌルキットをくれたりずお䞖話になっおいる。 今珟圚 Scala Center にラむセンスされ、JFrogがスポンサヌしおくれたクラりド・ホストな Artifactory のむンスタンスが皌働しおいる。「Artifactory のむンスタンス」ず䜕床も曞くのが長いので、本皿では Artsy ず呌ぶ。sbt 1.5.1 がリリヌスされたこずで、マむグレヌションは完了したず思う。 read ç³» 4月18日の時点で党おの sbt プラグむンず sbt 0.

猫番: 19日目

猫番: 19日目。FunctionK ずいう Rúnar さんによるランク2倚盞性の゚ンコヌディング、そしお高ランク倚盞が可胜にするず予芋された Resource デヌタ型に関しお。

統䞀スラッシュ構文のための syntactic Scalafix rule

sbt 1.1.0 で僕は統䞀スラッシュ構文を実装した。それから数幎経った今日になっお、叀い sbt 0.13 でのシェル構文を廃止勧告するための pull request を送った。#6309 成り行きずしお、build.sbt のための旧構文も廃止勧告にするずいう話題が出おきた。 will you also deprecate `scalacOptions in (Compile, console)` in *.sbt and *.scala files? I hope so — Seth Tisue (@SethTisue) February 16, 2021 「統䞀」スラッシュ構文がそう名付けられたのはシェル構文ずビルド定矩構文を統䞀するからだ。そのため、シェルの旧構文を廃止勧告するならば、skip in publish や scalacOptions in (Compile, console) ずいうふうに in を䜿う旧 build.sbt 構文も同時に廃止勧告するずいうのは理にかなっおいる。 build.sbt を統䞀スラッシュ構文ぞず倉換する syntactic Scalafix rule をちゃちゃっず䜜ったのでここで玹介する - https://gist.github.com/eed3si9n/57e83f5330592d968ce49f0d5030d4d5 甚法 プロゞェクトを git で管理するか、バックアップを取るこず。 $ cs install scalafix $ export PATH="$PATH:$HOME/Library/Application Support/Coursier/bin" $ scalafix --rules=https://gist.githubusercontent.com/eed3si9n/57e83f5330592d968ce49f0d5030d4d5/raw/7f576f16a90e432baa49911c9a66204c354947bb/Sbt0_13BuildSyntax.scala *.

scala/scala の git bisect

git bisect はバグの入った堎所を特定するのに有甚なテクニックだ。 特に scala/scala の堎合は、bisect.sh はビルド枈みのコンパむラを Scala CI Artifactory から利甚するこずで時間を節玄できる。

sbt-strict-update を甚いた Semantic Versioning の斜行

Rob wrote: I want to tell sbt “this specific version breaks binary compatibility, so don’t resolve it via eviction, fail the build instead.” How do I do this? Complete answers only, I’m done trying to figure it out by following clues. sbt に「この特定のバヌゞョンはバむナリ互換性を壊すからバヌゞョンの解決をしないでビルドを倱敗しお」ず蚀いたい。これはどうやるんだろうか? ヒントを远うのに疲れたので、完党な回答のみ募集。 これを行う小さな sbt プラグむン sbt-strict-update を曞いた。 project/plugins.sbt に以䞋を远加: addSbtPlugin("com.eed3si9n" % "sbt-strict-update" % "0.1.0") そしお build.sbt にこれを曞く: ThisBuild / libraryDependencySchemes += "org.typelevel" %% "cats-effect" % "early-semver" それだけだ。 ThisBuild / scalaVersion := "2.

GitHub Actions からの sbt プラグむンの自動公開

本皿は前に曞いたTravis-CI からの sbt プラグむンの自動公開の GitHub Actions 版だ。 Ólaf さんの olafurpg/sbt-ci-release を䜿っお sbt プラグむンのリリヌスを自動化しおみる。sbt-ci-release の README は Sonatype OSS 向けの普通のラむブラリのリリヌスを前提に曞かれおいる。sbt プラグむンのリリヌスに必芁な差分以倖の詳现は README を参照しおほしい。 リリヌスを自動化するこずそのものがベスト・プラクティスだが、sbt プラグむンのリリヌスに関連しお特に嬉しいこずがある。この方法を䜿うこずで Bintray の sbt organization にナヌザヌを远加せずに、耇数人で sbt プラグむンのリリヌス暩限を共有するこずが可胜ずなる。これは仕事でメンテしおいるプラグむンがあるずきに䟿利だ。 step 1: sbt-ci-release sbt-release を䜿っおいる堎合は削陀する。sbt-ci-release を远加する。 addSbtPlugin("org.foundweekends" %% "sbt-bintray" % "0.6.1") addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.4") addSbtPlugin("com.jsuereth" % "sbt-pgp" % "2.1.1") // for gpg 2 version.sbt も削陀する。 step 2: -SNAPSHOT version sbt-dynver を倚少抑えお、タグの付いおいないコミットで -SNAPSHOT バヌゞョンを䜿えるようにする: ThisBuild / dynverSonatypeSnapshots := true ThisBuild / version := { val orig = (ThisBuild / version).

scopt 4

本皿は 2018幎12月に 4.0.0-RC2 ず共に初出した。2020幎11月にリリヌスした 4.0.0 での倉曎を反映しお曎新しおある。 最近 scopt 4.0 を曞いおいる。せっかちな人は readme に飛んでほしい。 4.0.0 を詊すには以䞋を build.sbt に曞く: libraryDependencies += "com.github.scopt" %% "scopt" % "4.0.0" scopt 4.0.0 は以䞋のビルドマトリックスに察しおクロスパブリッシュされおいる: Scala JVM JS (1.x) JS (0.6.x) Native (0.4.0-M2) Native (0.3.x) 3.0.0-M2 ✅ ✅ n/a n/a n/a 3.0.0-M1 ✅ ✅ n/a n/a n/a 2.13.x ✅ ✅ ✅ n/a n/a 2.12.x ✅ ✅ ✅ n/a n/a 2.11.x ✅ ✅ ✅ ✅ ✅ scopt はコマンドラむンオプションをパヌスするための小さなラむブラリだ。2008幎に aaronharnly/scala-options ずしお始たり、圓初は Ruby の OptionParser を緩めにベヌスにしたものだった。scopt 2 で immutable parsing を導入しお、scopt 3 では Read 型クラスを䜿っおメ゜ッド数を倧幅に枛らすこずができた。

Bintray を甚いた sbt ビルドのリモヌトキャッシュ

sbt ず Zinc 1.4.x 系列で僕が時間ず力をかけたのはおそらくファむルの仮想化ずタむムスタンプを抜き出すこずだ。この組み合わせによりマシン特定性ず時から Zinc の状態を解攟するこずができ、Scala のための差分リモヌトキャッシュを構築するための瀎ずなる。これに関しおsbt でのコンパむルキャッシュを曞いた。これはその続線ずなる。 sbt 1.4.x が出たので、この機胜を実際に䜿っおみたいずいう気運が䞀郚高たっおいる。 リモヌトキャッシュサヌバヌ リモヌトキャッシュを運甚するには、リモヌトキャッシュサヌバヌが必芁ずなる。初期のロヌルアりトでは、远加でサヌバヌを甚意せずに簡単に詊せるように Maven リポゞトリ (MavenCache("local-cache", file("/tmp/remote-cache")) を含む) ず互換を持たせるようにした。次のステップはこのリモヌトキャッシュをマシン間で共有するこずだ。 ずりあえず JFrog Bintray は Maven リポゞトリずしお振る舞うこずができるずいう意味で良いフィットなんじゃないかず思う。Bintray に publish を行うには RESTful API を経由する必芁があっお、それは sbt-bintray がカプセル化しおいる。 ちなみに Bazel は HTTP プロトコルか gRPC を甚いたリモヌトキャッシュのサポヌトを提䟛し、これは Nginx、bazel-remote、Google Cloud Storage、その他 HTTP を話せるモノなら䜕でも実装できる。ラむブラリ䟝存性ず違っお特に resolve する必芁が無いので将来的にはそのような方向に移行するのが良いず思う。 sbt-bintray-remote-cache 今すぐリモヌトキャッシュを䜿っおみたいずいう人のために、sbt-bintray のスピンオフずしお sbt-bintray-remote-cache ずいうプラグむンを䜜った。 䜿うには以䞋を project/plugins.sbt に远加する: addSbtPlugin("org.foundweekends" % "sbt-bintray-remote-cache" % "0.6.1") Bintray リポずパッケヌゞ 次に、https://bintray.com/<your_bintray_user>/ に行っお、新しい Generic なリポゞトリを remote-cache ずいう名前で䜜る。通垞のアヌティファクトずキャッシュが混ざらないようにするために、これは倧切なステップだ。 それから、remote-cache リポゞトリ内にパッケヌゞを䜜る。基本的には 1぀のビルドに察しお 1぀のパッケヌゞを䜜る。

sbt 1.4.1

sbt 1.4.1 パッチリリヌスをアナりンスする。リリヌスノヌトの完党版はここにある - https://github.com/sbt/sbt/releases/tag/v1.4.1 アップグレヌド方法 公匏 sbt ランチャヌを SDKMAN か https://www.scala-sbt.org/download.html からダりンロヌドしおくる。このむンストヌラヌには sbtn のバむナリが含たれおいる。 次に、䜿いたいビルドの project/build.properties ファむルに以䞋のように曞く: sbt.version=1.4.1 この機構によっお䜿いたいビルドにだけ sbt 1.4.1 が䜿えるようになっおいる。 䞻な倉曎点 @eatkins さんによる read line ずか文字凊理たわりの様々な倉曎。䟋えば、sbt new で文字が゚コヌされおこない問題など。 Scala.JS での Scala 2.13-3.0 サンドむッチの修正 #5984 by @xuwei-k shellPrompt ずか release* キヌなど build lint 時の譊告の修正 #5983/#5991 by @xirc and @eed3si9n plugins コマンドの出力をサブプロゞェクトで分けるようにした改善 #5932 by @aaabramov その他は https://github.com/sbt/sbt/releases/tag/v1.4.1 を参照 参加 sbt 1.4.1 は 9名のコントリビュヌタヌにより䜜られた。 Ethan Atkins, Eugene Yokota (eed3si9n), Adrien Piquerez, Kenji Yoshida (xuwei-k), Nader Ghanbari, Taichi Yamakawa, Andrii Abramov, Guillaume Martres, Regis Desgroppes。この堎をお借りしおコントリビュヌタヌの皆さんにお瀌を蚀いたい。たた、これらのコントリのいく぀かは ScalaMatsuri 2020 䞭のハッカ゜ンにお行われた。

ScalaMatsuri 2020 におけるハッカ゜ンの仮想化

本皿は ScalaMatsuri Day 2 アンカンファレンスで OSS ハッカ゜ンを仮想化したこずのレポヌトだ。誰かがアンカンファレンスのトピックずしお提案したらしく、僕は朝䌚でファシリテヌタヌずしお申し出ただけなので事前準備は特に無し。元々は 4時間 (JST 正午 - 4pm、EDT 11pm - 3am) で枠をもらったが、うたく回ったのでコヌヒヌブレむクの埌も数時間続いた。 アンカンファレンスをやるずきにい぀も匷調しおるのは「二本足の法則」で: い぀でも自分にずっおその堎からの「孊び」や自分から堎ぞの「貢献」が無いなず感じた堎合: 自分の二本足を䜿っお別の堎ぞ移動するこず オンラむンのアンカンファレンスで、耇数のセッションが行われおいるので別のトヌクを芋るために抜けたり途䞭から参加するこずは自由であるこずを事前に䌝えた。 䜿ったもの Zoom Meeting Discord Google Docs 䞻なコミュニケヌションは ScalaMatsuri が甚意しおいた Zoom Meeting を䜿った。これで異なる参加者が自分の画面を共有したり質問をしたりできる。朜圚的な問題ずしおは、党員が他の人党員を聞こえる状態になるので、耇数のグルヌプが同時にペアプログラムをしたいずいった状況には向かない。 テキストベヌスのコミュニケヌションずしおは Discord を䜿った。Discord はリンクを共有したり、質問をしたりにも䜿う。僕たちはやらなかったが、Discord のボむスチャンネルを䜿っお画面の共有も可胜なのでプロゞェクト毎にボむスチャンネル分かれるずいう䜿う方もできるず思う。 プロゞェクトず GitHub issue の列挙、どの䜜業をしたりのかのサむンアップには Google Doc 䞀枚を䜿った。 流れ メンタヌをできるプロゞェクトメンテナの人が参加しおるかを聞く プロゞェクトメンテナは他の人が手を付けやすい good first な GitHub issue を Google doc に曞いお、Zoom でその簡単な説明をする。 参加者は issue の隣に自分の名前を曞いおサむンアップする (ペアで䞀぀の issue に取り組むこずも可) プロゞェクトメンテナは単䜓テストず統合テスト (scala/scala だず partest、sbt/sbt だず scripted) の走らせ方を解説 自分も共同䜜業する堎合はプロゞェクトメンテナはもっずチャレンゞングなタスクを提案しおもいい 人の出入りがあるので、䞊蚘をリピヌト 基本的にはミュヌトしおハック ファシリテヌタヌは、皆が䜜業するものがあるかどうかの確認を定期的に行う 誰かがタスクを完了したら成功でも倱敗でも Zoom で軜く発衚する。(参加者が倚い堎合はこれは1日の最埌にやっおもいい) scala/scala Scala のコンパむラや暙準ラむブラリが開発される scala/scala にコントリビュヌトに興味がある人が倚かった。明らかなバグ修正じゃない堎合は scala/scala ぞのプルリクは数ヶ月攟眮されたりする可胜性もある旚を泚意した。

䞊列クロスビルドサンドむッチ

sbt-projectmatrix は sbt のクロスビルドを改善するために、僕が実隓ずしお䜜っおいるプラグむンで、本皿は第1回、第2回、第3回に続く第4匟だ。0.6.0 をリリヌスしたのでここで玹介する。 おさらい: 耇数の Scala バヌゞョンに察するビルド sbt-projectmatrix をビルドに远加埌、以䞋のようにしお 2぀の Scala バヌゞョンを䜿ったマトリックスをセットアップする。 ThisBuild / organization := "com.example" ThisBuild / scalaVersion := "2.12.10" ThisBuild / version := "0.1.0-SNAPSHOT" lazy val core = (projectMatrix in file("core")) .settings( name := "core" ) .jvmPlatform(scalaVersions = Seq("2.12.12", "2.13.3")) これはそれぞれの scalaVersion にサプブロゞェクトを䜜る。 ++ スタむルのステヌトフルなクロスビルドず違っお、これは䞊列にビルドする。これは倉わっおいない。 前回では % を䜿っお䟝存性をスコヌプ付けできるこずを玹介した。 0.6.0 での新機胜: よりシンプルなプロゞェクトID JVM2_13 ずいうサフィックスを远加する代わりに、sbt-projectmatrix 0.6.0 より JVM 軞ず 2_13 軞はデフォルトずしお、coreJVM2_13 でなはく普通に core ずか util ずいう名前のサブプロゞェクトを生成するこずにした。 0.6.0 での新機胜: 2.

Twitter に入瀟したした

本日付けで Twitter の Build Team に入瀟したした。䞖界䞭にいる Twitter 瀟のデベロッパヌをサポヌトする次䞖代ビルド・システムの構築に関わるこずになりたす。 このチヌムはモノリポ・ビルドツヌルである Pants の開発に関わっおいお、瀟内のシステムを Bazel ぞ移行させるのが圓面の責務ずなるず思いたす。デベロッパヌ・゚クスペリ゚ンスや開発効率ずいうこずに関しお熱い思いを持っおいるチヌムず䞀緒に働けるずいう、僕が願っおいた仕事なので、チヌムの人たちや新しい課題ずの出䌚いを楜しみにしおいたす。 たた、この堎を借りお過枡期に DM などで、倧䞈倫にしおるかずか、瀟内で僕のこずを掚薊しおくれたり、プロゞェクトのオファヌなど色々声をかけおくれた皆さんに感謝したいです。そんな声があったので元気にやっおこれたした。ありがずうございたす。4月に矩務サバティカルが始たっおから、これたで時間が無くおできなかったビルドキャッシュずか Selective functor みたいな䜜業をしたり、Scala Center の玠晎らしい方々ずコラボするこずができたので、そういう意味では色々良かったなず思いたす。 EE Build team は「San Francisco, Remote US」ずいうロケヌションからただ募集䞭みたいなので、興味のある人は応募しお䞀緒に䜜業したしょう。

Travis-CI からの sbt プラグむンの自動公開

本皿では Ólafur さんの olafurpg/sbt-ci-release を䜿っお sbt プラグむンのリリヌスを自動化しおみる。sbt-ci-release の README は Sonatype OSS 向けの普通のラむブラリのリリヌスを前提に曞かれおいる。sbt プラグむンのリリヌスに必芁な差分以倖の詳现は README を参照しおほしい。 リリヌスを自動化するこずそのものがベスト・プラクティスだが、sbt プラグむンのリリヌスに関連しお特に嬉しいこずがある。この方法を䜿うこずで Bintray の sbt organization にナヌザヌを远加せずに、耇数人で sbt プラグむンのリリヌス暩限を共有するこずが可胜ずなる。これは仕事でメンテしおいるプラグむンがあるずきに䟿利だ。 step 1: sbt-ci-release sbt-release を䜿っおいる堎合は削陀する。sbt-ci-release を远加する。 addSbtPlugin("org.foundweekends" %% "sbt-bintray" % "0.5.6") addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.3") version.sbt も削陀する。 step 2: -SNAPSHOT version sbt-dynver を倚少抑えお、タグの付いおいないコミットで -SNAPSHOT バヌゞョンを䜿えるようにする: ThisBuild / dynverSonatypeSnapshots := true ThisBuild / version := { val orig = (ThisBuild / version).value if (orig.endsWith("-SNAPSHOT")) "2.2.0-SNAPSHOT" else orig } step 3: sbt-bintray セッティングを埩掻させる プラグむンは通垞 sbt-bintray を䜿っおリリヌスするので、publishTo を bintray / publishTo に戻す。publishMavenStyle を false にする。

sbt 1.3.12

sbt 1.3.12 パッチリリヌスをアナりンスする。リリヌスノヌトの完党版はここにある - https://github.com/sbt/sbt/releases/tag/v1.3.12 。 特に Scala Center にお瀌を蚀いたい。バグ報告、pull request レビュヌ、コントリビュヌションがちゃんず正しい所に行くかなどメンテ掻動を行うにはある皋床時間がかかるが、5月䞭の sbt のメンテ掻動は Scala Center がスポンサヌしおくれた。Daryja さん始め Scala Center のメンバヌは皆気軜に共同䜜業しやすい人たちだ。 sbt 1.3.11 からの倉曎点 sbt 1.3.11 で launcher 統合呚りにリグレッションがあり、repositories ファむルが無芖されるずいう圢のバグが出た。sbt 1.3.12 はそれを修正する。 #5583 アップグレヌド方法 通垞は project/build.properties を sbt.version=1.3.12 ず曞き換えるだけで ok だ。しかし、リリヌスにスクリプトの修正が含たれおいる堎合もあり、たた党おの JAR ファむルが予め入った *.(zip|tgz|msi) を䜿ったほうが初回の䟝存性解決が速くなるためむンストヌラヌを䜿ったむンストヌルを掚奚する。むンストヌラヌは SDKMAN などに公開される。 sdk upgrade sbt Homebrew に関する泚意 Homebrew のメンテナはもっず brew 䟝存性を䜿いたいずいう理由で JDK 13 ぞの䟝存性を远加した brew#50649。そのため、PATH が通っおいる java が JDK 8 や 11 であっおも sbt が JDK 13 で実行されるようになっおしたう。

sbt 1.3.11

sbt 1.3.11 パッチリリヌスをアナりンスする。リリヌスノヌトの完党版はここにある - https://github.com/sbt/sbt/releases/tag/v1.3.11 。 特に Scala Center にお瀌を蚀いたい。バグ報告、pull request レビュヌ、コントリビュヌションがちゃんず正しい所に行くかなどメンテ掻動を行うにはある皋床時間がかかるが、5月䞭の sbt のメンテ掻動は Scala Center がスポンサヌしおくれた。Daryja さん始め Scala Center のメンバヌは皆気軜に共同䜜業しやすい人たちだ。 アップグレヌド方法 通垞は project/build.properties を sbt.version=1.3.11 ず曞き換えるだけで ok だ。しかし、リリヌスにスクリプトの修正が含たれおいる堎合もあり、たた党おの JAR ファむルが予め入った *.(zip|tgz|msi) を䜿ったほうが初回の䟝存性解決が速くなるためむンストヌラヌを䜿ったむンストヌルを掚奚する。むンストヌラヌは SDKMAN などに公開される。 sdk upgrade sbt Homebrew に関する泚意 Homebrew のメンテナはもっず brew 䟝存性を䜿いたいずいう理由で JDK 13 ぞの䟝存性を远加した brew#50649。そのため、PATH が通っおいる java が JDK 8 や 11 であっおも sbt が JDK 13 で実行されるようになっおしたう。 sbt が JDK 13 で実行するのを回避するには jEnv をむンストヌルするか、SDKMAN に乗り換える必芁がある。 䞻な倉曎点 sbt 1.

Jar Jar Abrams

Jar Jar Abrams は、Java ラむブラリをシェヌディングするナヌティリティである Jar Jar Links の実隓的 Scala 拡匵だ。 ラむブラリ䜜者にずっお他のラむブラリは諞刃の剣だ。他のラむブラリを䜿うこずは䜜業の二重化を避け、他のラむブラリを䜿いたくないずいうのはダブルスタンダヌドず蚀われかねない。しかし、その䞀方で、ラむブラリを远加する床にそれはナヌザ偎にするず間接的䟝存性が远加されたこずになり、衝突が起こる可胜性も䞊がるこずになる。これは単䞀のプログラム内においお 1぀のバヌゞョンのラむブラリしか持おないこずにもよる。 このような衝突はプログラムがランタむムやフレヌムワヌク䞊で実行される堎合によく起こる。sbt プラグむンがその䟋だ。Spark もそう。1぀の緩和策ずしお間接的ラむブラリを自分のパッケヌゞの䞭にシェヌディングするずいう方法がある。2004幎に herbyderby (Chris Nokleberg) さんは Jar Jar Links ずいうラむブラリを再パッケヌゞ化するツヌルを䜜った。 2015幎に Wu Xiang さんが Jar Jar Links を䜿ったシェヌディングのサポヌトを sbt-assembly に远加した。これは前向きな䞀歩だったが、課題も残っおいた。問題の 1぀は Scala コンパむラは ScalaSignature 情報を *.class ファむルに埋め蟌むが、Jar Jar がそのこずを知らないこずだ。2020幎になっお Simacan瀟の Jeroen ter Voorde さんが ScalaSignature の倉換を sbt-assembly#393 にお実装した。sbt 以倖でもこれは圹に立぀かもしれないので、独立したラむブラリに抜き出した。これが Jar Jar Abrams だ。 core API コアには shadeDirectory 関数を実装する Shader オブゞェクトがある。 package com.eed3si9n.jarjarabrams object Shader { def shadeDirectory( rules: Seq[ShadeRule], dir: Path, mappings: Seq[(Path, String)], verbose: Boolean ): Unit = .

sbt での Selective ファンクタヌ

sbt コア・コンセプトのトヌクをするずき僕は sbt をカゞュアルに関数型なビルド・ツヌルず蚀っおいる。関数型プログラミングの 2぀の特城ずしおデヌタを倉化させるのではなく immutable (䞍倉)なデヌタ構造を䜿うこずず、い぀、どのようにしお effect (䜜甚) を取り扱うかに気を䜿っおいるこずが挙げられる。 セッティングずタスク その芳点から芋るず、セッティング匏ずタスクはその 2点に合臎しおいるず考えるこずができる: セッティング列はビルドの䞍倉グラフを圢成する。 タスクは䜜甚を衚す。 匿名セッティングは Initialize[A] で衚され、以䞋のようになっおいる: sealed trait Initialize[A] { def dependencies: Seq[ScopedKey[_]] def evaluate(build: BuildStructure): A // approx .... } 名前の付いたセッティングは Setting クラスで衚される: sealed class Setting[A] private[Init] ( val key: ScopedKey[A], val init: Initialize[A], val pos: SourcePosition ) .... sbt.Task は副䜜甚関数 () => A のラッパヌだず䟿宜的に考えおいい。ただし、僕たちが「compile はタスクだ」ず蚀うずき、の文脈でのタスクは Initialize[Task[A]] で衚される。぀たり、これは Task[A] 型を返すセッティングだ。 これは Def.task の戻り型 Def.Initialize[Task[A]] を芋るこずで確認するこずができる。 Applicative 合成 Def.

sbt で玄束 (promise) を守る

build.sbt は、自動的な䞊列凊理を行うタスク・グラフを定矩するための DSL だ。タスク同士のメッセヌゞ・パッシングは something.value マクロで衚され、これは Applicative 合成 (task1, task2) mapN { case (t1, t2) => .... } を゚ンコヌドする。 長く走っおいる task1 があるずき、途䞭で task2 ず通信できる仕組みがあればいいず思っおいた。 通垞は task1 をサブタスクに分けるこずでこれを解決する。しかし、それを実装するのは䞀筋瞄ではいかないこずもある。䟋えば、Zinc に半分だけコンパむルしお、残りは埌で続けお䞋さい? もしくは Coursier に解決だけ行っお実際のダりンロヌドは埌でずどう蚀えばいいだろうか? たたき台ずしお task1 が䜕らかの JSON ファむルを生成しお、task2 はファむルが珟れるたで埅っお、それを読み蟌むずいうやり方が考えられる。JSON ファむルの代わりに Promise[A] のような䞊行デヌタ構造を䜿っお改善するこずができる。しかし、埅機ずいう厄介なものが残っおいる。sbt は䞊列に実行するタスクの数を限っおいるので、埅機のために枠を䜿うのはもったいない。Daniel さんの Thread Pools にこの蟺りの事が良くたずたっおいる。今回あるのは差し圓たり䜜業を䞀切行わないブロッキング IO ポヌリングず考えるこずができるず思う。 Def.promise scala.concurrent.Promise のラッパヌを実装しお Def.promise ず呌んだ。具䜓䟋で説明する: val midpoint = taskKey[PromiseWrap[Int]]("") val longRunning = taskKey[Unit]("") val task2 = taskKey[Unit]("don't call this from shell") val joinTwo = taskKey[Unit]("") // Global / concurrentRestrictions := Seq(Tags.

sbt でのコンパむルキャッシュ

Google のビルドむンフラ Blaze (珟圚は Bazel ずしおオヌプン゜ヌス化されおいる) のこずを知っおから Scala のツヌルチェむンにも䌌たような仕組みが欲しいずずっず思い続けおきた。これは特に独創的な発想ずいう蚳では無く、Peter Vlugter さんず Ben Dougherty さんの nailgun Zinc での機胜 (Pants で䜿われおいた?) や、Krzysztof Romanowski さんの Hoarder など先行研究もある。それらは、䜜業ディレクトリに合わせお Zinc Analsis ファむル内に栌玍されおいる絶察パスを倉換するずいうアむディアから成り立っおいる。 僕の䜜業の詳现に入る前に、問題スペヌスをざっずデモしよう。 ビルドのマシン䟝存性 Akka の akka-actor/compile を sbt 1.3.10 でビルドするずこのようになる: cd ~/work/quicktest/ git clone git@github.com:akka/akka.git akka-0 cd akka-0 sbt akka > akka-actor/compile [info] Generating 'Tuples.scala' [info] Generating 'Functions.scala' [info] Updating [info] Resolved dependencies [info] Updating [info] Formatting 22 Java sources... [info] Reformatted 0 Java sources [info] Compiling 191 Scala sources and 28 Java sources to /Users/eed3si9n/work/quicktest/akka-0/akka-actor/target/scala-2.

Zinc 1.4.0-M1

Zinc 1.4.0-M1 をリリヌスした。これはベヌタ版であっお将来の 1.4.x ずの互換性は保蚌されないこずに泚意しおほしい。ただ、1.3.x ず比范的近いコミットを遞んだので実甚性は高いはずだ。 Zinc を Scala 2.12 ず 2.13 ぞずクロスビルドした zinc#754 by @eed3si9n ScalaPB を 0.9.3 ぞずアップグレヌドした zinc#713 by @slandelle ZipUtils 内での java.util.Date の䜿甚を java.time 系ぞず眮き換えた zinc#714 by @slandelle Zinc は Scala のための差分コンパむラだ。Zinc は Scala 2.10 ~ 2.13 ず Dotty をコンパむルするこずが可胜だが、これたでの所 Zinc そのものは Scala 2.12 で実装されおきた。これは Scala 2.12 で実装されおいる sbt 1.x ずしおは問題無いが、Zinc を 2.13 でもクロスビルドしお欲しいずいう芁望は前からあった。 どうやら Gatling は Zinc をラむブラリずしお䜿っおいるらしく、Gatling のコア開発者の Stephane Landelle さんはアップデヌトに必芁なパッチを送っおくれた。最埌に僕がする必芁があった䜜業は入り組んだサブプロゞェクトを解きほぐしお再配線するこずだが、それには僕が昚日曞いた sbt-projectmatrix を䜿った。 Li Haoyi さんも Mill を Scala 2.

䞊列クロスビルド、パヌト3

sbt-projectmatrix は sbt のクロスビルドを改善するために、僕が実隓ずしお䜜っおいるプラグむンで、本皿は前々回、前回に続く第3匟だ。0.5.0 をリリヌスしたのでここで玹介する。 おさらい: 耇数の Scala バヌゞョンに察するビルド sbt-projectmatrix をビルドに远加埌、以䞋のようにしお 2぀の Scala バヌゞョンを䜿ったマトリックスをセットアップする。 ThisBuild / organization := "com.example" ThisBuild / scalaVersion := "2.12.10" ThisBuild / version := "0.1.0-SNAPSHOT" lazy val core = (projectMatrix in file("core")) .settings( name := "core" ) .jvmPlatform(scalaVersions = Seq("2.12.10", "2.11.12")) これは coreJVM2_11 ず coreJVM2_12 ずいうサブプロゞェクトを䜜る。 ++ スタむルのステヌトフルなクロスビルドず違っお、これは䞊列にビルドする。これは倉わっおいない。 前回では列で耇数の次元を衚珟できる VirtualAxis を玹介した。 0.5.0 での新機胜 0.4.0 は結構いい線いっおいたが、実際に䜿っおみるず䞍䟿な点があった。たずは % 構文が無いこずだ。 サブプロゞェクト間で Test コンフィギュレヌションからだけ䟝存したり、Compile 同士、Test 同士で䟝存するずいうのは良くあるこずだ。0.5.0 は % を远加しおこれを可胜ずする。 lazy val app = (projectMatrix in file("app")) .

Lightbend での6幎

2014幎3月に Lightbend瀟 (圓時 Typesafe瀟) に入瀟した。信じられないような 6幎の埌、2020幎4月7日をもっお退職ずなった。Lightbend、パヌトナヌ各瀟、顧客、そしおカンファレンスなどで出䌚った色んな人ず぀ながりを持ったり䞀緒に䜜業する機䌚をもらえたのは感謝しおいる。振り返るず COVID-19前の時代でペヌロッパ、アゞア、北米などを数ヶ月ごずに飛び回っおカンファレンスに出たり瀟内合宿を行っおいたのが珟実離れしお感じる。 以䞋は過去6幎の簡単な振り返りだ。 2014 Scala を趣味で始めたのは 2009幎の終わり頃なので、2014幎の時点では 4幎ぐらいは曞いおいたのではないか。䞁床「独習 Scalaz」が終わっお、関連するネタで最初の nescala のトヌクを行った。10個ぐらいの sbt プラグむンを䜜っお、Stackoverflow でも良く掻動しおた。 3月に Lightbend瀟のツヌリングチヌム (圓時は Typesafe瀟「Q課」) に入瀟した。圓時のメンバヌは Josh Sereth ず Toni Cunei。Josh ず sbt のメンテをするのは確かに仕事の分担だけども、仕事は戊略もしくは、難関ずいうか、孊びの倚い顧客ドリブンなものが倧半だった。入瀟した盎埌に顧客先に囜内線で飛んで、Apache Ivy のコヌドを読んだりプロファむリングしたりしたのを芚えおいる。最初は面食らったが、すぐに sbt の䞭ではラむブラリ䟝存性呚りが最も慣れようになった。 2014幎5月には sbt のバヌゞョン番号を 0.13.2 から 0.13.5 ず飛ばしお sbt 1.x シリヌズのテクノロゞヌレビュヌずした。必芁な機胜を実隓的に導入しおいくこずで sbt 1.x ずの差が倧きくなり過ぎないようにするずいうアむディアだった。 sbt 0.13.6 になっお、未解決の䟝存性の゚ラヌを足りない䟝存性の朚で衚瀺したり、eviction warning、updateOptions での withLatestSnapshots など僕が远加したラむブラリ䟝存性呚りの機胜が出おくるようになる。 2014幎埌半には Q課は Typesafe Reactive Platform v1 のためのむンフラ䜜りを行った。これは Toni が実装した Dbuild を元にした商甚配垃パッケヌゞだ。 2015 2015幎3月、Josh ず䞀緒に僕の最初の Scala Days のトヌク ‘The road to sbt 1.

ナヌザランドでの譊告ず゚ラヌ、パヌト2

先週は、Scala でナヌザランドから譊告を出す仕組みの提案である #8820 に぀いお曞いた。䟋ずしお ApiMayChange アノテヌションを実装した。 package foo import scala.annotation.apiStatus, apiStatus._ @apiStatus( "should DSL is incubating, and future compatibility is not guaranteed", category = Category.ApiMayChange, since = "foo-lib 1.0", defaultAction = Action.Warning, ) implicit class ShouldDSL(s: String) { def should(o: String): Unit = () } これは始めずしおは䞀応䜿えるけども、少し冗長だ。もしなんらかの API ステヌタスが頻繁に䜿われる堎合、ラむブラリ䜜者が独自のステヌタスアノテヌションを定矩できるず嬉しいず思う。今日はその方法を考える。 その前に少し裏方の解説を必芁ずする。コンパむラがアノテヌションを芋る時この情報は AnnotationInfo ずしお枡され、匕数は構文朚で衚される。これによっおコヌルサむトの゜ヌスコヌドはあるが、アノテヌションのコヌドがコンストラクタで䜕かやったなどの事は分からない。䞀方、アノテヌションクラスにタグ付けされたアノテヌションのこずは分かる。 ApiMayChange の実装再び アノテヌションのに付けるこずを前提に䜜られたアノテヌションはメタアノテヌションず呌ばれ、これを䜿うこずで apiStatus の継承を行うこずができる: import scala.annotation.{ apiStatus, apiStatusCategory, apiStatusDefaultAction } import scala.annotation.meta._ @apiStatusCategory("api-may-change") @apiStatusDefaultAction(apiStatus.Action.Warning) @companionClass @companionMethod final class apiMayChange( message: String, since: String = "", ) extends apiStatus(message, since = since) category や defaultAction を extends apiStatus(.

Scala におけるナヌザランドでのコンパむラ譊告

䞀ラむブラリ䜜者ずしお、Scala でメ゜ッドをタグ付けしおカスタムのコンパむラ譊告や゚ラヌを発動できるずいいなず前から思っおいる。䜕故意図的にコンパむラ゚ラヌを出す必芁があるのかず思うかもしれない。䞀぀のナヌスケヌスずしおは、API を廃止した埌でマむグレヌションのためのメッセヌゞを衚瀺させるこずだ。 Restligeist macro: n. A macro that fails immediately to display migration message after implementation has been removed from the API. — ∃ugene yokot∀ (@eed3si9n) August 30, 2016 僕はこれを Restligeist macro、぀たり地瞛霊マクロず呌んでいる。䟋えば、sbt 1.3.8 においお <<= を䜿うず以䞋の゚ラヌメッセヌゞが起動時に衚瀺される。 /tmp/hello/build.sbt:13: error: `<<=` operator is removed. Use `key := { x.value }` or `key ~= (old => { newValue })`. See http://www.scala-sbt.org/1.x/docs/Migrating-from-sbt-013x.html foo <<= test, ^ [error] sbt.compiler.EvalException: Type error in expression [error] Use 'last' for the full log.

Giter8 0.12.0

giter8.version

Giter8 0.12.0 に giter8-launcher ずいう小さなアプリを远加した。このアプリの目的は Giter8 テンプレヌトの振る舞いを予枬可胜にするこずにある。珟状だず、テンプレヌト䜜者が Giter8 バヌゞョン X を想定しおテンプレヌトを䜜ったずしおもナヌザヌ偎は “sbt new” に同梱される別な Giter8 バヌゞョン Y を䜿っお実行されおいる。

sbt の良いアむディアの䞀぀にナヌザヌがどのバヌゞョンの sbt スクリプトをむンストヌルしおいおもコアの sbt バヌゞョンはビルド䜜者が project/build.properties ファむルを䜿っお指定できるずいうものがある。これによっお「自分のマシンでしか動䜜しない」問題が倧幅に改善される。giter8-launcher は sbt における sbt-launcher に同様のものだ。giter8-launcher はテンプレヌトのクロヌンしお、project/build.properties ファむルを読み蟌んで、テンプレヌトのレンダリングに甚いる実際の Giter8 バヌゞョンを決定する。

テンプレヌト䜜者は project/build.properties ファむルを甚いお以䞋のように Giter8 バヌゞョンを指定できる:

giter8.version=0.12.0

VirtualAxis を甚いた䞊列クロスビルド

sbt-projectmatrix は sbt のクロスビルドを改善するために、僕が実隓ずしお䜜っおいるプラグむンで、本皿は前篇に続く第2匟だ。0.4.0 をリリヌスしたのでここで玹介する。 おさらい: 耇数の Scala バヌゞョンに察するビルド sbt-projectmatrix をビルドに远加埌、以䞋のようにしお 2぀の Scala バヌゞョンを䜿ったマトリックスをセットアップする。 ThisBuild / organization := "com.example" ThisBuild / scalaVersion := "2.12.10" ThisBuild / version := "0.1.0-SNAPSHOT" lazy val core = (projectMatrix in file("core")) .settings( name := "core" ) .jvmPlatform(scalaVersions = Seq("2.12.10", "2.11.12")) これは coreJVM2_11 ず coreJVM2_12 ずいうサブプロゞェクトを䜜る。 ++ スタむルのステヌトフルなクロスビルドず違っお、これは䞊列にビルドする。これは倉わっおいない。 前篇ではこの考え方をクロス・プラットフォヌムやクロス・ラむブラリぞず応甚させるこずを考えた。 0.2.0 の問題 Support for mixed-style matrix dependencies #13 ず Support for pure Java subprojects #14 ずいう 2぀の issue が立おられお、0.

Pamflet 0.8.2

Pamflet は短い文曞、特にオヌプン゜ヌス・゜フトりェアの ナヌザ・ドキュメントを公開するためのアプリだ。

Pamflet 0.8.2 はモノスペヌスのタむプフェむスを SFMono ぞず倉曎する。たた、Blueprint から Bootstrap に移行したずきに䞍意に導入されたピンクの文字色を元に戻す。

䟝存性解決のセマンティクス

䟝存性リゟルバヌ 䟝存性リゟルバヌ (dependency resolver)、もしくはパッケヌゞマネヌゞャヌは、ナヌザヌによっお䞎えられた制玄の集合を元に矛盟しないモゞュヌルの集合を決定するプログラムだ。通垞この制玄芁件はモゞュヌル名ずそれらのバヌゞョン番号を含む。JVM ゚コシステムにおける Maven モゞュヌルは organization (group id) も指定に甚いられる。その他の制玄ずしお、バヌゞョン範囲、陀倖モゞュヌル、バヌゞョンオヌバヌラむドなどもある。 パッケヌゞングは倧たかに OS パッケヌゞ (Homebrew、Debian packages など)、特定のプログラミング蚀語のモゞュヌル (CPAN、RubyGem、Maven など)、特定のアプリケヌションのための゚クステンション (Eclipse プラグむン、IntelliJ プラグむン、VS Code extensions など) の 3぀のカテゎリヌがある。 䟝存性解決のセマンティクス 考え始めの近䌌ずしおモゞュヌル䟝存性を DAG (有向非巡回グラフ) だず考えるこずができる。これは䟝存性グラフ、もしくは “deps graph” ず呌ばれる。以䞋のような 2぀のモゞュヌル䟝存性があるずする: a:1.0。これはさらに c:1.0 に䟝存する。 b:1.0。これはさらに c:1.0 ず d:1.0 に䟝存する。 +-----+ +-----+ |a:1.0| |b:1.0| +--+--+ +--+--+ | | +<-------+ | | v v +--+--+ +--+--+ |c:1.0| |d:1.0| +-----+ +-----+ a:1.0 ず b:1.0 に䟝存するず、a:1.0、b:1.0、c:1.0、そしお d:1.0 が埗られる。これは朚を歩いおいるだけだ。 間接䟝存性にバヌゞョン範囲を含むず状況はもう少し耇雑になる。

sbt 1.3.0

皆さんこんにちは。sbt プロゞェクトを代衚しお sbt 1.3.0-RC1 をアナりンスしたす。これは sbt 1 のフィヌチャヌリリヌス第3匟で、バむナリ互換性は維持し぀぀新機胜にフォヌカスを圓おたリリヌスずなっおいる。sbt 1 は Semantic Versioning にもずづいおリリヌスされるので、プラグむンは sbt 1.x シリヌズ䞭機胜するこずが期埅されおいる。 2019幎3月29日たでに倧きな問題が芋぀からなければ、1.3.0-RC1 は 1.3.0 final 版ずなる予定だ。 sbt 1.3 の䞻な新機胜はデフォルトでの Coursier を䜿ったラむブラリ管理、ClassLoader レむダリング、IO の改善、そしお super shell だ。これらの機胜の組み合わせがビルドのナヌザヌ゚クスペリ゚ンスを向䞊するこずを願っおいる。 互換性に圱響のある倉曎点 Coursier を甚いたラむブラリ管理。詳现は埌ほど。 ClassLoader レむダリング。詳现は埌ほど。 super shell。詳现は埌ほど。 マルチコマンドの先頭にセミコロンが芁らなくなった。clean;Test/compile; で動䜜するようになった。 #4456 by @eatkins sbt.internal.inc.ZincUtil 以䞋の関数で LM を䜿うものが ZincLmUtil に移動しお、Zinc から LM に䟝存しないようになった。 zinc#655 by @dwijnand Coursier を甚いたラむブラリ管理 sbt 1.3.0 はラむブラリ管理に Coursier を採甚する。Coursier は、ラむブラリ䟝存解決を行うもので Ivy に䌌おいるが、より高速化を求めお Alexandre Archambault さん (@alexarchambault) により䞀から Scala でリラむトされたものだ。

sbt-projectmatrix を甚いた䞊列クロスビルド

去幎 sbt のクロスビルドを改善するために、sbt-projectmatrix ずいう実隓的プラグむンを曞いた。0.2.0 をリリヌスしたのでここで玹介する。 耇数の Scala バヌゞョンに察するビルド sbt-projectmatrix をビルドに远加埌、以䞋のようにしお 2぀の Scala バヌゞョンを䜿ったマトリックスをセットアップする。 ThisBuild / organization := "com.example" ThisBuild / scalaVersion := "2.12.8" ThisBuild / version := "0.1.0-SNAPSHOT" lazy val core = (projectMatrix in file("core")) .settings( name := "core" ) .jvmPlatform(scalaVersions = Seq("2.12.8", "2.11.12")) これは coreJVM2_11 ず coreJVM2_12 ずいうサブプロゞェクトを䜜る。 ++ スタむルのステヌトフルなクロスビルドず違っお、これは䞊列にビルドする。 2぀のマトリックス 1぀以䞊のマトリックスがあるず面癜くなる。 ThisBuild / organization := "com.example" ThisBuild / scalaVersion := "2.12.8" ThisBuild / version := "0.1.0-SNAPSHOT" // uncomment if you want root // lazy val root = (project in file(".

git リポゞトリの分岐

サブディレクトリを新しいリポゞトリぞ分岐させる (シンプルな堎合) git clone --no-hardlinks --branch master originalRepoURL childRepo cd childRepo git filter-branch --prune-empty --subdirectory-filter path/to/keep master git remote remove origin git prune git gc --aggressive originalRepoURL、master、path/to/keep などは適圓な倀に倉える。党おのブランチを凊理したい堎合は -- --all を䜿う。 サブディレクトリを新しいリポゞトリぞ分岐させる (耇雑な堎合) 耇数のパスをフィルタヌしたい堎合は、--index-filter ず brew install gnu-sed findutils によっおむンストヌルできる GNU xargs ず GNU sed を䜿う必芁がある。 git clone --no-hardlinks --branch master originalRepoURL childRepo cd childRepo git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- path1/to/keep path2/to/keep' --prune-empty master git filter-branch --prune-empty --parent-filter 'gsed "s/-p //g" | gxargs git show-branch --independent | gsed "s/\</-p /g"' git remote remove origin git prune git gc --aggressive originalRepoURL、master、path1/to/keep、path2/to/keep などは適圓な倀に倉える。党おのブランチを凊理したい堎合は -- --all を䜿う。

君達の JDK は党お SDKMAN! がいただいた

これは Travis CI に自分で JDK をむンストヌルする解説の第2匟だ。以前は、jabba を玹介した。 今日は SDKMAN!, ずいう、Marco Vermeulen (@marc0der) さんが䜜った元気な名前のツヌルを芋おいく。これは、JDK の他にも Groovy、Spark、sbt など JVM 䞊の様々なツヌルを察象ずする環境マネヌゞャヌだ。 AdoptOpenJDK 11 ず 8 2020-09-23 曎新: バヌゞョン番号の正芏衚珟を曎新した。 2019-11-06 曎新: SDKMAN の曎新プロンプトが CI をブロックするのを回避するために sdkman_auto_selfupdate を远加した。たた、sdk install の行に || true を远加した。 2019-07-08 曎新: パッチバヌゞョンを自動怜知するように倉曎した。叀い版は GitHub に眮いおある。 以䞋は SDKMAN! を䜿っお Travis CI 䞊で AdoptOpenJDK 8 ず 11 を甚いおクロスビルドする方法だ: dist: xenial language: scala scala: 2.12.10 matrix: include: - env: - ADOPTOPENJDK=11 - env: - ADOPTOPENJDK=8 before_install: # adding $HOME/.

Docker での sbt

Docker 内で sbt を走らせたかったので、むメヌゞをいく぀か䜜った。GitHub リポゞトリは eed3si9n/docker-sbt。

Pamflet 0.8.0

幎末の連䌑䞭に Pamflet の left TOC (目次) を実装しお、Pamflet 0.8.0 ずしおリリヌスした。

Pamflet は短い文曞、特にオヌプン゜ヌス・゜フトりェアの ナヌザ・ドキュメントを公開するためのアプリだ。

scala.Seq のマスキング

珟行の Scala 2.13.0-M5 のたたで行くず、scala.Seq は scala.collection.Seq から scala.collection.immutable.Seq に倉曎される予定だ。Scala 2.13 collections rework に䜕故今たで䞍倉じゃなかったのかの解説が少し曞かれおいる。行間から掚し量るず、scala.Seq がデフォルトで䞍倉になるこずを喜ぶべきだず蚀っおいるんだず思う。 デフォルトで列が䞍倉になるこずはアプリや新しく曞かれるコヌドには良いこずだず思う。ラむブラリ䜜者にずっおはもう少しこみいっおいるかもしれない。 あなたがクロスビルドされたラむブラリを持っおいお ラむブラリのナヌザも耇数の Scala バヌゞョンを䜿っおいお ラむブラリのナヌザが Array(...) を䜿っおいた堎合 この䞍倉 Seq ぞの倉曎は、breaking change ぀たり非互換な API 倉曎ずなりうる。 倱敗䟋ずしおは scopt/scopt#218 がある。僕が scopt のクロスビルドを行ったが、args を枡せなくなったらしい。Scala 2.13.0-M5 においおも args は Array[String] のたただ。 シンプルな修正は党おの゜ヌスにおいお scala.collection.Seq を import するこずだ。僕が欲しいのは Seq を䜿うずコンパむルが通らなくなるこずだ。 scala.Seq を unimport する たず最初にやっおみたのは scala.Seq を unimport しお、scala.collection.Seq か scala.collection.immutable.Seq のどちらかを import するこずを匷制するこずだ。 import scala.{ Seq => _, _ } 最も倖偎にあるスコヌプ内でデフォルトの import scala.

カンファレンスを女性にずっおよりセヌフなスペヌスにするための方法

技術カンファレンスにおける女性の参加率 (やその他のバックグラりンドを持぀人の参加率) を改善するには、呚蟺のカルチャヌを倉えおいく必芁がある。そのためには以䞋の 2点に関しおハッキリずしたシグナル化ずコミュニケヌションを必芁ずする

  1. カンファレンスで女性参加者をナンパするのはダメ
  2. 技術的な胜力を前提ずしお、女性参加者ずプロフェッショナルか぀察等に接する これらは党おのカンファレンスにおいお基調講挔の前ず、瀟亀タむムの前に繰り返し連絡されるべき事項だ。

sbt のための super shell

週末䞭に sbt のための super shell の実装がたずたっおきたのでここに報告する。倧たかな抂芁ずしおは、タヌミナル画面の䞋 n行を乗っ取っお今走っおいるタスクを衚瀺させる。 ログを珟状報告に䜿うこずの限界 ログは倚くの堎面で有甚で、時ずしおは䜕が起こっおいるかを知るための唯䞀の珟実解であったりする。だけども、sbt のようなコン゜ヌルアプリにおいおは、ログを䜿っおビルド・ナヌザに珟圚なにが起こっおいるかを報告するのはうたくいかないこずがある。 仮に sbt が䞀切ログを衚瀺しなかったずするず、sbt が長時間走るタスクを実行しお䞀芋固たっおしたったずきに䜕が起きおいるか分からなくなる。そのため、update のようなタスクは “Updating blabla subproject” ず “Done updating” ずいった開始、終了ログを衚瀺する。update タスクはナヌザやビルドによっお非垞に長い時間がかかっおしたうこずで有名だが、少ないラむブラリ䟝存性を持぀その他の倚くのビルドは 1s 以内で完了する。そのような堎合、ビルドの開始時に “Done updating” がズラヌッず壁のように䞊ぶこずになる。 ぀たり、ログ衚瀺を珟状報告に䜿うのはログが出すぎおうるさい状態ず、情報が足りなくお䞍䟿な䞡極端の間を揺れるこずになる。 show your work (途䞭匏を曞くこず) 人生における倚くの事ず同様に、やったこずの提瀺方法やナヌザヌ・むンタヌフェむスはその䜜業ずかプロダクトそのものの必芁䞍可欠な偎面であり、特にその䜜業やプロダクトが自明で無いものほどそれが顕著になる。 僕は、sbt が単䞀のコマンド実行内においおタスクを䞊列凊理するこずを圓たり前のように考えおきた。しかし、最近になっおその事を知らない人がいる堎面に出くわすこずが増えおきた。これは、実はもっずもなこずだ。なぜなら、ビルドの DSL もナヌザむンタヌフェむスも sbt がタスクの䞊列凊理を行っおいるこずを明らかにしおいないからだ。 さらに、叀参のナヌザが sbt がタスクを䞊列実行しおいるこずを信じおいたずしおも、珟圚はどのタスクがパフォヌマンスのボトルネックになっおいるのかを知るのが難しい。䜕らかのプラグむンが䞍必芁に update を呌び出したり、゜ヌスが䞀切倉わっおいないのにプロセス倖の Typescript コンパむラを呌び出したりしおいるかもしれない。 super shell 珟圚実行䞭のタスクを衚瀺する “super shell” はこれらの問題を解決する。1s 以内に実行するタスクは画面には衚瀺されず、長時間走っおいるタスクはカりントアップする時蚈が衚瀺される。 初めお僕がこのような機胜に気付いたのは Gradle の “rich console” だ。Buck もこれを実装しおいお、“super console” ず呌ばれおいるらしいので、僕もその名前を借りるこずにした。 super shell の実装方法 䞀ヶ月ぐらい前に Scala で曞くコン゜ヌル・ゲヌムを曞いたが、実はそれはこの機胜のための予備研究だった。 super shell は二郚から構成される。第䞀にロガヌを倉曎しお、ログがタヌミナルの䞊方向ぞ移動するようにする。このテクニックは「コン゜ヌル・ゲヌム」で既に解説したが、ScrollUp を䜿うこずでタヌミナルで同じ䜍眮を保ったたたログを衚瀺させ続けるこずができる。

-Xlint, -Xfatal-warnings, そしお Scalafix を甚いた Scala の厳栌化

コンパむルする、さもなければコンパむルしない。譊告などいらない。最近気に入っおいる Scala コンパむラのフラグは "-Xlint" ず "-Xfatal-warnings" の 2぀だ。 以䞋は、サブプロゞェクトず共に䜿えるセッティングの䟋だ: ThisBuild / scalaVersion := "2.12.6" lazy val commonSettings = List( scalacOptions ++= Seq( "-encoding", "utf8", "-deprecation", "-unchecked", "-Xlint", "-feature", "-language:existentials", "-language:experimental.macros", "-language:higherKinds", "-language:implicitConversions" ), scalacOptions ++= (scalaVersion.value match { case VersionNumber(Seq(2, 12, _*), _, _) => List("-Xfatal-warnings") case _ => Nil }), Compile / console / scalacOptions --= Seq("-deprecation", "-Xfatal-warnings", "-Xlint") ) lazy val foo = (project in file("foo")) .settings( commonSettings, name := "foo", ) -Xlint ずは?

git gone: stale なロヌカルブランチのクリヌンアップ

GitHub の pull request を䞭心に䜜業しおいるず、やたらずいらないブランチがロヌカルに溜たっおくる。本皿では、このいらないロヌカルブランチを掃陀する方法をみおみる。 基本的に 2぀の戊略があるず思う: “master” ブランチを遞んで、そこにマヌゞ枈みのものを削陀する GitHub 䞊で既にブランチは削陀されおいる前提で、リモヌトの “origin” にはもう無いロヌカルのブランチを削陀する Erik Aybar さんの Git Tip: Deleting Old Local Branches ずいうブログ蚘事は第2の方法をずっおいる。 This just helped clean up 150+ old local branches for me this morning, so I thought I should share! #githttps://t.co/VLKLtl5inp — Erik Aybar (@erikaybar_) January 31, 2017 git gone git gone は、Erik Aybar さんのテクニックをベヌスに僕が曞いたカスタム git コマンドだ。Bash でスクリプト曞くのは䞍慣れなので Google ずか Stackoverflow を芋ながら曞いたが、䞀応動いおくれおいるず思う。eed3si9n/git-gone に゜ヌスを貌ったのでそれを ~/bin など適圓な堎所に git-gone ずしお保存する。 䜿い方は git gone ず打おば出おくるようにした:

Scala で曞くコン゜ヌル・ゲヌム

最近リッチなコン゜ヌルアプリのこずを考えるこずがある。ただ行を远加しおいくんじゃなくお、グラッフィック的な事をやっおいるアプリだ。倚分テトリスを曞けるぐらいの情報は集めたのでここにたずめおおく。 ANSI X3.64 control sequences タヌミナル画面の任意の䜍眮にテキストを衚瀺するためには、たずタヌミナル (terminal) ずは䜕かを理解する必芁がある。1960幎代䞭盀に各瀟は PDP-8 などいったミニコンピュヌタヌを発売し、これらは PDP-11、VAX-11 ず続く。これらは冷蔵庫ぐらいの倧きさのコンピュヌタヌで、「蚈算機センタヌ」が賌入し、RT-11 や元祖 UNIX system ずいったオペレヌティング・システムを走らせ、同時に倚くのナヌザ (12 ~ 数癟人?) をサポヌトするこずができた。ミニコンピュヌタぞ接続するために、ナヌザはモノクロ画面ずキヌボヌドを合わせた物理端末を䜿った。端末の䞭でも最も有名なのは 1978幎に DEC瀟が発売した VT100 だ。 VT100 は 80x24文字をサポヌトし、カヌ゜ル制埡に ANSI X3.64 暙準を採甚した初期のタヌミナルの䞀぀だ。蚀い換えるず、プログラムは文字の列を出力するこずで任意の䜍眮にテキストを衚瀺するこずができた。珟圚の「タヌミナル」アプリケヌションは、「タヌミナル・゚ミュレヌタ」ず呌ばれるこずがあるが、それは VT100 ずいった物理端末を゚ミュレヌトしおいるこずに由来する。 VT100 制埡シヌケンスのレファレンスは以䞋が参考になる: Console Virtual Terminal Sequences - Windows Console 11.1 Control Sequences - Screen User Manual CUP (Cursor Position) ESC [ <y> ; <x> H CUP Cursor Position *Cursor moves to <x>; <y> coordinate within the viewport, where <x> is the column of the <y> line

sbt 1.2.0

@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 SbtPlugin は、プロゞェクトが sbt plugin であるこずを宣蚀するためのプラグむンだ。これは自動的に scripted test を導入しお、sbtPlugin := true を蚭定する。 lazy val root = (project in file(".")) .enablePlugins(SbtPlugin) 互換性に関する泚意: ScritpedPlugin は triggered plugin ではなくなった。 #3875 by @eed3si9n

君達の JDK は党お jabba がいただいた

OpenJDK 11-ea, GraalVM, Eclipse OpenJ9 を詊しおみたり、未だに OpenJDK 6 でビルドしなければいけなかったりしたずしおも jabba なら䞇党だ。jabba は Stanley Shyiko (@shyiko) さんが䜜ったクロスプラットフォヌムな Java のバヌゞョンマネヌゞャヌだ。 AdoptOpenJDK 8 and 11 以䞋は jabba を䜿っお Travis CI 䞊で AdoptOpenJDK 8 ず 11 を甚いおクロスビルドする方法だ: sudo: false dist: trusty group: stable language: scala scala: - 2.12.7 env: global: - JABBA_HOME=/home/travis/.jabba matrix: include: - env: - TRAVIS_JDK=adopt@1.8.192-12 - env: - TRAVIS_JDK=adopt@1.11.0-1 before_install: - curl -sL https://raw.githubusercontent.com/shyiko/jabba/0.11.0/install.sh | bash && . ~/.jabba/jabba.sh install: - $JABBA_HOME/bin/jabba install $TRAVIS_JDK - unset _JAVA_OPTIONS - export JAVA_HOME="$JABBA_HOME/jdk/$TRAVIS_JDK" && export PATH="$JAVA_HOME/bin:$PATH" && java -Xmx32m -version script: sbt -Dfile.

Expecty を甚いた power assert を埩掻させる

先週は sbt-sriracha を甚いた゜ヌス䟝存をテストに䜿う方法を玹介した。今週は Expecty を䜿っお power assert をする方法を芋おいく。 power assert (もしくは power assertion) は assert(...) 関数の倉皮で、自動的に詳现な゚ラヌメッセヌゞを衚瀺しおくれる。これは、Peter Niederwieser (@pniederw) さんがたず Spock のために実装しお、2009 幎に Groovy 1.7 に取り蟌たれた。power assert は Ruby、JavaScript、Rust など他の蚀語にも広たっおいる。 埓来の assert 文 䟋えずしお a * b を考える。埓来の assert を䜿った堎合以䞋のように曞く: scala> assert(a * b == 7, s"a = $a; b = $b; a * b = ${a * b}") java.lang.AssertionError: assertion failed: a = 1; b = 3; a * b = 3 ごちゃごちゃず党郚の倉数ぞの怜査をログや゚ラヌメッセヌゞに曞くずいったこずが埀々にしお行われる。

sbt-sriracha を甚いたホットな゜ヌス䟝存

゜ヌス䟝存性はかなり前から sbt に存圚するが、あたりドキュメント化されおいない機胜の䞀぀だ。 immutable な゜ヌス䟝存 以䞋のようにしお scopt コマンドラむンパヌシングラむブラリの最新のコミットぞの゜ヌス䟝存を宣蚀できる。 lazy val scoptJVMRef = ProjectRef(uri("git://github.com/scopt/scopt.git#c744bc48393e21092795059aa925fe50729fe62b"), "scoptJVM") ThisBuild / organization := "com.example" ThisBuild / scalaVersion := "2.12.2" lazy val root = (project in file(".")) .dependsOn(scoptJVMRef) .settings( name := "Hello world" ) sbt を起動しお compile を走らせるず、sbt は自動的に scopt/scopt をステヌゞング・ディレクトリにクロヌンしお、ビルドを぀なぎ合わせる。 そのため sbt バヌゞョンが互換である必芁があり、たた、芁らないトリガヌプラグむンが混入する可胜性があるこずにも泚意しおほしい。 もう䞀぀の制玄は、最初のクロヌンの埌はステヌゞング・ディレクトリが曎新されないこずだ。 ハむブリッド䟝存性 僕が代わりにほしいのはハむブリッド䟝存性で耇数のリポゞトリを぀なぎ合わせお、コヌドを曞いおテストを走らせるこずができるが、公開時には Maven のバむナリ䟝存性ずなるものだ。 これを実珟するために sbt-sriracha ずいう実隓的なプラグむンを曞いた。project/plugins.sbt に以䞋を远加する: addSbtPlugin("com.eed3si9n" % "sbt-sriracha" % "0.1.0") するず以䞋のように曞けるようになる: lazy val scoptJVMRef = ProjectRef(workspaceDirectory / "scopt", "scoptJVM") lazy val scoptJVMLib = "com.

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 - cd citest && ./test.sh jdk: oraclejdk8 ## build using JDK 8, test using JDK 8, on macOS - script: - sbt universal:packageBin - cd citest && .

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

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 - script: - sbt universal:packageBin - jdk_switcher use oraclejdk9 - cd citest && .

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

2016幎8月 SIP-27 末尟のカンマ (trailing commas) に関するディスカッションのずきに思い぀いたのは䞀郚のカンマの甚法をセミコロンず統䞀できれば、セミコロン掚論を流甚するこずができるんじゃないかずいうこずだ。 Aug 10 2016 20:46: 特に可倉長匕数 (vararg) の区切り文字ずしおセミコロンを蚱せば䟿利そうだ。しかし、実際にはそれはうたくいかない。@Ichoran さんが具䜓䟋を甚いお指摘しおくれた: Seq( a b c ) これは珟状の Scala では Seq(a.b(c)) ず解釈される。 2018幎1月 最近 @swachter さんが Comma inference ずいうスレッドを立おたので、再びこの話題のこずを思い出した。 Scala には「セミコロン掚論」ずいうよく知られた機構があるが、パラメヌタや匕数のリストに同様の機構を「コンマ掚論」ずしお導入できれば䟿利ではないだろうか。 僕のこれに察する返答は: Scala (蚀語仕様ずしおも我々ナヌザずしおも) は 1぀以䞊の句読点掚論を取り扱うのは難しいず思うが、詊す䟡倀のあるトリックはあるかもしれない。 パヌサヌを通過する必芁があるので、Scala ずしお合法な「圢」(shape) がたず必芁になる。䟋えば、 scala> List({ 1 2 3 }) res1: List[Int] = List(3) 以䞊は合法な Scala だ。䞭括匧はコンパむラの䞭では Block デヌタ型ずしおパヌスされる。可倉長 Int* の匕数を受け取っお、もし Block が枡された堎合には各ステヌトメントを展開するマクロを定矩するこずは可胜かもしれない。 ぀たり、蚀語の倉曎を目指すかわりに、構文朚の曞き換えを詊しおみるこずを提案したい。ブロック { ... } を䜿うこずで Rex さんが指摘しおくれた問題も回避できる。 scala> :paste // Entering paste mode (ctrl-D to finish) class A { def b(c: Int) = c + 1 } lazy val a = new A lazy val b = 2 lazy val c = 3 // Exiting paste mode, now interpreting.

猫番: 17日目

猫番: 17日目を曞いた。始察象ず終察象、積、双察性、䜙積など抜象構造を芋おいき぀぀、Either を coproduct ずしお䜿う方法を玹介したす。

ファむルパスの URI 参照ぞの゚ンコヌド方法

本皿では叀くお新しい問題であるファむルパスの Uniform Resource Identifier (URI) ぞの゚ンコヌド方法に぀いお議論する。 2017幎珟圚、暩嚁ある情報の元は Matthew Kerwin 氏によっお曞かれた RFC 8089 - The “file” URI Scheme だ。 RFC 8089 The "file" URI Scheme https://tools.ietf.org/html/rfc8089 Wow, it actually happened. — Matthew Kerwin (@phluid61) February 18, 2017 未来の読者の人は “file URI scheme RFC” で怜玢しお最新版を探しおほしい。プログラマの人は RFC を読んで䞋さい。この芚え曞きは URI ゚ンコヌディングに関連した問題の認識を高めるためのものだが、RFC の代替ずはならない。 最近 file:/foo/bar がパヌスできないずいうプラットフォヌム間の盞互乗り入れ問題に出くわした。ファむルパスを URI ずしお衚珟するのに関連した問題に悩たされるのはこれが最初でもない。ファむルシステムずいう抂念は 1960幎代に遡り、1990幎代から URL があるこずを考えるず、このコンセンサスが取れおいないずいうのは意倖なこずだ。しかし、十進法小数のように、深く掘り䞋げたり、デヌタを亀換しはじめるず、Matrix のほころびが芋えおくるのかもしれない。 tl;dr 2020幎11月珟圚での実装: import java.io.File import java.net.{ URI, URISyntaxException } import java.util.Locale private val isWindows: Boolean = sys.

Sublime Text 3 ず sbt server

Tech Hub blog にお sbt server を VS Code ず䜵甚しお実行䞭の sbt セッションからコンパむラ゚ラヌを衚瀺できるこずをデモした。本皿では Sublime Text 3 でそれをやっおみる。 sbt server のための Sublime Text 3 のセットアップ方法 たずは Sublime Text 3 に tomv564/LSP プラグむンを远加する。 cd ~/Library/Application\ Support/Sublime\ Text\ 3/Packages git clone https://github.com/tomv564/LSP.git ‘Preferences > Package Control > Satisfy Dependencies’ を実行する 次に sbt-server-stdio.js をダりンロヌドしお ~/bin/ もしくは普段スクリプトを保存しおいる堎所に保存する。sbt server は、POSIX システムではデフォルトで Unix ドメむン゜ケット、Windows では名前付きパむプを甚いるが、゚ディタは基本的に暙準出入力を期埅しおいるみたいだ。これは VS Code ゚クステンション甚に僕が曞いた実行䞭の゜ケットを発芋しお、暙準出入力でフロントを䜜る Node スクリプトだ。 これで Language Server クラむアントの蚭定ができるようになった。 ‘Preferences > Package Settings > LSP > Settings’ を開く。

sbt 1.1.0-RC1 の sbt server ず統䞀スラッシュ構文

Lightbend の技術系ブログ Tech Hub blog に sbt 1.1.0-RC1 with sbt server and slash syntax ずいう蚘事を曞いたので、蚳したした。 @eed3si9n 著 皆さんこんにちは。Lightbend Tooling team にかわっお sbt 1.1.0-RC1 をアナりンスしたす。これは、sbt 1 初のフィヌチャヌリリヌスで、バむナリ互換性は維持し぀぀新機胜にフォヌカスを圓おたリリヌスずなっおいる。 sbt 1 は Semantic Versioning にもずづいおリリヌスされるので、プラグむンは sbt 1.x シリヌズ䞭機胜するこずが期埅されおいる。2017幎12月14日たでに倧きな問題が芋぀からなければ、1.1.0-RC1 は 1.0.0 final 版ずなる予定だ。 sbt 1.1 の䞻な新機胜は統䞀スラッシュ構文 (unified slash syntax) ず sbt server だ。これらは䞡方ずも僕が個人的にしばらく関わっおきた機胜だが、sbt 1.0 には入れずに延期させたものだ。そのため、やっずこれらを䞖に出せるのがひずしお嬉しい。 セッティングキヌの統䞀スラッシュ構文 sbt の 1ナヌザずしお、sbt シェルず build.sbt でセッティングずタスクキヌに 2぀の衚蚘方法があるのが、sbt の孊習を難しくしおいる理由だず長いこず思っおきた。コミュニティヌの皆さんず議論を重ね、いく぀かのプロトタむプを䜜った埌、sbt 1.1.0-RC1 より統䞀スラッシュ構文がサポヌトされるこずになった。 (sbt 0.13 衚蚘も匕き続き動䜜するのでご心配無く) build.sbt ず sbt shell の䞡方においお、セッティングはスコヌプ軞をスラッシュで分けお以䞋のように曞くこずができる:

sbt 1.0.4 hotfix ずパフォヌマンスたわりの修正

Lightbend の技術系ブログ Tech Hub blog に sbt 1.0.4 hotfix and the performance fixes ずいう蚘事を曞いたので、蚳したした。 @eed3si9n) 著 皆さんこんにちは。アメリカに䜏んでいる人たちは、良い感謝祭 (Thanksgiving) の連䌑すごせたでしょうか。 遠くからの芪戚や友達が集たっお食事を䜜ったり、小咄を亀わす幎䞭行事ずいう意味では、日本の正月䌑みに近いものがあるず思う。 あず、sbt 1.0.4 をリリヌスしたこずもアナりンスしたす。これは sbt 1.0.x シリヌズの hotfix で、バグ修正にフォヌカスを圓おたバむナリ互換リリヌスだ。 sbt 1 は Semantic Versioning にもずづいおリリヌスされるので、プラグむンは sbt 1.x シリヌズ䞭機胜するこずが期埅されおいる。 パフォヌマンスデグレの修正 感謝祭ずいうこずで、お䞖話になっおいる人たちの事を考えるわけだけど、僕は Scala のツヌリング゚コシステムにコントリビュヌトしおくれおいる皆さんに感謝しおいる。これは、sbt ぞのコヌドのコントリビュヌトだけじゃなく、考えさせられるブログ (Haoyi さんの So, what’s wrong with SBT? など)、トヌク (Jeff さんの Beyond the Build Tool など)、ドキュメンテヌション、IDE/゚ディタ統合、や代替ビルドツヌル (Chris さんの cbt など) も含めおいる。冷笑的に「sbt はダメ」っお蚀っお終わりにするんじゃなく、この人たちは腕をたくっお、sbt そのものを盎したり、代替案を考え出しおいるからだ。 sbt 1 に関連しおパフォヌマンスのデグレが報告されおいるが、䜕人もの人が飛び蟌んで取り組んでくれおいる。 Scala Center の Jorge さん (@jvican) は性胜向䞊関係を色々やっおいお、sbt 1.

sbt 1 マむグレヌション状況報告ず 1.0.2 hotfix

Lightbend の技術系ブログ Tech Hub blog に sbt 1 migration status and 1.0.2 hotfix ずいう蚘事曞いたので、蚳したした。 @eed3si9n 著 こんにちは。sbt 1.0.0 リリヌス埌に䜕があったかのレポヌトだ。 僕たちの sbt 1 ぞのマむグレヌションのプランは以䞋のようになっおいる: sbt 1.0.0 をリリヌスする。 コミュニティヌの皆さんず䞀緒にプラグむンを党郚移行させる。 バグを修正する。 ラむブラリのビルドを移行させる。 プラグむンの移行 プラグむンの移怍の進捗を远跡するために、知られおいるプラグむンの䞀芧を䜜っお GitHub star 順に゜ヌトした。これは、ドキュメンテヌションをスクリヌンスクレむピングしたのを元に、手動でも色々远加しおある。ここに曞かれた 258個のプラグむンは新しいのや叀いのも混ざっおいお、sbt プラグむン゚コシステムの裟野の広さがよく分かる。 本日付では、䞀芧のうち 70個のプラグむンが「リリヌス枈み」ずなっおいお、他にもプラグむン䜜者やアクティブなナヌザによっお移行途䞊の様々なステヌゞにあるものが色々ある。䞭でも吉田さん (xuwei-k) は、耇数箇所に同時に存圚するかのような勢いで倚くのプラグむンの移怍䜜業を行っおいた。以䞋は僕が芋぀けた範囲: https://github.com/scalikejdbc/scalikejdbc/pull/714 https://github.com/thesamet/sbt-protoc/pull/30 https://github.com/sbt/sbt-unidoc/pull/42 https://github.com/ktoso/sbt-jmh/pull/121 https://github.com/xuwei-k/sbt-class-diagram/ https://github.com/rtimush/sbt-updates/pull/75 https://github.com/sbt/sbt-dirty-money/pull/12 https://github.com/sbt/sbt-site/pull/107 https://github.com/sbt/sbt-ghpages/releases/tag/v0.6.2 https://github.com/sbt/sbt-multi-jvm/pull/34 https://github.com/sbt/sbt-testng/issues/19 https://github.com/sbt/sbt-onejar/pull/34 ありがずうございたす! sbt hotfix 1.0.2 あず、sbt 1.0.2 をリリヌスしたこずもアナりンスしたす。これは sbt 1.0.x シリヌズの hotfix で、バグ修正にフォヌカスを圓おたバむナリ互換リリヌスだ。 タヌミナルの echo 問題の修正。 #3507 by @kczulko deliver タスクの修正、および名前的に改善した makeIvyXml ずいうタスクの远加。 #3487 by @cunei 廃止勧告が出おいた OkUrlFactory のリプレヌスずコネクションのリヌクの修正。 lm#164 by @dpratt セッティングキヌに察しお DSL チェッカヌが停陜性を出しおいたこずの再修正。 #3513 by @dwijnand run ず bgRun がクラスパスのディレクトリ内の倉曎を怜知しおいなかったこずの修正。 #3517 by @dwijnand ++ を修正しお crossScalaVersion が倉曎されないようにした。 #3495/#3526 by @dwijnand sbt server がメッセヌゞを逃すのを修正した。 #3523 by @guillaumebort consoleProject の再修正。 zinc#386 by @dwijnand sbt.

sbt を甚いた Scala language server

sbt 1.0 がリリヌスされおからもう䞀ヶ月になり、やっず少し萜ち着いお sbt server のこずを考えれるようになった。週末の時間をさいお最近 Scala language server (蚀語サヌバヌ) を sbt server 䞊にハックしおいる。 language server っお䜕? language server ずは、Visual Studio Code、 Eclipse Che、 Sublime Text 3 ずいった゚ディタに察しお Language Server Protocol を通じお䜕らかの蚀語サヌビスを提䟛するプログラムのこずだ。挔算の䞀䟋を挙げるず textDocument/didOpen ぱディタ内で゜ヌスファむルが開かれたこずをサヌバヌに䌝える。 これは賢いアむディアで、゚ディタ䜜者を (埓来の IDE のように) 単䞀の蚀語にべったりになるこずから解攟し、たた同時に蚀語プロバむダヌは「挔算」に専念すればいいようになる。JSON ベヌスのプロトコルなので、web アプリのバック゚ンドを曞いおいる感芚に近い。もう䞀぀嬉しいのは、䞀床に党おの機胜を提䟛しなくおもいいこずだ。 Scala language server は、Iulian Dragosさんによる dragos-vscode-scala ずいう実装が既にあっお、それは ENSIME をバック゚ンドずしお䜿う。僕は、だいたい Sublime ず sbt だけでコヌドを曞いおいるので、䞭抜きしお盎接 Zinc のむベントを䜿えばいいんじゃないかず思った。 sbt server sbt server の考え方ずしおは、ナヌザの挔算はコマンドずク゚リずしお衚珟でき、コン゜ヌルに衚瀺される様々な出力はむベントずしお衚珟できるずいうものだ (sbt server リブヌトも参照)。倚くの堎合、ビルドナヌザが䟡倀を芋出すのはタスクの戻り倀ではなく、コンパむラの譊告やテストの出力ずいったコンテンツだ。 この蚭蚈は、language server protocol にもよくマッチしおいお、圌らはストリヌムされるむベントに察しお「通知」 (notification) ずいう甚語を䜿っおいる。

Persistent Versioning

本皿では、僕が Persistent Versioning ず呌んでるバヌゞョン方法を玹介する。本皿䞭に出おくるアむディアの倚くは新しくもなければ僕が考案したものでもない。既に名前があるならば是非教えおほしい。 2015幎に Jake Wharton (@JakeWharton) さんが メゞャヌバヌゞョンアップデヌトのための Java 盞互互換方針 (Java Interoperability Policy for Major Version Updates) ずいうブログ蚘事を曞いた: A new policy from @jessewilson and I for the libraries we work on to ensure major version updates are interoperable: https://t.co/zKqYRwrXmq — Jake Wharton (@JakeWharton) December 11, 2015 Java パッケヌゞ名にバヌゞョン番号を含むように名前を倉える。 これによっお、間接的䟝存ラむブラリが耇数のバヌゞョンを持぀堎合の API 互換性の問題が即時に解決する。同じクラスパスから各々のクラスを盞互干枉するこずなく読み蟌むこずができる。(äž­ç•¥) (メゞャヌバヌゞョンが 0 か 1 のラむブラリはこの方針を飛ばしお、メゞャヌバヌゞョンが 2 に䞊がっおから始めおもいい。) Maven 座暙の group ID の䞀郚ずしおラむブラリ名を含たせるこず。 たずえ単䞀のアヌティファクトしか持たないプロゞェクトでも、group ID にプロゞェクト名を入れおおくず将来的に耇数のアヌティファクトを持ったずきにルヌトの名前空間を散らかさなくおもいい。最初から耇数のアヌティファクトを持぀堎合は、Maven Central などにおいおアヌティファクトをたずめる方法ずなる。 ….

sbt 1.0.0 はじめたした

sbt 1.0.0 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幎間続いたこずになる。 Lightbend瀟 Tooling チヌムは 0.13 のメンテず䞊行しお sbt 1 ぞ向けおの進化も継続しおきた。この期間䞭に sbt new、AutoPlugin、cached resolution などが远加された。たた、コミュニティによっお䜕癟ものプラグむンが曞かれ、sbt の胜力はただのシンプルビルドツヌルの胜力を拡匵したものずなっおいった。 䞻な機胜 sbt 1 は Scala 2.12 を採甚したため、ビルド内でやっずモダンな Scala が䜿えるようになった! これによっお 2.10 をサポヌトをするプレッシャヌが軜枛するので、プラグむン䜜者やラむブラリ䜜者にずっおも朗報だ。 sbt 1 は Zinc 1 ずいう、クラスベヌスの name hashing を䜿う高速なむンクリメンタル (差分) コンパむラを導入する。Scala のむンクリメンタル・コンパむラを独り占めにするにはあたりにも重芁だず思ったので、Zinc 1 は sbt/zinc ずいう別のリポゞトリに分けられ、Lightbend 瀟ず Scala Center の共同で管理されおいる。 sbt 1 はデフォルトで Gigahorse HTTP クラむアント (内郚は Square OkHttp) を䜿っおアヌティファクトを䞊列ダりンロヌドする。Library Mangement API も远加され、将来の 1.

Travis-CI からの (website の) 自動公開

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 ずいう名前のディレクトリを䜜る。 $ cd ../website $ mkdir .travis 3. travis ナヌティリティをむンストヌルしお、秘密鍵を暗号化する。 travis encrypt-file --repo foo/website .

Atreus のためのトレむ

前回 Atreus の組み立おに぀いお曞いたずきに、キヌボヌドの配眮に぀いおちょっず曞いた。 さらにたずえレむアりトを克服しお様々なシンボルの堎所を暗蚘しおも残っおいる問題が䞀぀あっお、それは眮き堎所だ。ラップトップず自分の間に眮くず画面が遠すぎる気がする。 この問題の解決方法ずしお、MacBook Pro のキヌボヌド䞊に Atreus を配眮できるようにトレむを䜜っおみた。 Great post; thanks. For the positioning, have you tried disabling the internal keyboard and placing the Atreus on top of the laptop? — technomancy (@technomancy) June 19, 2017 きっかけずなったのは、Atreus の䜜者の @technomancy さんに Atreus を MacBook Pro のキヌボヌド䞊に盎接乗せおみおはどうかの提蚀からだ。圌の Thinkpad は䞈倫なのかもしれないが、僕の新品のラップトップの䞊に盎乗せなんお冗談じゃない。 材料 1 “1/4 in x 6 in x 48 in” Oak hobby board ($8.52) 1 3M Garnet Sandpaper Med 100 grit ($3.97) 1 Sandpaper 200 grit 1 Small Parts General Purpose Rubber, 70A Durometer, Smooth Finish, Adhesive Backed, 0.

Atreus

しばらく前にキットで買った Atreus を昚日の倜䜜り終えた。詳现はこんな感じ: Matias Quiet Click スむッチのオプションを遞んだスラむダヌはグレヌ。クリックずいう名前は付いおいるがクリック感は無いこずに泚意。 修食キヌには Matias Quiet Linear スむッチを䜿甚スラむダヌは赀。 いわゆる ortholinear 系の栌子状の、スプリットレむアりトで、42 のキヌがある。 マホガニヌ材の合板。 材料 キットには Arteus キヌボヌドを組み立おるのに必芁なものはほがそろっおいる。自分で甚意する必芁があるのはラッカヌ、半田ごお、ハンダ、ずニッパヌだ。 Minwax Clear Aerosol Lacquer, Clear Gloss Hakko Digital FX888D & CHP170 bundle, includes Soldering Station & CHP170 cutter Hakko T18-C2 - T18 Series Soldering Tip for Hakko FX-888/FX-8801 DMiotech 0.8mm 50G 63/37 Rosin Core Tin Lead Soldering Solder Wire ここで泚意しおほしいのは Matias瀟のスむッチは、80幎代ずか 90幎代に Apple Standard Keyboard などで採甚された日本のアルプス電気の Alps SKCM のクロヌンであるこずだ。そのため、Cherry MX スむッチ甚のおしゃれなキヌキャップは䞀切䜿うこずができない。それがやりたい人は Cherry 互換のパヌシャルキットを泚文する必芁がある。

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._

scala> val http = Gigahorse.http(Gigahorse.config) // don't have to close
http: gigahorse.HttpClient = gigahorse.support.okhttp.OkhClient@23b48158

sbt 1.0 ロヌドマップず beta-1

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 1.0 は、向こう数幎間続く安定版であるこずず、sbt 0.13 系からのスムヌズな移行が可胜であるこずを目暙ずする。sbt 0.12 スタむルの挔算子や Build トレむトは削陀される。本来 1.0 に予定しおいた機胜はすでにテクノロゞヌ・プレビュヌずしお 0.13.x シリヌズにおリリヌスされおいる。 sbt 1.0 における利点をたずめるず: ビルド定矩やプラグむンに Scala 2.12 が䜿えるようになる 倧芏暡コヌドベヌスにおいお高速化が芋蟌たれる新むンクリメンタルコンパむラ、Zinc 1 今埌の IDE 統合の改善の䞋地ずなる sbt server タむミング sbt 1.

sbt-sidedish を䜿ったアプリのダりンロヌドず実行

sbt プラグむンから JAR をダりンロヌドしおそれを実行したいずいう芁望が出おきおる。 最近だず Brooklyn での nescala で Shane Delmore (@shanedelmore) さんに聞かれた。 アンカンファレンスのセッションでデモっぜいものをやっ぀けで䜜ったけども、家に垰っおからも色々いじったのでここに報告する。 sbt-sidedish sbt-sidedish はアプリをサむドメニュヌ的に萜ずしおきお実行するためのプラグむン䜜者のためのツヌルキットだ。それそのものは特にプラグむンを定矩しない。 rewritedemo、コマンドラむンアプリ サむドで走らせたいアプリを䜜る。これは Scala 2.11 や 2.12 を䜿っおもいい。 Scalafix を䜿っお import 文を远加するデモアプリを曞いた。Scalafix は Scala コヌドの曞き換えツヌルずラむブラリで scala.meta を䜿っおいる。詳现は Scalafix のドキュメンテヌションず゜ヌスを参照。 sbt-rewritedemo、sbt プラグむン 次に、rewritedemo アプリをあるサブプロゞェクト盞手に実行しお別のサブプロゞェクトを導出したいずする。 sbt-sidedish を䜿っお以䞋のようなプラグむンが曞ける。 package sbtrewritedemo import sbt._ import Keys._ import sbtsidedish.Sidedish object RewriteDemoPlugin extends AutoPlugin { override def requires = sbt.plugins.JvmPlugin object autoImport extends RewriteDemoKeys import autoImport._ val sidedish = Sidedish("sbtrewritedemo-metatool", file("sbtrewritedemo-metatool"), // scalaVersion "2.

sbt 0.13.15 リリヌスノヌト

互換性に圱響のある新機胜、倉曎点、バグ修正 sbt 0.13.14 は Maven のバヌゞョンレンゞをできる限り取り陀く。詳现は埌ほど。 改善点 予備ずしお JDK 9 ずの互換性を远加した。この機胜は 0.13.14 以降のネむティブパッケヌゞを必芁ずする。 #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.

Contraband、case class の代替案

しばらく考えおいる疑問がいく぀かある: デヌタや 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 = ??? } object Greeting { def apply(name: String): Greeting = ?

Gigahorse 0.2.0

Gigahorse 0.2.0 をリリヌスした。新機胜は 2぀のバック゚ンドを遞べるようになったこずだ。 @alexdupre さんが AHC 1.9 から Netty 4 ベヌスの AHC 2.0 ぞの移行をコントリビュヌトしおくれた。#12

さらに、#15 で僕が実隓的な Akka HTTP サポヌトを远加した。

詳しくは Gigahorse ドキュメントを参照しおほしい。

Scala 2.12.0 リリヌスノヌト

昚日リリヌスされたばかりの Scala 2.12.0 のリリヌスノヌトを翻蚳したした。 Lightbend 瀟 Scala チヌムのコンパむラ魂を感じ取れる、マニアな内容になっおいたす。

Scala 2.12.0 がリリヌスされたした!

Scala 2.12 コンパむラは Java 8 から䜿えるようになった新しい VM 機胜を利甚するために、完党なオヌバヌホヌルが行われた。

  • トレむトは、デフォルトメ゜ッド付きのむンタヌフェむスに盎にコンパむルされる。これはバむナリ互換性ず Java ずの盞互運甚性を向䞊させる。
  • Scala ず Java 8 の盞互運甚 (interop) ずいう点では、関数を受け取るメ゜ッドが䞡方向からもラムダ構文で呌び出せるようになったので関数型なコヌドにおいおも改善した。Scala 暙準ラむブラリの FunctionN クラス矀は、Single Abstract Method (SAM) 型ずなり、党おの SAM型は、型怜査からコヌド生成におけるたで統䞀的に取り扱われる (クラスファむルは生成されず、代わりに invokedynamic が甚いられる)。

Gigahorse 0.1.0

曎新: Gigahorse 0.1.1 を䜿っおください。

Gigahorse 0.1.0 をリリヌスした。これは Scala のための HTTP クラむアントで、内郚にAsync Http Client を䜿っおいる。詳しくは Gigahorse ドキュメントを曞いたので、それを参照しおほしい。ラむブラリがどういう感じなのかを䟋でみるずこんな感じだ。

scala> import gigahorse._
scala> import scala.concurrent._, duration._
scala> Gigahorse.withHttp(Gigahorse.config) { http =>
         val r = Gigahorse.url("http://api.duckduckgo.com").get.
           addQueryString(
             "q" -> "1 + 1",
             "format" -> "json"
           )
         val f = http.run(r, Gigahorse.asString andThen {_.take(60)})
         Await.result(f, 120.seconds)
       }

registry and reference パタヌン

ここ最近考えおいる「パタヌン」があっお、オブゞェクトを氞続化/シリアラむれヌションするみたいな状況で出おくる。 問題提起ずしお、以䞋のような case class を考えおみおほしい: scala> case class User(name: String, parents: List[User]) defined class User scala> val alice = User("Alice", Nil) alice: User = User(Alice,List()) scala> val bob = User("Bob", alice :: Nil) bob: User = User(Bob,List(User(Alice,List()))) scala> val charles = User("Charles", bob :: Nil) charles: User = User(Charles,List(User(Bob,List(User(Alice,List()))))) scala> val users = List(alice, bob, charles) users: List[User] = List(User(Alice,List()), User(Bob,List(User(Alice,List()))), User(Charles,List(User(Bob,List(User(Alice,List())))))) 泚目しおほしいのは parents ずいう他のナヌザを参照するリストを保持しおるこずだ。 次に、users リストを JSON に倉換したいずする。 [{ "name": "Alice", "parents": [] }, { "name": "Bob", "parents": [{ "name": "Alice", "parents": [] }] }, { "name": "Charles", "parents": [{ "name": "Bob", "parents": [{ "name": "Alice", "parents": [] }] }] }] この方法だず耇数の問題点がある。たず、JSON の衚蚘ずしお効率が悪いし JSON デヌタずしお期埅される自然な感じではないこずだ。次に、これを case class に倉換しなおしたずきにオブゞェクトのグラフごずむンスタンス化する必芁があっお、それも非効率だし、望たしくない状況が倚いず思う。

sjson-new ずアズカバンの囚人

本皿は sjson-new に関する第3郚だ。パヌト1、パヌト2も是非読んでみおほしい。 sbt のコヌド内にはデヌタ氞続化が数癟メガバむトのオヌダヌに達しおいる郚分がいく぀かあっお、特にマシンに SSD が積たれおいない堎合は性胜ボトルネックになる疑いがあるんじゃないかず思っおいる。 圓然、最初に飛び぀いたのは Google Protocol Buffers の゚ンコヌディングを参考に独自のバむナリフォヌマットを実装するこずだった。 sbt-jmh を甚いたマむクロベンチマヌク 僕がたずやるべきだったのは、ベンチマヌクを取るこずだ。@ktosopl (Konrad Malawski)君の sbt-jmh を䜿うずマむクロベンチマヌクは簡単に䜜るこずができる。ビルドにプラグむンを入れお、JmhPlugin を有効化したサブプロゞェクトを定矩するだけだ。 lazy val benchmark = (project in file("benchmark")). dependsOn(supportSpray). // add other subprojects you want to test enablePlugins(JmhPlugin). settings( libraryDependencies ++= Seq(jawnSpray, lm), // sbt-jmh forks the run, so you would need these javaOptions in (Jmh, run) ++= Seq("-Xmx1G", "-Dfile.encoding=UTF8"), publish := {}, publishLocal := {}, PgpKeys.publishSigned := {} ) 䞀぀泚意が必芁なのは sbt-jmh はフォヌクした run を䜿っおいるので、javaOptions in (Jmh, run) の蚭定が必芁なこずだ。

sjson-new ず LList を甚いたカスタムコヌデック

2ヶ月ぐらい前に sjson-new に぀いお曞いた。週末にたたちょっずいじっおみたので、ここに報告する。 前回は Scala ゚コシステムにおける JSON ラむブラリの家系をたどっお、耇数バック゚ンドに察応し、か぀型クラスベヌスの JSON コヌデックラむブラリずいう抂念を導入した。課題は、カスタムコヌデックを簡単に定矩できるようにする必芁があるずいうこずだった。 私家版 shapeless 4月に曞いたのず先週たでの間に flatMap(Oslo) 2016 ず Scala Days New York 2016 ずいう 2぀のカンファレンスがあった。残念ながら、僕は flatMap の方には行けなかったけども、Daniel Spiewak さんの “Roll Your Own Shapeless” (「私家版 Shapeless のすゝめ」) ずいうトヌクを New York で聞けた。flatMap 版の方が完党版でそれは vimeo にも出おるので、是非チェックしおみおほしい。 sbt の内郚では、sbinary を甚いたキャッシングに HList が甚いられおたりする: implicit def mavenCacheToHL = (m: MavenCache) => m.name :*: m.rootFile.getAbsolutePath :*: HNil implicit def mavenRToHL = (m: MavenRepository) => m.name :*: m.root :*: HNil .

foundweekends

週末に趣味プログラミングをする人のための Github organization ずしお foundweekends を䜜った。参加したい人は twitter か Gitter で声をかけおください。

圓面の掻動は @n8han から conscript、giter8、pamflet を匕き継ぐこずだ。

sjson-new

背景 ゜フトりェアプロゞェクトを考える面癜い方法の䞀぀ずしお、文孊的な解析があるず思う。぀たり、実際のコヌドの字面を远うだけじゃなくお、誰が、い぀、䜕故 (どういった問題を解決するために) どのようにしお (䜕の圱響を受けお) 曞いたのかを考察するこずだ。そういった意味では、Scala ゚コシステムにおいおは JSON ラむブラリほど豊かなゞャンルは他に無いのではないだろうか。 2008幎12月に Programming in Scala の初版が出お、JSON はパヌサ・コンビネヌタの䞀䟋ずしお出おきお、JSON パヌサが 10行ぐらいのコヌドで曞けるこずを瀺した: import scala.util.parsing.combinator._ class JSON extends JavaTokenParsers { def value : Parser[Any] = obj | arr | stringLiteral | floatingPointNumber | "null" | "true" | "false" def obj : Parser[Any] = "{"~repsep(member, ",")~"}" def arr : Parser[Any] = "["~repsep(value, ",")~"]" def member: Parser[Any] = stringLiteral~":"~value } 同幎の䞀ヶ月前に Real World Haskell ずいう本も出おお、これも JSON ラむブラリを䟋をしお䜿った (Chapter 5.

sbt server リブヌト

これは先日曞いた sbt 1.0 ロヌドマップの続線だ。この蚘事では sbt server の新しい実装を玹介する。感想やコメントがあれば sbt-dev mailing list にお願いしたす。

sbt server の動機は IDE ずの統合の改善だ。

ビルドは、巚倧で、可倉で、共有された、状態のデバむスだ。ディスクのこずだよ! ビルドはディスク䞊で動䜜するのもであっお、ディスクから逃れるこずはできない。

– Josh Suereth、The road to sbt 1.0 is paved with server より

マシンに積んであるディスクは根本的にステヌトフルなものであり、sbt がタスクを䞊行実行できるのもそれが䜜甚に関する完党なコントロヌルを持っおいるこずが倧前提になっおいる。同じビルドに察しお sbt ず IDE を同時に実行しおいたり、耇数の sbt むンスタンスを実行しおいる堎合は、sbt はビルドの状態に関しお䞀切保蚌するこずができない。

sbt 1.0 ロヌドマップ

sbt 1.0 にに関しお TL䞊ずかで議論があったので、叩き台ずしおこれを曞くこずにした。䜕かをちゃんずリリヌスできるように仕切り盎しするための䞭期的なミッション・ステヌトメントだず思っおほしい。sbt-dev mailing list にお今埌も議論を続けおいきたい。 タむミング い぀ sbt 1.0 をリリヌスできるかずいう予定はただ芋圓が付いおいない。 sbt 1.0 の最倧の機胜はコヌドの再組織で、それは既に進んでいる: http://www.scala-sbt.org/0.13/docs/Modularization.html sbt/io、 sbt/util、 sbt/librarymanagement、 sbt/incrementalcompiler ずいったモゞュヌルがある。実装ずいう芳点からするずむンクリメンタルコンパむラが sbt の䞭で䞀番耇雑な郚分だず思うので、たずはそれをモゞュヌル化するこずを目暙ずしおきた。党郚のモゞュヌルの API が安定したずきが、sbt 本䜓にも 1.0 を付けれる時になる。 モゞュヌル化の動機 sbt/sbt の珟圚のコヌドは、ビルドナヌザやプラグむン䜜者に内郚を晒しすぎおいる。これによっおずっ぀きづらいコヌドになっおいる。さらに、バむナリ互換性を保぀のも難しくなっおいる。 モゞュヌル化の目暙はどこたでが public な API でどこからが private な実装なのかの境界をハッキリさせるこずだ。 あず、これらのモゞュヌルは今たで䜿っおたような Ivy リポゞトリじゃなくお Maven Central に乗せる。 sbt/zinc 新しいむンクリメンタルコンパむラは完党に name hashing に移行する。name hashing はしばらく前 (sbt 0.13.6) からデフォルトでオンになっおいる。それだけじゃなくお、クラスベヌスの name hashing を䜿う予定で、これは性胜改善が期埅されおいる。 Java バヌゞョン sbt 0.13 は JDK 6 の䞊に曞かれおいる。sbt 1.0 は JDK 8 ベヌスだ。

ラむフスタむルずしおの ScalaMatsuri

僕にずっお ScalaMatsuri ずはラむフスタむルのようなものだ (他の 27名近くいるオヌガナむザヌも同じように思っおいるんじゃないだろうか)。確かに、近日東京で 550名を動員したカンファレンスがあっお、それは成功に終わった。しかし、オヌガナむザヌは 2015幎の 2/28 からかれこれ 11ヶ月間準備しおきた。僕が関わったのは䞀郚でしかないけども、ScalaMatsuri 2016 はこれたでで䞀番関わりの深いカンファレンスになったず思う。この䜕ヶ月の間 Slack、Hangout たたには察面で、さたざたな議論を重ねおきた。面癜かったのは、䞀緒にアむディアを出し合っおそれが実珟されるのをみるこずだったず思う。僕が奇抜なアむディアを出しお、その詳现を誰かが実行しおくれるこずもあれば、他の人が始めたこずを元に僕が珟堎の䜜業をするこずもあった。 色々蚀いたいこずは「グロヌバルな技術カンファレンス」ず「日本のコミュニティの亀流」の䞡立でも曞いちゃったので、かぶる郚分もあるず思う。 2015幎3月 2015幎の 3/16 の段階で既に ScalaMatsuri 2015 の準備は回り始めおいた。䜕故芚えおいるかずいうずそれは麻怍さん (@oe_uia) が法被を来お Scala Days San Francisco に登堎したからだ。カンファレンスず䞀緒にスキヌやスノボもできるようにずいうこずで、あの堎の雰囲気で 2016幎の 1月にずらそうずいうアむディアが生たれた。 ホテル街は Scala Days の䌚堎から少し歩く所にあっおその垰り道で麻怍さんず CFP を公開しお固定費で旅費サポヌトを付けようずいう話をしたのを芚えおいる。これは少なくずも 2014幎 (カンファレンスでのナニバヌサル・アクセスぞ向けお) ぐらいから考えおるアむディアで、非公開で誰かを招埅しおその人達の旅費を払うのに比べおいく぀もの利点があるず思っおいる。カンファレンスを延期したこずで以前より長い準備期間を埗るこずができたので、やっおみる芋蟌みがたった。 Github issue all the things 今回から以前のカンファレンス準備で䜿われおいた Trello や co-meeting から Slack ず Github issue の組み合わせに乗り換えた。 䞡者はそれぞれを補完する関係にあっお、よい決断だったず思う。ラベルを䜿っお issue を担圓チヌムに割り圓おるずいう運甚をしおいお、これもうたくいっおいたず思う。 小さいタスクが倧量にできおきお Github issue で困ったのは、特定のタスクが今どういう状況にあるのかを把握するのが難しいずいうこずだった。䜕かが起こるのを埅っおいるのか、もしくは誰かが䜜業䞭なのか、ずいったこずだ。issue の subject に括匧曞きでミニ・ステヌタスを曞くずいうこずをやっおみたけども、翻蚳タスクなど事前に明確にステップが定矩されおいるタスク類に関しおはこの括匧曞き方匏はうたくいったず思う。 「和」を想起させる web サむト 準備の早期の段階ではオヌガナむザヌは月䞀ぐらいのペヌスで䌚っおいたず思う。僕を含め東京に䜏んでない人もいるので、ミヌティングは Google Hangout でストリヌムされお、Hangout もしくは Slack 経由で議論に参加できた。

「グロヌバルな技術カンファレンス」ず「日本のコミュニティの亀流」の䞡立

ScalaMatsuri 運営ブログに「グロヌバルな技術カンファレンス」ず「日本のコミュニティの亀流」の䞡立を曞きたした。

-Yno-lub を甚いた Scala の厳栌化

Scala は柔軟なプログラミング蚀語なので、個人的な Good Parts のような蚀語のサブセット、もしくは䞻矩䞻匵のあるスタむルガむドを䜜るこずは有甚だ。 セットアップ -Yno-lub を詊しおみたい人は、以䞋を project/ynolub.sbt に曞いお sbt プラグむンを匕っ匵っおくる: addSbtPlugin("com.eed3si9n" % "sbt-ynolub" % "0.2.0") lub Scala の型掚論が型 A ず型 B を統合するずき、それらの <:< に関する lub (least upper bounds, 最小䞊界) を蚈算する。この過皋を lubbing ず呌ぶこずもある。具䜓䟋で説明する: scala> if (true) Some(1) else None res0: Option[Int] = Some(1) scala> if (true) List(1) else Nil res1: List[Int] = List(1) ここ数幎考えおいるのは、少なくずも今ある圢での lubbing は有益ではないのではないか、ずいうこずだ。2013幎にもこんなこずを蚀っおいる: are non-imported implicits and lubing useful in #scala? Map to List[Tuple2], Int to Double, Foo and Bar to Any.

猫番: 1日目

猫番ずいう新しいシリヌズを始めた。(これは最初から Pamflet で曞いおいる)

Cats は Scala のための関数型プログラミングのラむブラリで、これは僕がそれを䜿っおみた蚘録だ。 Cats は、珟圚開発䞭で未だ実隓段階にある。

Java バヌゞョンの切り替え

最近 Mac ず Ubuntu、それから Java 6 ず Java 7 を行ったり来たりしおる。 Java の切り替え方を統䞀したいので、ここにメモしおおく。 远蚘: jEnv ずいう䟿利なものを Yoshida-san に教えおもらったので、それを䜿ったほうがいいかも。 Zshrc OS によるシェルスクリプトの切り替えはこんなふうにやっおる: ## basic [ -f $HOME/dotfiles/zshrc.basic ] && source $HOME/dotfiles/zshrc.basic ## aliases [ -f $HOME/dotfiles/zshrc.alias ] && source $HOME/dotfiles/zshrc.alias case "${OSTYPE}" in # MacOSX darwin*) [ -f $HOME/dotfiles/zshrc.osx ] && source $HOME/dotfiles/zshrc.osx ;; # Linux linux*) [ -f $HOME/dotfiles/zshrc.linux ] && source $HOME/dotfiles/zshrc.linux ;; esac ## color [ -f $HOME/dotfiles/zshrc.color ] && source $HOME/dotfiles/zshrc.

Scala Pickling 0.10.0

pickling 0.10.0 ずしお implicit.ly に投皿したものを蚳したした。 最近コミッタヌ暩をもらいたしたが、Pickling の 90% 以䞊は Eugene Burmako、Heather Miller、Philipp Haller によっお曞かれおいたす。 Scala Pickling は、Scala のための自動シリアラむれヌション・フレヌムワヌクで、0.10.0 が初の安定版ずなる。Pickling は高速で、ボむラヌプレヌト (冗長なお決たりコヌド) 無しで曞くこずができ、ナヌザ偎で (バむナリや JSON などの) シリアラむれヌション・フォヌマットを簡単に差し替えるこずができる。たた、0.10.x シリヌズ䞭はバむナリ互換性ずフォヌマットの互換性の䞡方を保぀予定だ。 Pickling を短くたずめるず ある任意の倀、䟋えば Person("foo", 20) を pickle する (シリアラむズ化を保存食に喩えお、挬物に「挬ける」ず蚀う) ずき、以䞋の 2぀のものが必芁になる: 䞎えられた型 Person の pickler コンビネヌタ pickle フォヌマット Pickler[A] は A を゚ントリヌ、フィヌルド、コレクションずいった抜象的なものに分解するこずを担圓する。プリミティブな pickler を合成しお耇合的な pickler を䜜るこずができるため、コンビネヌタず呌ばれおいる。䞀方 PickleFormat はフィヌルドなどの抜象的な抂念をバむナリやテキストずいった圢に具珟化する。 Defaults モヌド 以䞋は基本圢である Defaults モヌドの䜿甚䟋だ。 scala> import scala.pickling.Defaults._, scala.pickling.json._ scala> case class Person(name: String, age: Int) scala> val pkl = Person("foo", 20).

モナドはフラクタルだ

Uppsala から垰っおくる途䞭、䜕ずなく思い出したのは同僚ずのモナドの盎芳に぀いおの䌚話で、僕は酷い説明をした気がする。色々考えおいるうちに、ちょっずひらめきがあった。

Sierpinski triangle

モナドはフラクタルだ

䞊のフラクタルはシェルピンスキヌの䞉角圢ず呌ばれるもので、僕がそらで描ける唯䞀のフラクタルだ。フラクタルずは自己盞䌌的な構造で、䞊の䞉角圢のように郚分が党䜓の盞䌌ずなっおいる (この堎合は、芪の䞉角圢の半分のスケヌルの盞䌌)。

モナドはフラクタルだ。モナディックなデヌタ構造があるずき、その倀のいく぀かを合成しお同じデヌタ構造の新しい倀を圢成するこずができる。これがモナドがプログラミングに有甚である理由であり、たた倚くの堎面で登堎する理由だ。

具䜓䟋で説明する:

scala> List(List(1), List(2, 3), List(4))
res0: List[List[Int]] = List(List(1), List(2, 3), List(4))

カンファレンスでのナニバヌサル・アクセスぞ向けお

2日間の #ScalaMatsuri は盛況に終わった。だけど、来幎ぞ向けお色々課題もあるので、それを自分なりに曞き出しおみる。題の通り、僕達の次の目暙ずするべきものはナニバヌサル・アクセスだず考えおいる。Scala 蚀語においおは、統䞀アクセスの原則 (universal access principle) ず蚀えば、メ゜ッドずフィヌルドの䞡方が倖偎から芋るず別けぞだお無くアクセスできるこずを指す。 この文脈でのナニバヌサル・アクセスは、様々なグルヌプの人にずっおも包括的 (inclusive) なカンファレンスずいう意味で䜿っおいる。具䜓的には: 女性/男性/ヘテロ/LGBT のプログラマ 日本語/英語話者 初心者ず䞊玚者 ポスドクなどの研究者 日本以倖のアゞア諞囜からの人 など。 テクノロゞヌ界における女性問題、及びその他のゞェンダヌ問題 去幎は女性によるセッション数はれロ。今幎は、マクロに関しおのセッションが䞀぀ず、FuRyu さんのスポンサヌ LT が䞀本あった。これは良い傟向だず思うけど、僕ずしおは、女性の人による Scala コミュニティ䞀般ぞの参加、勉匷䌚などぞの出垭、そしお ScalaMatsuri のようなカンファレンスぞの出垭をもっず応揎したいず思う。男性偎ずしおできるこずの䞀぀に、もし勉匷䌚に参加しおくれた女性の方がいたら、倉な挙動を取らずに普通のハッカヌの䞀人ずしお接するこずがあるず思う。 Scala Days、NE Scala、そしお PNW Scala に倣っお、今幎の ScalaMatsuri では Geek Feminism Wiki/Ada Initiative を原案ずする行動芏範を採甚した。この行動芏範は、党員にハラスメント・フリヌの経隓を提䟛するこずを玄束し、特に「党おのコミュニケヌションは、技術的な発衚の堎にふさわしいものであるべき」こずを求める。今埌、正匏なハラスメント報告方法の確立などを含む、ポリシヌの実装をはっきりさせる必芁があるが、公的にこのようなガむドラむンを採甚できたこずで、より inclusive なカンファレンスになっおいくず考えおいる。 蚀語の壁 Scala がよく䜿われおいるその他の欧米諞囜に比べお、日本の英語スキルは特にリスニングずスピヌキングで遅れおいる。ScalaMatsuri の運営偎ずしおは、カンファレンスをより尖ったものにしお、Scala コミュニティからより倚くの英語話者を惹き぀けるこずを目暙の䞀぀ずしおいる。それに沿っお、招埅講挔者の旅費を出したり、テキスト翻蚳を提䟛したり、䞀般的に英語話者が来おも楜しめるように歓迎するようにしおいる。今幎は、日本語話者でも英語で発衚する人も出おきた。 このような努力は、Scala には興味があるが英語は苊手ずいう倚くのカンファレンス参加者にずっお利害関係の衝突ずなる。リアルタむムで提䟛される有志によるテキスト翻蚳は、無いよりはいいかもしれないけど、埀々にしお䞍十分である。解決方法ずしお怜蚎するべきはプロの通蚳を雇うこずだ。これは YAPC::Asia などではうたくいったらしい。さらに、2぀の別路線 (track) を䜜っお、それぞれ英語での発衚ず日本語での発衚を行うべきだ。 初心者ず䞊玚者 Matsuri は祭ずいう意味で、テヌマも “enjoy Scala” だった。前から Scala をやっおきおるナヌザには確かに楜しいカンファレンスだったかもしれないが、僕のものも含め倚くのトヌクは初心者を眮いおきがりにしたものずなった。この回避方法ずなり埗るかもしれないのが、英語路線ず日本語路線の区別の他に、NE Scala のようにセッションを参加者の投祚で決めおもらうこずだ。通蚳付きで英語のセッションでも聞いおみたい人ず䞊玚者、逆に日本語にしお欲しい人ず初心者に盞関性があるず仮定するず、それぞれの路線が、投祚によっお聎衆が聞きたい適切なレベルに補正されるのではないだろうか。 ポスドクずアゞア諞囜からの参加者 1日目のレポヌトに曞いたずおり、宋 剛秀さんの発衚は唯䞀孊術的な方面からのものだったけど、独自で面癜いものだった。アメリカやペヌロッパからのロックスタヌ的な登壇者を芳るのも面癜いけども、日本から宋さんのようなポスドクの研究者や、はたたた近隣のアゞア諞囜である、むンド、䞭囜、韓囜、台湟、シンガポヌルなどから呌んでみるのも面癜いのではないだろうか。英語路線を蚭けるこずで、日本語の心配はいらなくなるず思う。実装する方法の䞀぀ずしおは、CFP をもっず比范的長く取っお、䟋えば最倧 $1500 たでで旅費のサポヌトをするず宣䌝すればいいず思う。投祚埌には、旅費予算から差し匕いおいっお、祚の倚い順に可胜な限りの人を招埅すればいい。 党おの受け皿ずしおのアンカンファレンス もし英語路線か日本語路線のどちらかの競争率が高くなっおも、今埌はアンカンファレンスを受け皿ずしお機胜させるこずができる。今回で倚くの人が盎接アンカンファレンスが行われる様子を芋たので、今埌はより倚くの議論や準備枈みのトヌクが増えるこずを期埅しおいう。来幎からはホワむトボヌドを廃止しお、圓日の朝に Google docs に盎接党おのアンカンファレンスのアむディアをファシリテヌタ名ず共に曞く方向に倉えおいくべきだず思う。狙いはあたり人気が無いセッションでも郚屋が空いおいれば、ちゃんずセッションを蚭けるこずにある。

ScalaMatsuri 1日目

日本での Scala カンファレンスも今幎で二幎目だ。今幎は ScalaMatsuri ず名前を倉えお仕切り盎し。300枚のチケットは売り切れ、招埅講挔者やスポンサヌ招埅枠などを入れたら圓日はもっずいたかもしれない。アメヌバブログやオンラむン広告サヌビスなどを事業ずする CyberAgent さんのオフィスを䌚堎ずしおお借りした。 1日目のトップバッタヌは小田奜先生こず Martin Odersky 先生 (@ordersky) の「Scala 進化論」。倚くの人が小田奜先生の講挔を楜しみにしおいたので、朝から満員に近かったず思う。僕が出垭したセッションは、拙䜜の closed-captioning を䜿っお和英、英和のテキスト翻蚳を打ち蟌むのに忙しかった。䞀日目翻蚳チヌムの他のメンバヌは、@cbirchall、 @cdepillabout、 @okapies、 @oe_uia。 次に僕が「sbt、傟向ず察策」を日本語で話した。mkdir helloworld から始めお、sbt の最初のステップから、continuous testing たでの流れのデモから始めた。次に、基瀎コンセプト、0.13.6 で入る新機胜である HTTPS デフォルト、consolidated resolution、eviction warning を玹介しお、最埌に「サヌバずしおの sbt」ずさらなる性胜の改善ずいう将来の展望でシメた。LinkedIn瀟のプレスチヌムから、LinkedIn が sbt の性胜改善の仕事をスポンサヌしおもらっおるこずを話しおもいい蚱可をもらっおきたので、今回機胜改善に関しお公の堎でお瀌できたのは良かったず思う。 Activator ず sbt に関しお質問があった。Activator の 3぀の甚䟋ずいうこずで以䞋のように回答した: トレヌニング・セッションなどにおける USBドラむブなどによる Typesafe スタックのオフラむン配垃 新ナヌザの out-of-the-box ゚クスペリ゚ンス (箱を開けおすぐ遊べるこず) の改善 ナヌザがコヌドを打ち蟌みながら䜿えるチュヌトリアルをホストするプラットフォヌム sbt サヌバに関しおは、IntelliJ などの他のツヌルずの連携、ず将来的な remote compilation などの可胜性ができるこず䞡方に぀いお奜反応を埗た。 Jon Pretty (@propensive) さんの ‘Fifty Rapture One-Liners in Forty Minutes’ ずいう講挔。リ゜ヌスの読み曞きを抜象化するこずに焊点を絞ったラむブラリみたいで、オンラむンから色々読み蟌んで、生の状態の読み蟌み (slurp) や case class ぞの萜ずし蟌みをするみたいだ。enrich-my-library、マクロ、dynamics などナヌザ・フレンドリヌな Json 凊理のために蚀語のトリックを倚甚しおいる。バック゚ンドの json ラむブラリが遞べるようになっおいるのは奜印象。

Vim メモ

個人的には SublimeText で特に困っおいないし、メむンの゚ディタずしおしばらく䜿っおきた。だけど、コマンドラむンから䜿える゚ディタにも少しは興味があるし、色んな人がネットワヌク䞊から䜿えるから䟿利ずいうこずを蚀っおいる。X を転送したり、他の方法でリモヌトむンすれば Sublime を䜿えるんじゃないかずも思うが、䞀応詊しおみよう。 この Vim のセットアップをしようず思ったキッカケの䞀぀に新しく MBP を買ったずいうのがあっお、折角だから䜕か新しいこずをやっおみようかなず思った。぀たり、本皿は完党な玠人が個人的なメモずしお曞いおあるものだ。そもそもブログずいうのはそういうものなはずだ。動くかどうかは保蚌できない。党般的に yuroyoko さんが数幎前に曞いた iTerm2 + zsh + tmux + vim で快適な256色タヌミナル環境を構築するを参考にした。 Vim 以倖の色々なこず dotfiles 本皿で曞いたセットアップは eed3si9n/dotfiles に䞊げおある。他の人の dotfiles を fork するのが䜜法らしいけども、自分の環境に持ち蟌む蚭定をちゃんず理解したかったので、䞀から曞き始めた。 dotfiles の基本的な考え方ずしおは、これを ~/dotfiles/ にたず checkout しお、そこには zshrc などのファむルが入っおる。これらのルヌトの蚭定ファむルはホヌムディレクトリ内で ~/.zshrc などずいう感じでシンボリックリンクが匵られる。 Terminal.app Mac で iTerm2 がどうしおも必芁になったこずはただない。以前には Terminal.app に色々ず制限があったのかもしれないけど、今の所僕はこれで間に合っおいる。 Terminal.app を䜿い続けおいる理由のもう䞀぀が、僕が TotalTerminal のファンであるこずだ。 homebrew Homebrew にはお䞖話になっおいる。 Zsh このマシンのシェルは Zsh にする。Mac なら How to use Homebrew Zsh Instead of Max OS X Default を参照:

Scala を甚いたスクリプティング

珟実問題ずしお正芏衚珟が必芁になるこずがある。いく぀かのテキストファむルに倉換をかけたりする床に find コマンド、zsh のドキュメントや Perl 関連の StackOverflow の質問を手探りしながら䜜業するこずになる。苊劎しながら Perl を曞くよりは Scala を䜿いたい。結局、僕個人の慣れの問題だ。 䟋えば、今手元に 100以䞊の reStructuredText ファむルがあっお、それを markdown に倉換する必芁がある。たずは pandoc を詊しおみお、それはそれなりにうたくいった。だけど、䞭身をよく読んでみるずコヌドリテラルの倚くがちゃんずフォヌマットされおないこずに気づいた。これは単䞀のバッククォヌト (backtick) で囲たれおいたり、Interpreted Text を䜿っおいるからみたいだ。このテキストをいく぀かの正芏衚珟で前凊理しおやればうたくず思う。 コマンドラむン scalas 僕の珟圚の開発マシンには scala ぞのパスが通っおいない。zip ファむルを䞀回ダりンロヌドするのは倧した䜜業じゃないけども、将来的に jar ずスクリプトの管理をしなきゃいけないのが面倒な気がする。普通なら僕は sbt を䜿っお Scala の jar をダりンロヌドさせる。それでもいいけども、単䞀のファむルのみを䜿った解法が欲しいずする。 そこで今詊しおるのが sbt の script runnerだ: #!/usr/bin/env sbt -Dsbt.version=1.4.7 -Dsbt.main.class=sbt.ScriptMain -Dsbt.supershell=false -error /*** ThisBuild / scalaVersion := "2.13.4" */ println("hello") 次に、 $ chmod +x script.scala $ ./script.scala hello これで自分の Scala version を 2.13.4 に指定するスクリプトができた。コンパむルを含めお “hello” が衚瀺されるたで 8秒かかるから、サクサクずは皋遠い感じだけど、個人的には蚱容範囲内だず思う。

sbt テクノロゞ・プリビュヌ: auto plugin

Preview of upcoming sbt 1.0 features: Read about the new plugins を蚳したした。 著 @eed3s9n, @jsuereth sbt に倉化が蚪れようずしおいる。sbt 1.0 ぞ向けお sbt の原理である自動化 (automation)、むンタラクション (interaction)、統合化 (integration) の党面においお改善がみられる予定だ。1.0 の二倧機胜ず目されおいるのは auto plugin ず「ビルドサヌバずしおの sbt」の 2぀だ。 今埌の数ヶ月にわたっお sbt チヌムは sbt 0.13 コヌドベヌス䞊にこれらの機胜を远加したプリビュヌ版をリリヌスする。これらのプリビュヌ版によっお、sbt 1.0 の仕様が固たる前にコミュニティヌからのフィヌドバックを埗たり、新しい蚭蚈方針や理念そしお新機胜を促進するこずを目的ずしおいる。 長い間 sbt を支えおきた Mark Harrah がビルド以倖のこずをするために旅立っおいったこずを残念ながら報告しなければならない。しかし、Typesafe のビルドツヌルチヌムである Antonio Cunei、Josh Suereth に新たなメンバヌ Eugene Yokota (@eed3si9n) が sbt の techlonogy lead の䞀人ずしお参加するこずを歓迎したい。 本皿では、今回できあがった auto plugin 機胜を玹介する。これは sbt 0.13.5-M2 リリヌスに含たれる。 プラグむン・゚コシステム sbt の最倧の匷みずしおプラグむン・゚コシステムを挙げるこずができる。プラグむンはビルド定矩ず党く同じように動くため、sbt を習うこずはそのたたプラグむンを曞くのを習うこずに぀ながっおいく。sbt プラグむンの倚様性はこの基本的なコンセプトの力匷さを物語っおいるだろう。䞭でも Play Framework ず Activator の二぀は抜き出おいる。これらは sbt の䞊にで䜜られおいおむンタラクティブな開発゚クスペリ゚ンスを提䟛しおいるからだ。

Scala でのクラス線圢化 (mixin 順序) の制玄

昚日は、䜕故か早朝に目が芚めお @xuwei_k氏のScalaで抜象メ゜ッドをoverrideする際にoverride修食子を付けるべきかどうかの是非を流し読みしおいた。この話題は面癜すぎたので、飛び起きおすぐに英蚳しおしたった。Scalaz で遭遇したコヌドを䟋にしお型クラスのデフォルトむンスタンスを提䟛するこずの埮劙なゞレンマを解説しおいる。 以䞋に問題を簡略化したコヌド䟋を瀺す: trait Functor { def map: String } trait Traverse extends Functor { override def map: String = "meh" } sealed trait OneOrFunctor extends Functor { override def map: String = "better" } sealed trait OneOrTraverse extends OneOrFunctor with Traverse { } object OneOr { def OneOrFunctor: Functor = new OneOrFunctor {} def OneOrTraverse: Traverse = new OneOrTraverse {} } これをテストするには以䞋を実行する: scala> OneOr.OneOrTraverse.map res0: String = meh OneOr.

sbt-sequential を甚いたタスクの逐次化

本皿では sbt 0.13 における実行意味論 (execution semantics) ずタスクの逐次化 (task sequencing) に぀いおみおいこうず思う。たずは前提ずなる背景を倧たかに埩習しお、次に逐次的タスク (sequential task) を远加するために曞いた実隓的プラグむン sbt-sequential を玹介したい。 背景 Mark 曰く: sbt のモデルは副䜜甚をタスクに局所化させるこずで、䟝存性さえ満たせば、タスクはい぀でも実行できるずいうものだ。この利点はデフォルトで䞊列であるこずで、実際により速いビルドを可胜ずするこずだ。 蚀い替えるず、sbt を䜿ったビルド定矩はタスク間の䟝存性のみを定矩しおいお、これらのタスクがどのタむミングで始動されるかは sbt によっお自動的に蚈算される。これをちゃんず理解するために、たず副䜜甚を持った Scala コヌドの実行意味論をみおみよう。 盎列実行 (serial execution) class Test { def startServer(): Unit = { println("starting...") Thread.sleep(500) } def stopServer(): Unit = { println("stopping...") Thread.sleep(500) } def numberTask: Int = 1 def integrationTest0(): Int = { val n = numberTask startServer() println("testing...") Thread.sleep(1000) stopServer() n } } 誰かが integrationTest0() を呌び出すず、コヌドは曞かれたのず党く同じ順序で実行される。たず numberTask が呌び出され、次に startServer() が呌ばれこの実行は 0.

Spire の Ops マクロ: 暗黙の挔算子の高速化

䞀芋普通の挔算でもいかに高速化できるかをい぀も考えお発衚しおる奇才 Eiríkr Åsheim (@d6) さんの “How to use Spire’s Ops macros in your own project” を翻蚳したした。い぀も気さくに話しかけおくれるフレンドリヌでいいや぀です。翻蚳の公開は本人より蚱諟枈みです。 2013幎10月13日 Eiríkr Åsheim 著 2013幎11月20日 e.e d3si9n èš³ Spire の Ops マクロずは䜕か? Spire の型クラスは + や * ずいった基瀎的な挔算子を抜象化する。普通これらの挔算は非垞に速い。そのため、ちょっずでも䜙蚈な事 (䟋えば、boxing やオブゞェクトの割り圓おなど) を挔算ごずにやっおしたうず、ゞェネリック化したコヌドは盎接呌び出したものず比べお遅いものになっおしたう。 効率的か぀ゞェネリックな数倀プログラミングが Spire の存圚意矩だ。䞍必芁なオブゞェクト割り圓おを回避するために僕たちはいく぀かの Ops マクロを甚意した。本皿ではその仕組みず、君のコヌドからそれらのマクロを䜿う方法を解説する。 通垞の型クラスを甚いた暗黙の挔算子の仕組み Scala で型クラスを甚いる堎合、通垞は暗黙の倉換に頌るこずでゞェネリックな型に挔算子を「远加」する。(蚳泚: いわゆる Enrich my library パタヌンだ) 以䞋に具䜓䟋で説明するず、A はゞェネリックな型、Ordering は型クラスで、> が暗黙の挔算子ずなる。foo1 はプログラマが曞くコヌドで、foo4 は implicit が解決されお、糖衣構文が展開された埌のものだ。 import scala.math.Ordering import Ordering.Implicits._ def foo1[A: Ordering](x: A, y: A): A = x > y def foo2[A](x: A, y: A)(implicit ev: Ordering[A]): A = x > y def foo3[A](x: A, y: A)(implicit ev: Ordering[A]): A = infixOrderingOps[A](x)(ev) > y def foo4[A](x: A, y: A)(implicit ev: Ordering[A]): A = new ev.

sbt 0.13 を甚いた四次元空間内の移動

è­Šå‘Š: この sbt に぀いおの芚え曞きは䞭玚ナヌザ向けだ。 セッティングシステム sbt 0.12 同様に sbt 0.13 の䞭心にあるのはセッティングシステムだ。Settings.scala を芋おみよう: trait Init[Scope] { ... final case class ScopedKey[T]( scope: Scope, key: AttributeKey[T]) extends KeyedInitialize[T] { ... } sealed trait Initialize[T] { def dependencies: Seq[ScopedKey[_]] def evaluate(map: Settings[Scope]): T ... } sealed class Setting[T] private[Init]( val key: ScopedKey[T], val init: Initialize[T], val pos: SourcePosition) extends SettingsDefinition { ... } } pos を無芖するず、型 T のセッティングは、型が ScopedKey[T] である巊蟺項 key ず型が Initialize[T] である右蟺項 init によっお構成される。

オブゞェクト指向プログラミングずは䜕か?

oop はどう定矩されるべきだろうか?

玔粋オブゞェクト指向プログラミング

玔粋オブゞェクト指向プログラミングは以䞋のように定矩できる:

オブゞェクトを䜿ったプログラミング。

オブゞェクトずは䜕か?

他のオブゞェクトぞの参照を保持し、事前にリストアップされたメッセヌゞを受信するこずができ、他のオブゞェクトや自分自身にメッセヌゞを送信するこずができるアトムで、他には䜕もしない。メッセヌゞは名前ずオブゞェクトぞの参照のリストから構成される。

これでおしたい。蚀い回しは僕が考えたものだけど、アむディアはオブゞェクト指向ずいう蚀葉を䜜った匵本人 Alan Kay (2003) からのものだ。これ以倖は、盎接 oop に関係無いか、実装䞊の詳现だ。

sbt 0.13.0 の倉曎点

抂芁 互換性に圱響のある新機胜、倉曎点、バグ修正 sbt ずビルド定矩を Scala 2.10 に移行した。 project/plugins/ 内に眮かれたプラグむンの蚭定ファむルのサポヌトを廃止した。これは 0.11.2 より廃止予定になっおいた。 set コマンドにおいおセッティングの右蟺項内のタブ補完を廃止した。新たに远加されたタスクマクロがこのタブ補完を䞍芁にするからだ。 キヌの慣甚的な曞き方はこれよりキャメルケヌス camelCase のみずする。詳现は埌ほど。 Maven ずの互換性を正すため、テストのデフォルトの classifier を tests に修正した。 グロヌバルなセッティングずプラグむンのディレクトリをバヌゞョン付けるようにした。デフォルトでは、グロヌバルセッティングは ~/.sbt/0.13/ に、グロヌバルプラグむンは ~/.sbt/0.13/plugins/ に眮かれる。sbt.global.base システムプロパティを䜿った明瀺的なオヌバヌラむドは継続しお適甚される。(#735) scalac にファむルを枡すずきに sbt が行なっおいた正芏化 (canonicalization) を廃止した。(#723) 各プロゞェクトがそれぞれ固有の target ディレクトリを持぀こずを匷制するようにした。 䟝存ラむブラリの Scala バヌゞョンをオヌバヌラむドしないようにした。これによっお個別の蚭定が異なる Scala バヌゞョンに䟝存できるようになり、scala-library 以倖の Scala 䟝存性を通垞のラむブラリ䟝存性ず同じように扱えるようになった。しかし、これによっおその他の scala-library 以倖の Scala ラむブラリが最終的に scalaVersion 以倖のバヌゞョンに解決される可胜性も生たれた。 Cygwin での JLine の蚭定が倉曎された。Setup 参照。 Windows 䞊での JLine ず Ansi コヌドの振る舞いが改善された。CI サヌバ内では -Dsbt.log.format=false を指定しお明瀺的に Ansi コヌドを無効にする必芁があるかもしれない。 フォヌクされたテストや run がプロゞェクトのベヌスディレクトリをカレント・ワヌキング・ディレクトリずしお甚いるようにした。 compileInputs は Compile ではなく (Compile,compile) 内で定矩するようにした。 テストの実行結果は Tests.

シンプルさの必芁性

2012幎4月23日にテキサスの Austin で行われた RailsConf 2012 での Rich Hickey (@richhickey) さんによる基調講挔、Simplicity Matters を曞き起こしお翻蚳したした。 Rich Hickey さんは Clojure や Datomic の䜜者です。 この翻蚳は Creative Commons Attribution ShareAlike 3.0 ラむセンスに基いお公開したす。

Rich Hickey 講挔 e.e d3si9n èš³

Rich Hickey

Scala: 空飛ぶサンドむッチのパヌツ

JavaScript が䜜られたのは 1995幎のこずだから、『JavaScript: The Good Parts』(2008幎)、jQuery (2006幎)、V8 (2008幎) などが登堎するよりもかなり前に䜜られたこずになる。jQuery ず V8 が加算的な貢献であるのに察しお、Douglas Crockford 氏の『The Good Parts』が面癜いのは、蚀語から機胜を匕き算した本であるこずだず思う。 ここ最近、もし Scala をリアルワヌルドな制玄である Java 的な芪しみやすさや互換性を無芖しおワンダヌランド的な蚭定でサブセットを䜜ったらどうなるだろうかず考えおいる。Scala を Java の代替ずしお䜿う事が蚱されるなら、関数型プログラミング蚀語の代替ずしお䜿っおもいいじゃないかず思う。この思考実隓のもう䞀぀の詊みは、Scala の構文の䞭で重耇しおいるものを枛らすこずだ。本皿では、慣甚的な甚法が䜕かを考えたり、䜕かに察しお良し悪しの刀定を䞋すこずには興味は無い。これは空飛ぶサンドむッチのパヌツ (The Flying Sandwich Parts; TFSP) ず呌ぶこずにする。 倀 What talk you of the posy or the value? — William Shakespeare, Merchant of Venice Scala 蚀語仕様は倀を以䞋のように定矩する: 倀定矩 val x : T = e は、e の評䟡から埗られる倀の名前ずしお x を定矩したす。 TFSP においおは、トレむトやクラスの本文内では型泚釈 T の省略を犁止する。関数内のロヌカルの倀は型掚論を䜿っお定矩しおもよい。これによっお関数レベルにおいお型怜査が行われるこずが保蚌される。 遅延評䟡倀 玠の val を䜿っお倀を定矩するず、定矩した順番に気を䜿う必芁がある。初期化する前に倀を参照しおしたうず実行時に NullPointerException が発生しおしたう。倀を lazy だず曞くこずで最初に参照されるたで初期化を遅延するこずができる。

scopt 3.0

scopt is a little command line options parsing library. 今日 scopt 3.0 をリリヌスする。実装の詳现に興味が無ければ、readme に飛んでほしい。 2010幎3月4日ごろ僕は scopt のコミッタになった。これは元々 Aaron Harnly さんが 2008幎ごろ曞いた scala-options のフォヌクだ。確か、usage text 呚りの倉曎ず key=value options ず argument list ずいう機胜を远加したかったんだず思う。それ以降党おのバグレポを担圓しおきた。その䞭には jar を scala-tools.org に公開しおくれずいうのもあった。2012幎3月18日、僕は再びプロゞェクトを scopt/scopt にフォヌクしお immutable parser を远加した scopt 2.0.0 をリリヌスした。 数幎に枡っお重ねるようにしお機胜が远加されたため、scopt3 は䞀から曞き盎すこずにした。発端ずなったのは Leif Wickland さんに「scopt に intArg() が無いのは蚭蚈䞊の理由があるのか」ず聞かれたこずだ。 Ruby の OptionParser に inspire されお曞かれた元の Aaron さんの scala-options にはオプションのために 5個のメ゜ッドがあった: onInt、 onDouble、 onBoolean、 on、それからもう䞀぀オヌバヌロヌドされた on。重なる開発の結果 scopt2 は opt のオヌバヌロヌドが 6぀、intOpt、 doubleOpt、 booleanOpt、 keyValueOpt、 keyIntValueOpt、 keyDoubleValueOpt、 keyBooleanValueOpt それぞれに 4぀づ぀のオヌバヌロヌドが蓄積された。合蚈 34 ものメ゜ッドだ!

Dispatch プラグむンの曞き方

Dispatch は Scala からネットぞ぀なぐデファクトの方法であり続けおきた。昚今のノンブロッキングIO ぞの流れず歩調を合わせお @n8han はラむブラリを Async Http Clientベヌスのものに曞きなおし、Reboot ず呌んだ。埌にこれは、Dispatch 0.9 ずしおリリヌスされる。さらに、独自の Promise を SIP-14 で暙準化された Future に眮き換えたものが Dispatch 0.10 だ。 Dispatch Classic 同様に Reboot でも web API をラッピングしたプラグむンを䜜るこずができる。本皿では、Classic で曞かれたプラグむンを移怍しながら Dispatch 0.10 プラグむンの曞き方を解説しおいく。 repatch-twitter 他のプラグむンずの名前の衝突を回避するために、僕のは dispatch-twitter ではなく repatch-twitter ず呌ぶこずにする。 sbt たずは sbt の蚭定から始める: repatch-twitter/ +- project/ | +- build.properties | +- build.scala +- core/ +- src/ +- main/ +- scala/ +- requests.scala +- ... build.properties の䞭身: sbt.version=0.12.3 build.scala の䞭身:

カンファレンスを翻蚳する

もう䞀ヶ月経぀けど 2013幎3月1日に日本に䞀時垰囜しお「Scala Conference in Japan 2013」に出垭した。そういう名前のカンファレンス。 ポッドキャストから ある日 (2012幎6月2日だけど) Scala Days 2012 で録音された Scala Types を聞いおいるず誰かが (@timperrett さん) “I would love to see Scala Days in Asia. We had two in Europe now. It would be wicked to have it in China or Japan, or somewhere like that.” ず蚀っおいたので、その趣旚を Twitter で䌝えた: 今 Scala Days 2012 で録音された Scala Types を聎いおたら、開催地が欧米圏に偏っおるから次あたり日本ずかアゞア圏なんおどうだろうっお話が出おた。コミュニティが声出せば誘臎もありえるかも 䌚話が始たるず @jsuereth がすぐに支持の声を䞊げおくれた: @kmizu @eed3si9n_ja If you guys manage to get a Scala conference somewhere in asia, I’ll be there!

抜象的な Future

これは Scalaz Advent Calendar 2012 12日目の蚘事です。 次々ず Scala 界の知胜掟を集結させおいる Precog 瀟の開発チヌムからのブログ Precog.Copointed。今日は blueeyes などの開発でも知られる Kris Nuttycombe (@nuttycom) さんが曞いた The Abstract Future を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。 2012幎11月27日 Kris Nuttycombe 著 2012幎12月11日 e.e d3si9n èš³ Precog 開発ブログの前回は僕たちが Cake パタヌンを䜿っおコヌドベヌスを構造化しお、ギリギリたで実装型を抜象化しおしおいるこずを Daniel が曞いた。その蚘事での説明のずおり、これは非垞に匷力な抂念だ。型を存圚型ずしお保぀こずで、やがお遞択された型を「意識」しおいないモゞュヌルからはそれらの型の倀は䞍可芖であるため、カプセル化の境界の突砎をコンパむラが防止しおくれる。 今日の蚘事では、この抂念を型からさらに進めお型コンストラクタに適甚しお、蚈算モデルを䞞ごず眮き換える機構ずしお䜿えるこずを説明する。 Scala を少しでも䜿ったこずがあれば、䜕らかの文脈で誰かが「モナド」ずいう蚀葉を䜿ったのを聞いたこずがあるだろう。䟋えば、Scala の for ずいうキヌワヌドにより提䟛される糖衣構文に関する議論か、Option 型を䜿うこずで null 参照゚ラヌの萜ずし穎が回避できるこずを説明したブログ蚘事で読んだのかもしれない。Scala でのモナドに関する議論の倧半が「コンテナ」型に焊点を圓おおいるのに察しお、Scala ゚コシステムでよく芋かけるいく぀かの型の䞭にモナディック合成のより面癜い偎面が衚れるものがある。限定蚈算 (delimited computation) だ。どのモナディックな型を合成しおもこの偎面を芋るこずができるが、これを盎接利甚した䟋ずしお最もよく䜿われおいる Scala でのモナディックな型に非同期蚈算を゚ンコヌドした akka.dispatch.Future がある (これは Scala 2.10 においお珟行の Future を眮き換える予定のものだ)。これは蚈算のステップを順序付けするための柔軟な方法を提䟛するこずで、本皿が泚目するモナディック合成の䞀面を䜓珟する。 ここで䞀蚀断っおおくが、この蚘事はモナドのチュヌトリアルずしお機胜するこずを意図しおいない。モナドの解説ずその Scala のプログラミングずの関連を取り扱った蚘事は既にたくさんある (ありすぎるかも!)。もしこの抂念に䞍慣れなら読み進める前にそれらの解説を読むず圹に立぀かもしれない。しかし、最初に泚意しおおきたい点が䞀぀あっお、(モナディック合成のための糖衣構文ずしおの for が瀺すずおり) Scala ではモナドは広い範囲で利甚されおいるにも関わらず Scala の暙準ラむブラリに Monad 型が無いずいうのは Scala 固有な状況だずいうこずだ。そのため、モナド型が必芁ならば暙準ラむブラリ倖の玠晎らしい Scalaz プロゞェクトを䜿う。Scalaz のモナド抜象䜓は implicit 型クラスパタヌンを利甚しおいる。以䞋にベヌスの Monad 型を簡略化したものを瀺す:

Func を䜿った数独

これは Scalaz Advent Calendar 2012 5日目の蚘事です。 12月の間䞭、日本の技術系ギヌクは日替わりでテヌマに沿った蚘事を公開し、圌の囜では「Advent Calendar」ず呌ばれおいるらしい。去幎の Scala Advent Calendar 2011 で僕は Eric Torreborre さんが The Essence of Iterator Pattern をカバヌした蚘事を翻蚳した。これは日本人の関数型プログラミング蚘事奜きを知った䞊である皋床狙ったものだった。もう1぀の利己的な動機は、蚘事を䞀語䞀語蚳す過皋においお抂念のいく぀かは僕の頭にも染みこんでくれるんじゃないかずいう期埅だった。振り返っおみるず、䞡方の目的ずも䜜戊成功だったず蚀える。Jeremy Gibbons さん、Bruno Oliveira さんそしお Eric 䞡方の仕事のクオリティのお陰だ。これらの染み蟌んだ知識が今幎に曞いた独習 Scalaz シリヌズの隠し味だったんじゃないかず思っおいる。 独習 Scalaz 12日目でふれたずおり、Scalaz 7 の型クラスむンスタンスには既に product ず compose が含たれおおり、たた Traverse も定矩されおいる。論文にある word count の䟋題 たである。僕が気づいたのは、倀レベルでの合成が無いこずだ。この論文の興味深い点の1぀に「applicative functor の合成」があり、これはモゞュヌル化プログラミング的なものを可胜ずする。 Gibbons ず Oliveira の蚀う「applicative functor」は実は型クラスのむンスタンスだけではなく、applicative 関数の合成も指しおいる。これは論文からの以䞋の抜粋をみれば明らかだ: data (m ⊠ n) a = Prod { pfst :: m a, psnd :: n a } (⊗) :: (Functor m, Functor n) ⇒ (a → m b) → (a → n b) → (a → (m ⊠ n) b) (f ⊗ g) x = Prod(f x)(gx) 代数デヌタ型の ⊠ は型レベルの積だが、䞭眮関数の ⊗ は 2぀の applicative 関数の倀レベルの積で、a → (m ⊠ n) ずいう型の applicative 関数を返す。蚀い換えるず、プログラマは applicative functor を返す関数を構築するだけよくお、型レベルでの合成は自動的に行われる。

絵で芋るモナド

John Wiegley さんの “Monads in Pictures” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。

2012幎8月20日 John Wiegley 著 2012幎8月21日 e.e d3si9n èš³

これはモナドのチュヌトリアルではないし、ここには数孊甚語も出おこない。本皿は、既にモナドを䞀応䜿えるぐらいには習った人を察象ずする。芖芚化するこずで、䜕のために䜕をやっおいるかが明らかになるはずだ。

関数

モナドに察する盎感を埗る䞀぀の方法ずしお関数からモナドぞの抜象化をたどるずいうものがある。関数が䜕をやっおいるのかを簡単な絵で衚しおみよう。Haskell の関数の呌び出しの構文を䞊に、同じ挔算を芖芚化したものを䞋に眮いた:

Scala 2.10 におけるメタプログラミング: 構文朚、シンボル、型に぀いお

Scala マクロの䜜者 Eugene Burmako さんによるリフレクション API に関する発衚のスラむド、“Metaprogramming in Scala 2.10” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。 2012幎4月28日 Eugene Burmako 著 2012幎8月5日 e.e d3si9n èš³ はじめに メタプログラミング メタプログラミングずは、他のプログラムや自身をデヌタずしお曞いたり操䜜するコンピュヌタプログラムを曞くこず。 —Wikipedia コンパむラ 問: どうやっおメタプログラミングを可胜にするこずができだろう? 答: コンパむラよりもプログラムに関しおデヌタを持぀者がいるだろうか? プログラマにコンパむラを公開しよう。 リフレクション 2.10 ではプログラムに関するデヌタをリフレクション API ずしお公開する。 この API は、scala-library.jar (むンタヌフェむス)、scala-reflect.jar (実装)、scala-compiler.jar (実行時コンパむル) にたたがっおいる。 Martin の方が詳しい 先日行われた Martin Odersky 先生による講挔におリフレクション API の蚭蚈が詳しく説明されおいる: http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/Reflection-and-Compilers 実習 今日は、いく぀かの具䜓䟋を通しおリフレクション API の基瀎を習い、たたどうやっお曎に倚くの情報を埗られるかを習う。 マクロ 問: ちょっず! マクロはどうなっおるの? 答: マクロの栞ずなるのはリフレクションであり、リフレクションがマクロを API ずしお提䟛し、リフレクションがマクロを可胜ずする。今日はたずリフレクションを理解するこずに焊点を圓おる。マクロは小さな埌付けにすぎない。 マクロ、その哲孊ず応甚に関しおは、Scala Days での講挔を参考にしおほしい: http://eed3si9n.com/ja/scala-macros-scaladays2012 リフレクション コアずなるデヌタ構造 構文朚 (Tree) シンボル (Symbol) 型 (Type) $ scalac -Xshow-phases phase name id description ---------- -- ----------- parser 1 ゜ヌスを AST ぞずパヌスし、簡単な糖衣構文展開 (desugaring) を行う。 namer 2 名前を解決し、シンボルを名前付けされた構文朚ぞず関連付ける。 typer 4 メむンコヌス: 構文朚を型付けする。 pickler 7 シンボルテヌブルをシリアラむズする。 できる限り分かりやすくこれらの抂念の説明をする぀もりだが、Paul Phillips 以䞊の説明は恐らく誰にもできない。 Inside the Sausage Factory ずいう講挔は絶察に芋おおいたほうがいい。

初めおの Scala マクロ

Scala マクロの䜜者 Eugene Burmako さんが管理する scalamacros.org から “Getting started” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。 Eugene Burmako 著 2012幎7月31日 e.e d3si9n èš³ 1. Scala 2.10 を入手する マクロは 2.10.0-M3 以降の Scala で出荷されおいる。珟行のマむルストヌンである 2.10.0-M6 などのマクロが入ったコンパむラを盎接ダりンロヌドするか、Maven や sbt などから参照する。奜きな方法を䜿っおいい。 蚳泚: sbt 0.11.3 を䜿ったプロゞェクトを github に甚意したので、 git clone -b ja https://github.com/eed3si9n/scalamacros-getting-started.git でセットアップできる。 2. マクロを曞く Macros.scala ずいうファむルを䜜っお以䞋のコヌドをペヌストする (関連する API やむンフラなどマクロシステムに倧切なこずが曞かれおいるのでコメントもしっかり読んでほしい)。 import scala.reflect.makro.Context import collection.mutable.ListBuffer import collection.mutable.Stack object Macros { // マクロ定矩のシグネチャは奜きなパラメヌタを受け取る普通の関数ず同じだ。 // しかし、本文は実装ぞの参照のみずなる。 def printf(format: String, params: Any*): Unit = macro printf_impl // マクロ実装のシグネチャはマクロ定矩のものず察応する必芁がある。 // 䞀芋耇雑に芋えるが、心配する必芁はない。 // もしコンパむラが䞍満なら、゚ラヌメッセヌゞで必芁なシグネチャを教えおくれる。 def printf_impl(c: Context)(format: c.

Scala マクロ、ロンドンに珟る

マクロの䜜者ずしお今泚目を济びおいる Eugene Burmako さんず、マクロを䜿っお蚀語統合されたデヌタベヌス接続行うラむブラリ SLICK の䜜者である Jan Christopher Vogt さんが今幎の Scala Days で行った発衚のスラむドを翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。

2012幎4月18日 Eugene Burmako、Jan Christopher Vogt 著 2012幎7月30日 e.e d3si9n èš³

Scala マクロ

(頭をおかしくせずに) コンパむラを拡匵する暩限を開発者に䞎える!

これはコンパむル時に以䞋を行う:

  • 怜査
  • 凊理
  • AST 倉換
  • コヌド生成
  • ランタむムぞの AST の配備

蚳泚: Scala マクロは 2.10 より導入されるコンパむル時にコヌドを眮換する機構だ。これにより今たでボむラヌプレヌトが必芁だったものを自動生成できるようになるなど、より高い衚珟力を手にするこずができる。

Scala脳のための C# LINQ

これは Scala プログラマのための C# LINQ 機胜の芚え曞きだが、逆ずしおも䜿えるはず。 型掚論 C# には型掚論がある。個人的に、ロヌカル倉数ではできるだけ var を䜿うようにしおいる。 var x = 1; Scala にも var があるけど、可胜なら䞍倉 (immutable) な val を䜿うのが奜たしいずされおいる。 val x = 1 新しい List ず Array の䜜成 C# はむンラむンでコレクションを䜜るこずができる。 using System.Collections.Generic; var list = new List { “Adam”, “Alice”, “Bob”, “Charlie” }; var array = new [] { 0, 1, 2 }; 党おの Scala コレクションにファクトリメ゜ッドがある。 val list = List("Adam", "Alice", "Bob", "Charlie") val array = Array(0, 1, 2) ラムダ匏を䜿ったフィルタ C# には “enrich-my-library” 的なモンキヌパッチングがあり、普通の Array に Where メ゜ッドが远加されおいる。

sbt 0.12.0 の倉曎点

぀いに final がリリヌスされた、sbt 0.12.0 の倉曎点を蚳したした。 バむナリバヌゞョンずいう抂念が導入されるこずで、Scala 2.9.0 で入ったけどあたり掻甚されおいない Scala の埌方バむナリ互換性がより正面に出おくるキッカケずなるず思いたす。 互換性に圱響のある新機胜、バグ修正、その他の倉曎点 Scala 2.10 以降の Scala 及び sbt プラグむンのクロスバヌゞョン芏玄の倉曎。 (詳现は以䞋の項目 ) 盎接実行された堎合、匷制的に update を実行するようにした。 #335 sbt プラグむンリポゞトリがプラグむンずプラグむンの定矩にデフォルトで加わった。 #380 プラグむン蚭定ディレクトリの優先順䜍。 (詳现は以䞋の項目 ) ゜ヌス䟝存性の修正。 (詳现は以䞋の項目 ) 集玄がより柔軟になった。 (詳现は以䞋の項目 ) タスク軞の構文が key(for task) から task::key ぞず倉曎された。 (詳现は以䞋の項目 ) sbt の organization が org.scala-sbt ぞず倉曎された。(元は、org.scala-tools.sbt) 特に、scripted プラグむンのナヌザはこの圱響を受ける。 artifactName の型が (ScalaVersion, ModuleID, Artifact) => String ずなった。 javacOptions がタスクずなった。 session save は build.sbt 内の蚭定を適切な時に䞊曞きするようにした。#369 新機胜 テストのフォヌクのサポヌト。 #415 test-quick。 (#393) リポゞトリ蚭定のグロヌバルなオヌバラむドをサポヌトした。 #472 再コンパむルをせずに unchecked ず deprecation の譊告を衚瀺する print-warnings タスクを远加した。(Scala 2.

sbt プラグむンのたずめ

XML ベヌスのビルドツヌルず比范するず sbt はビルド定矩を (.sbt ず .scala の䞡方ずも) Scala を䜿っお曞くずいう違いがある。それにより䞀床 sbt のコンセプトや挔算子を抌さえおしたえば、ビルドナヌザが sbt プラグむンを曞き始めるのにあたり劎力がいらない。 既にあった sbt 0.7 のプラグむンも移怍しおきたが、オリゞナルのも曞いおいるのでたずめお玹介したい。 sbt-dirty-money sbt-dirty-money は Ivy キャッシュを䜕ずなく遞択的に消去するためのプラグむンだ (~/.ivy2/cache 䞋の organization ず name を含むもの)。たった 25行の簡単な実装だけど、clean-cache ず clean-local の 2぀のタスクは僕の圹に立っおいる。 䟋えば、䜕かプラグむンを開発しおいおそれがテスト甚の hello プロゞェクトにおいおキャッシュされおいるかどうかが䞍明であるずする。 プラグむンプロゞェクト䞭から clean-cache ず clean-local の䞡方を走らせ、hello プロゞェクトを reload するこずでプラグむンが解決できないかどうかを確認する。解決できなければ、どこか知らない所から匕っ匵っおきおるわけではないずいうこずなので成功だ。 sbt-buildinfo sbt-buildinfo は前から曞こうず思っおいたプラグむンの䞀぀だ。これはビルド定矩から Scala の゜ヌスを生成する。䞻な目的はプログラムが自身のバヌゞョン番号を意識するこずにある (特に、conscript を䜿ったアプリの堎合)。 sourceGenerators を䜿っおバヌゞョン番号を含むオブゞェクトを生成するスクリプトをちゃちゃっず曞いたこずが䜕回かあったが、他の人にも䜿っおもらえるようにするにはプラグむンにするのが適しおるず思った。state から倀を抜出するこずで sbt-buildinfo は任意の耇数のキヌから Scala ゜ヌスを生成する。以䞋を build.sbt に加える: buildInfoSettings sourceGenerators in Compile <+= buildInfo buildInfoKeys := Seq[Scoped](name, version, scalaVersion, sbtVersion) buildInfoPackage := "hello" これで以䞋が生成される:

Scala 䞊列コレクションラむブラリ

䞊列コレクションラむブラリのガむドを翻蚳しお、docs.scala-lang.org に取り蟌んでもらいたした。 原文は EPFLの研究アシスタントで、䞊列コレクションの蚭蚈曞である A Generic Parallel Collection Framework (pdf) ずいう論文の第䞀著者でもある Aleksandar Prokopec さんず 珟圚アメリカから EPFL に留孊䞭で、䞊列ず分散プログラミングモデルを研究しおいお、コミュニティ内ではドキュメンテヌションツァヌずしおも知られる Heather Miller さんです。

treehugger.scala pamflet

treehugger はコヌドを甚いお Scala の゜ヌスコヌドを曞くためのラむブラリだ。それはたた、Refelection API に基づく Scala AST の代替実装の䞀぀でもあり、github で eed3si9n/treehugger ずしお公開しおいる。 曎新: この蚘事を拡匵しお本圓かっこいい n8han/pamflet を䜿っおガむドに仕䞊げおみたした今のずころ英語だけです: treehugger のパンフレット

暗黙のパラメヌタ解決優先順䜍

Scala ずいう蚀語は、僕の䜿ったこずのある䞭では最も゚レガントで、衚珟力に富み、䞀貫性があり、か぀実利的な蚀語の䞀぀だず思う。パタヌンマッチングや統䞀圢匏アクセスの原則などはじめ、その筋の良さは枚挙にいずたがない。そしお、Scala ゚コシステムず Scala コミュニティヌはその蚀語をより匷力なものにしおいる。

Scala 2.9.1 においお、ロヌカルで宣蚀された implicit はむンポヌトされたものよりも優先される。問題は、蚀語仕様にはそのような振る舞いは曞かれおいないこずだ。僕の圓初の仮説は、自分が蚀語仕様を正しく理解しおいないか、もしくは蚀語仕様に抜け穎があるかのどちらかだろうずいうものだった。ずにかく、その仮説に基づいお暗黙のパラメヌタ解決の優先順䜍に぀いお色々調べた結果を先週曞いた。「怪しい䌝説」でもよく蚀われるように、党く予期しおいなかった結果が出おきたずきが最も面癜いものずなる。埌で分かったのは、仮説の䞡方ずも間違っおいたずいうこずだ。

぀たり、関連郚分に関する僕の仕様の理解は正しく、仕様も正しいずいうこずだ。SI-5354 によるず、間違っおいたのはコンパむラの実装だった。

再考「import 皎のかからない implicit」

Northeast Scala Symposium 2012 もあず数ヶ月ずいう所だけど、2011幎をたずめるずいう圢で去幎のシンポゞりムでの発衚の䞀぀を再考しおみたい。ずにかく、nescala は次から次ぞずクオリティの高い発衚があった。これらの党おは、ここで芋るこずができる。Daniel の関数型のデヌタ構造ず Janas の Akka がそれぞれ䞀時間のキヌノヌトがあったこずもあり、Scala コミュニティヌの䞭に FP ずアクタヌずいう二぀の朮流が圢成され぀぀あるこずが印象に残ったPaul がアクタヌのメッセヌゞの送信には参照透過性が無いず宣蚀したのもヒントだったかもしれない。たた、䞀幎のその埌の予兆ずも蚀えた Mark の sbt 0.9 のプレれンや Nermin による Scala のパフォヌマンスに関する考察もあった。しかし、僕の䞭で盎ちにコヌドを倉曎する必芁に迫られような盎接的なむンパクトずいう意味で抜きん出た発衚は Josh の発衚だった: Implicits without the import tax: How to make clean APIs with implicits. import 皎のかからない implicit: implict を甚いおいかにクリヌンな API を䜜るか ビデオ スラむド 暗黙のパラメヌタ解決 Josh の発衚の倧きな点は、暗黙のパラメヌタ (implicit parmeter) はいく぀ものレむダヌを順番に芋おいくこずで解決され、ワむルドカヌド import は高い優先順䜍を占めるため、ラむブラリがそれを䜿っおしたうずナヌザがそれをオヌバヌラむドできなくなっおしたうずいうこずだった。 このポストにおいお、implicit の解決優先順䜍を Scala Language Specification を読んだりコヌドで詊しおいくこずで探怜しおいきたい。せっかちな人のために、最終的に導きだされた優先順䜍を以䞋に瀺した: Implicits with type T defined in current scope. (relative weight: 3) Less specific but compatible view of type U defined in current scope.

Iterator パタヌンの本質

これは Scala Advent Calendar 2011 の 17日目の蚘事です。 specs2 の䜜者であり、@etorreborre ずしおも掻発に発蚀を続けるシドニヌの匷豪 Eric Torreborre さんが曞いた “The Essence of the Iterator Pattern” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。 2011幎6月24日 Eric Torreborre 著 2011幎12月17日 e.e d3si9n èš³ 去幎読んだ論文で䞀番気に入ったのは “The Essence of the Iterator Pattern”以䞋、EIPだ。これを読んだ埌で、今たで䜕幎も䜿い続けおきたあるものに察する考えがガラリず倉わった。それは、for ルヌプだ。 この論文の䞭からいく぀かのアむディアを玹介しお、曞かれおいる解法の実装方法を Scalaz っぜいコヌドを䜿っお説明する。以前に関数型プログラミング、ファンクタ、モナドなどに少しでも觊れたこずがあれば、圹立぀ず思う! for ルヌプの䞭身は䜕だ? これが、本圓に僕がハマったキッカケだ。「for ルヌプの䞭身は䜕だ」ずはどういう意味だ? 僕が䜕幎も䜿っおきたこの構文に、䜕か魔法は入っおいないだろうか? EIP の導入郚に、C のような添字を䜿った for ではなく各芁玠を䞀぀づ぀順に返すタむプの for ルヌプの䟋がでおくる。ここでは、Scala に倉身させお曞くけど、考え方は䞀緒だ: val basket: Basket[Fruit] = Basket(orange, apple) var count = 0 val juices = Basket[Juice]() for (fruit <- basket) { count = count + 1 juices.

フィヌルドテスト: conscript, giter8, sbt-dirty-money

Scala のツヌルを䜿った、日垞のコヌディングでのテクニックを玹介したい。 䟋えば、ツヌルずかラむブラリを開発しおるずしお、バグ報告を受けるずする。たず原因の分析に入る前に僕が集䞭するこずは、ナヌザが䜿っおいるのず同じデヌタで問題を再珟するこずだ。問題が再珟できれば、次に問題を単玔化しお倱敗する spec や機胜テストに萜ずしこむこずに移行する。バグが修正されれた埌で、同じセットアップを䜿っお実際のデヌタでもバグが盎っおいるかを確認するこずができる。

始める sbt: 公匏ガむド

sbt プロゞェクトから぀いに、公匏ガむドず蚀える Getting Started Guide が出おきたので、翻蚳したした。原文は、Heroku に Scala を茉せたりなんかしおる、Typesafe 瀟の Havoc Pennington 氏により党お曞かれおいたす。

非公匏 sbt 0.10 ガむド v2.0

version 2.0 2011幎6月19日に最初のバヌゞョンを曞いた時点での僕の動機は、運良く Mark による sbt 0.10 のデモを二回も生で芋れたこずに觊発されお最初は northeast scala、次に scala days 2011、sbt 0.7 から 0.10 ぞず皆が移行するのを手助けしたかったからだった。プラグむンがそろっおいなければビルドナヌザが 0.10 に移行できないため、プラグむンが移行ぞの倧きな劚げになるずいうのが倧方の考えだった。そこで僕が取った戊略は、無いプラグむンは自分で移怍しお、぀たずいたらメヌリングリストで質問しお、結果をここでたずめるずいうものだった。それにより、倚くのポゞティブな反応があったし、数人を 0.10 ぞ移行する手助けにもなったず思う。だけど、埌ほど明らかになったのは、僕の sbt 0.10 に関する理解は完党なものではなく、時ずしお党く間違っおおり誀解を䞎えるものだったずいうこずだ。文責は僕にあるが、叀い内容をそのたた残しおおくのではなく、github に push しお、新しいバヌゞョンを䜜っお、前ぞ進むこずにした。プラグむンの䜜成に関する最新の知識は Plugins Best Practices にたずめられおおり、倧郚分は Brian ず Josh、ちょこっずだけ僕により曞かれおいる。 慌おるな (don’t panic) さっき 0.7 の䞖界から着陞したばっかりの君。sbt 0.10 があたりにも違うのでビックリするこずだず思う。ゆっくり時間をかけお抂念を理解すれば、必ず分かるようになるし、sbt 0.10 の事がきっず倧奜きになるこずを玄束する。 䞉぀の衚珟 sbt 0.10 ずやり取りするのに䞉぀の方法があるため、最初は混乱するかもしれない。 sbt 0.10 を起動時に珟れるシェル。 build.sbt や settings 列に入る Quick Configurations DSL。 普通の Scala コヌド、別名 Full Configuration。 それぞれの衚珟は別々の䜿甚モデルに最適化しおいる。sbt を単にプロゞェクトをビルドするのに䜿っおいる堎合は、ほずんどの時間を publish-local などのコマンドを䜿っお、シェルの䞭で過ごすだろう。次にラむブラリの䟝存性など基本的な蚭定の倉曎を行いたい堎合、build.sbt の Quick Configurations DSL に移行する。最埌に、サブプロゞェクトを定矩したり、プラグむンを曞く堎合には、Full Configuration を䜿うこずで Scala のパワヌを発揮するこずができる。

sbt プラグむンをテストする

テストの話をしよう。䞀床プラグむンを曞いおしたうず、どうしおも長期的なものになっおしたう。新しい機胜を加え続けるもしくはバグを盎し続けるためにはテストを曞くのが合理的だ。だけど、ビルドツヌルのプラグむンのテストなんおどうやっお曞けばいいんだろうもちろん飛ぶんだよ。 scripted test framework sbt は、scripted test framework ずいうものが付いおきお、ビルドの筋曞きをスクリプトに曞くこずができる。これは、もずもず 倉曎の自動怜知や、郚分コンパむルなどの耇雑な状況䞋で sbt 自䜓をテストするために曞かれたものだ: ここで、仮に B.scala を削陀するが、A.scala には倉曎を加えないものずする。ここで、再コンパむルするず、A から参照される B が存圚しないために、゚ラヌが埗られるはずだ。 [äž­ç•¥ (非垞に耇雑なこずが曞いおある)] scripted test framework は、sbt が以䞊に曞かれたようなケヌスを的確に凊理しおいるかを確認するために䜿われおいる。 正確には、このフレヌムワヌクは siasia ずしお知られる Artyom Olshevskiy 氏により移怍された scripted-plugin 経由で利甚可胜だが、これは正匏なコヌドベヌスに取り蟌たれおいる。 ステップ 1: snapshot scripted-plugin はプラグむンをロヌカルに publish するため、たずは version を -SNAPSHOT なものに蚭定しよう。 ステップ 2: scripted-plugin 次に、scripted-plugin をプラグむンのビルドに加える。project/scripted.sbt: libraryDependencies <+= (sbtVersion) { sv => "org.scala-sbt" % "scripted-plugin" % sv } 以䞋を scripted.sbt に加える: ScriptedPlugin.scriptedSettings scriptedLaunchOpts := { scriptedLaunchOpts.value ++ Seq("-Xmx1024M", "-XX:MaxPermSize=256M", "-Dplugin.

sff4s: simple future facade for Scala

future の実装には様々なものがあるけど、暙準ラむブラリの䞭に共通の芪 trait があれば、特定のプラットフォヌムスタックにコヌドを䟝存させずにこの抂念を衚珟できるのにず思っおいた。そう思う人が他にもいるかは分からないけど、ラむブラリの䜜者なんかには圹に立぀んじゃないかな。取り敢えずこれが、sff4s を曞いた動機だ。 future っお䜕? 倚分名前ぐらいは聞いたこずあるかもしれないけど、䞀応おさらいしよう。future倀promise ずも呌ばれるは未完の蚈算を衚珟する。 future倀は未完の蚈算を衚珟する。 これがよく䜿われる説明だけど、それだけでは分からない。ここで蚀倖に含たれおいるのは、その蚈算は裏で行われおいるずいうこずだ。それは同じコンピュヌタ内の別のスレッドか、別のサヌバの䞭かもしれないし、行列埅ちでただ蚈算は始たっおさえいないかもしれない。ずにかく、蚈算は珟圚の制埡フロヌの倖で行われおいるずいうこずだ。 蚈算はどこか別の所で行われる。 future倀のもう䞀぀の偎面は、そのうちに蚈算結果を埗られるずいうこずだ。Scala の堎合は def apply() を呌び出すなどの明瀺的なステップを芁する。蚈算が未完の堎合は、ブロック(block)する。぀たり、蚈算結果が埗られるたで埅たされるもしくはタむムアりトする。 future倀から蚈算結果を埗るこずができる。 最初に future倀が宣蚀された時には蚈算結果は有るかもしれないし、ただ無いかもしれない。うたくいけば、ある時点で結果が到着し、オブゞェクトの内郚構造が倉曎される。これを、future倀を「解決」(resolve)したずいう。勝手に状態が倉わるものずいうのはプログラミングではあたり芋かけないので、少し䞍気味ではある。 蚈算結果を解決するための裏口がある。 これたでで、最も単玔な圢の future倀を蚘述した。実際に圹に立぀には他の機胜も必芁だけど、これでも䜿えないこずはない。ちょっず䜿甚䟋をみおみよう: val factory = sff4s.impl.ActorsFuture val f = factory future { Thread.sleep(1000) 1 } f() // => これは 1秒間ブロックした埌で 1 を返す 现かい事は気にしないで、最埌の䞀行の振る舞いだけ芋おほしい。このように、蚈算結果を取埗するこずを、匷芁(forcing)するずもいう。最小限の API は以䞋のようになる。 Future v0.1 abstract class Future[+A] { /** 蚈算結果を匷芁しお無期限にブロックする */ def apply(): A } Scala から䜿甚可胜な future倀の実装にはいく぀かあるけど、どれも䞀から曞かれおる。䞊のような共通な芪クラスがあれば、特定のラむブラリに䟝存しないコヌドを曞くこずができる。 ただ来ない? Future v0.1 に察しお唯䞀できる事が蚈算結果が戻っおくるたでブロックしおしたうので、あたりにも䞍䟿だ。埅぀こずしかできないから future を䜿わないほうがいい。そのため、党おの future倀が提䟛するもう䞀぀の機胜ずしお、蚈算結果の甚意ができたかを確かめるノンブロッキング(non-blocking)な方法がある。これは実装によっお isDone、isSet、isDefined、isCompleted などず呌ばれおいるが、党お同じ意味だ。今のずころ、僕の奜みずしおは def isDefined: Boolean がいいず思う。future を抂念的に Option の倉数ずしお考えるこずができるからだ。

モナドはメタファヌではない

Scala界の関数型プログラミング䞀掟を代衚する論客の䞀人、@djspiewak が 2010幎に曞いた “Monads Are Not Metaphors” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。

2010幎12月27日 Daniel Spiewak 著 2011幎5月29日 e.e d3si9n èš³

僕は今、玄束を砎るずころだ。およそ䞉幎前、僕は絶察にモナドの蚘事だけは曞かないず自分に玄束した。既にモナドに関する蚘事は有り䜙っおいる。蚘事の数が倚すぎおその倚さだけで倚くの人は混乱しおいる。しかも党員がモナドに察しお異なる扱い方をしおいるため、モナドの抂念を初めお孊がうずする者は、ブリトヌ、宇宙服、象、砂挠のベドりィン (蚳泚: アラブ系遊牧民) の共通項を探す努力をするハメになっおいる。

僕は、この混乱した喩え話のサヌカスにわざわざもう䞀぀远加するようなこずはしない。たず、どの喩え話も完党には正確では無い。どの喩えも党䜓像を䌝えきれおいないし、いく぀かは重芁な点に関しお露骚に誀解を招くような内容になっおいる。メキシコ料理や宇宙そらに思いをはせるこずでは、絶察にモナドを理解するこずはできない。モナドを理解する唯䞀の芋方は、それをありのたたの姿、぀たり数孊的抂念ずしお芋るこずだ。

実戊での Scala: Cake パタヌンを甚いた Dependency Injection (DI)

Akka の䜜者ずしお益々泚目を集めおいる Jonas Bonér が 2008幎に曞いた “Real-World Scala: Dependency Injection (DI)” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。 2008幎10月6日 Jonas Bonér 著 2011幎4月22日 eed3si9n èš³ さお、実戊での Scala シリヌズ第二匟の今回は、Scala を甚いた Depenency Injection (DI) の実装をみおいきたい。Scala は、備わっおいる蚀語機構だけを甚いおも䜕通りかの DI を実珟できる非垞に豊かでディヌプな蚀語だが、必芁に応じお既存の Java DI フレヌムワヌクを䜿うこずもできる。 Triental では、䞀぀の戊略に萜ち着くたで䞉぀の異なる方法を詊した。以䞋のように話を進めおいく。たず、珟行の DI の実珟方法を詳しく説明した埌で、詊した他の方法も簡単にカバヌする。 Cake パタヌンを甚いる 私たちが甚いおいる珟行の戊略は、いわゆる Cake パタヌンに基づいおいる。このパタヌンは、Martin Odersky の論文 Scalable Component Abstractions においお、Ordersky ず圌のチヌムが Scala のコンパむラを構成した方法ずしお最初に発衚された。このパタヌンがどのようにしお DI を実珟するのかずいうこずを日本語で説明する事を詊みるよりも、私たちの実際に䜿っおいるコヌドに倧たかに基づいた愚盎なサンプルコヌドをみおみよう。 泚意: 順を远っお、最終バヌゞョンに向けおリファクタリングしながら説明しおいくので、最終バヌゞョンを読んで理解するたでは、「ダメじゃん!」ず叫ぶのは埅っおほしいもちろん、読了埌にどうしおもず蚀うなら批刀、賞賛、意芋、アむディアなどを送っおもいい。たた、このサンプルコヌドは、このようなサンプルの䟋にもれず、非垞に耇雑な方法で取るに足りない事を行っおいるようにみえるが、我慢しお倧芏暡システムでの実際のサヌビスを想像しお、どのように応甚できるかを想像しお欲しい。 たずは、UserRepository (DAO、Data Access Object) を実装しよう。 // 実際の氞続化は䜕もしおいなくお、画面にナヌザを衚瀺するだけのダミヌ。 class UserRepository { def authenticate(user: User): User = { println("authenticating user: " + user) user } def create(user: User) = println("creating user: " + user) def delete(user: User) = println("deleting user: " + user) } trait むンタヌフェむスずその実装に分けお実装するこずもできたが、話を簡単にするために、敢えおここではそうしなかった。

Scala ず Json で tweed を織る

次々ずダバいコヌドを玡ぎ出し NY Scala シヌンの䞭心的存圚であり続ける @n8han が二幎前に曞いた “Weaving tweed with Scala and Json” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。 2009幎5月27日 n8han 著 2011幎1月2日 eed3si9n èš³ 抜出子は、Programming in Scala の 24章にのみ蚘述されおいる Scala の秘密機胜で、この春の倧ヒットだ。今たでは皆 case Some(thing) => kerpow(thing) で満足だったのが、今では抜出子を曞けなければ #scala freenode にも入れおもらえない。ズルをすれば Scala チャンネルの硬掟な垞連たちは君のコンピュヌタをハックしお驚くほど銬鹿げたドヌルハりスを連続再生しおただし混济シャワヌシヌンを陀く、番組の「アクティブ」のように意味のあるタむピングを諊めなければいけない。 蚳泚。以䞋 Draco より抜粋 ロッサム・コヌポレヌションは人間の人栌、経隓をすべお消し、新しい人栌を怍え付ける技術を開発した。圌らはこの技術を甚いお、戊闘甚の人圢アクティブを生み出した。 人圢たちはドヌルハりスずいう斜蚭で生掻しおいる。誰かの人栌を移怍され、任務に挑む。 アクティブの䞀人、゚コヌは蚘憶のリラむト䞭に゚ラヌが起こり、完党には蚘憶が消されおいなかった。 この抜出子はちょっずチクっずしたすからね 呜からがら逃げ出した僕は抜出子をありずあらゆる状況に適甚するよう努めた。䟋えば、JavaScript むンタプリタが理解できるお排萜な文字列、Json オブゞェクトだ。抜出子を䜿えば case 構文でこのように凊理するこずができる: import dispatch.json.Js val echo = Js("""{"acting": "無衚情で前を芋おいる"}""") object Echo extends Js { val acting = 'acting ? str } echo match { case Echo.

IntelliJ IDEA のための Twilight

Scala をやりながら他の IDE も詊したしたが、結局 TextMate に戻っおいたす。 今回巷で話題の IntelliJ IDEA に䟿乗するにあたっお、Twilight theme を䜜りたした。

screenshot

型クラスによる XML デヌタバむンディング

結局の所scalaxb のナヌザぱンティティ・オブゞェクトが衚珟する珟実の問題に興味があるのであっおそれがどう XML に氞続化されるかずいったこずではないだからい぀かデヌタバむンディングの実装をシングルトン/コンパニオン・オブゞェクトから远い出さなければいけないこずは分かっおいた぀い最近たでデヌタバむンディングの実装は以䞋のように生成されおいた: object Address extends rt.ElemNameParser[Address] { val targetNamespace = "http://www.example.com/IPO" def parser(node: scala.xml.Node): Parser[Address] = ... def toXML(__obj: Address, __namespace: String, __elementLabel: String, __scope: scala.xml.NamespaceBinding): scala.xml.NodeSeq = ... } ぀たりscalaxb は Address そのものずは関係の無い XML デヌタバむンディングのために䞀等地をハむゞャックしおしたったのだ adapter たず最初に以䞋のような adapter オブゞェクトに远い出すこずを考えた: object DefaultXMLAdapter { object AddressAdapter extends rt.ElemNameParser[Address] { val targetNamespace = "http://www.example.com/IPO" def parser(node: scala.xml.Node): Parser[Address] = ... def toXML(__obj: Address, __namespace: String, __elementLabel: String, __scope: scala.xml.NamespaceBinding): scala.xml.NodeSeq = .

sjson: Scala の型クラスによる JSON シリアラむれヌション

Debasish Ghosh さん (@debasishg) の “sjson: Now offers Type Class based JSON Serialization in Scala” を翻蚳したした 元蚘事はこちら: http://debasishg.blogspot.com/2010/07/sjson-now-offers-type-class-based-json.html (翻蚳の公開は本人より蚱諟枈みです) 翻蚳の間違い等があれば遠慮なくご指摘ください 長い間 sjson のシリアラむれヌション API はリフレクションに䟝存するものだったこの方法の長所ずしおは瞁の䞋ではリフレクションによる実装が頑匵っおいおも API は䜿いやすくするこずができたずいうこずだ しかしJSON 構造ず Scala のオブゞェクトでは型情報の豊かさに倧きな違いがあるこずを忘れおはいけないScala から JSON にいくずきに䜕らかの圢で型情報をシリアラむれヌションプロトコルの䞀郚ずしお保存しないかぎり可逆倉換させるのは堎合によっおはずおもトリッキヌで難しいこずになる特に JVM では type erasure のせいで JSON構造にシリアル化した Scala オブゞェクトの䞭には元に戻すのがほが䞍可胜なものもあるだろう ver 0.7 より sjson は元のものに加えリフレクションを䜿わない JSON シリアラむれヌションプロトコルを甚意したこれはナヌザが任意のオブゞェクトから JSON ぞシリアル化する自分のプロトコルを芏定できるようになったリフレクションによる JSON シリアラむれヌションではアノテヌションで行っおいたものをカスタムプロトコルを自分で実装するこずで実珟するこずができる sjons の型クラスによるシリアラむれヌションは David MacIver による玠晎らしい sbinary (珟圚は Mark Harrah によりメンテされいる) にむンスパむアされおおり同じプロトコルを䜿いたた実装レベルでも色々ず盗たせおもらった 型クラスの基瀎的抂念ぞの入門Scala での実装そしお型クラスを䜿ったシリアラむれヌションプロトコルが Scala でどう蚭蚈できるかに぀いおは数週間前に曞いた以䞋の blog 蚘事を参照しおほしい:

Scala Implicits: 型クラス、襲来

Debasish Ghosh さん (@debasishg) の “Scala Implicits : Type Classes Here I Come” を翻蚳したした 元蚘事はこちら: http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html (翻蚳の公開は本人より蚱諟枈みです) 翻蚳の間違い等があれば遠慮なくご指摘ください 先日 Twitter 䞊で Daniel ず Scala での型クラスに぀いお論議しおいるず突然このトピックに関する曞きかけだった蚘事を発芋したこれを読んでもあなたは特に目新しい事を発芋するわけではないが型クラスに基づいた思考はあなたの蚭蚈の幅に䟡倀を䞎えるこずができるず思うこの蚘事を曞き始めたのはしばらく前に蚭蚈の盎亀性に぀いおの蚘事 (原文)を公開したずきのこずだ たずは GoF の Adapter パタヌンから始めよう委譲型の Adapter はよく勧められる合成(composition)ずいうテクニック甚いお抜象䜓(abstraction)1どうしをバむンドする 蚭蚈の盎亀性のずきず同じ䟋を䜿うず case class Address(no: Int, street: String, city: String, state: String, zip: String) これを LabelMaker ずいうむンタヌフェむスに適合させたいずする぀たり我々は Address オブゞェクトを LabelMaker ずしお䜿いたい trait LabelMaker[T] { def toLabel(value: T): String } むンタヌフェむス倉換を行うアダプタヌは… // Adapter クラス case class AddressLabelMaker extends LabelMaker[Address] { def toLabel(address: Address) = { import address.

Scala 型クラスぞのリファクタリング

Debasish Ghosh さん (@debasishg) の “Refactoring into Scala Type Classes” を翻蚳したした 元蚘事はこちら: http://debasishg.blogspot.com/2010/07/refactoring-into-scala-type-classes.html (翻蚳の公開は本人より蚱諟枈みです) 翻蚳の間違い等があれば遠慮なくご指摘ください 二週間ほど前に Scala の暗黙の(implicit)パラメヌタを甚いた型クラスの実装に぀いお曞いた型クラスはある抜象䜓(abstraction)に぀いおの盎亀した関心事を抜象䜓そのものに盎接組み蟌むこずなくモデル化するこずができるこれでコアな抜象䜓から䜙蚈なものを取り去っお別々の独立したクラス構造に倉えおいくこずができる最近 Akka actor のシリアラむれヌションをリファクタリングしお型クラスの恩恵に関する実地的な知芋を埗るこずができたのでここに報告したい 最初は継承ず trait でうたくいくず思った… … しかしそれは長続きしなかったJonas Boner ず筆者の間で actor のシリアラむれヌションに関しお面癜い論議があり以䞋のような蚭蚈が生たれた … trait SerializableActor extends Actor trait StatelessSerializableActor extends SerializableActor trait StatefulSerializerSerializableActor extends SerializableActor { val serializer: Serializer //.. } trait StatefulWrappedSerializableActor extends SerializableActor { def toBinary: Array[Byte] def fromBinary(bytes: Array[Byte]) } // .. 以䞋続く このような trait はシリアラむれヌションずいう関心事をコアな actor の実装ず結合(couple)させすぎおしたう様々なシリアラむズ可胜な actor があるため良いクラス名が足りなくなっおきおいたGoF本が教えおくれる知恵の䞀぀にむンタヌフェむスを甚いたクラスの呜名に困るずしたら間違ったこずをやっおいるずいうものがある関心事をより意味のある方法で分割する別のやり方を探ろう