2014-11-30

プログラミング用フォント Ricty Diminished

Linux の環境に限ったことではありませんが、同じ文字数で画面右側の文字列末尾が揃って、かつ、ゼロとオーなど似たような文字を判別しやすい、プログラミングやソースコードの表示に適した等幅フォント、しかもフリーなものを継続的に探しています。

いろいろ調べてみると、Ricty というフォントが日本語を使う環境では高い評価を受けているようです。このフォントはに種類のフォント、InconsolataMigu 1M を合成したものです。ライセンスの関係でフォントの合成を自分で行う必要があり、合成したフォントの再配布ができません。

自分で合成するのは面倒なので、私は姉妹フォントである Ricty Diminished を使用しています。Inconsolata と Circle M+ 1m を Ricty 生成スクリプトで合成したフォントです。 IPA ゴシックのグリフを含まないため、使用可能な漢字グリフの数が少ない代わり、SIL Open Font License の下で配布が可能です。

ダウンロードしたフォントを展開して、Linux のデスクトップ環境ではフォントビューアを使ってインストールします。左は Fedora 21 β版の MATE での例です。Fedora の Eclipse では Monospace という等幅合成フォントがデフォルトで、いまひとつ使いにくいところがあったのですが、Ricty Diminished を使うことで快適感が増しました。

最適なフォントというものは主観的な要因が大きいので人それぞれなのですが、ご興味があれば試して見る価値があると思います。

ちなみに、フォントビューアでインストールしたフォントは、$HOME/.local/share/fonts に格納されます。

参考サイト

  1. 最高に見やすいプログラミング用フォントRictyの生成と使い方 - ウェブソク
  2. プログラミング用フォントをまとめてみました(Source Code Pro/Ricty/Consolasなどなど) | memobits
  3. コーディングに役立つ? 画面上できれいに揃う等幅フォントまとめ - NAVER まとめ

2014-11-29

東芝ブランドの野菜が販売開始へ--都内の百貨店など12店舗で

11 月 28 日に、東芝ブランドの野菜の発売が開始されたそうです。野菜生産をしている工場、「東芝クリーンルームファーム横須賀」は、以前にフロッピーディスク工場の入っていた建屋の 4 階を改装して造られており、ISO クラス 8(米国連邦規格ではクラス 10 万に相当)のクリーンルームの栽培室の中で発芽から育苗、栽培、収穫までを行い、無農薬・低生菌の野菜を供給できることが特徴なのだそうです。

既に富士通も始めている「クリーンルームの特性を活かした無農薬生産」は、地味なようですが、Google が地図情報と自動運転の技術を引っさげてで自動車業界へ参入しようとしていることに匹敵するほどのインパクトを社会に与えるかもしれません。いつの間にか「無農薬の野菜」とは、大自然の中で栽培された野菜ではなく、環境が管理されたクリーンルーム内で栽培された、自然界に存在しない植物、なんてことが当たり前の感覚になるかもしれません。それでも、遺伝子操作をした害虫に強い野菜と比べると、抵抗感は段違いに低いです。

富士通や東芝の IT 産業から、設備の有効活用とはいえ、野菜生産の事業に展開した決断力とその精力的な取組みには拍手喝采を贈りたいです。日本の半導体産業は「産業のコメ」と呼ばれ国の基幹産業でしたが、今後は、半導体産業の施設やインフラを活用して、価値を持たせた野菜生産を始めとした農業のビジネスモデルの改革に貢献することになるかもしれません。半導体産業はかつての「産業のコメ」ではなく、そう遠くない将来に本物の米作りに応用される日がやってくるような気がします。

東芝ブランドの野菜が首都圏で販売が開始されたということで、どのような反響があったのか気になるところですが、今のところ、反響が判るような記事を探し出せませんでした。継続的に情報をアップデートして行く予定です。

関連サイト

  1. 東芝:プレスリリース (2014-05-15):野菜生産の事業化について
  2. 東芝:プレスリリース (2014-09-30):植物工場「東芝クリーンルームファーム横須賀」での生産開始について
  3. 東芝もクリーンルームで野菜生産 富士通に続き - ITmedia ニュース
  4. 【CEATEC 2014 Vol.37】東芝は野菜も作る!11月から購入可能 | RBB TODAY
  5. “ITと野菜”の意外な関係--東芝、富士通が野菜を展示したCEATEC JAPAN 2014 - CNET Japan
  6. 富士通がレタスを販売。半導体用クリーンルームを野菜工場化して無農薬・低カリウム実現 - Engadget Japanese
  7. 富士通と東芝が野菜作り?「ITと野菜」の意外な関係 - NAVER まとめ
  8. Googleは自動車を支配するか 共存か、対立か 進化する自動運転(前篇) (1/2)

追記

その後の追加情報です。


2014-11-23

Fedora 21 と JavaFX

JavaFX は Java 仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Java SE 7 Update 2 以降に標準搭載 1. されているのですが、Fedora で利用できる OepnJDK のパッケージには JavaFX (OpenJFX) のライブラリは含まれていませんでした。

約一年ぶりに Fedora 21 がリリースされますが、Java の 開発環境が OpenJDK が 7 から 8 へ移行するということで、JavaFX のライブラリも含まれているかもしれない…、と理由の無い期待を抱いていたのですが、Fedora 21 の β版を試した限りでは残念ながら OpenJDK のパッケージに JavaFX は含まれていませんでした。

Fedora 20 や CentOS 7 を使っていた時には JavaFX のプログラミングをするために、Oracle が公開している JDK の rpm パッケージ 2. をインストールし、JavaFX に対応している NetBeans IDE 3. もインストールしていました。

今回の Fedora 21 の環境(β版)では、JDK 早期ビルド版が公開されているサイト 4. から、JDK 8u40 Build b15 をインストールして、NetBeans IDE 8.0.1 上で使用してみました。NetBeans IDE 上の Java プラットフォームマネージャに、下記のようにダウンロードした Java 8 を追加します。ここでは「Java 8」がダウンロードした JDK、「Java 8(デフォルト)」が、Fedora のパッケージである OpenJDK になっています。

いつものバージョン確認のサンプルの実行結果です。

なお、環境を整えさえすれば OpenJFX を自分でビルドすることができそうですので、折りを見て挑戦してみます 5.

参考サイト

  1. Java 7 に JavaFX が追加される (2011/12/30)
  2. Java SE Development Kit 8 - Downloads
  3. Welcome to NetBeans
  4. JDK 8u40 Early Access Releases — Project Kenai
  5. Building OpenJFX - OpenJFX - OpenJDK Wiki

2014-11-22

やっぱり Fedora

Fedora の次のバージョン 21 がおよそ一年ぶりにリリースされるまであと僅か。私は 7 月に CentOS 7 がリリースされたのに合わせて Fedora から CentOS に乗り換えたばかりだったのですが、ひさしぶりの Fedora のリリースを前に我慢ができず、結局 Fedora に戻してしまいました。Fedora 21 Workstation の β版を使い始めて、正式リリースを待っています。

デスクトップは MATE を使いたかったのですが、下記のようになってインストールができませんでした。

$ su
パスワード:
# yum groupinstall "MATE デスクトップ"
読み込んだプラグイン:langpacks
パッケージ ibus-gtk3-1.5.9-5.fc21.x86_64 はインストール済みか最新バージョンです
パッケージ ibus-gtk2-1.5.9-5.fc21.x86_64 はインストール済みか最新バージョンです
パッケージ chrony-1.31-1.fc21.x86_64 はインストール済みか最新バージョンです
依存性の解決をしています
--> トランザクションの確認を実行しています。
...
(省略)
...
--> 衝突を処理しています: fedora-release-workstation-21-1.noarch は fedora-release-nonproduct と衝突しています
--> 衝突を処理しています: fedora-release-nonproduct-21-0.16.noarch は fedora-release-workstation と衝突しています
--> 依存性解決を終了しました。
エラー: パッケージ: fedora-release-nonproduct-21-0.16.noarch (fedora)
             要求: fedora-release = 21-0.16
            インストール: fedora-release-21-1.noarch (@updates-testing)
                fedora-release = 21-1
            利用可能: fedora-release-21-0.16.noarch (fedora)
                fedora-release = 21-0.16
エラー: fedora-release-workstation conflicts with fedora-release-nonproduct-21-0.16.noarch
エラー: fedora-release-nonproduct conflicts with fedora-release-workstation-21-1.noarch
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest
# 

パッケージ fedora-release-workstationfedora-release-nonproduct が衝突しています。どうやら、Fedora 21 からグループパッケージの管理が少し変わったようで、そのまま同時にはインストールできないようです。そこで、yum groupinfo で構成を確認しました。

# yum groupinfo "MATE デスクトップ"
読み込んだプラグイン:langpacks

Environment Group: MATE デスクトップ
 Environment-Id: mate-desktop-environment
 説明: MADE デスクトップは GNOME 2 ベースのパワフルなグラフィカルユーザーインタフェースを提供します。シンプルさを求める人や従来型のデスクトップインタフェースで使いたい人にお勧めします。
 Mandatory Groups:
   +admin-tools
    base-x
    core
   +dial-up
   +fedora-release-nonproduct
    fonts
    guest-desktop-agents
    hardware-support
   +input-methods
   +mate-desktop
    multimedia
    networkmanager-submodules
    printing
   +standard
 Optional Groups:
   +3d-printing
    libreoffice
   +mate-applications
   +mate-compiz
# 

これによると mate-desktop というサブグループをインストールすれば出来そうでしたので、早速試しました。

# yum groupinstall "mate-desktop"
読み込んだプラグイン:langpacks
google-chrome                                               |  951 B  00:00     
updates/21/x86_64/metalink                                  | 7.5 kB  00:00     
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ NetworkManager-l2tp.x86_64 0:0.9.8.7-3.fc21 を インストール
--> 依存性の処理をしています: xl2tpd のパッケージ: NetworkManager-l2tp-0.9.8.7-3.fc21.x86_64
...
(省略)
...
---> パッケージ libwmf-lite.x86_64 0:0.2.8.4-40.fc21 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================
 Package                     アーキテクチャー
                                    バージョン                     リポジトリー
                                                                           容量
================================================================================
Installing for group install "MATE":
 NetworkManager-l2tp         x86_64 0.9.8.7-3.fc21                 fedora  95 k
...
(省略)
...
 xl2tpd                      x86_64 1.3.6-6.fc21                   fedora 141 k

トランザクションの要約
================================================================================
インストール  54 パッケージ (+58 個の依存関係のパッケージ)

総ダウンロード容量: 129 M
インストール容量: 431 M
Is this ok [y/d/N]: y

パッケージ群をインストール後、ログアウトしてデスクトップを MATE に変更してログインし直しました。


2014-11-09

ブログサービス『Blogger』(blogspot)にアクセス障害発生中! それでもブログを見る方法を解説 - Buzz+ バズプラス

Blogger (blogspot) が、どうやらダウンしたらしいと確信したのは、自分のブログだけでなく、他の知っている Blogger のサイトへのアクセスを何度も試してからでした。それぐらい、このサイトのネットワーク障害を経験したことがありません。

もともと、www.blogger.com で登録していたのに、ふと www.blogger.jp に転送されていることに気付いたのは、使い始めて何年も経ってからでした。そういう訳なのか何なのかは判りませんが、Blogger がカバーしている他のドメインでも閲覧することができるようですので、障害が日本だけで発生しているのであれば、下記のようにしてブログを閲覧することもも可能です。

そもそも Google のサービスにおいて、障害状況を知りたい時はどうすればよいのでしょうか。Google 検索で探してみた結果、以下のサイトを見つけました。

Blogger だけでなく、Google の全てのサービスの状況が確認できます。

RSS Feed を利用すると以下のような情報をゲットできます。


Date: Sat, 08 Nov 2014 12:17:00 GMT
From: Apps Status Dashboard
Subject: Blogger

 November 8, 2014 4:17:00 AM PST

Blogger service has already been restored for some users, and we expect a resolution for all users within the next 12 hours. Please note this time frame is an estimate and may change.

 November 8, 2014 1:02:00 AM PST

We're investigating reports of an issue with Blogger. We will provide more information shortly.

We have received reports users in Japan are not being able to access blogspot. We are investigating the issue.


障害が滅多に無いからこそ、こういう情報が必要なのかもしれません。

 

2014-11-08

【備忘録】入力ストリームにおける文字セットの指定 (Java)

Java でプログラミングをする時、私の場合 Linux 上で Eclipse か NetBeans IDE を使っています。作ったプログラムを Windows 上で使用する場合もあるのですが、時々、読み込んだファイルの文字が、いわゆる「文字化け」を起こしていて慌てることがあります。

例えば、テキストファイル filename.txt を読みこむ場合、入力ストリームを以下のようにします。

BufferedReader br = new BufferedReader(new FileReader("filename.txt"))

(日本語版の)Windows 上で読み込むテキストファイルの文字セットが Shift_JIS (cp932) であれば問題は起こりませんが、例えば UTF-8 だったりすると「文字化け」が発生します。入力ストリームの文字セットに UTF-8 を指定する場合は、次のようにします。

FileInputStream in = new FileInputStream("filename.txt");
InputStreamReader sr = new InputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(sr);

Linux (CentOS 7) 上では文字セットを UTF-8 にしているので、Windows 上で同じ形式のファイルを読み込む場合、うっかり配慮を忘れてしまったりするので、備忘録として書き留めておきました。

参考サイト

 

2014-11-06

Eclipse で Commons Math を試す (2)

Cmmons Math を利用した、前回の記事で紹介したサンプルをベースに、データや重回帰分析でフィッティングした多項式をプロットできるようにしました。使用したライブラリは Nebula Visualization Widgets の XY Graph です。

GUI の部分を無理矢理くっつけた、やっつけ感が満載のサンプルではありますが、期待どおりのプロットを表示してくれます。読み込む 100,000 組の xy が対になっているデータは、前回と同様、fdata01.zip (fdata01.txt) を使います。

List: MulRegGuiTest.java
package commonsmathtest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.nebula.visualization.xygraph.dataprovider.CircularBufferDataProvider;
import org.eclipse.nebula.visualization.xygraph.figures.Trace;
import org.eclipse.nebula.visualization.xygraph.figures.Trace.TraceType;
import org.eclipse.nebula.visualization.xygraph.figures.XYGraph;
import org.eclipse.nebula.visualization.xygraph.figures.Trace.PointStyle;
import org.eclipse.nebula.visualization.xygraph.util.XYGraphMediaFactory;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class MulRegGuiTest {
    Shell shell;

    private File file;
    private int m = 100000, n = 5;
    private double[][] X;
    private double[] y;
    private double[] c;
    
    public MulRegGuiTest(Display display, File file) {
        this.file = file;

        // multiple regression analysis
        calcMulReg();

        // GUI
        shell = new Shell(display);
        shell.setText("MulRegGuiTest");
        shell.setSize(800, 400);

        shell.setLayout(new FillLayout());

        initUI();

        shell.setLocation(100, 100);
        shell.open();

        // event loop
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    private void calcMulReg() {
        X = new double[m][n];
        y = new double[m];

        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            String str;
            int i = 0;

            while ((str = br.readLine()) != null) {
                double xValue = Double.parseDouble(str.substring(0, 6));
                y[i] = Double.parseDouble(str.substring(6, 20));
                for (int j = 0; j < n; j++) {
                    X[i][j] = Math.pow(xValue, (double) j);
                }
                i++;
            }
            br.close();
        } catch (FileNotFoundException e) {
            System.out.println(e);
        } catch (IOException e) {
            System.out.println(e);
        }

        OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression();
        regression.setNoIntercept(true);
        regression.newSampleData(y, X);

        c = regression.estimateRegressionParameters();
        // double[] residuals = regression.estimateResiduals();
        // double[][] parametersVariance = regression.estimateRegressionParametersVariance();
        // double regressandVariance = regression.estimateRegressandVariance();
        double rSquared = regression.calculateRSquared();
        // double sigma = regression.estimateRegressionStandardError();

        // Result
        System.out.println("# of DATA\t" + m);
        System.out.println("Coefficients");
        for (int j = 0; j < n; j++) {
            System.out.println("C(" + j + ") =  " + c[j]);
        }
        System.out.println("R-squared = " + rSquared);
    }

    private void initUI() {
        // use LightweightSystem to create the bridge between SWT and draw2D
        LightweightSystem lws = new LightweightSystem(shell);

        // create a new XY Graph.
        XYGraph xyGraph = new XYGraph();
        xyGraph.setTitle("Mulreg Example");

        xyGraph.primaryXAxis.setTitle("x axis");
        xyGraph.primaryYAxis.setTitle("y axis");

        xyGraph.primaryXAxis.setShowMajorGrid(true);
        xyGraph.primaryYAxis.setShowMajorGrid(true);

        // set it as the content of LightwightSystem
        lws.setContents(xyGraph);

        xyGraph.primaryXAxis.setAutoScale(true);
        xyGraph.primaryYAxis.setAutoScale(true);

        // create a trace data provider, which will provide the data to the trace.
        CircularBufferDataProvider traceDataProvider1 = new CircularBufferDataProvider(false);
        CircularBufferDataProvider traceDataProvider2 = new CircularBufferDataProvider(false);
        traceDataProvider1.setBufferSize(m);
        traceDataProvider2.setBufferSize(m);

        for (int i = 0; i < m; i++) {
            traceDataProvider1.setCurrentXData(X[i][1]);
            traceDataProvider1.setCurrentYData(y[i]);

            traceDataProvider2.setCurrentXData(X[i][1]);
            traceDataProvider2.setCurrentYData(linearCoupling(i));
        }

        // create the trace for raw data
        Trace trace1 = new Trace("data", xyGraph.primaryXAxis, xyGraph.primaryYAxis, traceDataProvider1);

        // set trace property for raw data
        trace1.setTraceType(TraceType.POINT);
        trace1.setPointStyle(PointStyle.CIRCLE);
        trace1.setPointSize(1);

        // add the trace to xyGraph
        xyGraph.addTrace(trace1);

        // create the trace for regression
        Trace trace2 = new Trace("fitting", xyGraph.primaryXAxis, xyGraph.primaryYAxis, traceDataProvider2);

        // set trace property for regression
        trace2.setPointStyle(PointStyle.NONE);
        trace2.setTraceColor(XYGraphMediaFactory.getInstance().getColor(XYGraphMediaFactory.COLOR_RED));;
        trace2.setLineWidth(2);

        // add the trace to xyGraph
        xyGraph.addTrace(trace2);
    }

    private double linearCoupling(int i) {
        double y = 0;
        for (int j = 0; j < n; j++) {
            y = y + c[j] * X[i][j];
        }
        return y;
    }

    public static void main(String[] args) {
        File readFile = new File("/home/bitwalk/ドキュメント/fdata01.txt");

        Display display = new Display();
        new MulRegGuiTest(display, readFile);
        display.dispose();
    }
}

実行例

重回帰分析をするために用意したサンプルは人為的に作ったものですので、プロットしても面白味がありません。しかし、100,000 程度のデータ数でも簡単にプロットできることが確認できたので、もっと応用範囲を広げてみようと思います。

 

2014-11-04

Eclipse で Commons Math を試す (1)

Cmmons Math a. は 、Apache のトッププロジェクトである Apache Commons にある Apache Commons#Commons Proper に属する、数学と統計学の軽量コンポーネントです b.Apache License Version 2.0 に従って配布されています。いろいろなコンポーネントを利用できますが、ここでは、多項式係数を最小二乗法で求めてみます。

なお、最初に扱うサンプルは、以前 NetBeans IDE で試したもの c. と同じものを Eclipse 上でも試し、その上で SWT と組み合わせて視覚化したいと考えています。ただ、大量のデータをそのままプロットできるかどうか…。まずは、NetBeans IDE で試した時のおさらいをします。当時使用したデータファイルのリンク先に不具合があるので、今回、新たにデータの格納先を 4shared に確保しました。

使用環境

  • OS : CentOS 7 (Linux)
  • JDK : java-1.7.0-openjdk-1.7.0.71-2.5.3.1.el7_0.x86_64
  • IDE : Eclipse Luna Service Release 1 (4.4.1)

サンプル

100,000 組の xy が対になっているデータ fdata01.zip (fdata01.txt) を使って、c.、次の 4 次の多項式でフィッティングするために、その係数 c0,  c1,  c2,  c3,  c4 を最小二乗法で求めます。

y = c0 + c1x + c2x2 + c3x3 + c4x4

以下が Commons Math を利用したサンプルプログラムです。なお、使用した Commons Math は Version 3.3 です。なお、Java 1.5 以上が必要です。

package commonsmathtest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression;

public class CommonsMathTest {

    public static void main(String[] args) {
        int m = 100000, n = 5;
        double X[][], y[];
        X = new double[m][n];
        y = new double[m];

        File file = new File("/home/bitwalk/ドキュメント/fdata01.txt");

        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            String str;
            int i = 0;
            while ((str = br.readLine()) != null) {
                double xValue = Double.parseDouble(str.substring(0, 6));
                y[i] = Double.parseDouble(str.substring(6, 20));
                for (int j = 0; j < n; j++) {
                    X[i][j] = Math.pow(xValue, (double) j);
                }
                i++;
            }
            br.close();
        } catch (FileNotFoundException e) {
            System.out.println(e);
        } catch (IOException e) {
            System.out.println(e);
        }

        OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression();
        regression.setNoIntercept(true);
        regression.newSampleData(y, X);

        double[] c = regression.estimateRegressionParameters();
//        double[] residuals = regression.estimateResiduals();
//        double[][] parametersVariance = regression.estimateRegressionParametersVariance();
//        double regressandVariance = regression.estimateRegressandVariance();
        double rSquared = regression.calculateRSquared();
//        double sigma = regression.estimateRegressionStandardError();

        // Result
        System.out.println("# of DATA\t" + m);
        System.out.println("Coefficients");
        for (int j = 0; j < n; j++) {
            System.out.println("C(" + j + ") =  " + c[j]);
        }
        System.out.println("R-squared = " + rSquared);
    }
}

実行例を以下に示しました。ここでは R2 (決定係数)も計算しています。

run:
# of DATA 100000
Coefficients
C(0) =  37.76585776133077
C(1) =  0.049683847037500665
C(2) =  6.988983959854228E-6
C(3) =  -4.217424916004811E-7
C(4) =  2.686562674530102E-10
R-squared = 0.7654053656031088

小数点以下が全て前回と全く同じになっているというわけではなく、ほんの僅かな違いが確認できますが、無視して良いでしょう。さて、これをプロットできるか、次回試してみます。

参考サイト

  1. Commons Math: The Apache Commons Mathematics Library
  2. Apache Commons Math
  3. bitWalk's: NetBeans IDE で Commons Math を試す
  4. The Commons Math User Guide - Statistics 1.5 Multiple linear regression
  5. bitWalk's workshop - CommonsMath

 

2014-11-03

Appleの新言語「Swift」をオープンソースで実装するプロジェクトがスタート

Swift は、従来の Objective-C に代わる言語として、iOS や OS X 向けのアプリケーション開発で使用できる、2014 年 6 月に Apple から発表された新しいプログラミング言語です。

Swift は Apple 以外のプラットフォームには対応していないため、Swift 言語のオープンな実装を作成するプロジェクトとして Phoenix が立ち上げられました。開発は Cocoa のフリー実装と言える GNUStep の開発者である Greg Casamento 氏が率いるそうです。

今後、大きなプロジェクトになるかもしれない、一つのオープンソースプロジェクトの誕生を暖く見守りたいです。

  1. Appleの新言語「Swift」をオープンソースで実装するプロジェクトがスタート、GNUStepの開発者も参加 | SourceForge.JP Magazine
  2. Ind.ie Projects / phoenix | GitLab
  3. Ind.ie — Designing Hope
  4. Swift - Overview - Apple Developer

 

2014-11-01

複数行の文字列表示と StyledText

SWT の Text を、複数行にわたる文字列を表示するだけの用途に使おうとして、サンプルを作って確認をしました。以下のように Text の編集機能を無効にすればなんとかなると簡単に考えていたのすが…、ひとつ問題がありました。

List: SWTAppText.java
package text;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class SWTAppText {
    Shell shell;

    public SWTAppText(Display display) {
        shell = new Shell(display);
        shell.setText("メッセージ");

        initUI();

        shell.setSize(200, 100);
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }

    }

    public void initUI() {
        shell.setLayout(new GridLayout(1, true));

        Text text = new Text(shell, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY);
        text.setText("複数行の文字列を Text に表示するためだけのサンプルです。");
        text.setEditable(false); // READ_ONLY だけで十分かもしれないが、念の為
        
        GridData gd = new GridData();
        gd.horizontalAlignment = GridData.FILL;
        gd.verticalAlignment = GridData.FILL;
        gd.grabExcessHorizontalSpace = true;
        gd.grabExcessVerticalSpace = true;
        text.setLayoutData(gd);

    }

    public static void main(String[] args) {
        Display display = new Display();
        new SWTAppText(display);
        display.dispose();
    }
}

実行例

上の実行例のように、複数行にわたる文字列を表示する用途には使えるのですが、文字列の先頭に必ず「入力カーソル (Input Cursor)」が表示されていて、これを消すことができません。解決方法をインターネットで探しているうちに気が付きました。そもそも、文字れの先頭に表示されている入力用のカーソルを「入力カーソル (Input Cursor)」であると信じ込んでいたことが、解決に時間がかかってしまったことをです。「キャレット (Caret)」をキーワードにして探せば簡単に StyledText を使えば良いことに気付いたことでしょう。

「入力カーソル (Input Cursor)」は Tcl/Tk で使われている用語です(例えば [2])。昔、Tcl/Tk を IME などの日本語入力へ対応させることに取り組んでいて、Caret = 「漢字キーなどを押して(Caret の位置に)かな変換用ウィンドウを出すこと」にイメージが固まってしまっていて Caret というキーワードが出てきませんでした。

Text の代わりに StyledText を利用して Caret を非表示にしたサンプルを示します。

List: SWTAppStyledText.java
package styledtext;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class SWTAppStyledText {
    Shell shell;

    public SWTAppStyledText(Display display) {
        shell = new Shell(display);
        shell.setText("メッセージ");

        initUI();

        shell.setSize(200, 100);
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }

    }

    public void initUI() {
        shell.setLayout(new GridLayout(1, true));

        StyledText text = new StyledText(shell, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY);
        text.setText("複数行の文字列を StyledText に表示するためだけのサンプルです。");
        text.setEditable(false);
        text.setCaret(null); 
        
        GridData gd = new GridData();
        gd.horizontalAlignment = GridData.FILL;
        gd.verticalAlignment = GridData.FILL;
        gd.grabExcessHorizontalSpace = true;
        gd.grabExcessVerticalSpace = true;
        text.setLayoutData(gd);

    }

    public static void main(String[] args) {
        Display display = new Display();
        new SWTAppStyledText(display);
        display.dispose();
    }
}

実行例

複数行にわたる文字列を表示するだけのことですが、Caret というキーワードを使わなかったために意外に解決に手こずってしまったので、自戒を込めて備忘録的に書留ました。

参考サイト

  1. Eclipse Community Forums: Standard Widget Toolkit (SWT) » how to remove blinking cursor in StyledText widget
  2. The Tk Text Widget | Linux Journal