2016-01-31

Java でメッセージダイジェストを生成

Java の MessageDigest クラスは、MD5 あるいは SHA などのメッセージダイジェストアルゴリズムの機能を提供しています。

以前、bitWalk's: MD5 & SHA Checksum Utility で Windows 上で動作する MD5 & SHA Checksum Utility を紹介しましたが、Java で同じようなことを実現してみようと思い、簡単なサンプルを JavaFX で作ってみました。なお、MessageDigest クラスの使い方は、参考サイト [1] を参考にさせていただきました。

動作を確認した環境は次の通りです。

  • OS: Fedora 23 (x86_64)
  • Java: Java SE 1.8.0_72 (jdk1.8.0_72-1.8.0_72-fcs.x86_64)
  • IDE: NetBeans IDE 8.1

サンプルプログラムを以下に示しました。参考サイト [2] の GitHub にイメージを含む全ソースをアップしてあります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package hashcalc;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.RowConstraints;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javax.xml.bind.DatatypeConverter;
 
public class HashCalc extends Application {
 
    String baseDir = getClass().getResource("image/").toString();
    Image icoApp = new Image(baseDir + "Binary.png");
    Image icoFile = new Image(baseDir + "File.png");
    Image icoPen = new Image(baseDir + "Pencil.png");
 
    File file;
    TextField field_sha256;
 
    @Override
    public void start(Stage primaryStage) {
 
        BorderPane root = new BorderPane();
        Scene scene = new Scene(root);
 
        GridPane gridpane = new GridPane();
        gridpane.setPadding(new Insets(5));
        gridpane.setHgap(5);
        gridpane.setVgap(2);
 
        ColumnConstraints column1 = new ColumnConstraints();
        ColumnConstraints column2 = new ColumnConstraints(600);
        ColumnConstraints column3 = new ColumnConstraints();
        gridpane.getColumnConstraints().addAll(column1, column2, column3);
 
        RowConstraints row1 = new RowConstraints();
        row1.setFillHeight(true);
        RowConstraints row2 = new RowConstraints();
        row2.setFillHeight(true);
        gridpane.getRowConstraints().addAll(row1, row2);
 
        // File Name label
        Label label_file = new Label("File Name");
        GridPane.setHalignment(label_file, HPos.RIGHT);
        gridpane.add(label_file, 0, 0);
 
        // File Name field
        TextField field_file = new TextField();
        field_file.setEditable(false);
        GridPane.setHalignment(field_file, HPos.LEFT);
        gridpane.add(field_file, 1, 0);
 
        // File Name button
        Button button_file = new Button();
        button_file.setGraphic(new ImageView(icoFile));
        button_file.setOnAction((ActionEvent t) -> {
            FileChooser fileChooser = new FileChooser();
            file = fileChooser.showOpenDialog(primaryStage);
            field_file.setText(file.toString());
            clearMessageDigest();
        });
        gridpane.add(button_file, 2, 0);
 
        // SHA-256 label
        Label label_sha256 = new Label("SHA-256");
        GridPane.setHalignment(label_sha256, HPos.RIGHT);
        gridpane.add(label_sha256, 0, 1);
 
        // SHA-256 field
        field_sha256 = new TextField();
        field_sha256.setEditable(false);
        GridPane.setHalignment(field_sha256, HPos.LEFT);
        gridpane.add(field_sha256, 1, 1);
 
        // SHA-256 button
        Button button_sha256 = new Button();
        button_sha256.setGraphic(new ImageView(icoPen));
        button_sha256.setOnAction((ActionEvent t) -> {
            try {
                String md = calcMessageDigest("SHA-256");
                field_sha256.setText(md);
            } catch (NoSuchAlgorithmException | IOException ex) {
                Logger.getLogger(HashCalc.class.getName()).log(Level.SEVERE, null, ex);
            }
        });
        gridpane.add(button_sha256, 2, 1);
 
        root.setCenter(gridpane);
        primaryStage.setResizable(false);
        primaryStage.setTitle("HashCalc");
        primaryStage.getIcons().add(icoApp);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
 
    void clearMessageDigest() {
        field_sha256.setText("");
    }
 
    String calcMessageDigest(String algorithm) throws NoSuchAlgorithmException, FileNotFoundException, IOException {
 
        if (isEmpty(file)) {
            return "";
        }
        if (!checkBeforeReadfile(file)) {
            return "";
        }
 
        MessageDigest md = MessageDigest.getInstance(algorithm);
        FileInputStream in = new FileInputStream(file);
 
        byte[] dataBytes = new byte[1024];
 
        int nread = 0;
        while ((nread = in.read(dataBytes)) != -1) {
            md.update(dataBytes, 0, nread);
        }
        byte[] mdbytes = md.digest();
 
        return DatatypeConverter.printHexBinary(mdbytes);
    }
 
    boolean isEmpty(File value) {
        return value == null || value.length() == 0;
    }
 
    static boolean checkBeforeReadfile(File read) {
        if (read.exists()) {
            if (read.isFile() && read.canRead()) {
                return true;
            }
        }
 
        return false;
    }
 
    public static void main(String[] args) {
        launch(args);
    }
}

実行例

試しに、Fedora 23 の Live-CD のイメージを使ってみましたが、まあ許容できる時間で結果を返してくれます。本格的なユーティリティプログラムとして使うには、もう少し GUI を作りこむ必要がありそうです。

参考サイト

  1. Java SHA Hashing Example
  2. bitwalk123/HashCalc

 

2016-01-25

Oracle Critical Patch Update - January 2016

Oracle は 19 日、Critical Patch Update (CPU) を公開しました。JDK では、8 update 71 と 72 が公開されています。最近、CPU, Critical Patch Update と PSU, Patch Set Update が同時にリリースされることが多いのですが、なんだか判りづらいですね。

2016-01-19

Kindle Paperwhite を購入して

2007 年 11 月に米国で Kindle が Amazon.com から発売され、いよいよ本格的に電子書籍時代到来かと思ったものですが、当時、日本の Amazon.jp から Kindle がすぐには発売されませんでした。

2012 年になっていよいよ Amazon.jp から Kindle が発売されることになり、(結局、様子見を決め込んで買いませんでしたが)購入を真剣に検討し始めたことを覚えています。発売前後の記事を拾ってみました。

E30HT という Windows Mobile の端末を 2009 年に購入したものの、一年程度で壊れてしまい、それ以来、間に合わせで買ったガラケーをずっと使い続けていました。

ところが、一年ほど前に会社から iPhone 5S が支給され、ようやく人並みにスマホなるものを使うようになり、これによってガラケーとの距離はすっかり遠くなってしまいました。

書籍についても、Apple Store で読みたい書籍は大抵は入手できるので、iPhone で本を読むようになり、少なくとも小説などは紙媒体を買わなくなりました。ただ、画面が小さいことが最大の難点でした。

それで、いよいよ Amazon の Kindle を買う時がきたと思い、今年になってようやく、Kindle Paperwhite(ニューモデル)WiFi モデルのキャンペーン情報なしのものを 16,280 円(実際にはポイントや割引でずいぶん安く買っています)で購入したのでした。

実は、Fire タブレットが、プライム会員の割引価格 4,980 円で買えることに大変心惹かれたのですが、本来の購入目的が、文庫本を読むための電子デバイスであったので、カラー画面よりもバッテリーの持ちが良いことを優先することにしました。

あとは、いわゆる電子ペーパーの今の実力を知りたいという興味もありました。

ちなみに Kindle Paperwhite のディスプレイの仕様には

Carta電子ペーパー技術採用6インチPaperwhiteディスプレイ、解像度300ppi、内蔵型ライト、フォント最適化技術、16階調グレースケール

とあります。

本を読むための専用電子デバイスにどこまでコストをかけるかは、人それぞれだとは思いますが、紙媒体の書籍のスペースを確保しなくても良いことと、持ち運びのし易さを勘案して、このぐらいは許容できるだろうと考えました。

使用感

Kindle Paperwhite を購入後、最初に購入した本は、昨年ドラマ化された下町ロケットの後半部分、「下町ロケット2 ガウディ計画」だったのですが、いろいろな事情で以前に Kindle Cloud Reader で読むために購入してあった書籍も、Kindle Paperwhite 上で読めるようになりました。

Kindle Paperwhite の使用感を書くにあたって、このような電子デバイスの操作に慣れる必要があると考え、まずは前述の本を全部読むことにしました。毎日、読書に費やすことができる時間は就寝前の一時間ぐらいで、しかも暗くした部屋で布団の中で読むのが常です。大きめのフォントにして楽に読めるようにしています。紙媒体の本と違い、暗闇でも読めるのはありがたいことです。ただ、本体が 205g とは言え、長く読んでいると腕が疲れると感じるのは贅沢な悩みでしょうか。

こういう状況で一冊読み終わる頃には、すっかり基本操作に慣れました。確かに iPhone などスマートフォンあるいは他のタブレット端末と較べてしまうと、動作はキビキビしていませんし、電子ペーパーのリフレッシュが時々入ります。でも、バッテリーはとても長持ちしますし、目も疲れません。

スマートフォン/タブレットと同じ類と考えずに、じっくり読むための読書専用デバイスだと割りきれば、これはこれで良いように思います。操作はシンプルですし、個人的には、結構満足しています。

ただ、通勤中の電車で Kindle を開いて読書をすることを、現時点では躊躇っています。降車時にさっとポケットにしまうほどには小さくないからです。画面が小さいと読みにくいし、悩ましいところです。ディスプレイの大きさは維持して、周りの枠の部分が少なくなれば全体的な大きさも小さくなります。今後の改善に期待したいです。

現在のところ、このモノクロ画面に大きな不満はありませんが、技術的には、カラーに対応した電子ペーパーの開発と普及に大きな期待をしたいです。

iPhone を使うようになって、毎日の充電が当たり前になってしまいました。一人あたりの電力消費量は大したことではないのでしょうが、全体で見るときっと消費電力は結構な量になっているのでしょう。以前、工場のペーパーレス化を実現するため、電子ペーパーの活用を検討したこともあり、電子ペーパーへの関心が高く、ニュースでも気をつけているのですが、自分のニュースソースではなかなかタイムリーに引っかかりません。

それでも電子書籍のように普及し始めているデバイスで採用されているので、電子ペーパーの進化をエンドユーザーが実際に手にとって目にすることができるようになりました。消費電力が極めて少ない、エコな電子ペーパーがもっと普及していくことをとても期待しています。

 

2016-01-10

【備忘録】ListView にポップアップメニューをつける - JavaFX

JavaFX の ListView の各アイテムを右クリックしてポップアップメニューを表示させるのにはどうすればいいんだろうとあれこれ試してみましたがうまくいきません。ポップアップメニューは ContextMenu クラスを利用するとして、ListView のアイテムに表示するには…。

たまたま ListView のアイテムが凝ったオブジェクトだったこともあり、このアイテムにバインディングすることを意識しすぎて、解に近づけませんでした。参考サイト [1] を見つけて唖然、どうせ座標計算をするのだから ListView に処理をバインディングすれば良かったのでした。

ということで、備忘録として簡単なサンプルを紹介します。

動作環境

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

  • OS: Fedora 23 x86_64
  • jdk1.8.0_66-1.8.0_66-fcs.x86_64 (Oracle)
  • IDE: NetBeans IDE 8.1

Sample_ListView クラス

リスト:Sample_ListView.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package sample_listview;
 
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.ListView;
import javafx.scene.control.MenuItem;
import javafx.scene.input.ContextMenuEvent;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
 
public class Sample_ListView extends Application {
 
    List<Pref> pref = new ArrayList<>();
    ObservableList<Pref> observableList = FXCollections.observableList(pref);
 
    @Override
    public void start(Stage primaryStage) {
        pref.add(new Pref("青森県", "青森市", "青森県青森市長島一丁目1番1号"));
        pref.add(new Pref("岩手県", "盛岡市", "岩手県盛岡市内丸10番1号"));
        pref.add(new Pref("宮城県", "仙台市", "宮城県仙台市青葉区本町3丁目8番1号"));
        pref.add(new Pref("秋田県", "秋田市", "秋田県秋田市山王四丁目1番1号"));
        pref.add(new Pref("山形県", "山形市", "山形県山形市松波2丁目8番1号"));
        pref.add(new Pref("福島県", "福島市", "福島県福島市杉妻町2番16号"));
        pref.add(new Pref("茨城県", "水戸市", "茨城県水戸市笠原町978番地6"));
 
        // popup menu
        ContextMenu popup = new ContextMenu();
 
        // prefecture list UI
        ListView<Pref> lv = new ListView<>(observableList);
        lv.setPrefHeight(150);
        lv.setPrefWidth(150);
        lv.setContextMenu(popup);
        lv.setOnContextMenuRequested((ContextMenuEvent event) -> {
            popup.show(lv, event.getScreenX(), event.getScreenY());
            event.consume();
        });
 
        MenuItem itemCapital = new MenuItem("県庁所在地");
        itemCapital.setOnAction((ActionEvent t) -> {
            Pref selected = lv.getSelectionModel().getSelectedItem();
            System.out.println(selected.getPrefecture() + "の県庁所在地は、" + selected.getCapital() + "です。");
        });
 
        MenuItem itemAddress = new MenuItem("住所");
        itemAddress.setOnAction((ActionEvent t) -> {
            Pref selected = lv.getSelectionModel().getSelectedItem();
            System.out.println(selected.getPrefecture() + "の県庁の住所は、" + selected.getAddress() + "です。");
        });
 
        popup.getItems().addAll(itemCapital, itemAddress);
 
        StackPane root = new StackPane();
        root.getChildren().add(lv);
 
        Scene scene = new Scene(root);
 
        primaryStage.setTitle("Sample_ListView");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
 
    class Pref {
 
        String prefecture;
        String capital;
        String address;
 
        public Pref(String prefecture, String capital, String address) {
            this.prefecture = prefecture;
            this.capital = capital;
            this.address = address;
        }
 
        public void setPrefecture(String prefecture) {
            this.prefecture = prefecture;
        }
 
        public String getPrefecture() {
            return prefecture;
        }
 
        public void setCapital(String capital) {
            this.capital = capital;
        }
 
        public String getCapital() {
            return capital;
        }
 
        public void setAddress(String address) {
            this.address = address;
        }
 
        public String getAddress() {
            return address;
        }
 
        @Override
        public String toString() {
            return prefecture;
        }
    }
 
    public static void main(String[] args) {
        launch(args);
    }
}

実行例

宮城県の県庁所在地は、仙台市です。
宮城県の県庁の住所は、宮城県仙台市青葉区本町3丁目8番1号です。

 

参考サイト

  1. JavaFX: create a ContextMenu on a ListView – Das JAVA-Hilfe Blog und mehr

2016-01-05

Automotive Grade Linux

Automotive Grade Linux, AGL とは、コネクテッド カー向けフル オープン ソフトウェア スタックの開発導入を促進する、Linux Foundation 協業プロジェクトです。AGL はその中核となる Linux の機能と強みを利用して、共通のプラットフォームを開発するために自動車メーカーと技術系企業との連携協力を実現しています。 1.

ということなのですが、聞きなれない用語がいくつかありますので、途中ですが語句の説明を加えます。

コネクテッド カー 2.
コネクテッドカーとは、ICT 端末としての機能を有する自動車のことであり、車両の状態や周囲の道路状況などの様々なデータをセンサーにより取得し、ネットワークを介して集積・分析することで、新たな価値を生み出すことが期待されています。
ICT 3.
Information and Communications Technology の頭文字を取ったものであり、情報通信技術のことです。
ソフトウェアスタック 4.
ソフトウェア・スタックとは、特殊な種類のソフトウェア定義であり、これを使用してターゲット・システムに同時に、および特定の順序でインストールするソフトウェアのグループを示すことができます。
ソフトウェア・スタックは、インストール可能ファイル、ソフトウェア・プロダクトに対するソフトウェア定義、ソフトウェア・パッチ、および他のソフトウェア・スタックを含むことができます。
ソフトウェア・スタックは、以下のような目的を果たします。
  • 管理対象システムに、一貫して正しい順序かつ同じ構成で同じソフトウェアをインストールできます。
  • ソフトウェア・スタックをコンピューター・テンプレートに追加すると、Tivoli® Provisioning Manager がソフトウェア・スタックと整合していない管理対象システムを識別できます。
  • ソフトウェア・スタックは、個々のシステムにインストールすることも、コンピューター・テンプレートに追加して、プロビジョニングされたサーバーに自動的にインストールすることもできます。
Linux Foundation 5.
The Linux Foundation はこの Linux を支援するための組織です。The Linux Foundation は、Linus Torvalds 自身を雇用することはもとより、カーネル開発コミュニティをサポートし、大規模なコラボレーションを育むことにより、あらゆる好奇心をフリーでオープンな意見交換へと導きます。また、企業や人々が、絶えず変化を続ける Linux を取り巻く環境に順応するための手助けをしています。さらに The Linux Foundation は、Linux の協力的な DNA を他の業界や市場に広げる活動も行っています。企業とオープン ソース プロジェクトと開発者が Linux Foundation 協業プロジェクトで協力し合い、世界的な難問について事実上の解決方法を共同開発することができます。

用語さえ判れば全て理解できるというほど優秀な頭脳を持っていませんが、それでも、なんとなく判ったような気にはなります。

さて、その AGL の共同プロジェクトに フォード、マツダ、三菱自動車とスバルが参画したというニュースを見つけました 6.。このプロジェクトには、トヨタをはじめ、多くの日本の自動車業界の企業が既に参画しているのですが、米国の自動車メーカーから、一社とは言え、フォードが参画したということが特筆すべきことのようです。なお、日本語による記事もありました 7.

さらに、プロジェクトは、自動車業界向けに開発された新しい AGL ユニファイド コード ベース (Unified Code Base: UCB) を発表しました 8.。これはいわゆる Linux ディストリビューションのひとつで、自動車専用アプリに対応できるようゼロから開発されたものだそうです。どのような形式で配布されるのか判らないのですが。一体どのような Linux なのか興味があります。

1 月 6 日から、毎年恒例の CES, Consumer Electronics Show がラスベガスで開催されます 9.。GENIVI CES 2016 のデモンストレーション ショーケースで AGL UCB が紹介され、ナビゲーション、HVAC コントロール、ラジオ、メディア プレーヤー/ブラウザー、セッティング、およびホーム スクリーンのデモ アプリが展示されるそうですので、現地に見には行けませんが、ニュースに注目したいです。

  1. Automotive Grade Linux が新しいユニファイド コード ベース ディストリビューションをリリース | The Linux Foundation
  2. 総務省|平成27年版 情報通信白書|コネクテッドカー
  3. 総務省|平成27年版 情報通信白書|平成27年版情報通信白書 特集テーマ 「ICTの過去・現在・未来」
  4. IBM Knowledge Center
  5. LF について | The Linux Foundation
  6. Linux Foundation Accelerates Automotive Grade Linux
  7. スバル、三菱自動車、マツダ、フォードが Linux Foundation と Automotive Grade Linux のメンバーに | The Linux Foundation
  8. Automotive Grade Linux が新しいユニファイド コード ベース ディストリビューションをリリース | The Linux Foundation
  9. CES 2016 公式日本語サイト

2016-01-04

【備忘録】NetBeans IDE のフォント

NetBeans IDE のエディタ上のフォントはなぜこうもギザギザしているのでしょうか。まるでアンチエイリアスが効いていないようだと思いつつも、最適なフォントを探すことを優先してしまい、アンチエイリアスのことを調べていませんでした。

そんな中でたどり着いた最適解が、Myrica.ttc でした 1.

使用環境

  • OS : Fedora 23 (x86_64) / GNOME
  • JDK : jdk1.8.0_66-1.8.0_66-fcs.x86_64
  • IDE : NetBeans IDE 8.1

NetBeans IDE のオプション・ダイアログで、フォントを Myrica M 18(M は等幅フォント)に設定した時の、エディタ上のフォントの例を以下に示しました。

他のフォントに比べれば、概ね満足できるフォント表示なのですが、例えば丸括弧 ( ) がもっと滑らかにならないか、など不満は残ります。

ここまできて、ようやくアンチエイリアスについて調べてみることにしました。すると、多くの方が同じ不満を抱いているらしく、すぐに解決方法が見つかりました。参考にさせていただいたサイトを [2] に示しました。

私は、NetBeans IDE をダウンロードサイトからダウンロードして、/home にある自分のアカウントのディレクトリ内にインストールしてしまっています。この場合、~/netbeans-8.1/etc/netbeans.conf を編集することになります。下記に朱字の部分を追加します。

# Options used by NetBeans launcher by default:
# (can be overridden by explicit command line switches)
#
# Note that default -Xmx is selected for you automatically.
# You can find these values in var/log/messages.log file in your userdir.
# The automatically selected value can be overridden by specifying -J-Xmx
# here or on the command line.
#
# If you specify the heap size explicitly, you may also want to enable
# Concurrent Mark & Sweep garbage collector.
# (see http://wiki.netbeans.org/FaqGCPauses)
#
netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-Dapple.laf.useScreenMenuBar=true
 -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true
 -J-Dsun.zip.disableMemoryMapping=true -J-Dawt.useSystemAAFontSettings=lcd"

NetBeans IDE を起動して、同じソース部分を比較してみましょう。

エディタ部分だけでなく、行番号など他の部分も含めて、随分となめらかになりました。知らない、ということは恐ろしいことです。

参考サイト

  1. プログラミングフォント Myrica | プログラミングフォント Myrica / Estable
  2. NetBeansフォントのアンチエイリアスを有効にする | Worth Living

2016-01-02

Linux Standard Base (LSB) とはなにか 〜 はじめに

LSB, Linux Standard Base は、アプリケーションとプラットフォーム間の相互運用性を定めた Linux オペレーティングシステムの中核標準です。この標準には、文書化されたバイナリインターフェース仕様、標準に従って開発されたディストリビューションおよびアプリケーションをテストするためのツール一式、およびテスト目的のサンプル実装が含まれています 1.

手許のノート PC にインストールしてある Fedora 23 で、lsb をキーワードにしてインストールしてあるパッケージを検索すると、確かに LSB に関係のありそうなパッケージがリストされます。

$ rpm -qa | grep lsb
redhat-lsb-cxx-4.1-30.fc23.x86_64
redhat-lsb-submod-security-4.1-30.fc23.x86_64
redhat-lsb-desktop-4.1-30.fc23.x86_64
redhat-lsb-4.1-30.fc23.x86_64
redhat-lsb-printing-4.1-30.fc23.x86_64
redhat-lsb-submod-multimedia-4.1-30.fc23.x86_64
epson-inkjet-printer-201211j-1.0.1-1lsb3.2.x86_64
redhat-lsb-core-4.1-30.fc23.x86_64
redhat-lsb-languages-4.1-30.fc23.x86_64
$ 

リストの中から、redhat-lsb-core の情報を見てみると、確かに LSB に関係があるパッケージのようです。

$ rpm -qi redhat-lsb-core
Name        : redhat-lsb-core
Version     : 4.1
Release     : 30.fc23
Architecture: x86_64
Install Date: 2015年12月26日 07時03分14秒
Group       : System Environment/Base
Size        : 45813
License     : GPLv2
Signature   : RSA/SHA256, 2015年06月22日 13時55分01秒, Key ID 32474cf834ec9cba
Source RPM  : redhat-lsb-4.1-30.fc23.src.rpm
Build Date  : 2015年06月19日 07時30分40秒
Build Host  : buildvm-04.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager    : Fedora Project
Vendor      : Fedora Project
URL         : http://www.linuxfoundation.org/collaborate/workgroups/lsb
Summary     : LSB Core module support
Description :
The Linux Standard Base (LSB) Core module support provides the fundamental
system interfaces, libraries, and runtime environment upon which all conforming
applications and libraries depend.
$ 

パッケージ redhat-lsb-core のファイルリストを表示してみます。

$ rpm -ql redhat-lsb-core
/bin/redhat_lsb_init
/etc/lsb-release.d
/etc/lsb-release.d/core-4.1-amd64
/etc/lsb-release.d/core-4.1-noarch
/etc/redhat-lsb
/etc/redhat-lsb/lsb_killproc
/etc/redhat-lsb/lsb_log_message
/etc/redhat-lsb/lsb_pidofproc
/etc/redhat-lsb/lsb_start_daemon
/lib/lsb
/lib/lsb/init-functions
/lib64/ld-lsb-x86-64.so.3
/usr/bin/lsb_release
/usr/lib/lsb
/usr/lib/lsb/install_initd
/usr/lib/lsb/remove_initd
/usr/sbin/redhat_lsb_trigger.x86_64
/usr/share/doc/redhat-lsb-core
/usr/share/doc/redhat-lsb-core/COPYING
/usr/share/doc/redhat-lsb-core/README
/usr/share/doc/redhat-lsb-core/README.lsb_release
/usr/share/lsb/4.1/modules/core
/usr/share/lsb/4.1/modules/core/core-4.1-amd64
/usr/share/lsb/4.1/modules/core/core-4.1-noarch
/usr/share/lsb/4.1/modules/core/security-4.1-amd64
/usr/share/lsb/4.1/modules/core/security-4.1-noarch
/usr/share/lsb/4.1/submodules/core-4.1-amd64
/usr/share/lsb/4.1/submodules/core-4.1-noarch
/usr/share/man/man1/lsb_release.1.gz
$ 

リストには実行ファイル /usr/bin/lsb_release がありますので、--help を付けてタイプし、オプションを調べます。

$ lsb_release --help
FSG lsb_release v2.0 prints certain LSB (Linux Standard Base) and
Distribution information.

Usage: lsb_release [OPTION]...
With no OPTION specified defaults to -v.

Options:
  -v, --version
    Display the version of the LSB specification against which the distribution is compliant.
  -i, --id
    Display the string id of the distributor.
  -d, --description
    Display the single line text description of the distribution.
  -r, --release
    Display the release number of the distribution.
  -c, --codename
    Display the codename according to the distribution release.
  -a, --all
    Display all of the above information.
  -s, --short
    Use short output format for information requested by other options (or version if none).
  -h, --help
    Display this message.
$ 

オプション -a を付けて情報を全て表示してみます。

$ lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID: Fedora
Description: Fedora release 23 (Twenty Three)
Release: 23
Codename: TwentyThree
$ 

LSB Version には LSB のバージョン情報がいくつか表示されているようです。その他は Fedora に関する情報です。

そもそも。LSB と Linux (Fedora) は、具体的にどのように関わっているのでしょうか。今後、(不定期になりますが)何回かに亘って LSB とは何か、整理した情報を紹介していきたいと思います。

参考サイト

  1. ポータビリティについて知る | The Linux Foundation

2016-01-01

JDK 9 のリリース・スケジュール

2016 年最初の記事が明るい記事でなくて申し訳ありません。

先月はじめに JDK 9 のリリーススケジュールが修正され、半年遅れの 2017 年 3 月にになりました。Java のパッケージにモジュールを導入する改良 (JSR 376) が、予定に間に合わないようです。

パッケージの上にさらにモジュールというプログラムを導入することで、パッケージのアクセス制御を実現でき、モジュールの相関関係を多重化できます。モジュールを活用することでパッケージの数を減らすことができ、モノリシックなプログラムパッケージからの脱却を図れます。

Java 8 開発の頃から遅延を発生させて導入を見送られた機能ですが、今度こそは、たとえスケジュールが遅れても導入を実現して欲しいです。