2017-10-29

JavaFX: LineChart を使いこなそう (8) 日付軸

JavaFX のチャートを使いこなせるようになりたいと、ずいぶん前に LineChart のサンプルを示しました [1]。その時には、横軸にカテゴリの軸を使って整数値の年を文字列に変換して表示しましたが、今回は DateAxis クラスを使って、日付として軸を設定してみます。

使用した環境は以下の通りです。開発版の NetBeans IDE で JDK 9 を使用できることを確認したので、経験を積むためにも Java 9 を積極的に使っていきたいと考えています。

  • OS: Fedora 27 beta (x86_64)
  • Java: jdk-9.0.1-9.0.1-ga.x86_64 (Oracle)
  • IDE: NetBeans IDE Dev (Build 201710270002) [2]

LineChartSample8.java

DateAxis は JavaFX 標準で用意されているクラスではありません。何人かの方が Axis クラスを継承して DataAxis クラスを作成して公開されていますが、ここでは Christian Schudt 氏および Diego Cirujano 氏が著作者 (author) になっているソースを使用させていただきました [3]

プロジェクトは、前述した以前のサンプル [1] の構成と同じですが、プロジェクト内に上記 DateAxis.java を加えています[左図参照]。

それぞれのソースを紹介したいのですが、長くなってしまいますので、ここではメインの LineChartSample8.java だけ紹介します。すべてのソースは GitHub [4] にありますので、そこからクローンして下さい。

リスト:LineChartSample8.java 
package linechartsample8;

import java.util.Calendar;
import java.util.Date;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Series;
import javafx.stage.Stage;

public class LineChartSample8 extends Application {

    @Override
    public void start(Stage stage) {
        stage.setTitle("Line Chart Sample (8)");
        //defining the axes
        DateAxis xAxis = new DateAxis();
        NumberAxis yAxis = new NumberAxis();

        xAxis.setLabel("X軸ラベル(年)");
        yAxis.setLabel("Y軸ラベル(数値)");

        //creating the chart
        LineChart<Date, Number> lineChart = new LineChart<>(xAxis, yAxis);
        lineChart.setData(getChartData());
        lineChart.setTitle("折れ線グラフのサンプル");

        Scene scene = new Scene(lineChart, 800, 400);
        String ClassName = getClass().getSimpleName();
        scene.getStylesheets().add(getClass().getResource(ClassName + ".css").toExternalForm());

        stage.setScene(scene);
        stage.show();
    }

    private ObservableList<XYChart.Series<Date, Number>> getChartData() {
        double y1 = 0.1;
        double y2 = -0.1;
        Series<Date, Number> series1 = new Series<>();
        Series<Date, Number> series2 = new Series<>();

        series1.setName("系列1");
        series2.setName("系列2");

        for (int i = 2011; i < 2021; i++) {
            series1.getData().add(new XYChart.Data<>(getYear(i), y1));
            y1 = y1 + Math.random() - .5;

            series2.getData().add(new XYChart.Data<>(getYear(i), y2));
            y2 = y2 + Math.random() - .5;
        }
        ObservableList<XYChart.Series<Date, Number>> seriesList = FXCollections.observableArrayList();
        seriesList.add(series1);
        seriesList.add(series2);

        return seriesList;
    }

    private Date getYear(int i) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(i, 0, 1, 0, 0);
        return calendar.getTime();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

コンパイルオプション

DateAxis.java のインポート宣言で、パッケージ com.sun.javafx.charts はモジュール javafx.controls で宣言されていますが、エクスポートされていませんというメッセージでエラーになっています。このエラーは、Java 8 では見られなかったものです。

これは Java 9 でモジュールシステムを導入したことにより、パッケージレベルでのカプセル化が可能になったため、JDK の内部 API を使用するとコンパイル エラーにすることが可能になったためのようです。このエラーの解決には代替機能を探すことが推奨されていますが、一時的にこの強力なカプセル化を壊す方法がコンパイラのオプションに --add-exports として追加されています [5][6]。今回は、これを利用します。

--add-exports javafx.controls/com.sun.javafx.charts=ALL-UNNAMED

NetBeans IDE で、このプロジェクトの「プロジェクト・プロパティ」ダイアログを表示させ、「コンパイル」画面の「追加コンパイラ・オプション(L):」のエントリに上記オプションを追加します。これでコンパイルが通るようになります。

コンパイラ・オプションの設定

実行例を以下に示します。

LineChartSample8 の実行例

このサンプルでは、一見、前回の実行例と違いがないように見えますが、Date 型という「数値」で軸を作っていますので、ウィンドウのサイズを変えると目盛り間隔が調整されます。日付を軸に使いたいときは日付に対応した軸を使ったほうが当然便利なのです。日付(通常は、日や時間単位の間隔)を横軸にしてデータのトレンドをプロットするニーズが多いので重宝しています。

参考サイト

  1. bitWalk's: JavaFX: LineChart を使いこなそう (2)
  2. NetBeans IDE ダウンロード
  3. sco0ter / ExtFX / source / src / main / java / extfx / scene / chart / DateAxis.java — Bitbucket
  4. bitwalk123/LineChartSample8
  5. ヌーラボのアカウント基盤を Java 9 にマイグレーションして起きた問題と解決法 | ヌーラボ
  6. Java Platform, Standard Edition Oracle JDK 9 Migration Guide, Release 9

 

ブログランキング・にほんブログ村へ
にほんブログ村

2017-10-28

Java 9 と NetBeans IDE

Java 9 が 9 月 22 日にリリースされ、つづけて 10 月 17 日にクリティカルパッチアップデート 9.0.1 が Oracle 社からリリースされました [1]。私は Java のプログラミングでは NetBeans IDE を愛用していますが、JDK 9 に対応した正式版はまだリリースされていません。しかし、NetBeans IDE の開発版では対応していますので試してみました。

使用した環境は以下の通りです。

  • OS: Fedora 27 beta (x86_64)
  • Java: jdk-9.0.1-9.0.1-ga.x86_64 (Oracle) [1]
  • IDE: NetBeans IDE Dev (Build 201710270002) [2]

これは Java のバージョン System.getProperty("java.version")、JavaFX のバージョン System.getProperty("javafx.runtime.version") およびプラットフォーム System.getProperty("os.name") を表示するだけの簡単な JavaFX の GUI プログラム [3] を実行させた例です。

JavaVersion の実行例

開発版は毎日のように更新されていますが、さすがに毎日インストールし直すことはできません。しかし、週に何回かはインストールし直しています。いずれリリースされる JDK 9 対応の NetBeans IDE 正式版に備え、従来版との違いを確認しながら Java 9 を使い始めています。

参考サイト

  1. Java SE Development Kit 9 - Downloads
  2. NetBeans IDE ダウンロード
  3. bitwalk123/JavaVersion

 

ブログランキング・にほんブログ村へ
にほんブログ村

2017-10-15

Fedora 27 の 32 bit UEFI サポートと ASUS TransBook T100HA

Fedora 27 のベータ版が 10 月 3 日にリリースされました [1]。メインの PC は dnf コマンドで先月アップグレードを済ませてしまっていましたが、このリリースで Live イメージが公開されるのを待っていました。

Fedora 27 では 32 bit UEFI がサポートされるので [2]、64 bit 対応のオペレーティングシステムが動くのに、起動部分だけ 32 bit UEFI にしか対応していなかった廉価な PC にも Fedora をインストールできる可能性が出てきました。既に Fedora が稼働している PC ではインストール用のメディアがなくともアップグレードできますが、Fedora がインストールされていない PC に Fedora を試すには、インストール用のメディアを作成できなければなりません。

このところ、廉価なノート PC に Fedora をインストールして、サブノートとして愛用してきましたが、幸いなことにほとんどの場合で Fedora のインストールに成功しています。唯一まともに Fedora を使えるようにできなかったのは、Amazon.jp プライムデー 2016 で破格な値段の誘惑に負けて買った ASUS TransBook T100HA でした。なんとか Ubuntu 14.04 をインストールして使えるようにはしたものの [3]、ほとんど使わずに埃を被ってしまっていました。

Ubuntu 14.04 on T100HA

ただ Linux が使えるということだけでは不十分で、普通のやりかたでアップデートやアップグレードを重ねて新しい機能を試すことができないと、趣味で Linux 使っている側面の欲求を満たせません。今回、ASUS TransBook T100HA へ Fedora 27 のベータ版を普通にインストールすることに成功したので、顛末をまとめておきます。

Live イメージのダウンロード

まずは [4] のサイトから Fedora 27 Beta Workstation の Live イメージ(ISO フォーマット)をダウンロードしておきます。

MediaWriter で USB メモリのインストールメディアを作成

Fedora 上でダウンロードした ISO ファイルを MediaWriter を使ってインストール用 USB メディアを生成します。しかし残念ながら Fedora 27 ベータ版の MediaWriter が正常に起動しなかったので、Fedora 26 の MediaWriter を使用しました。

  • OS: Fedora 26 (x86_64)
  • MediaWriter: mediawriter-4.1.0-1.fc26.x86_64

Live イメージを作成するブランクの USB メモリを準備し、USB ポートに挿入しておきます。

MediaWriter を起動するにはメニューから選択するか、端末エミュレータ上で以下のように入力します。

$ mediawriter

起動した MediaWriter の画面から、'Custom Image' をクリックします。

'Custom Image' の選択 (MediaWriter)

あらかじめダウンロードしておいた Live イメージ Fedora-Workstation-Live-x86_64-27_Beta-1.5.iso を選択します。

ISO ファイルの選択 (MediaWriter)

次に作成する、すなわちイメージを書き込みするメディアを選択します。

私は粗忽者なので、ここでのメディアの選択を怠り、大切なデータに何度も上書きをしてしまっています。くれぐれもここで正しい書き込み先を設定することを忘れないようにしてください。

作成するメディアの選択 (MediaWriter)

赤い 'Write to Disk' のボタンをクリックすると、root のパスワードの入力を求められます。

root のパスワード入力 (MediaWriter)

イメージの書き込みが始まりますので、終了するまでしばらく待ちます。

イメージの書き込み (MediaWriter)

書き込みとチェックが終わった後、青い 'Close' ボタンが現れますので、クリックして MediaWriter を終了します。

イメージの書き込みの終了 (MediaWriter)

作成したインストールメディアの BOOT フォルダ内をみると確かに BOOTIA32.EFIBOOTX64.EFI というように 32 bit と 64 bit 用の両方のファイルが存在していることを確認できます。

インストールメディアの BOOT フォルダ内のファイル

ASUS TransBook T100HA へのインストール

今回作成したインストールメディアを使って ASUS TransBook T100HA へインストールしました。インストールについては特に問題はありませんでした。Ubuntu 14.04 をインストールしていたときと同じくログイン画面では画面の縦横が逆になっています。

ログイン画面

デスクトップ環境は Cinnamon を使用しており、画面を反時計回りに 90°回転させています。

ディスプレイの設定と回転した画面 (Cinnamon)

インストールは問題なくできたものの、単純に最新に近いカーネルであれば良いというものではなく、正常に動作しないデバイスは相変わらずです。以下に不具合を簡単にまとめました。

  • タッチパネルが効いていない[要調査]
  • 内蔵の WiFi が使えない
  • Bluetooth が使えない
  • 内蔵のサウンド関連のデバイスを使えない
  • キーボードのレイアウトが時々おかしくなる

結局のところ、無い無い尽くしのままです。しかし、タッチパネルについては設定次第である程度使えるようになる可能性があるので、引き続き情報を収集しながらしばらく使ってみます。

追記 (2017-10-17)

この記事を書いたときにはあれこれ試していて時間切れになってしまったので、あとになってもう少し調べました。そもそもタッチパネルの設定ってどうするのか皆目判らなかったので、まずは xinput コマンドで現在の入力デバイスの一覧を表示してみました。

$ xinput --list
⎡ Virtual core pointer                     id=2 [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer               id=4 [slave  pointer  (2)]
⎜   ↳ ASUS Tech Inc. ASUS HID Device           id=11 [slave  pointer  (2)]
⎜   ↳ ASUS Tech Inc. ASUS HID Device           id=12 [slave  pointer  (2)]
⎜   ↳ Logitech USB Receiver                    id=18 [slave  pointer  (2)]
⎜   ↳ Logitech USB Receiver                    id=20 [slave  pointer  (2)]
⎣ Virtual core keyboard                    id=3 [master keyboard (2)]
    ↳ Virtual core XTEST keyboard              id=5 [slave  keyboard (3)]
    ↳ Power Button                             id=6 [slave  keyboard (3)]
    ↳ Video Bus                                id=7 [slave  keyboard (3)]
    ↳ Power Button                             id=8 [slave  keyboard (3)]
    ↳ Sleep Button                             id=9 [slave  keyboard (3)]
    ↳ ASUS Tech Inc. ASUS HID Device           id=10 [slave  keyboard (3)]
    ↳ Intel HID events                         id=13 [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                         id=14 [slave  keyboard (3)]
    ↳ gpio-keys                                id=15 [slave  keyboard (3)]
    ↳ gpio-keys                                id=16 [slave  keyboard (3)]
    ↳ ASUS Tech Inc. ASUS HID Device           id=17 [slave  keyboard (3)]
    ↳ Logitech USB Receiver                    id=19 [slave  keyboard (3)]
$

なにか足りないような…。Ubuntu 14.04 をインストールした時の記事を確認すると肝心のタッチパネル SIS047 の id がポインタデバイス (Virtual core pointer) の一覧に表示されていません。

そこで、Fedora を起動した時のログを確認してみました。

$ dmesg | grep SIS0457
[    3.515740] acpi SIS0457:00: Failed to change power state to D0
[    3.540067] acpi SIS0457:00: Cannot transition from (unknown) to D3hot
[    3.688347] input: SIS0457:00 0457:113D as /devices/pci0000:00/808622C1:05/i2c-5/i2c-SIS0457:00/0018:0457:113D.0004/input/input7
[    3.688587] hid-multitouch 0018:0457:113D.0004: input,hidraw3: I2C HID v1.00 Device [SIS0457:00 0457:113D] on i2c-SIS0457:00
$

システム的にはこのデバイスに対応していているようですが、最初にコケているように見えます。念の為、前後のメッセージも調べました。

...
...
[    3.506907] ACPI Exception: AE_BAD_PARAMETER, Returned by Handler for [UserDefinedRegion] (20170531/evregion-300)
[    3.507044] ACPI Error: Method parse/execution failed \_SB.P33X._ON, AE_BAD_PARAMETER (20170531/psparse-550)
[    3.507150] acpi 80860F14:03: Failed to change power state to D0
[    3.515514] ACPI Exception: AE_BAD_PARAMETER, Returned by Handler for [UserDefinedRegion] (20170531/evregion-300)
[    3.515633] ACPI Error: Method parse/execution failed \_SB.P33X._ON, AE_BAD_PARAMETER (20170531/psparse-550)
[    3.515740] acpi SIS0457:00: Failed to change power state to D0
[    3.540067] acpi SIS0457:00: Cannot transition from (unknown) to D3hot
[    3.560977] intel_ish_ipc 0000:00:0a.0: enabling device (0000 -> 0002)
[    3.580160] mmc1: queuing unknown CIS tuple 0x80 (2 bytes)
[    3.581751] mmc1: queuing unknown CIS tuple 0x80 (3 bytes)
[    3.583369] mmc1: queuing unknown CIS tuple 0x80 (3 bytes)
[    3.583901] mmc0: new HS200 MMC card at address 0001
[    3.586134] mmc1: queuing unknown CIS tuple 0x80 (7 bytes)
[    3.645433] mmc1: new ultra high speed DDR50 SDIO card at address 0001
[    3.674941] mmcblk0: mmc0:0001 CGND3R 58.2 GiB 
[    3.676063] mmcblk0boot0: mmc0:0001 CGND3R partition 1 4.00 MiB
[    3.676611] mmcblk0boot1: mmc0:0001 CGND3R partition 2 4.00 MiB
[    3.677065] mmcblk0rpmb: mmc0:0001 CGND3R partition 3 4.00 MiB
[    3.688347] input: SIS0457:00 0457:113D as /devices/pci0000:00/808622C1:05/i2c-5/i2c-SIS0457:00/0018:0457:113D.0004/input/input7
[    3.688587] hid-multitouch 0018:0457:113D.0004: input,hidraw3: I2C HID v1.00 Device [SIS0457:00 0457:113D] on i2c-SIS0457:00
[    3.692801]  mmcblk0: p1 p2 p3
...
...

う〜ん、わからん。Ubuntu 14.04 に戻すことが頭をよぎりましたが、積極的に使用しなかったディストリビューションに戻しても仕方がないので、引き続きコツコツと調べることにします。Fedora でタッチパネルを使えるようになるまでの道程は遠いです。

 

参考サイト

  1. Releases/27/Schedule - FedoraProject
  2. Changes/32BitUefiSupport - FedoraProject
  3. bitWalk's: ASUS TransBook T100HA と Ubuntu 14.04 LTS
  4. Fedora Workstation Beta のダウンロード
  5. Input device configuration - FedoraProject

 

ブログランキング・にほんブログ村へ
にほんブログ村