JDK12は3/19リリース。あとOpenJDKのGithubリポジトリができた

9/25のJDK11リリースまで1週間となりました。

JDK12のスケジュール提案

そんな中、JDK12のスケジュールの提案が出てますね。2019/3/19リリースの予定です。

  2018/12/13  Rampdown Phase One
  2019/01/17  Rampdown Phase Two
  2019/01/31  Release-Candidate Phase
  2019/03/19  General Availability

Proposed schedule for JDK 12

OpenJDKのGithubリポジトリができた

ところで、OpenJDKのソース管理はMercurialで行われ、レビューはメーリングリストで行われています。
これをGitに移行してGithubを使ってみようという流れが起きています。
OpenJDK Commiter's Workshopでも長い時間をとって議論が行われていましたが、Mercurialリポジトリサイズが大きな問題になっていたように思います。


このプロジェクトはSkaraという名前になってます。
Call for Discussion: New Project: Skara -- investigating source code management options for the JDK sources
メーリングリストもできていますね。
skara-dev Info Page


ということで、まずはGithubリポジトリができました。
openjdk/jdk: Read-only mirror of http://hg.openjdk.java.net/jdk/jdk

Raw String Literalsが正式にJEPに入った

Raw String Literalsは正式にJEPに入りました。まだコードは取り込まれてないけど。
JEP proposed to target JDK 12: 326: Raw String Literals (Preview)

ランダムな向きのベクトルを生成する

ちょっと、ランダムな向きのベクトルを生成する必要があったので調べてみた。
さすがStackOverFlow。すぐあった。
正規分布で各要素を得て正規化すればいいということらしい。
distribution - random unit vector in multi-dimensional space - Stack Overflow


詳しい説明は ここを見ろってあったけど、よくわからない・・・
Hypersphere Point Picking -- from Wolfram MathWorld


とりあえずJavaのコードのように書くとこう。

var r = new Random();
return new Vector3D(r.nextGaussian(),
                    r.nextGaussian(),
                    r.nextGaussian()).normalize();

Raw String LiteralsがJDK12のJEPに

Raw String Literals(RSL)がJDK12のJEPにProposalとして入りました。RSLはバッククオートで囲って改行やダブルクオートなどを含む文字列を表記する仕様です。
Amberで検討されているJava構文の変更 - Qiita


必要なAPIコンパイラでの対応はすでにレビュー中なので、早ければもしかしたら今週末のEAで試せるかもしれません。


先にJEPに入ったSwitch Expressionは、まずはcaseの拡張がEA9に入りました。
しかし、利用するには--enable-previewオプションが必要になります。


まだExpressionには なってないようですね。


RSLもPreviewとしてJEPに入っているので、--enable-previewが必要になるんだろうな。

JDK 11 RC1リリースと、Loomの継続は継続なの?疑惑

バグが2つ残っていて遅れたJDK 11 RC1が先週末にでてますね。「そして運がよければ最後の!」 by Mark Reihhold
JDK 11: First Release Candidate


昨日さくらばさんがLL2018でLoomの話をしてTwitterがにぎわってから、Loomで言ってる継続はほんとに継続なのか、という話題がでてます。


このAPIだと継続(=残りの計算)っぽくないけど、やろうとしてることや実態は継続(or 限定継続?)、ということなんですかね。

JDK12の最初のJEPはSwitch Expression(Preview)

JDK12に最初のJEPが入りました。
JDK 12


JEP325 Switch Expressions(Preview)です。
JEP 325: Switch Expressions (Preview)


拡張Switchについては、Qiitaでまとめていますが var a = switch(f){case 0->false;default->true;}のような書き方ができるような仕様変更です。
Amberで検討されているJava構文の変更 - Qiita


これで、Switchが便利に使えるようになります。


ところで、JDK11はRCが出るはずでしたが、2つほどP1のバグが残ってるのでまだのようです。
JDK 11: No Release Candidate, yet


IBMメインフレームで使われているs390x CPUでネイティブコールに失敗してるのと、SSLの挙動がおかしいみたいですね。
[JDK-8209637] [s390x] Interpreter doesn't call result handler after native calls - Java Bug System
[JDK-8207317] SSLEngine negotiation fail Exception behavior changed from fail-fast to fail-lazy - Java Bug System


それと、ツッコミ隊長であるStephen Colebourneさんが、OpenJDKでのLTSについて質問しています。そこにOracleのMark Reinholdさん、Red HatのAndrewさん、AdoptOpenJDKのMartijnさんが答えていて、だいたい肯定的な意見に見えますね。
What does LTS mean for OpenJDK?

Project LoomでJavaでの継続(Continuation)を試す

Project Loomは、Javaで継続(Continuation)やFiber(軽量スレッド)、末尾呼び出し最適化なんかを実現するプロジェクトです。
OpenJDK: Loom


そのLoom、ながいことどうやって動かすかもよくわからない感じだったのが、先日のJVMLSにあわせてプロトタイプが公開されてました。
http://mail.openjdk.java.net/pipermail/loom-dev/2018-July/000061.html


ビルド方法はこんな感じです。

$ hg clone http://hg.openjdk.java.net/loom/loom  
$ cd loom  
$ hg update -r fibers 
$ sh configure   
$ make images

たりないパッケージはconfigureのときに教えてくれるので、それに従って入れていけばいいです。


Continuationはプログラムを動かしたり止めたりの制御ができる仕組みです。

public class LoomSample {
  public static void main(String... args) {
    var scope = new ContinuationScope() {};
    var c = new Continuation(scope, () -> {
      System.out.println("c1");
      Continuation.yield(scope);
      System.out.println("c2");
      Continuation.yield(scope);
      System.out.println("c3");
    });
    System.out.println("out1");
    c.run();
    System.out.println("out2");
    c.run();
    System.out.println("out3");
    c.run();
    System.out.println("out4");
  }
}

Continuation#yieldで動きを止めて、run()で再開できる感じ。
実行するとこういう出力になります。

out1
c1
out2
c2
out3
c3
out4


Fiberは、このContinuationにスケジューラを組み合わせて並行実行する感じになります。


で、たとえばゲームなどで、異なる動きをするキャラクタを1/60ごとに1フレーム動かすみたいな処理は自分で状態機械を組んだり面倒なコードが必要になります。継続で書ければ、それぞれの動きを通常の処理として書けばいいことになります。


往復運動する青い四角と、円運動する赤い丸を1/20秒ごとに動かすというサンプルを書いてみました。
https://gist.github.com/kishida/3898fdc50757e8d66a2f1f79f6d378db


結構いい感じに動いてます。


Loomの資料は、wikiがここにあって、JVMLS2018の資料なども公開されています。
https://wiki.openjdk.java.net/display/loom/Main


目的みたいなことは、ここでまとまってます。
Loom Proposal.md


Fiberは、伊藤さんがechoサーバーつくってます
https://github.com/chiroito/sandbox/blob/master/sandbox-loom/src/main/java/FiberEchoServer.java

JVM Language Summitに行く-Day0 移動日

JVM Language Summitという、JVM言語の開発者が集まるイベントがSanta ClaraのOracle Campusであるのですけど、毎年おもしろそうな発表ばっかりで、一度行きたいと思っていたので行くことにしました。
ただ、時期が時期だけにSanJose空港行きの飛行機がちょう高かったので(もしかしたら福岡-成田が高いのかも)、台湾経由でサンフランシスコ空港に行くことにしました。


朝10時くらいに、ちょっとヨドバシでカードリーダー付USB-Cハブを買って、11時くらいに福岡空港に。


台湾時間13時に桃園空港についた。
トランジットに7時間あるので、台北駅まで出ました。MRT便利。


目的は、この変な人形の写真を撮ること。もちろんVRも撮ってます。



ところで、ガチャガチャコーナーがあって、NO MORE盗撮があったのですが、台湾の人にわかるんでしょうか?


台湾時間20時に飛行機に。
で、サンフランシスコ行こうとすると、一旦日本に戻ってくるわけですね。


そしてサンフランシスコ空港に西海岸時間17時ごろ到着


18:30くらいのBARTにのってMillbraeまで。


Millbraeで19:20くらいのCaltrainに乗り換え。


Caltrainでは、どっかの駅についたときに、サラサラ金髪の少年がなんか楽しそうに走ってきて、癇癪玉のようなものを外に投げて戻っていきました。楽しそう。


そしてようやく20:15くらいにSanta Claraにつきました。


そこからはUberで、AirBnBで予約したおうちまで。20:45くらいにつきました。
ちなみに移動手段はAirBnBのホストの人が全部調べていてくれました。ありがたや。


日本時間だと30日13時なので、27時間くらいかかってますね。
つかれた。