2017-08-06

【備忘録】JavaFX GUI メッセージの国際化 --- NetBeans IDE

JavaFX で GUI アプリケーションを作るとき、表示する文字列は英語でなければならない案件ばかりだったため、GUI アプリケーションの国際化について考えてきませんでした。しかし最近になって、ついにというか、ようやくというか、少なくとも英語環境と日本語環境の両方に対応する必要がある案件が出てきましたので、やり方を調べました [1]

使用している環境は以下の通りです。

  • OS: Fedora 26 (x86_64)
  • Java: jdk1.8.0_141-1.8.0_141-fcs.x86_64 (Oracle)
  • IDE: NetBeans IDE 8.2

この環境のロケール [2] は下記のようになっています。

$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
$

国際化の目標

ここでの目標は、ソースを再コンパイルすることなく、実行環境のロケールに応じたメッセージを表示することです。今回は英語をデフォルトとして日本語環境で日本語メッセージを表示することを目標とします。

Hello World!

サンプルとして、NetBeans IDE で空の JavaFX アプリケーションのプロジェクトを作成したときに生成される Hello World! のソースを国際化対応することにします。

メイン・メニューから「ファイル(F)」→「新規プロジェクト(W)...」を選んで、新規プロジェクトを作成するダイアログを開きます。

 

新規プロジェクトのダイアログの「プロジェクト(P)」の欄で JavaFXアプリケーション を選択し、下の「 次 > 」ボタンをクリックして次へ進みます。

 

プロジェクト名(N)」は HelloWorld としました。「終了(F)」ボタンをクリックしてダイアログを終了します。

 

実行すると(いつものように)以下のように表示されます。

 

Java のソースは以下のようになっています。コメント行は取り除きました。

リスト:HelloWorld.java 
package helloworld;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloWorld extends Application {
    
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction((ActionEvent event) -> {
            System.out.println("Hello World!");
        });
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        
        Scene scene = new Scene(root, 300, 250);
        
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

プロパティ・ファイルの追加

国際化に対応させる文字列は、プロパティ・ファイルに保存します。プロパティ・ファイルはキーと値がペアになった形式になっており、キーはプログラムがテキストを読み出すために使用する識別子、値は実際のテキストになります。各ロケールに対して、プロパティ・ファイルを作成しますが、キーは各ロケール共通で、文字列のみが異なります。まずはデフォルトのプロパティ・ファイルを作成します。

HelloWorld パッケージを選択、右クリックでプルダウンメニューを表示させ、「新規」→「その他...」を選択します。

 

「新規ファイル」のダイアログが表示されますので、「カテゴリ(C)」のリストから「その他」を選び、「ファイル・タイプ(F)」のリストで「プロパティ・ファイル」を選びます。下の「 次 > 」ボタンをクリックして次へ進みます。

 

「New プロパティ・ファイル」ダイアログで作成するプロパティ・ファイル名を設定します。ここではプロジェクト名と同じ HelloWorld とします。

 

ブランクの HelloWorld.propertier が生成されます。

 

国際化ウィザードの利用

国際化ウィザードは対象となるソースから文字列を抽出し、プロパティ・ファイルにキーとペアを書き出して、Java プログラムがプロパティ・ファイルと連携するよう、ソースの文字列の箇所に java.util.ResourceBundle.getBundle() を埋め込んでくれます。

国際化ウィザードを利用するには、メイン・メニューから、「ツール(T)」>「国際化(Z)」>「国際化ウィザード(I)」を選択します。

 

国際化ウィザートのダイアログの最初のステップ「1. 国際化するソースを選択する」では、国際化の対象となるソースを選択します。この例では HelloWorld.java のみです。下の「 次 > 」ボタンをクリックして次へ進みます。

 

次のステップ「2. ソースのリソースを選択」では、ソースとリソースであるプロパティファイルを対応させるのですが、この例では同じ名前の HelloWorld.propeties しかありませんので、そのまま下の「 次 > 」ボタンをクリックして次へ進みます。

 

「3. フィールドの生成」ステップでは、この場合、何も変更せず、下の「 次 > 」ボタンをクリックして次へ進みます。

 

最後の「4. 見つかった文字列の変更」ステップではウィザードは抽出した文字列からキーが先生されて表示されます。この例ではこのまま「終了(F)」ボタンをクリックしてウィザードを終了させます。

 

ウィザード終了後、HelloWorld.java の文字列の箇所は下記のように java.util.ResourceBundle.getBundle() で置換されています。

リスト:HelloWorld.java(国際化ウィザード終了後) 
package helloworld;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloWorld extends Application {
    
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText(java.util.ResourceBundle.getBundle("helloworld/HelloWorld").getString("SAY 'HELLO WORLD'"));
        btn.setOnAction((ActionEvent event) -> {
            System.out.println(java.util.ResourceBundle.getBundle("helloworld/HelloWorld").getString("HELLO WORLD!"));
        });
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        
        Scene scene = new Scene(root, 300, 250);
        
        primaryStage.setTitle(java.util.ResourceBundle.getBundle("helloworld/HelloWorld").getString("HELLO WORLD!"));
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

空だった HelloWorld.properties には以下のようにキーと値のペアが書き込まれています。

リスト:HelloWorld.properties 
SAY\ 'HELLO\ WORLD'=Say 'Hello World'
HELLO\ WORLD!=Hello World!

日本語ロケールの追加

国際化に対応した HelloWorld.java と、デフォルトの HelloWorld.properties ファイルの準備ができたので、今度は日本語のメッセージを用意します。

デフォルトの HelloWorld.properties ファイルを選択して右クリックしてプルダウンメニューを表示させ、「追加(A)」→「ロケール...」を選択します。

 

「新規ロケール」のダイアログが表示されますので、「事前定義ロケール(P)」のリストから ja_JP を選択して「 OK 」ボタンをクリックしてダイアログを閉じます。

※「事前定義…」ってなんだ?と思いましたが、英語版のメッセージは Predefined ですので、要するに「定義済み…」という意味なのでしょう。

 

HelloWorld_ja_JP.properties が生成されます。生成後は HelloWorld.properties と同じ内容になっていますので、次のように編集しました。

リスト:編集後の HelloWorld_ja_JP.properties 
SAY\ 'HELLO\ WORLD'=「こんにちは、世界!」と出力
HELLO\ WORLD!=こんにちは、世界!

あらためてプロジェクトをビルド・実行すると。以下の通り、ばっちりメッセージが日本語に変わりました(下左図)。

念の為 HelloWorld.jar を Windows 10(日本語版, 32bit)へコピー・実行して確認してみたところ、同様に日本語メッセージが表示されました(下右図)。

 

参考サイト

  1. GUIフォームの国際化 - NetBeans IDEチュートリアル
  2. ロケールとは - 国際化対応言語環境の利用ガイド

 

国際化に関しては、こんなに古い本しか出回っていません。😢

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

2017-07-28

Oracle、32件の脆弱性を修正した「Java SE 8 Update 141」を公開 - 窓の杜

Java SE 8 Update 141 を Oracle 社が公開したのは 7 月 18 日のことですので、すいぶん時間が経ってしまいましたが、OpenJDK 8 の Update 141 (java-1.8.0-openjdk-1.8.0.141-1.b16.fc26.x86_64) が Fedora でもそれから数日遅れで利用可能になりました。

今回は Fedora 26 上で、OpenJDK と OenJFX の組み合わせでバージョン表示をしてみました。

参考サイト

  1. Oracle、32件の脆弱性を修正した「Java SE 8 Update 141」を公開 - 窓の杜
  2. OpenJDK
  3. bitwalk123/JavaVersion

 

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

2017-06-18

【備忘録】Rのplsパッケージの使い方

PLS 回帰, Partial Least Squares Regression(部分的最小二乗回帰)とは、目的変数 Yを予測するために係数を最適化する手法のひとつです。

業務でこの手法を応用したツールを使っているのですが、導き出した結果を検証する環境を探していたところ、R の pls パッケージであれば十分な検証ができそうだということが判りました。そこで、この pls パッケージの使い方を備忘録的にまとめました。

動作環境は次の通りです。

  • OS: Fedora 26 x86_64 (beta)
  • R-core-3.4.0-2.fc26.x86_64
  • rstudio-1.0.143-1.x86_64

ここでは参考サイト [1] に従って、自分で動作を確認して備忘録にすることが目的なので、統計的解釈に深くは立ち入っていないことをご了承下さい。また、あとで得た知見で書き直したり書き足したりすることもあります。

pls パッケージのインストール

R を起動して、以下のコマンドで pls パッケージをインストールします。

> install.packages("pls")
 パッケージを ‘/home/bitwalk/R/x86_64-redhat-linux-gnu-library/3.4’ 中にインストールします 
 (‘lib’ が指定されていないため) 
 --- このセッションで使うために、CRAN のミラーサイトを選んでください --- 
 URL 'https://cran.ism.ac.jp/src/contrib/pls_2.6-0.tar.gz' を試しています 
Content type 'application/x-gzip' length 809111 bytes (790 KB)
==================================================
downloaded 790 KB

* installing *source* package ‘pls’ ...
**  パッケージ ‘pls’ の解凍および MD5 サムの検証に成功しました 
** R
** data
*** moving datasets to lazyload DB
** inst
** preparing package for lazy loading
** help
*** installing help indices
  converting help for package ‘pls’
    finding HTML links ...  完了 
    biplot.mvr                              html  
...
...
** building package indices
** installing vignettes
** testing if installed package can be loaded
* DONE (pls)

 ダウンロードされたパッケージは、以下にあります 
  ‘/tmp/RtmpBE2Z3b/downloaded_packages’ 
> 

最初に、pls パッケージを library でロードしておきます。

> library(pls)
 次のパッケージを付け加えます: ‘pls’ 

 以下のオブジェクトは ‘package:stats’ からマスクされています: 

     loadings 

> 

使用するサンプル

以下のサンプルデータを用いますので、data でロードします。

> data(gasoline)

データの精度を4桁に設定します。

> options(digits = 4)

サンプルデータ gasoline の解析

> ?gasoline
gasoline                  package:pls                  R Documentation

Octane numbers and NIR spectra of gasoline

Description:

     A data set with NIR spectra and octane numbers of 60 gasoline
     samples.  The NIR spectra were measured using diffuse reflectance
     as log(1/R) from 900 nm to 1700 nm in 2 nm intervals, giving 401
     wavelengths.  Many thanks to John H. Kalivas.

Usage:

     gasoline
     
Format:

     A data frame with 60 observations on the following 2 variables.

     ‘octane’ a numeric vector.  The octane number.

     ‘NIR’ a matrix with 401 columns.  The NIR spectrum.

Source:

     Kalivas, John H. (1997) Two Data Sets of Near Infrared Spectra
     _Chemometrics and Intelligent Laboratory Systems_, *37*, 255-259.

サンプルの gasoline データ(オクタン価とガソリンの拡散反射の近赤外線分光データ、NIR スペクトル)を解析します。データは以下のような構造になっています。

> names(gasoline)
[1] "octane" "NIR"   
> gasoline$octane
 [1] 85.30 85.25 88.45 83.40 87.90 85.50 88.90 88.30 88.70 88.45 88.75 88.25
[13] 87.30 88.00 88.70 85.50 88.65 88.75 85.40 88.60 87.00 87.15 87.05 87.25
[25] 86.85 88.65 86.60 86.00 86.10 86.50 86.30 84.40 84.70 84.60 84.50 88.10
[37] 85.25 88.40 88.20 88.40 88.55 88.35 88.20 85.30 88.50 88.25 88.00 88.85
[49] 88.45 88.70 88.10 87.60 88.35 85.10 85.10 84.70 87.20 86.60 89.60 87.10
> gasoline$NIR
      900 nm    902 nm    904 nm    906 nm    908 nm    910 nm    912 nm
1  -0.050193 -0.045903 -0.042187 -0.037177 -0.033348 -0.031207 -0.030036
2  -0.044227 -0.039602 -0.035673 -0.030911 -0.026675 -0.023871 -0.022571
...
...
 [ reached getOption("max.print") -- 58 行を無視しました ] 

gasoline$octane の要素は、波長ごとに NIR スペクトルのリスト(ベクトル)になっています。もう少し詳しく調べてみます。

> dim(gasoline$NIR)
[1]  60 401
> dimnames(gasoline$NIR)
[[1]]
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15" "16"
[17] "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" "31" "32"
[33] "33" "34" "35" "36" "37" "38" "39" "40" "41" "42" "43" "44" "45" "46" "47" "48"
[49] "49" "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" "60"

[[2]]
  [1] "900 nm"  "902 nm"  "904 nm"  "906 nm"  "908 nm"  "910 nm"  "912 nm"  "914 nm" 
  [9] "916 nm"  "918 nm"  "920 nm"  "922 nm"  "924 nm"  "926 nm"  "928 nm"  "930 nm" 
...
...
[393] "1684 nm" "1686 nm" "1688 nm" "1690 nm" "1692 nm" "1694 nm" "1696 nm" "1698 nm"
[401] "1700 nm"

イメージしやすいように、gasoline$octane のデータについて、波長を横軸にとってプロットしてみました。もっとスマートなプロットの仕方があると思いますが、とりあえず、これでお許しください。

> y.values <- gasoline$NIR
> x.label <- colnames(y.values)
> x.value <- as.numeric(substring(x.label, 1, nchar(x.label) - 3))
> plot(x.value, y.values[1,], type = "n", main = "NIR spectra of gasoline samples", xlab = "wavelength", ylab = "log(1/R)")
> for (i in 1:nrow(y.values)) lines(x.value, y.values[i, ], type = "l")

このデータ解析の目的は、

octane = f(NIR) = f(NIRwavelength1, NIRwavelength2, ...)

という関数関係を求めて、スペクトルからオクタン価を予測することなのですが、401 個の変数(NIR スペクトル)、60 組のデータでは、従来の重回帰分析を使おうとしても自由度が全然足りなくて解析できません。しかし、401 個のデータは互いに独立した関係にないので、これら NIR スペクトルの代わりに、主成分分析で主成分に分解し、目的変数と相関のある成分 compn から関数関係を求めます。

octane = g(compwavelength1, compwavelength2, ...)

まず、データをトレーニング用とテスト用の二つに分けます。

> gasTrain <- gasoline[1:50,]
> gasTest <- gasoline[51:60,]

フィッティングはトレーニング用のデータ gasTrain を用いて次のようにします。

> gas1 <- plsr(octane ~ NIR, ncomp = 10, data = gasTrain, validation = "LOO")

このフィッティングでは 10 個の成分で行われ、一個抜き交差検証, leave-one-out (LOO) cross-validated predictions が実施されています。

フィッティングと検証結果は summary で確認できます。

> summary(gas1)
Data:  X dimension: 50 401 
 Y dimension: 50 1
Fit method: kernelpls
Number of components considered: 10

VALIDATION: RMSEP
Cross-validated using 50 leave-one-out segments.
       (Intercept)  1 comps  2 comps  3 comps  4 comps  5 comps  6 comps  7 comps  8 comps  9 comps  10 comps
CV           1.545    1.357   0.2966   0.2524   0.2476   0.2398   0.2319   0.2386   0.2316   0.2449    0.2673
adjCV        1.545    1.356   0.2947   0.2521   0.2478   0.2388   0.2313   0.2377   0.2308   0.2438    0.2657

TRAINING: % variance explained
        1 comps  2 comps  3 comps  4 comps  5 comps  6 comps  7 comps  8 comps  9 comps  10 comps
X         78.17    85.58    93.41    96.06    96.94    97.89    98.38    98.85    99.02     99.19
octane    29.39    96.85    97.89    98.26    98.86    98.96    99.09    99.16    99.28     99.39>

ちなみに、gas1 は以下のような構造になっています。

> names(gas1)
 [1] "coefficients"    "scores"          "loadings"        "loading.weights"
 [5] "Yscores"         "Yloadings"       "projection"      "Xmeans"         
 [9] "Ymeans"          "fitted.values"   "residuals"       "Xvar"           
[13] "Xtotvar"         "fit.time"        "ncomp"           "method"         
[17] "validation"      "call"            "terms"           "model"

実測値と予測値の最小二乗誤差 RMSEP, Root Mean Square Error of Prediction が小さいほどフィッティングが良いと考えることができます。gas1 では成分 (comps) が 10 までの関係を調べてありますので、成分の数とフィッティング (RMSEP) との関係をプロットしてみます。

> plot(RMSEP(gas1), legendpos = "topright")

このプロットによると、octane を表現するのに二成分あればほぼ十分であるということが判ります。二成分のときの RMSEP は 0.2966 です。

成分の数が決まれば、その成分で予測した値と実測値との相関を確認することができます。

> plot(gas1, ncomp = 2, asp = 1, line = TRUE)

次に最初の3つの成分の得点 score の一覧表を作ります。

> plot(gas1, plottype = "scores", comps = 1:3)

この例では、特に目立った傾向が見られません。成分の得点一覧は次のように explvar で表示できます。

> explvar(gas1)
    Comp 1     Comp 2     Comp 3     Comp 4     Comp 5     Comp 6     Comp 7     Comp 8     Comp 9    Comp 10 
78.1707683  7.4122245  7.8241556  2.6577773  0.8768214  0.9466384  0.4921537  0.4723207  0.1688272  0.1693770 
>

成分の負荷量 loading をプロットすることは、成分を解釈するためによく使われます。

> plot(gas1, "loadings", comps = 1:2, legendpos = "topleft", labels = "numbers", xlab = "nm")

解析を始める前にデータをトレーニング用とテスト用の二つに分けましたが、テスト用のデータ gasTest を用いて、二つの成分で予測値を計算するには次のようにします。

> predict(gas1, ncomp = 2, newdata = gasTest)
, , 2 comps

     octane
51 87.94125
52 87.25242
53 88.15832
54 84.96913
55 85.15396
56 84.51415
57 87.56190
58 86.84622
59 89.18925
60 87.09116

> 

テスト用のデータ gasTest は octane の実測値が含まれていますので、各成分数ごとの予測値との RMSEP を算出することができます。

> RMSEP(gas1, newdata = gasTest)
(Intercept)      1 comps      2 comps      3 comps      4 comps      5 comps      6 comps      7 comps      8 comps      9 comps     10 comps  
     1.5369       1.1696       0.2445       0.2341       0.3287       0.2780       0.2703       0.3301       0.3571       0.4090       0.6116  
> 

まとめ

参考サイト [1] の一部を、自分で確認してきましたが、これでおおよその使い方を掴めました。あとは、自分のデータを使って、業務で使っているツールが導き出す結果を検証できるように、もう少しこのパッケージを使い込んでいきたいと考えています。

参考サイト

  1. Introduction to the pls Package

 

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

2017-05-26

【備忘録】JavaFXで8種より多いシンボルを LineChart に表示する

R を使ってある事象をチャートで説明したところ、なんと(社内の)担当者が R のスクリプトを理解できないということが判明し、仕方なく JavaFX で同じようなプロットを作ることになりました。R ではスマートに計算できるベクトルの計算が、Java ではうまく行かず冗長になりますが、それでもやってやれないことはないと取り掛かったのですが、思わぬところで行き詰まってしまいました。この作業では珍しくシンボルの数が多いのですが、今までのやり方では8種までしかシンボルの色などを設定できなかったのです。

下記は無事この問題が解決した後のプロット例です。

従来は下記のように CSS ファイルで、.default-color0.chart-... の太字の数字の部分を順番に 0, 1, 2, ... と増やして対応させていましたが、この方法だと 7 までしか使えません。

.default-color0.chart-series-line { ... }
.default-color0.chart-line-symbol { ... }
...
...
...

参考サイト [1] によると、.default-color0.chart-... を使わずに、代わりに .series0.chart-... を使うと良いとのことです。下記のようにして 14 種類の線およびシンボルを無事表示されることができました。

リスト:シンボルが多いときの CSS 設定例 
.chart-series-line {
    -fx-stroke-width: 1px;
    -fx-effect: null;
}

.series0.chart-series-line { -fx-stroke: transparent; }
.series0.chart-line-symbol {
    -fx-background-color: #c0c0c0, #c0c0c0;
    -fx-background-radius: 3px;
    -fx-padding: 3px;
}

.series1.chart-legend-item-symbol {
    -fx-background-color: #ff0000;
    -fx-background-radius: 0;
    -fx-background-insets: 0;
    -fx-shape: "M0,5 L0,7 L12,7 L12,5 Z";
    -fx-scale-shape: false;
}

.series2.chart-series-line {
    -fx-stroke: #ff0000;
    -fx-stroke-width: 1px;
}
.series2.chart-line-symbol {
    -fx-background-color: #ff0000, #ff0000;
    -fx-background-radius: 0px;
    -fx-padding: 0px;
}
.series2.chart-legend-item-symbol {
    -fx-background-color: #ff0000;
    -fx-background-radius: 0;
    -fx-background-insets: 0;
    -fx-shape: "M0,5 L0,7 L12,7 L12,5 Z";
    -fx-scale-shape: false;
}

.series3.chart-series-line { -fx-stroke: transparent; }
.series3.chart-line-symbol {
    -fx-background-color: #008080, #008080;
    -fx-background-radius: 2px;
    -fx-padding: 2px;
}
.series4.chart-series-line { -fx-stroke: transparent; }
.series4.chart-line-symbol {
    -fx-background-color: #008080, #008080;
    -fx-background-radius: 0;
    -fx-background-insets: 0;
    -fx-shape: "M2,0 L5,4 L8,0 L10,0 L10,2 L6,5 L10,8 L10,10 L8,10 L5,6 L2,
        10 L0,10 L0,8 L4,5 L0,2 L0,0 Z";
}

.series5.chart-series-line { -fx-stroke: transparent; }
.series5.chart-line-symbol {
    -fx-background-color: #0040c0, #0040c0;
    -fx-background-radius: 2px;
    -fx-padding: 2px;
}
.series6.chart-series-line { -fx-stroke: transparent; }
.series6.chart-line-symbol {
    -fx-background-color: #0040c0, #0040c0;
    -fx-background-radius: 0;
    -fx-background-insets: 0;
    -fx-shape: "M2,0 L5,4 L8,0 L10,0 L10,2 L6,5 L10,8 L10,10 L8,10 L5,6 L2,
        10 L0,10 L0,8 L4,5 L0,2 L0,0 Z";
}

.series7.chart-series-line { -fx-stroke: transparent; }
.series7.chart-line-symbol {
    -fx-background-color: #0000ff, #0000ff;
    -fx-background-radius: 2px;
    -fx-padding: 2px;
}
.series8.chart-series-line { -fx-stroke: transparent; }
.series8.chart-line-symbol {
    -fx-background-color: #0000ff, #0000ff;
    -fx-background-radius: 0;
    -fx-background-insets: 0;
    -fx-shape: "M2,0 L5,4 L8,0 L10,0 L10,2 L6,5 L10,8 L10,10 L8,10 L5,6 L2,
        10 L0,10 L0,8 L4,5 L0,2 L0,0 Z";
}

.series9.chart-series-line { -fx-stroke: transparent; }
.series9.chart-line-symbol {
    -fx-background-color: #4000c0, #4000c0;
    -fx-background-radius: 2px;
    -fx-padding: 2px;
}
.series10.chart-series-line { -fx-stroke: transparent; }
.series10.chart-line-symbol {
    -fx-background-color: #4000c0, #4000c0;
    -fx-background-radius: 0;
    -fx-background-insets: 0;
    -fx-shape: "M2,0 L5,4 L8,0 L10,0 L10,2 L6,5 L10,8 L10,10 L8,10 L5,6 L2,
        10 L0,10 L0,8 L4,5 L0,2 L0,0 Z";
}

.series11.chart-series-line { -fx-stroke: transparent; }
.series11.chart-line-symbol {
    -fx-background-color: #800080, #800080;
    -fx-background-radius: 2px;
    -fx-padding: 2px;
}
.series12.chart-series-line { -fx-stroke: transparent; }
.series12.chart-line-symbol {
    -fx-background-color: #800080, #800080;
    -fx-background-radius: 0;
    -fx-background-insets: 0;
    -fx-shape: "M2,0 L5,4 L8,0 L10,0 L10,2 L6,5 L10,8 L10,10 L8,10 L5,6 L2,
        10 L0,10 L0,8 L4,5 L0,2 L0,0 Z";
}

.series13.chart-series-line { -fx-stroke: transparent; }
.series13.chart-line-symbol {
    -fx-background-color: #ff0000, #ff0000;
    -fx-background-radius: 4px;
    -fx-padding: 4px;
}

JavaFX に書き直したからと言って、くだんの担当者に理解してもらえるかどうかはあやしいのですが、このことで出来なかったことが出来るようになったので良しとし、備忘録としました。

参考サイト

  1. java - setting more than eight colors for data series in JavaFX ScatterChart - Stack Overflow
  2. bitWalk's: JavaFX: LineChart を使いこなそう (3)

 

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

2017-05-06

Fedora 26 アルファ版へアップグレード

Linux ディストリビューションのひとつ、Fedora は、年に二回の頻度で新しいバージョンがリリースされています。スケジュール通りにリリースされれば、5 月の連休中にベータバージョンをインストールできるのですが、リリーススケジュールは遅延するのが常です。次期バージョンの Fedora 26 のベータリリースは、現時点では 2017-05-30 となっています [1]

この連休中にアップグレードを済ませておきたかったので、以下の手順で Fedora 25 からアルファ版の Fedora 26 へアップグレードしました。

  1. dnf update --refresh
  2. dnf install dnf-plugin-system-upgrade
  3. dnf system-upgrade download --releasever=26
  4. dnf system-upgrade reboot

以下が実際の例です。

$ su
パスワード:
# dnf update --refresh
Dropbox Repository                              8.2 kB/s | 2.4 kB     00:00    
google-chrome                                    38 kB/s | 3.8 kB     00:00    
Visual Studio Code                              388 kB/s | 238 kB     00:00    
依存性が解決されました。
================================================================================
 Package      アーキテクチャ バージョン                      リポジトリ    容量
================================================================================
アップグレード:
 code         x86_64         1.12.1-1493934217.el7           code          59 M

トランザクションの要約
================================================================================
アップグレード  1 パッケージ

総ダウンロード容量: 59 M
これでいいですか? [y/N]: y
パッケージをダウンロードしています:
code-1.12.1-1493934217.el7.x86_64.rpm           6.6 MB/s |  59 MB     00:08    
--------------------------------------------------------------------------------
合計                                            6.5 MB/s |  59 MB     00:09     
トランザクションの確認を実行中...
トランザクションの確認に成功しました。
トランザクションのテストを実行中...
トランザクションのテストに成功しました。
トランザクションを実行中...
  アップグレード: code-1.12.1-1493934217.el7.x86_64                         1/2 
  整理中        : code-1.11.2-1492070635.el7.x86_64                         2/2 
  検証中        : code-1.12.1-1493934217.el7.x86_64                         1/2 
  検証中        : code-1.11.2-1492070635.el7.x86_64                         2/2 

アップグレード済み:
  code.x86_64 1.12.1-1493934217.el7                                             

完了しました!
# dnf install dnf-plugin-system-upgrade
メタデータの期限切れの確認は、0:01:57 時間前の Sat May  6 11:32:25 2017 に実施しました。
依存性が解決されました。
================================================================================
 Package                             アーキテクチャ
                                              バージョン        リポジトリ
                                                                           容量
================================================================================
インストール:
 dnf-plugin-system-upgrade           noarch   0.7.1-4.fc25      updates    48 k
 python3-dnf-plugin-system-upgrade   noarch   0.7.1-4.fc25      updates    31 k

トランザクションの要約
================================================================================
インストール  2 パッケージ

総ダウンロード容量: 79 k
インストールされる容量: 173 k
これでいいですか? [y/N]: y
パッケージをダウンロードしています:
(1/2): python3-dnf-plugin-system-upgrade-0.7.1- 120 kB/s |  31 kB     00:00    
(2/2): dnf-plugin-system-upgrade-0.7.1-4.fc25.n 178 kB/s |  48 kB     00:00    
--------------------------------------------------------------------------------
合計                                             12 kB/s |  79 kB     00:06     
トランザクションの確認を実行中...
トランザクションの確認に成功しました。
トランザクションのテストを実行中...
トランザクションのテストに成功しました。
トランザクションを実行中...
  インストール  : python3-dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch     1/2 
  インストール  : dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch             2/2 
  検証中        : dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch             1/2 
  検証中        : python3-dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch     2/2 

インストール済み:
  dnf-plugin-system-upgrade.noarch 0.7.1-4.fc25                                 
  python3-dnf-plugin-system-upgrade.noarch 0.7.1-4.fc25                         

完了しました!
# dnf system-upgrade download --releasever=26
Fedora 26 - x86_64 - Updates                    1.9 kB/s | 257  B     00:00    
RPM Fusion for Fedora 26 - Nonfree              122 kB/s | 158 kB     00:01    
RPM Fusion for Fedora 26 - Free                 688 kB/s | 529 kB     00:00    
Fedora 26 - x86_64                              6.4 MB/s |  53 MB     00:08    
Failed to synchronize cache for repo 'rpmfusion-free-updates', 無効化。
Failed to synchronize cache for repo 'Dropbox', 無効化。
Failed to synchronize cache for repo 'rpmfusion-nonfree-updates', 無効化。
メタデータの期限切れの確認は、0:01:13 時間前の Sat May  6 11:35:52 2017 に実施しました。
依存性が解決されました。
================================================================================
 Package                         アーキテクチャ
                                        バージョン                 リポジトリ
                                                                           容量
================================================================================
インストール:
 beignet                         x86_64 1.3.1-1.fc26               fedora 4.6 M
 blivet-gui                      noarch 2.1.3-1.fc26               fedora 300 k
 clang-libs                      x86_64 3.9.1-2.fc26               fedora 8.7 M
 cldr-emoji-annotation           noarch 31.0.0_1-1.fc26            fedora 2.0 M
 compat-openssl10                x86_64 1:1.0.2j-6.fc26            fedora 1.1 M
...
...
...
  zlib.x86_64 1.2.11-2.fc26                                                     
  zlib-devel.x86_64 1.2.11-2.fc26                                               
  zziplib.x86_64 0.13.62-8.fc26                                                 

ダウングレード済み:
  blender.x86_64 1:2.78c-1.fc26                                                 
  blender-fonts.noarch 1:2.78c-1.fc26                                           
  inkscape.x86_64 0.92.0-11.fc26                                                
...
...
...

完了しました!
Download complete! Use 'dnf system-upgrade reboot' to start the upgrade.
ダウンロードされたパッケージは、次の成功するトランザクションまで、キャッシュに保存されます。
'dnf clean packages' を実行することでキャッシュを削除できます。
# dnf system-upgrade reboot

最後のリブート処理で、パッケージのアップグレードと整理が始まります。時間はかかりましたが、アップグレードを無事終了することができました。

Fedora 26 の新しい機能などについては別記事でレポートして行く予定です。

参考サイト

  1. Releases/26/Schedule - FedoraProject

 

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