JavaでAirPlayサーバ

ZOOMやGoogle Hangoutsでのミーティングが増える今日この頃だけど、今までのようにホワイトボードでささっと書いて済ませたいときも多い。さて、どうするかと思ったときに思いつくのが、iPadとかで書いてそれを画面共有とかできればなという感じかと思う。Macを使っていれば、AirPlayで送れば良いので話が早いのだが、WindowsやLinuxのときにはどうしたものかとなる。ググって調べると、古い情報が多く、試しても動かないものも多いし…。

ということで、今回試したのはjava-airplay-serverというもの。ただ、これだと、自分で実装しないといけないので、試すのはjava-airplay-server-examplesの方です。動かすには、Gradle 6くらいが必要らしい(Gralde 4だとコンパイルできなかった…) いくつかサンプルがあるけど、tcp-forwarderを動かします。

$ git clone https://github.com/serezhka/java-airplay-server-examples.git
$ cd java-airplay-server-examples/tcp-forwarder/
$ gradle bootRun

として、別なターミナルを開いて、

$ ffplay -f h264 -codec:v h264 -i tcp://localhost:5002

とすれば、準備完了です。あとは、iPadから画面ミラーリングを選択するとsrzhkaと表示されるので、それを選択すれば表示される。(一応表示されるけど、iPad Proを使って試した私の環境だと、そこそこ遅延がある感じでした…使えなくはないと思うけど)

JUL->Log4J2でログを出す

FessではLog4J2を利用しているが、Java標準のロギングのjava.util.loggingのログをLog4J2経由で出せていなかった…。なので、メモがてらに。

やらなきゃならないこととしては、依存関係にorg.apache.logging.log4j:log4j-julをまずは追加する。

あとは、起動時のシステムプロパティに以下を追加する。

-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager

とすれば、Log4J2で指定したものでログが出てくる。詳しいことはここを参照。

AdoptOpenJDKをパッケージで入れる

ここの情報によると、AdoptOpenJDKでようやくオフィシャルなRPMとDEBファイルが提供されるようになったらしい。というわけで、Ubuntu 18.04に入れてみる。

# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# echo deb https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ bionic main > /etc/apt/sources.list.d/adoptopenjdk.list
# apt-get update
# apt-get install adoptopenjdk-11-hotspot

という感じで簡単にインストールできる。

$ java -version
 openjdk version "11.0.3" 2019-04-16
 OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7)
 OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.3+7, mixed mode)

デフォルトが変わらないようであれば

# update-alternatives --config java

をして切り替える。

Java9で日付のフォーマット変更

Java 11を真面目に使い始めて遭遇したのだが、Java 8まではDateFormat#getDateTimeInstanceで”M/d/yy h:mm a”のDateFormatが返ってきたけど、Java 9からは”M/d/yy, h:mm a”という感じで微妙にカンマが入る。ということで、今までどおりにパースはできない…。

JDK-8152154を見ると、-Djava.locale.providers=COMPAT,CLDR JI9032375 というオプションで前のも使えるらしい。

javadoc: error – The code being documented uses modules

Java 11を使ってmvn javadoc:javadocとしたときに

[ERROR] Exit code: 1 - javadoc: error - The code being documented uses modules but the packages defined in https://docs.oracle.com/javase/8/docs/api/ are in the unnamed module.

とか

[ERROR] Exit code: 1 - javadoc: エラー - ドキュメント化しようとしているコードではモジュールが使用されていますが、https://docs.oracle.com/javase/8/docs/api/で定義されているパッケージは名前のないモジュールのものです。

のようなエラーが出るときには、JavaDocの参照するJavaのソースコードのバージョンの問題なので、pom.xmlのjavadocプラグインで、sourceを次のようにして押しておく

      <plugin>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>3.0.1</version>
        <configuration>
          <encoding>UTF-8</encoding>
          <docencoding>UTF-8</docencoding>
          <charset>UTF-8</charset>
          <source>8</source>
        </configuration>
      </plugin>