search term:

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 に倉換しなおしたずきにオブゞェクトのグラフごずむンスタンス化する必芁があっお、それも非効率だし、望たしくない状況が倚いず思う。

デヌタが関数倀などを保持しおいるずさらに厄介なこずになっおくる。

registry and reference パタヌン

この察策ずしお考えおいるものを僕は registry and reference パタヌンず呌んでいる。基本的な考えずしおは、予め 3人のナヌザを registry (登蚘所) に登録しお、JSON は以䞋のような内容で䌝達する:

["Alice", "Bob", "Charles"]

ググっおみるず Martin Fowler 先生も Registry パタヌンず呌んでいるみたいだ。圌のモデルだず Registry は以䞋の 2぀のメ゜ッドを含む:

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) の蚭定が必芁なこずだ。

あずは䟋にならっおベンチマヌクを定矩しおいくだけだ。僕は Jawn の真䌌をしお abstract class にしおみた。

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

そういう圱響もあっお、HList ずか Shapeless の LabelledGeneric みたいなのがあれば JSON object を衚す䞭間倀ずしおいいのではないかず思っおいたので、Daniel のトヌクには最埌に背䞭を抌しおもらった気がする。

本皿では、HList の目的を特化した LList ずいうものを玹介する。

LList

sjson-new には LList ずいうデヌタ型があっお、これは labelled heterogeneous list、ラベル付された倚型リストだ。 暙準ラむブラリに぀いおくる List[A] は、A ずいう同じ型しか栌玍するこずができない。暙準の List[A] ず違っお、LList はセルごずに異なる型の倀を栌玍でき、たたラベルも栌玍するこずができる。このため、LList はそれぞれ独自の型を持぀。REPL で芋おみよう:

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. Writing a library: working with JSON data)。これは JSON デヌタが JValue ず呌ばれる代数的デヌタ型によっお蚘述できるこずを解説した:

data JValue = JString String | JNumber Double | JBool Bool | JNull | JObject [(String, JValue)] | JArray [JValue] deriving (Eq, Ord, Show)

この考え方は僕たちの゚コシステムに倧きな圱響を䞎えた。

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 ベヌスだ。

sbt-archetype

sbt-archetype は Jim Powers が提案するコンセプトで、sbt に Activator みたいに new コマンドを付けるずいうものだ。templateResolvers セッティングみたいなバック゚ンド機構を぀けお、テンプレヌトの゜ヌスは蚭定で Activator Template、Github、private repository など倉えれるようにしたい。

ラむフスタむルずしおの 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幎にもこんなこずを蚀っおいる:

非import の implicit や lubbing は #scala の圹に立぀ものだろうか? Map から List[Tuple2]、Int から Double、 Foo ず Bar から 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.color

環境倉数

zshrc.osx ず zshrc.linux のそれぞれに Java 6、7、8甚の環境倉数を定矩する。たずは Mac:

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぀のものが必芁になる:

  1. 䞎えられた型 Person の pickler コンビネヌタ
  2. 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).pickle
pkl: pickling.json.pickleFormat.PickleType =
JSONPickle({
  "$type": "Person",
  "name": "foo",
  "age": 20
})

scala> val person = pkl.unpickle[Person]
person: Person = Person(foo,20)

この Defaults モヌドは、プリミティブ pickler 矀から Pickler[Person] をコンパむル時に自動的に導出する! コヌドが静的に生成されるため、文字列の操䜜などもむンラむン化しお高速化しおいる。(同じくスキヌマを䜿わない Java serialization や Kryo に比べおも速い)

モナドはフラクタルだ

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 を参照:

$ brew install zsh
$ chsh -s /usr/local/bin/zsh

蚭定に関しおは、zshrc は他の zshrc.* の読み蟌みだけを行っおいる:

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.OneOrTraverse.map は "better" を期埅しおいるけども、map の実装は意図せずに Traverse のデフォルトむンスタンスによっお乗っ取られおしたった。

@xuwei_k氏は抜象メ゜ッドのオヌバヌラむド時に override 修食子を付けるか吊かの先行研究があるか聞いおいるので、考えおみよう。Scala は型クラスのむンスタンス定矩を項の空間ず統合 (芋方によっおはコンプレクト) しお、順序は継承関係によっお指定されるので、関数型プログラミングずいうよりはモゞュラヌプログラミングの話になる。Mixin 順序党般に関するトピックはクラス線圢化 (class linearization) ず呌ばれる。本皿で取り䞊げる内容はだいたいコップ本第二版にも曞いおあるこずだず思う。

クラス線圢化の補題

@xuwei_k氏の override のゞレンマは以䞋の補題ずしお蚀い換える事ができる:

  • trait OneOrFunctor ず Traverse があるずき、Traverse が OneOrFunctor の埌にくるようなクラス線圢化を犁止するこずができるか?

abstract override

普通の trait はむンタヌフェむスのような圹割をするのに察しお、Scala は stackable traits を提䟛しお、これはクラスの振る舞いを倉曎する。trait を stackable にするには、たずクラスか trait から継承しお、メ゜ッドに abstract override ずいう修食子を付ける。この修食子の目的は、メ゜ッド本文内から super ぞのアクセスを可胜ずするこずだ。trait の super は動的に束瞛されるため、通垞はアクセスするこずができない。

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.5 秒間かかる。メ゜ッドが実行しおいる間は戻っおくるたで制埡はブロックされる。次に println("testing...") が呌ばれるずいった具合だ。このような順序の入れ替えを䌎わず、たたオヌバヌラップを䌎わない実行は盎列実行 (serial execution) ず呌ばれる。

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.Ops(x) > y

(実はこれは埮劙に間違っおいる。foo4 ぞの展開は実行時に infixOrderingOps が呌ばれるたでは行われないが、これから説明するこずの芁点ずなる。)

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 によっお構成される。

第䞀次元

䟿宜的に ScopedKey[T] は、珟圚のプロゞェクトなどのデフォルトのコンテキストにスコヌプ付けされた SettingKey[T] や TaskKey[T] だず考えるこずができる。するず残るのは Initialize[T] だけで、これは䟝存キヌの列ず䜕らか方法で T ぞず評䟡される胜力を持っおいる。Initialized[T] に盎接䜜甚するのはキヌに実装されおいる <<= 挔算子だ。Structure.scala 参照:

sealed trait DefinableSetting[T] {
  final def <<= (app: Initialize[T]): Setting[T] = 
    macro std.TaskMacro.settingAssignPosition[T]
  ...
}

名前から掚枬しお、このマクロは pos を代入しおいるのだず思う。sbt 0.12 においおはキヌのタプルにモンキヌパッチされた apply や map メ゜ッドによっお Initialize[T] が構築された。sbt 0.13 ではスマヌトな := 挔算子を䜿うこずができる。Structure.scala 参照:

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

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.Output になった。

新機胜

  • boot.properties 内のレポゞトリをデフォルトのプロゞェクトの resolver ずしお甚いる。boot.properties 内のレポゞトリに bootOnly ず曞くこずでデフォルトでプロゞェクトに䜿甚されないようにするこずができる。 (Josh S., #608)
  • .sbt ファむル内で val や def を曞けるようにした。詳现は埌ほど。
  • .sbt ファむル内でプロゞェクトを定矩できるようにした。Project 型の val をビルドに远加するこずになる。詳现は埌ほど。
  • セッティング、タスク、およびむンプット・タスクの新構文。詳现は埌ほど。
  • autoAPIMappings := true ずするこずで、䟝存ラむブラリの倖郚 API scaladoc に自動的にリンクするようにした。これは Scala 2.10.1 を必芁ずし、apiURL を䜿っお䟝存ラむブラリの scaladoc の堎所を指定する必芁がある。apiMappings タスクを䜿っお手動でマッピングを提䟛するこずもできる。
  • スむッチコマンドを䜿っお䞀時的に Scala ホヌムディレクトリを蚭定できるようにした: ++ scala-version=/path/to/scala/home。 だたし、scala-version の郚分は省略可胜だが、マネヌゞ䟝存性の解決に甚いられる。
  • ~/.m2/repository に公開するための publishM2 コマンドを远加した。(#485)
  • ルヌトプロゞェクトが定矩されおいない堎合は、党おのプロゞェクトを集玄するデフォルトのルヌトプロゞェクトを甚いる。(#697)
  • 耇数のプロゞェクトやコンフィギュレヌションからタスクやセッティングを取埗するための新しい API を远加した。Getting values from multiple scopes参照。
  • テストフレヌムワヌクの機胜をより良くサポヌトするためにテストむンタヌフェむスを改善した。詳现は
  • export コマンド
    • タスクの堎合は、export ストリヌムの内容を衚瀺する。慣䟋ずしおは、タスクず等䟡のコマンドラむンを衚瀺する。䟋えば、compile、doc、console はそれらを実行する近䌌的なコマンドラむンを衚瀺する。
    • セッティングの堎合は、ロガヌを経由せずにセッティングの倀を盎接衚瀺する。

バグ修正

  • 䟝存ラむブラリの衝突を譊告しないようにした。代わりに conflict manager を蚭定する。(#709)
  • フォヌクされたテストを実行するずきに Cleanup ず Setup を実行するようにした。別の JVM で実行されるため、クラスロヌダは䜿うこずができない。

改善点

  • API 抜出フェヌズを、typer フェヌズではなく picker フェヌズの埌で実行するこずで typer の埌にコンパむラプラグむンを眮けるようにした。(Adriaan M., #609)
  • セッティングの゜ヌス内における䜍眮を蚘録するようにした。inspect は定矩された倀に関わる党おのセッティングの䜍眮を衚瀺する。
  • Build.rootProject 内にルヌトプロゞェクトを明瀺的に指定できるようにした。
  • キャッシュ情報を保存するためのディレクトリが必芁なタスクは stream の cacheDirectory を䜿えるようになった。これは cacheDirectory セッティングに取っお代わる。
  • フォヌクされた run や test によっお䜿われる環境倉数が envVars によっお蚭定できるようになった。これは Task[Map[String,String]] だ。(#665)
  • コンパむルに倱敗した堎合にクラスファむルを埩旧するようにした。これぱラヌがむンクリメンタルコンピレヌションの埌ろの方の過皋で発生しおいるが修正するには元の倉曎されたファむルを盎す必芁がある堎合に圹に立぀。
  • デフォルトプロゞェクトの自動生成ID を改善した。(#554)
  • scala コマンドによる䜙蚈なクラスロヌダを回避するためにフォヌクされた run は java コマンドを䜿うようにした。(#702)
  • autoCompilerPlugins が内郚䟝存プロゞェクト内で定矩されたコンパむラプラグむンを䜿えるようにした。ただし、プラグむンのプロゞェクトは exportJars := true を定矩する必芁がある。プラグむンに䟝存するには ...dependsOn(... % Configurations.CompilerPlugin) ず曞く。
  • 非プラむベヌトなテンプレヌトの芪クラスを远跡するこずで、むンクリメンタルコンピレヌション時により少なく小さい䞭間ステップを必芁ずするようにした。
  • むンクリメンタルコンパむラによっお抜出された API の内郚構造をデバッグするためのナヌティリティを远加した。(Grzegorz K., #677, #793)
  • consoleProject はセッティングの倀の取埗ずタスクの実行を統合した構文を提䟛する。Console Project 参照。

その他

  • Eclipse ナヌザの䟿宜のために sbt プロゞェクト自䜓の゜ヌスのレむアりトをパッケヌゞ名に沿ったものに倉曎した。(Grzegorz K., #613)

倧きな倉曎点の詳现

キャメルケヌスのキヌ名

これたでのキヌ名の曞き方は、Scala の識別子はキャメルケヌスで、コマンドラむンではハむフンで぀なげた小文字ずいう慣甚だったが、これからは䞡方ずもキャメルケヌスに統䞀する。既存のハむフン付けされたキヌ名に察しおもキャメルケヌスを䜿うこずができ、たた既にあるタスクやセッティングに察しおは継続しおハむフン付けされた圢匏も受け付ける。しかし、タブ補完はキャメルケヌスのみを衚瀺するようになる。

シンプルさの必芁性

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 だず曞くこずで最初に参照されるたで初期化を遅延するこずができる。