忙しい人のためのJavaの近況とOpenJDKについて #Corretto #Zulu #Adopt

OracleからJava11がリリースされましたが

私自身、色々と誤解していた部分があったので、まとめてみました。

まとめてみると、今後はAdoptかZuluのOpenJDKがサポート期間も長く主流になるかも?と思えます。

OracleのOpenJDKも、LTSで3年サポートされれば、、、Oracle嫌いだけど。

(個人的には、流れ的にOracleのOpenJDKもLTSで3年サポートされるでしょーって思います。)

因みにサポートとは、バグフィックスやセキュリティパッチを入手できるか?ということです。

11/15 Correttoを追記。OpenJDKの戦国時代になりそうな、選択肢の豊富さになってきました。

  • Oracle JDK11
    • OracleのJDK、今までのJDKといえばほぼコレ。
    • Java12が出るまで(6ヶ月)のサポートは無償(開発・テストやプロトタイプ、デモ用途に限定)。Java12が出てからのサポートや実運用は有償。
  • Oracle OpenJDK11
    • OracleがOpenJDKをビルドして提供
    • Java12が出るまで(6ヶ月)のサポートは無償。Java12が出てからのサポート(LTS期間の3年)はチーフアーキテクトのMark Reinhold氏が宣言しているが、公式発表はなし。jdk.java.netで提供。
  • Adopt OpenJDK
    • AdoptOpenJDKコミュニティがOpenJDKをビルドして提供
    • Java8は2023年9月まで、Java11は2022年9月まで(最低4年間)サポート。
      • IBMやMS?がスポンサー
    • AdoptOpenJDK+HotspotVMと、AdoptOpenJDK+OpenJ9がある
      • Linux、AIX、Windows向けに提供されている。
      • HotspotVMのみ、MacOSとLinux ARM向けが提供されている。
    • DockerHubでも配信。 
    • IBMが、AdoptOpenJDKを4年間サポートする意向を示している。
  • RedHat OpenJDK11
    • RedHatがOpenJDKをビルドして提供
    • OpenJDK8をRed Hatが2020年10月までサポート、OpenJDK11はRed Hatが独自のサポート期間を設ける
      • Red Hat Linuxのエンタープライズ版で利用する事ができる。
  • IBM JDK + OpenJ9
    • IBMのJDK。ランタイムのOpenJ9が最近OSS化された。
    • Java8は2022年4月までサポート
      • Windows向けのバイナリは単体で提供されていない。
      • LinuxやAIX向けは単体提供あり。
      • DockerStoreで無料配信されているが、実運用は有償。
  • Zulu OpenJDK
    • AZUL SystemsがOpenJDKをビルドして提供
    • 商用サポートは8年のLTSサポートで、セキュリティとバグ修正を迅速に入手できる
    • 非商用の提供は明確にされていない。
      • JDK10、JDK9の32bit版があり、JDK6u113、JDK7u191、JDK8u181がある。
        • 非商用もサポート長いかもしれない?
      • ダウンロードページ
    • カスタマーにMicrosoft
    • 元OracleのSimon Ritter氏が所属している
  • Amazon Corretto
    • AmazonがOpenJDKをビルドして無償提供、今はプレビュー版。正式は2019年1月を予定。
    • JDK8は2023年6月(4年半)、JDK11は2024年6月(4年半)、セキュリティとバグ修正を入手できる?
    • 現在、Amazon Linux、Windows7~10、MacOSのインストーラ、Docker版が提供中、Windowsの32bit版の有無は不明。
      • 正式リリース時には、UbuntuやRed Hat Enterprise Linuxが含まれる
      • 個人的には、zip版も欲しい、、、
      • ダウンロードページ 
      • AWSにJavaの神様と言われているJames Gosling氏が所属している

以上

Homebridgeプラグイン開発環境構築メモ

Homebridgeのプラグインを作成するために、開発環境を構築した時のメモです。
Macにhomebridgeをインストールし、VSCode-InsidersをIDEとして使います。

プラグインのプログラム手法に関しては別途、公開予定ですが、
この時に作成したプラグインは下記のGitHubに公開しているので、参考にしてみてください。

環境設定

Macにデバッグ用にhomebridgeをグローバルにインストール

$ sudo npm install -g --unsafe-perm homebridge
$ homebridge # 起動確認、Ctrl+Cで停止
$ mkdir ~/.homebridge; cd ~/.homebridge
$ curl -L -o ~/.homebridge/config.json https://raw.githubusercontent.com/nfarina/homebridge/master/config-sample.json
$ cp config.json config.json.org; code-insiders config.json
# usernameを修正(英小文字は英大文字にする)、MACアドレスの形式なのでMacのWiFiのアドレスを入力するが、被らなければ良い。
# accessoriesとplatformsの中身は空に
$ homebridge # 再度、起動確認

homebridgeの開発・デバッグ用設定を作成

$ cp -R .homebridge .homebridge-dev # 既存設定をコピー
$ cd .homebridge-dev; rm -R accessories; rm -R persist # 前回起動時のキャッシュを削除
$ code-insiders config.json # username,port番号を変更、開発したPluginの設定を追加
$ homebridge -D -U ~/.homebridge-dev -P ~/develop/nodejs/homebridge-sample/ # 開発用に起動する時のコマンド例、-Uは設定、-Pは読み込むPluginフォルダ指定

プラグインプロジェクト作成

プラグインプロジェクトのフォルダを作成

$ mkdir ~/develop/nodejs/homebridge-temper; cd ~/develop/nodejs/homebridge-temper
$ typings init # 型定義一覧を初期化
$ typings install dt~node --global --save # nodeの型定義を追加

# 型定義をGithubからインストール(正常)、homebridgeの基礎となるライブラリの型定義。型定義はhomebrideとだいたい同じ。
$ typings install github:KhaosT/HAP-NodeJS/index.d.ts --global --save # hap-nodesの型定義を追加

VSCodeのデバッグ設定

jsconfig.json修正

プロジェクトフォルダのjsconfig.jsonに、allowSyntheticDefaultImportsをtrueで追加

{
    "compilerOptions": {
        "target": "es6",
        "module": "commonjs",
        "allowSyntheticDefaultImports": true
    }
}

homebridge設定のconfig.jsonをデバッグ用にコピー

$ mkdir config; cp ~/.homebridge-dev/config.json config/config.json
$ code-insiders config/config.json # homebridge用のデバッグ設定追加

プロジェクトフォルダの.vscode/launch.jsonを下記の様に修正

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "Launch Program",
            "program": "homebridge",
            "stopOnEntry": false,
            "args": [
                "-D",
                "-P",
                "${workspaceRoot}",
                "-U",
                "${workspaceRoot}/config"
            ],
            "cwd": "${workspaceRoot}",
            "preLaunchTask": null,
            "runtimeExecutable": null,
            "runtimeArgs": [
                "--nolazy"
            ],
            "env": {
                "NODE_ENV": "development"
            },
            "console": "internalConsole",
            "sourceMaps": false,
            "outFiles": []
        },
        {
            "name": "Attach",
            "type": "node",
            "request": "attach",
            "port": 5858,
            "address": "localhost",
            "restart": false,
            "sourceMaps": false,
            "outFiles": [],
            "localRoot": "${workspaceRoot}",
            "remoteRoot": null
        },
        {
            "name": "Attach to Process",
            "type": "node",
            "request": "attach",
            "processId": "${command:PickProcess}",
            "port": 5858,
            "sourceMaps": false,
            "outFiles": []
        }
    ]
}

GalaxyNote8のSideSyncをリモートデバッグに使う

GalaxyNote8のSideSyncをリモートデバッグに使います。

準備

Qi対応の無線充電器(おすすめ)

  1. WiFiは充電時のみ常時接続
設定⇨接続⇨WiFi⇨詳細設定⇨スリープ中にWi-Fi接続を維持⇨「充電時」にする

  2. IPは静的取得とし、固定する。(もしくはルータ側でMacアドレス指定のIP固定にする)
設定⇨接続⇨WiFi⇨接続中のWiFiネットワークをロングタップ⇨ネットワーク設定を管理⇨IP設置を「静的」にして任意のIPアドレスを入力
(デートウェイやDNSはそのままで良いはず)

  3. SideSyncをNote8とMac(PC)にインストール
Mac版のインストールには癖がある、システム環境設定⇨セキュリティとプライパイシー⇨プライバシー⇨アクセシビリティ⇨鍵をクリック⇨SideSyncを許可

  4. PCとNote8のSideSyncを起動し接続設定をすませておく

  5. ADBのリモートデバッグ設定をUSBで接続して行う

$ export PATH=$PATH:_Users_kogahirotaka_Library_Android_sdk_platform-tools # AndroidSDKのツールをパスに追加
$ adb tcpip 5555 # PCのポート待機を設定、5555〜5585まで?
$ adb connect 192.168.10.88:5555 # Note8に5555で接続
  1. USBを抜いて、下記のコマンドで端末が存在するか確認
$ adb devices # デバック端末リスト表示(確認用)

接続方法

  1. Qiの上にNote8を置く(WiFi接続)

  2. MacのSideSync起動(基本的に自動起動)

  3. adb tcpipとadb connectで接続

$ adb tcpip 5555
$ adb connect 192.168.10.88:5555
  1. adb shellでNote8のSideSync起動
$ adb shell monkey -p com.sec.android.sidesync30 -c android.intent.category.LAUNCHER 1 # SideSync起動
  1. 使い終わったら、adb disconnectで切断
$ adb disconnect # PCポート切断
$ adb usb # USBモードへ

BroadLink RM3 Mini 初期設定メモ

通称、黒豆。miniintheboxから激安で購入。
国内で販売されている「eRemote mini」と本体は同じ、国内版は値段が高いし、標準アプリは全く使わないので、回避。汗

初期設定する環境はTinkerBoard(TinkerOS)とする。Debian系ならほぼ同じ?と思われる。

  1. Python control for Broadlink RM2 IR controllers (python-broadlink)のインストール
  • Git clone
$ sudo apt-get install git
$ git clone https://github.com/mjg59/python-broadlink.git
$ cd python-broadlink
  1. Command line interface for python-broadlinkの設定
  • Python2.7系が既にインストール済みなので、OK(3系は動かないっぽい)
$ python
Python 2.7.13 (default, Nov 24 2017, 17:33:09)
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
  • 2系を明示的に呼ぶコマンドもある
$ python2
Python 2.7.13 (default, Nov 24 2017, 17:33:09)
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
  • 2系のdev版が必要なのでインストール
$ sudo apt-get install python2.7-dev
  • PIPのインストール
$ curl -kL https://bootstrap.pypa.io/get-pip.py | python
$ sudo python -m pip install --upgrade pip # pip自身の更新
  • 外部ライブラリのインストール(devel版のインストール後に行うこと)
$ sudo python2 -m pip install configparser
$ sudo python2 -m pip install netaddr
$ sudo python2 -m pip install pycrypto
  • PIPでbroadlinkモジュールを追加
$ sudo pip install broadlink

これで、CLIツール(python-broadlink/cli)が使える

  1. RM3 miniのネットワーク接続設定

下記、GitHubのREADMEを拙い英語力で翻訳したもの。この翻訳結果を元に黒豆のネットワーク接続設定を行う。

Setup a new device on your local wireless network:
ローカルワイヤレスネットワークで新しいデバイスをセットアップする

  1. Long press the reset button until the blue LED is blinking quickly.
  2. 青色のLEDがすばやく点滅するまでリセットボタンを長押しします。
  3. Long press again until blue LED is blinking slowly.
  4. 青色のLEDがゆっくりと点滅するまでもう一度長押ししてください。(なる)
  5. Manually connect to the WiFi SSID named BroadlinkProv.
  6. BroadlinkProvという名前のWiFi SSIDに手動で接続します。
  7. Run setup() and provide your ssid, network password (if secured), and set the security mode.
  8. setupを実行し、ssid、ネットワークパスワード(保護されている場合)、およびセキュリティモードを設定します
  9. Security mode options are (0 = none, 1 = WEP, 2 = WPA1, 3 = WPA2, 4 = WPA1/2)
  10. セキュリティモードのオプションは、(0=なし, 1=WEP, 2=WPA1, 3= WPA2, 4=WPA1 / 2)
  • 2~3. 黒豆を電源に接続しリセットボタンを押して、APモードに設定。(1は省略)

  • 4.はBroadlinkProvという名前のSSIDにWifi接続して設定。

$ sudo iwconfig wlan0 essid BroadlinkProv # WiFiのBroadlinkProvに接続
$ sudo iwconfig # WiFiの接続状況を表示
  • 5~6. は下記のPythonスクリプトを実行。(有線LANを抜いて、TinkerBoardのターミナルで直接実行)
$ cd python-broadlink # git cloneしたpython-broadlinkに移動
$ python2 # Python2を対話モードで実行。下記を入力する。
>>> import broadlink
>>> broadlink.setup('ASUS_RT-AC88U_24G', 'lovesaorihime', 3)
>>> exit()
  1. 黒豆のデバイス情報を表示して保存
    broadlink_discoveryを実行し、ローカルネットワーク上の黒豆のデバイス情報を表示し、ファイルに保存する。
  • デバイス情報の表示
$ cd python-broadlink/cli # git cloneしたpython-broadlink/cliに移動
$ ./broadlink_discovery
discover
###########################################
RM2
# broadlink_cli --type 0x2712 --host 192.168.10.166 --mac ecda5834ea34
Device file data (to be used with --device @filename in broadlink_cli) :
0x2712 192.168.10.166 ecda5834ea34 ## この部分をファイルに保存
temperature = 0.0
  • デバイス情報の0x2712 192.168.10.166 ecda5834ea34をファイルに保存する
$ mkdir ~/bb/device # 任意の場所へ移動
$ echo "0x2712 192.168.10.166 ecda5834ea34" > ~/bb/device/2FBedRoom
  1. 赤外線リモコンの信号を送受信
  • LIGHT_ONファイルに信号を保存。
    下記のコマンド実行後に黒豆に向けて保存したいリモコン操作をする。

  • 保存したデバイスファイル指定

$ ./broadlink_cli --device @/home/linaro/bb/device/2FBedRoom --learnfile ~/bb/ir/LIGHT_ON_OFF
  • デバイス情報(type,host,mac)指定
$ ./broadlink_cli --type 0x2712 --host 192.168.10.166 --mac ecda5834ea34 --learnfile /home/linaro/bb/ir/LIGHT_ON_OFF
  • LIGHT_ONファイルの信号を送信。
    送信したい信号を保存したファイルを指定する。

  • 保存したデバイスファイル指定

$ ./broadlink_cli --device @/home/linaro/bb/device/2FBedRoom --send @~/bb/ir/LIGHT_ON_OFF # 対象の黒豆をデバイスファイル指定
  • デバイス情報(type,host,mac)指定
$ ./broadlink_cli --type 0x2712 --host 192.168.10.166 --mac ecda5834ea34 --send @/home/linaro/bb/ir/LIGHT_ON_OFF # 対象の黒豆をtype,host,mac指定