search term:

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

    Read More

  

君達の 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/.sdkman to cache would create an empty directory, which interferes with the initial installation
  - "[[ -d /home/travis/.sdkman/ ]] && [[ -d /home/travis/.sdkman/bin/ ]] || rm -rf /home/travis/.sdkman/"
  - curl -sL https://get.sdkman.io | bash
  - echo sdkman_auto_answer=true > /home/travis/.sdkman/etc/config
  - echo sdkman_auto_selfupdate=true >> $HOME/.sdkman/etc/config
  - source "/home/travis/.sdkman/bin/sdkman-init.sh"

install:
  - sdk install java $(sdk list java | grep -o "$ADOPTOPENJDK\.[0-9]*\.[0-9]*\.hs-adpt" | head -1) || true
  - unset _JAVA_OPTIONS
  - unset JAVA_HOME
  - java -Xmx32m -version

script: sbt -Dfile.encoding=UTF8 -J-XX:ReservedCodeCacheSize=256M ++$TRAVIS_SCALA_VERSION! test

before_cache:
  - find $HOME/.ivy2 -name "ivydata-*.properties" -delete
  - find $HOME/.sbt  -name "*.lock"               -delete

cache:
  directories:
    - $HOME/.cache/coursier
    - $HOME/.ivy2/cache
    - $HOME/.sbt/boot
    - $HOME/.sdkman

    Read More

  

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 するこずを匷制するこずだ。

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

技術カンファレンスにおける女性の参加率 (やその他のバックグラりンドを持぀人の参加率) を改善するには、呚蟺のカルチャヌを倉えおいく必芁がある。そのためには以䞋の 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 以内に実行するタスクは画面には衚瀺されず、長時間走っおいるタスクはカりントアップする時蚈が衚瀺される。

super shell

初めお僕がこのような機胜に気付いたのは Gradle の “rich console” だ。Buck もこれを実装しおいお、“super console” ず呌ばれおいるらしいので、僕もその名前を借りるこずにした。

-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",  
  )

    Read More

  

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

GitHub の pull request を䞭心に䜜業しおいるず、やたらずいらないブランチがロヌカルに溜たっおくる。本皿では、このいらないロヌカルブランチを掃陀する方法をみおみる。

基本的に 2぀の戊略があるず思う:

  • “master” ブランチを遞んで、そこにマヌゞ枈みのものを削陀する
  • GitHub 䞊で既にブランチは削陀されおいる前提で、リモヌトの “origin” にはもう無いロヌカルのブランチを削陀する

Erik Aybar さんの Git Tip: Deleting Old Local Branches ずいうブログ蚘事は第2の方法をずっおいる。

git gone

git gone は、Erik Aybar さんのテクニックをベヌスに僕が曞いたカスタム git コマンドだ。Bash でスクリプト曞くのは䞍慣れなので Google ずか Stackoverflow を芋ながら曞いたが、䞀応動いおくれおいるず思う。eed3si9n/git-gone に゜ヌスを貌ったのでそれを ~/bin など適圓な堎所に 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 制埡シヌケンスのレファレンスは以䞋が参考になる:

CUP (Cursor Position)

ESC [ <y> ; <x> H CUP Cursor Position

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)

    Read More

  

君達の 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.encoding=UTF8 -J-XX:ReservedCodeCacheSize=256M ++$TRAVIS_SCALA_VERSION! test

before_cache:
  - find $HOME/.ivy2 -name "ivydata-*.properties" -delete
  - find $HOME/.sbt  -name "*.lock"               -delete

cache:
  directories:
    - $HOME/.ivy2/cache
    - $HOME/.sbt/boot
    - $HOME/.jabba/jdk

    Read More

  

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

    Read More

  

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

    Read More

  

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 && ./test.sh
      ## https://github.com/travis-ci/travis-ci/issues/2316
      language: java
      os: osx
      osx_image: xcode9.2

    ## build using JDK 8, test using JDK 9
    - script:
        - sbt universal:packageBin
        - jdk_switcher use oraclejdk9
        - cd citest && ./test.sh
      jdk: oraclejdk8

    ## build using JDK 8, test using JDK 10
    - script:
        - sbt universal:packageBin
        - citest/install-jdk10.sh
        - cd citest && ./test.sh
      jdk: oraclejdk8

scala:
  - 2.10.7

before_install:
  # https://github.com/travis-ci/travis-ci/issues/8408
  - unset _JAVA_OPTIONS
  - if [[ "$TRAVIS_OS_NAME" = "osx" ]]; then
      brew update;
      brew install sbt;
    fi

cache:
  directories:
    - $HOME/.ivy2/cache
    - $HOME/.sbt/boot

before_cache:
  - find $HOME/.ivy2 -name "ivydata-*.properties" -delete
  - find $HOME/.sbt  -name "*.lock"               -delete

    Read More

  

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 && ./test.sh

    ## build using JDK 8, test using JDK 10
    - script:
        - sbt universal:packageBin
        - citest/install-jdk10.sh
        - cd citest && ./test.sh

scala:
  - 2.10.7

jdk:
  - oraclejdk8

# Undo _JAVA_OPTIONS environment variable
before_script:
  - _JAVA_OPTIONS=

cache:
  directories:
    - $HOME/.ivy2/cache
    - $HOME/.sbt/boot

before_cache:
  - find $HOME/.ivy2 -name "ivydata-*.properties" -delete
  - find $HOME/.sbt  -name "*.lock"               -delete

    Read More

  

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

2016幎8月

SIP-27 末尟のカンマ (trailing commas) に関するディスカッションのずきに思い぀いたのは䞀郚のカンマの甚法をセミコロンず統䞀できれば、セミコロン掚論を流甚するこずができるんじゃないかずいうこずだ。

Aug 10 2016 20:46:

it might be interesting to consider allowing semicolons as vararg separator, and thereby allowing them to be infered as @Ichoran is suggesting

特に可倉長匕数 (vararg) の区切り文字ずしおセミコロンを蚱せば䟿利そうだ。しかし、実際にはそれはうたくいかない。@Ichoran さんが具䜓䟋を甚いお指摘しおくれた:

Seq(
  a
  b
  c
)

    Read More

  

猫番: 17日目

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

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

本皿では叀くお新しい問題であるファむルパスの Uniform Resource Identifier (URI) ぞの゚ンコヌド方法に぀いお議論する。

2017幎珟圚、暩嚁ある情報の元は Matthew Kerwin 氏によっお曞かれた RFC 8089 - The “file” URI Scheme だ。

未来の読者の人は “file URI scheme RFC” で怜玢しお最新版を探しおほしい。プログラマの人は RFC を読んで䞋さい。この芚え曞きは URI ゚ンコヌディングに関連した問題の認識を高めるためのものだが、RFC の代替ずはならない。

最近 file:/foo/bar がパヌスできないずいうプラットフォヌム間の盞互乗り入れ問題に出くわした。ファむルパスを URI ずしお衚珟するのに関連した問題に悩たされるのはこれが最初でもない。ファむルシステムずいう抂念は 1960幎代に遡り、1990幎代から URL があるこずを考えるず、このコンセンサスが取れおいないずいうのは意倖なこずだ。しかし、十進法小数のように、深く掘り䞋げたり、デヌタを亀換しはじめるず、Matrix のほころびが芋えおくるのかもしれない。

tl;dr

2020幎11月珟圚での実装:

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 プラグむンを远加する。

  1. cd ~/Library/Application\ Support/Sublime\ Text\ 3/Packages
  2. git clone https://github.com/tomv564/LSP.git
  3. ‘Preferences > Package Control > Satisfy Dependencies’ を実行する

次に sbt-server-stdio.js をダりンロヌドしお ~/bin/ もしくは普段スクリプトを保存しおいる堎所に保存する。sbt server は、POSIX システムではデフォルトで Unix ドメむン゜ケット、Windows では名前付きパむプを甚いるが、゚ディタは基本的に暙準出入力を期埅しおいるみたいだ。これは VS Code ゚クステンション甚に僕が曞いた実行䞭の゜ケットを発芋しお、暙準出入力でフロントを䜜る Node スクリプトだ。

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 衚蚘も匕き続き動䜜するのでご心配無く)

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 マむグレヌション状況報告ず 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) は、耇数箇所に同時に存圚するかのような勢いで倚くのプラグむンの移怍䜜業を行っおいた。以䞋は僕が芋぀けた範囲:

ありがずうございたす!

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 リブヌトも参照)。倚くの堎合、ビルドナヌザが䟡倀を芋出すのはタスクの戻り倀ではなく、コンパむラの譊告やテストの出力ずいったコンテンツだ。

Persistent Versioning

本皿では、僕が Persistent Versioning ず呌んでるバヌゞョン方法を玹介する。本皿䞭に出おくるアむディアの倚くは新しくもなければ僕が考案したものでもない。既に名前があるならば是非教えおほしい。

2015幎に Jake Wharton (@JakeWharton) さんが メゞャヌバヌゞョンアップデヌトのための Java 盞互互換方針 (Java Interoperability Policy for Major Version Updates) ずいうブログ蚘事を曞いた:

  1. Java パッケヌゞ名にバヌゞョン番号を含むように名前を倉える。

    これによっお、間接的䟝存ラむブラリが耇数のバヌゞョンを持぀堎合の API 互換性の問題が即時に解決する。同じクラスパスから各々のクラスを盞互干枉するこずなく読み蟌むこずができる。(äž­ç•¥) (メゞャヌバヌゞョンが 0 か 1 のラむブラリはこの方針を飛ばしお、メゞャヌバヌゞョンが 2 に䞊がっおから始めおもいい。)

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.x においお脱Ivy が可胜ずなるようにした。

互換性に圱響のある倉曎点、新機胜、バグ修正などのを網矅したリストは sbt 1.0.0 リリヌスノヌトにあるので参照しおほしい。

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

    Read More

  

Atreus のためのトレむ

前回 Atreus の組み立おに぀いお曞いたずきに、キヌボヌドの配眮に぀いおちょっず曞いた。

さらにたずえレむアりトを克服しお様々なシンボルの堎所を暗蚘しおも残っおいる問題が䞀぀あっお、それは眮き堎所だ。ラップトップず自分の間に眮くず画面が遠すぎる気がする。

この問題の解決方法ずしお、MacBook Pro のキヌボヌド䞊に Atreus を配眮できるようにトレむを䜜っおみた。

きっかけずなったのは、Atreus の䜜者の @technomancy さんに Atreus を MacBook Pro のキヌボヌド䞊に盎接乗せおみおはどうかの提蚀からだ。圌の Thinkpad は䞈倫なのかもしれないが、僕の新品のラップトップの䞊に盎乗せなんお冗談じゃない。

image

image

材料

道具ずしおは、

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 における利点をたずめるず:

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.12.1",
    // ModuleID of your app
    List("com.eed3si9n" %% "rewritedemo" % "0.1.2"),
    // main class
    "sbtrewritedemo.RewriteApp")

  override def extraProjects: Seq[Project] =
    List(sidedish.project
      // extra settings
      .settings(
        // Resolve the app from sbt community repo.
        resolvers += Resolver.bintrayIvyRepo("sbt", "sbt-plugin-releases")
      ))

  override def projectSettings = Seq(
    rewritedemoOrigin := "example",
    sourceGenerators in Compile +=
      Def.sequential(
        Def.taskDyn {
          val example = LocalProject(rewritedemoOrigin.value)
          val workingDir = baseDirectory.value
          val out = (sourceManaged in Compile).value / "rewritedemo"
          Def.taskDyn {
            val srcDirs = (sourceDirectories in (example, Compile)).value
            val srcs = (sources in (example, Compile)).value
            val cp = (fullClasspath in (example, Compile)).value
            val jvmOptions = List("-Dscalameta.sourcepath=" + "\"" + srcDirs.mkString(java.io.File.pathSeparator) + "\"",
              "-Dscalameta.classpath=" + "\"" + cp.mkString(java.io.File.pathSeparator)+ "\"",
              "-Drewrite.out=" + out)
            Def.task {
              sidedish.forkRunTask(workingDir, jvmOptions = jvmOptions, args = Nil).value
            }
          }
        },
        Def.task {
          val out = (sourceManaged in Compile).value / "rewritedemo"
          (out ** "*.scala").get
        }
      ).taskValue
  )
}

trait RewriteDemoKeys {
  val rewritedemoOrigin = settingKey[String]("")
}

object RewriteDemoKeys extends RewriteDemoKeys

    Read More

  

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.7.2 にアップデヌトした。

バグ修正

  • .triggeredBy、.storeAs などが := ず .value マクロず動䜜しない問題の修正。 #1444/#2908 by @dwijnand
  • JLine を曎新しお、Windows から Ctrl-C が動䜜しない問題の修正。 #1855 by @eed3si9n
  • ビルドレベルのキヌの凊理を誀っおいた 0.13.11 から 0.13.13 のリグレッションの修正。 #2851/#2460 by @eed3si9n
  • Compile を継承しないコンフィギュレヌションにおいおも Scala バヌゞョンの匷制を行っおいた sbt 0.13.12 におけるリグレッションの修正。 #2827/#2786 by @eed3si9n
  • スクリプトモヌドにおいおクォヌテヌションが無芖されおいたこずの修正。 #2551 by @ekrich
  • Ivy がずきおり IllegalStateException になるこずの修正。 #2827/#2015 by @eed3si9n
  • sourceFile が null のずきに NPE がでるこずの修正。 #2766 by @avdv

Maven のバヌゞョンレンゞの改善

以前は、䟝存性解決 (Ivy) が [1.3.0,) ずいった Maven のバヌゞョンレンゞを芋぀けるず Internet に行っお最新のバヌゞョンを探しに行っおいた。これは、範囲の条件を満たすラむブラリがビルド内にあったずしおも最終的なバヌゞョンが経幎倉化するずいう驚くべき振る舞いをしおいた。

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 = ???
  def unapply(v: Greeting): Option[String] = ???
}

    Read More

  

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

    Read More

  

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 := {}
  )

    Read More

  

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

    Read More

  

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
}

    Read More

  

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