search term:

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