読者です 読者をやめる 読者になる 読者になる

Fight the Future

何かを始めたら、半分成功したのと同じ

RxJava 2.0 is released

java

I've translated a InfoQ's article about RxJava 2.0 into Japanese.

www.infoq.com

RxJava 2.0 quite differs from version 1.0. Summary of differences is in RxJava's website.

github.com

By the way, JDK 9 supports Reactive Stream (JEP 266).

JEP 266: More Concurrency Updates

The Reactive Streams spec will be included as java.util.concurrent.Flow. It has 4 interfaces in this spec.

  • Flow.Processor<T,R>: A component that acts as both a Subscriber and Publisher.

  • Flow.Publisher: A producer of items (and related control messages) received by Subscribers.

  • Flow.Subscriber: A receiver of messages.

  • Flow.Subscription: Message control linking a Flow.Publisher and Flow.Subscriber.

Instead of this, we will need a reactive stream library like RxJava or Spring Web Reactive after release of JDK 9.

Introduction to Javaslang

java

I translated this article into Japanese in InfoQ.

www.infoq.com

I haven't known Javaslang library for now.

What is Javaslang?

Javaslang's website is below:

http://www.javaslang.io/javaslang-docs/

Javaslang brings functional programming to Java.

This library is inspired by Scala. It mainly focuses on Collection library.

How to use?

It needs Java 8 and is available in Maven Central repository.

I try to use Javaslang version 2.0.5.

Differ from Java 8, Javaslang has its own List and Stream interface.

Number sum = List.of(1, 2, 3).sum();
System.out.println(sum); // 6

And it has Option which correspond to Java 8's Optional, Tuple, Pattern Matching and so on.

For more infomation, visit Javaslang website.

Pivotal Cloud Foundryを始めてみる

java

Pivotal Cloud Foundry(PCF)を試す機会をいただきました。ローカルのPCF Devではなく、パブリッククラウドのPCFの方です!

今後少しずつ、使ってみたログを残していこうと考えています。 今回は、PCFにサンプルのSpringBootアプリケーションをアップするところまでやってみます。

Getting Started

Getting Started with Pivotal Cloud Foundry | Pivotal

パブリッククラウドのPCFだから"Try PCF on the Public Cloud"の"始める"を押すぜ! f:id:jyukutyo:20161219153554p:plain こう書いてます。

"CONTINUE"押しました。

f:id:jyukutyo:20161219153917p:plain

Cloud Foundry Command Line Interface (cf CLI)をインストールしようという画面です。 MacでアクセスしたのでMacがデフォルト表示されていますが、WindowsLinuxあります。

インストールしたらcf helpと打ってみろということですので打ちます。

f:id:jyukutyo:20161219174131p:plain

$ cf help
cf バージョン 6.22.2+a95e24c-2016-10-27, Cloud Foundry command line tool
...

出たぜ!

Deploy the Sample App

f:id:jyukutyo:20161219154233p:plain サンプルアプリがあるので、それをpushしてみようぜと書いてます。 まずgit cloneする。 で、cf CLIでPCFにログインします。

$ cf login -a xxx.pivotal.io
API エンドポイント: xxx.pivotal.io

Email> alice@example.com

Password> 
認証中です...
OK

組織 xxx をターゲットにしました

スペース jyukutyo をターゲットにしました


                      
API エンドポイント:   https://xxx.pivotal.io (API バージョン: 2.65.0)
ユーザー:             alice@example.com
組織:                 xxx
スペース:             jyukutyo

あとはさっきクローンしたアプリケーションのディレクトリでcf pushするだけ! 数分かかります。

$ cf push
マニフェスト・ファイル /Users/jyukutyo/temp/cf-sample-app-spring/manifest.yml を使用しています

alice@example.com として組織 xxx / スペース jyukutyo 内のアプリ cf-spring を更新しています...
OK

cf-spring をアップロードしています...
次のパスからアプリ・ファイルをアップロードしています: /Users/jyukutyo/temp/cf-sample-app-spring
713K、44 個のファイルをアップロードしています
Done uploading               
OK


alice@example.com として組織 xxx / スペース jyukutyo 内のアプリ cf-spring を開始しています...
Downloading azq_nodejs...
Downloading staticfile_buildpack...
Downloading go_buildpack...
Downloading nodejs_buildpack...
Downloading python_buildpack...
Downloaded staticfile_buildpack
Downloading php_buildpack...
Downloaded azq_nodejs (96M)
Downloading java_buildpack_offline...
Downloaded php_buildpack (310.4M)
Downloading dotnet_core_buildpack...
Downloaded java_buildpack_offline (249.1M)
Downloading binary_buildpack...
Downloaded python_buildpack (255.3M)
Downloading null_buildpack...
Downloaded nodejs_buildpack (109.4M)
Downloading tc_server_buildpack_offline...
Downloaded dotnet_core_buildpack (169.3M)
Downloading java_buildpack_offline_3_9...
Downloaded binary_buildpack (9.3K)
Downloading ruby_buildpack...
Downloaded go_buildpack (392M)
Downloaded null_buildpack (3K)
Downloaded java_buildpack_offline_3_9 (269.4M)
Downloaded tc_server_buildpack_offline (330.2M)
Downloaded ruby_buildpack (260.8M)
Creating container
Successfully created container
Downloading app package...
Downloaded app package (1.2M)
Downloading build artifacts cache...
Downloaded build artifacts cache (107B)
Staging...
-----> Java Buildpack Version: v3.9 (offline) | https://github.com/cloudfoundry/java-buildpack.git#b050954
-----> Downloading Open Jdk JRE 1.8.0_101 from https://java-buildpack.cloudfoundry.org/openjdk/trusty/x86_64/openjdk-1.8.0_101.tar.gz (found in cache)
       Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (1.1s)
-----> Downloading Open JDK Like Memory Calculator 2.0.2_RELEASE from https://java-buildpack.cloudfoundry.org/memory-calculator/trusty/x86_64/memory-calculator-2.0.2_RELEASE.tar.gz (found in cache)
       Memory Settings: -Xmx681574K -XX:MaxMetaspaceSize=104857K -Xss349K -Xms681574K -XX:MetaspaceSize=104857K
-----> Downloading Spring Boot CLI 1.4.0_RELEASE from https://java-buildpack.cloudfoundry.org/spring-boot-cli/spring-boot-cli-1.4.0_RELEASE.tar.gz (found in cache)
       Expanding Spring Boot CLI to .java-buildpack/spring_boot_cli (0.0s)
Exit status 0
Staging complete
Uploading droplet, build artifacts cache...
Uploading build artifacts cache...
Uploading droplet...
Uploaded build artifacts cache (107B)
Uploaded droplet (53.2M)
Uploading complete
Destroying container
Successfully destroyed container

1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 1 個のインスタンスが実行中です

アプリが開始されました


OK

アプリ cf-spring はコマンド `CALCULATED_MEMORY=$($PWD/.java-buildpack/open_jdk_jre/bin/java-buildpack-memory-calculator-2.0.2_RELEASE -memorySizes=metaspace:64m..,stack:228k.. -memoryWeights=heap:65,metaspace:10,native:15,stack:10 -memoryInitials=heap:100%,metaspace:100% -stackThreads=300 -totMemory=$MEMORY_LIMIT) && SERVER_PORT=$PORT JAVA_HOME=$PWD/.java-buildpack/open_jdk_jre JAVA_OPTS="-Djava.io.tmpdir=$TMPDIR -XX:OnOutOfMemoryError=$PWD/.java-buildpack/open_jdk_jre/bin/killjava.sh $CALCULATED_MEMORY" exec $PWD/.java-buildpack/spring_boot_cli/bin/spring run app.groovy` を使用して開始されました

alice@example.com として組織 xxx / スペース jyukutyo 内のアプリ cf-spring の正常性と状況を表示しています...
OK

要求された状態: started
インスタンス: 1/1
使用: 512M x 1 インスタンス
URL: xxx.pivotal.io
最終アップロード日時: Mon Dec 19 06:53:21 UTC 2016
スタック: cflinuxfs2
ビルドパック: java-buildpack=v3.9-offline-https://github.com/cloudfoundry/java-buildpack.git#b050954 open-jdk-like-jre=1.8.0_101 open-jdk-like-memory-calculator=2.0.2_RELEASE spring-boot-cli=1.4.0_RELEASE

     状態   開始日時                 CPU    メモリー             ディスク           詳細
#0   実行   2016-12-19 03:54:47 PM   0.0%   512M の中の 198.9M   1G の中の 144.4M

出力の最後の方にあるURL:にアクセスします。

f:id:jyukutyo:20161219174151p:plain

表示されました!

次は管理画面見たりマーケットプレイス使ってみたりしよう!

what is JSRs in 900s

java

Now max JSR number is 380, but JSR has 900s number. For example, JSR 901 is "JavaTM Language Specification".

The Java Community Process(SM) Program - JSRs: Java Specification Requests - List of all JSRs

What are these? They are completed and moved to maintaining.

How to get an application class loader in Java Agent method

java jvm

In Java Agent method, such as premain() or agentmain(), class loader is system classloader, not application class loader.

If you intent to change bytecode of class loaded by application class loader, you will need an application class loader.

To get this, I think there is only one way. Get from Instrument API, as shown below.

public static void agentmain(String agentArgs, Instrumentation inst) throws Exception {
  Class[] classArray = inst.getAllLoadedClasses();
}

getAllLoadedClasses() returns an array of all classes currently loaded by the JVM. So, we need to seek the application class loader from these.

Map<String, Class> classMap = Arrays
                .stream(
                   inst
                     .getAllLoadedClasses()
                )
                .collect(
                  Collectors
                    .toMap(
                      c -> c.getName(), c -> c, (c1, c2) -> c1
                    )
                );

String target = "com.example.HelloWorld";
ClassLoader classLoader = classMap.get(target).getClassLoader();

It works well, but Agent class need to know the application class name. Is this okay?

material of my session in JJUG CCC 2016 fall

java jvm コミュニティ

I talked about Java Agent and bytecode manipulation libraries in JJUG CCC 2016 fall.

My session room was filled to capacity with bytecode fans!

This is a material of this session.

www.slideshare.net

How can I get a web application classloader in Java Agent's method agentmain()

java jvm

I implement Java Agent which transform classes of a web application running in an application server.

To do so, I need a web application classloader which load these classes.

I know Instrument#getAllLoadedClasses() method.

But this method returns Class array, so I retrieve the Class loaded by web application class loader by Class name etc.

I think this is not good code.

Is there another way to get a web application classloader in Java Agent?