きしだのはてな このページをアンテナに追加 RSSフィード

2018-08-09(木) Project LoomでJavaでの継続(Continuation)を試す

[][]Project LoomでJavaでの継続(Continuation)を試す 10:20 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

トラックバック - http://d.hatena.ne.jp/nowokay/20180809

2018-07-29(日) JVM Language Summitに行く-Day0 移動日

[]JVM Language Summitに行く-Day0 移動日 01:54 JVM Language Summitに行く-Day0 移動日を含むブックマーク

JVM Language Summitという、JVM言語の開発者が集まるイベントがSanta ClaraのOracle Campusであるのですけど、毎年おもしろそうな発表ばっかりで、一度行きたいと思っていたので行くことにしました。

ただ、時期が時期だけにSanJose空港行きの飛行機がちょう高かったので(もしかしたら福岡-成田が高いのかも)、台湾経由でサンフランシスコ空港に行くことにしました。


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

f:id:nowokay:20180803092751j:image


台湾時間13時に桃園空港についた。

トランジットに7時間あるので、台北駅まで出ました。MRT便利。

f:id:nowokay:20180803092752j:image


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

f:id:nowokay:20180803092753j:image



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

f:id:nowokay:20180803092755j:image

f:id:nowokay:20180803092754j:image


台湾時間20時に飛行機に。

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

f:id:nowokay:20180803092756j:image


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

f:id:nowokay:20180803092757j:image


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

f:id:nowokay:20180803092758j:image


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

f:id:nowokay:20180803092759j:image


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


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

f:id:nowokay:20180803092800j:image


そこからはUberで、AirBnBで予約したおうちまで。20:45くらいにつきました。

ちなみに移動手段はAirBnBのホストの人が全部調べていてくれました。ありがたや。


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

つかれた。

トラックバック - http://d.hatena.ne.jp/nowokay/20180729

2018-07-23(月) VR180カメラでVRを撮るのにハマりまくっている。みんなも買おう

VR180カメラでVRを撮るのにハマりまくっている。みんなも買おう 03:14  VR180カメラでVRを撮るのにハマりまくっている。みんなも買おうを含むブックマーク

先日Oculus Goを買って、360channelで鈴木咲がネクタイ締めてくれる3D動画を見たりして、VRおもしれーとハマっていました。

で、そういうの撮れるデバイスあるかなーと思ったら、VR180という規格をGoogleが作っていて、それに対応したカメラをLenovoやシャオミが出してることがわかり、これは可及的速やかに購入して身の回りを記録するべきだと早速購入。

買ったのはLenovoのMirage Cameraです。

そしたらすげー面白かった。登壇のたびに撮影してます。登壇気分が味わえて楽しい。

f:id:nowokay:20180724021851j:image


ちなみに、360channelの動画はこれ。

”はだける浴衣”でイチャイチャ新婚生活♡ 鈴木咲 ファンが見たいVR | 360Channel | VR動画配信サービス

Oculus Goで3Dで見るには専用アプリで見る必要があります。

https://www.oculus.com/experiences/go/1068604633204352/

ここには360版だけのコンテンツと3Dもあるものがあるんですが、平面が360度あるより、180度立体があるほうが断然よいです。立体じゃない360コンテンツだとがっかり感ある。360だと、鈴木咲が近づいてきても、ただデカくなるだけで近づいてきた感じじゃないんですよね。3Dだと「ちょ、近づきすぎ」ってなる。

で、これ書きながら見てたら、Webの360版だと浴衣ぬぐのね。ぜんぜんはだけてないなーと思ったら、そういうことだったか。

ちなみに、鈴木咲は、だいぶ前にオリエント工業の人形として有名になった人ですね。

鈴木咲さんのツイート: ”よくね、オリエント工業製のリアルな...”


いや、これは鈴木咲 紹介エントリではない。


まあそんな感じで、360よりも180で立体に撮れるほうが重要だと思って、そしてできるだけ早く3Dで記録を始めたいと思って、すぐにヨドバシで買ったのです。

で、何を撮るかというと、身の回りのいろいろを撮るのが楽しいです。コンビニの雑誌の棚とか近所の交差点とか。散らかった部屋を撮ってOculus Goで見ると、散らかった部屋が立体に見えて楽しいです。


大きい建物は結構いいです。博多駅を見上げたり。

f:id:nowokay:20180724021847j:image


それと、吹き抜けおすすめ。これは羽田第一ターミナルの吹き抜けです。手を出して撮ると、足元に床がないので恐怖体験できます。

f:id:nowokay:20180724021836j:image


あと、写真撮影OKな美術館。国立西洋美術館で考える人VRを撮ってきました。

f:id:nowokay:20180724021844j:image


地獄の門はかなりいいです。もちろん横を向けば立像が見えます。

f:id:nowokay:20180724024553j:image


絵画も、サイズ感が体験できてすごくいいです。

f:id:nowokay:20180724021840j:image

ただ、解像度の問題で細部はぜんぜん見れないけど。シニャックの点描なんかは、完全に点がつぶれて普通の絵になっちゃってます。それでも存在感は なかなかいいです。


面白いのが、上野公園からスカイツリーが見えるのを写真で撮ると、見えてる大きさに比べて小さくしか映らないのだけど、これがVRで見るとそれなりに大きく見えます。

f:id:nowokay:20180724024549j:image


一番のヒットは名刺交換VRです。名前のとおり、名刺交換するところをVR動画で撮ったのですが、これは見るとフフッってなります。

f:id:nowokay:20180724023344j:image

他にもビールを注いでもらうVRも撮ったのですが、なにかしてもらうVRは とてもいいです。コンビニレジVRとか撮りたいですが、これはなかなか難しい。

あ、でも、普通に名刺交換の作法指導なんかに いい気がしますね。


福岡オフィスを撮って東京オフィスの人に見せたりもしたのですが、オフィス紹介VRとかもよさそう。

f:id:nowokay:20180724023728j:image

不動産やさんとかは物件紹介VRやればいいと思うな。


ただ、これ撮ってもOculus Go持ち歩くわけにもいかないし、なかなかその場で人に見せれないなーと思ったら、いいものがあった。

結構ちゃんとVRに見れるので、これでその場で人に見せることができます。

Oculus Goで見るには一度PCにデータ移してからOculus Goにファイル転送する必要もあって面倒だし。

関係ないけど、このAmazonレビュー、ほとんどが違う製品のレビューで、レビューをクリックすると別製品が出てくるんだけど、どういうことなんだろう?まあいいや。


180度レンズが筐体の端にあるので、普通に手で持つと高い確率で手が映り込みます。自撮り棒あるほうが楽です。はさむやつより、ネジのほうがいいです。


それと、1度壊れて電源入らなくなって修理待てないので買いなおしたのだけど、そうするとデータも取り出せなくなるので、MicroSDカード入れておくのがいいです。

買いなおしたのは、修理には10営業日かかると言われたので、確実に8月になってしまって、それまでの面白イベントが撮れないわけで。実際、この数日でもいろいろ撮れたので買いなおしてよかった。修理あがってきたら誰かに売りつけようかと。


あ、撮るときの注意としては、食べ物とか机の上に置いてあるものとか撮るときに下に傾けて撮るとVRで見るときに酔ってしまうので、あくまでカメラは垂直に。見るときに下を向こう。

それと、手の分 前に出てしまうので、あまり近づきすぎないように気を付けること。特に食べ物を撮るときに近づきすぎると焦点が合わないので、ちょっと目の高さよりカメラを下げるくらいがいいと思います。実際にそこに目を置いてちゃんと見えるか、という感じですね。

あと、手がかぶらないように。あ、視界の範囲の人は だいたい映るので、広く共有したいものを撮りたかったら、完全に視界から人がいなくなってから撮るのがいいです。それでもあとでVRで横を見たらおっさんがちょうこっち見てるとかあります。

それと、炎天下で動画とってると熱ですぐ止まってしまいます。注意。


ということで、みんなVR撮りまくると楽しいと思うよ。特に子どもとかイヌとかネコとか。

今のところ簡単に共有する方法がなくて、ファイルを直接やりとりするしかないのだけど、FacebookGoogleがなんとかしてくれるでしょう。

2018-07-08(日) ロケールを指定してJShellを起動

[]ロケールを指定してJShellを起動 21:39 ロケールを指定してJShellを起動を含むブックマーク

  • J-Duser.language=enをつける
C:\Users\naoki>java\jdk-10.0.1\bin\jshell -J-Duser.language=en
|  Welcome to JShell -- Version 10.0.1
|  For an introduction type: /help intro

nonamenoname 2018/07/10 14:24 それは言語であってロケールではないのでは...まあ、言語も込みかな(user.countryも使えばいいのかな)

nowokaynowokay 2018/07/12 03:36 あ、確かに

2018-07-07(土) Java 11 API changes

[][]Java11 API Changes 22:59 Java11 API Changesを含むブックマーク

JDK11 features are frozen since it was in the Rampdown phase last month.


Big changes are listed in this page as JEPs.

JDK 11


However there are many changes outside of JPEs in JDK 11, therefore I list up the API changes in JDK 11 as far as I know.


String

lines()

Get a stream divided by line breaks.

jshell> "test\nhoge\n".lines().map(String::toUpperCase).toArray()
$11 ==> Object[2] { "TEST", "HOGE" }

repeat(int)

Repeat string for the specified times.

jshell> "test".repeat(3)
$7 ==> "testtesttest"

isBlank()

The method appended that determines whether the string contains only spaces or not. Full width space is also treated as a space.

jshell> var halfSpace = "\u0020"
halfSpace ==> " "

jshell> halfSpace.isBlank()
$11 ==> true

jshell> var fullSpace = "\u3000"
fullSpace ==> " "

jshell> fullSpace.isBlank()
$13 ==> true

strip() / stripLeading() / stripTrailing()

Almost same as trim() / trimLeft() / trimRight() but it takes full width spaces as a spece.

jshell> var aaa = fullSpace + "aaa" + fullSpace
aaa ==> " aaa "

jshell> aaa.strip()
$14 ==> "aaa"

jshell> aaa.trim()
$15 ==> " aaa "

CharSequence

compare(CharSequence, CharSequence)

Sort by dictionaly order.

It is used by compateTo in CharSequence/StringBuffer/StringBuilder. Therefore the 3 classes implements Comparable.


Character

toString(int)

It was not convenient so far but now it become convenient.

JDK10.0.1

jshell> Character.toString(65)
|  Error:
|  incompatible types: possible lossy conversion from int to char
|  Character.toString(65)
|                     ^^

JDK11ea14

jshell> Character.toString(65)
$9 ==> "A"

Path

of(String, String...)

We had to use Paths.get() so far, now we can use of() as same manner as another classes.


Files

writeString(Path, CharSequence)

We can save a string with 1 method.

jshell> Files.writeString(Path.of("test.txt"), "Hello!!!")
$3 ==> test.txt

readString(Path)

We can read a string with 1 method.

jshell> Files.readString(Path.of("test.txt"))
$4 ==> "Hello!!!"

Reader

nullReader()

We can get a Reader that do nothing.


Writer

nullWriter()

We can get a Writer that do nothing.


Predicate

not(Predicate)

We could not use a method reference where it needs to invert the condition, now we can use a method reference.

jshell> Stream.of("aa", "", "bb").filter(Predicate.not(String::isEmpty)).toArray()
$23 ==> Object[2] { "aa", "bb" }

Collection

toArray(IntFunction)

We had to use a non stylish notation like list.toArray(new String[list.size())]) on creating an typed array from a collection, now we can write in a stylish notation.

jshell> List.of("aa","bb").toArray(String[]::new)
$1 ==> String[2] { "aa", "bb" }

Optional/OptionalInt/OptionalLong/OptionalDouble

isEmpty()

isPresent() had existed so far, now we have isEmpty().

jshell> Optional.ofNullable(null).isEmpty()
$5 ==> true

TimeUnit

convert(Duration)

added for java.util.concurrent.TimeUnit


Pattern

asMatchPredicate()

There was asPredicate that do find, now we have asMatchPredicate that do match.

jshell> var pred = Pattern.compile("aaa").asPredicate()
pred ==> java.util.regex.Pattern$$Lambda$25/0x00000008000b5040@2f686d1f

jshell> pred.test("aaa")
$6 ==> true

jshell> pred.test("aaab")
$7 ==> true

jshell> var matPred = Pattern.compile("aaa").asMatchPredicate()
matP ==> java.util.regex.Pattern$$Lambda$24/0x00000008000b6440@402a079c

jshell> matPred.test("aaa")
$9 ==> true

jshell> matPred.test("aaab")
$10 ==> false

ListSelectoinModel

getSelectedIndices()/getSelectedCount() are added.

Swing is changing!


Thread

destroy() / stop(Throwable)

Removed. stop() remains.


Policy

javax.security.auth.Policy is removed.


ArrayIndexOutOfBoundsException

The message become gentle for human.

JDK10.0.1

jshell> new int[]{}[0]
|  java.lang.ArrayIndexOutOfBoundsException thrown: 0
|        at (#8:1)

JDK11-ea14

jshell> new int[]{}[0]
|  Exception java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
|        at (#4:1)

IndexOutOfBoundsException

hyphens are removed in the message.

JDK10.0.1

jshell> List.of().get(0)
|  java.lang.IndexOutOfBoundsException thrown: Index 0 out-of-bounds for length 0
|        at Preconditions.outOfBounds (Preconditions.java:64)
|        at Preconditions.outOfBoundsCheckIndex (Preconditions.java:70)
|        at Preconditions.checkIndex (Preconditions.java:248)
|        at Objects.checkIndex (Objects.java:372)
|        at ImmutableCollections$List0.get (ImmutableCollections.java:106)
|        at (#6:1)

JDK11-ea14

jshell> List.of().get(0)
|  Exception java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
|        at ImmutableCollections$ListN.get (ImmutableCollections.java:411)
|        at (#3:1)

System

arraycopy

The message become gentle for human.

JDK10

jshell> System.arraycopy(new int[0],0,new double[0],0,0)
|  java.lang.ArrayStoreException thrown

JDK11ea19

jshell> System.arraycopy(new int[0], 0, new double[0], 0, 0)
|  Exception java.lang.ArrayStoreException: arraycopy: type mismatch: can not copy int[] into double[]

setProperty(String, String)

So far changing java.home would make trouble but now it is not affect for the system, maybe...


Support Japanese new era.

It is introduced as NEWERA

Javaの新元号対応を試す。そして実用には問題がある - きしだのはてな


Base64

Since ea20, the encoding become faster by using AVX512, but I can not confirm on Windows.


Boolean

parseBoolean

It become lettle faster to remove redundant null check, they said.

JDK10

    public static boolean parseBoolean(String s) {
        return ((s != null) && s.equalsIgnoreCase("true"));
    }

JDK11

    public static boolean parseBoolean(String s) {
        return "true".equalsIgnoreCase(s);
    }

I haven't confirmed it yet.


List

copyOf

copyOf that has introduced since Java10, it was wrong copying a subList. It could not be serialized. Now fixed.

Common initialize.

jshell> var list1 = List.of("a","b","c")
list1 ==> [a, b, c]

jshell> var list2=list1.subList(1,2)
list2 ==> [b]

jshell> var list3=List.copyOf(list2)
list3 ==> [b]

JDK11ea19


jshell> list2==list3
$13 ==> true

jshell> new ObjectOutputStream(OutputStream.nullOutputStream()).writeObject(list3)
|  Exception java.io.NotSerializableException: java.util.ImmutableCollections$SubList
|        at ObjectOutputStream.writeObject0 (ObjectOutputStream.java:1185)
|        at ObjectOutputStream.writeObject (ObjectOutputStream.java:349)
|        at (#14:1)

JDK11ea20

jshell> list2==list3
$26 ==> false

jshell> new ObjectOutputStream(OutputStream.nullOutputStream()).writeObject(list3)

jshell>

TimSort

There are some bug, but fixed, maybe.

https://blog.satotaichi.info/timsort-was-broken/

トラックバック - http://d.hatena.ne.jp/nowokay/20180707