2009-12-29

【備忘録】Java/Swing のプログラムにおける日本語フォント表示

Java の GUI プログラムで、日本語のフォントが正しく表示されません。環境は Fedora 12 (x86_64) です。

そもそも、Fedora で Java のプログラミングをほとんどしないので気がつきませんでした。

例えば、以下のようなプログラム Hello.java をコンパイルして実行してみます。

// Hello.java
import javax.swing.*;

public class Hello extends JFrame {
private static final long serialVersionUID = 1L;

Hello() {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
add(new JLabel("こんにちは、世界!"));
pack();
}

public static void main(String[] args) {
new Hello().setVisible(true);
}
}


$ javac Hello.java
$ java Hello

日本語フォントが □□□□ となってしまって表示されません。

しかしながら、コンパイルした Hello.class を Windows へコピーして実行してみると日本語フォントが正しく表示されます。

これは、Fedora の Java 実行環境に問題がありそうだと考え、インターネットを検索してみると、既に調べている方がおられました。

[1] Fedora11でSwingのプログラムに日本語を正しく表示させる方法 - 何かしらの言語による記述を解析する日記

 
[1] のサイトの「方法1」に従い、自分の環境に読み替えて編集すると Fedora 上で日本語を表示させることができました。ただし $JAVA_HOME/lib/fontconfig.Fedora.bfc のリネームはしていません。

会社で他の人に使ってもらう GUI ツールがあって、プロトタイプは Tcl/Tk で作って試用してもらいました。しかし、そもそも自分は IT 部門の人間ではないので、長期的な保守を考えれば、(自分しか保守ができない言語で作るより) Java あたりで作り直しておいた方が無難かと思い、この年末年始の休みに作り替えてしまおうとしています。実行環境は Windows 上になりますが、開発は使い慣れた Fedora の方がはかどるからです。
 

追記


[1] の方法で確かに日本語フォントが表示できるようになりましたが、Fedora デフォルトでインストールされていなかった「さざなみ」フォントをインストールしたことで、ブラウザなどの表示フォントが変わってしまいました。以前のフォントの方が断然見やすかったので、「さざなみ」フォントの使用を止めて元に戻し、Windows のフォントを持ってきて(RPM を作成して)Java 用に使用できるように変更してしまいました。

 

2009-12-19

ReactOS 0.3.11

定より二ヶ月ほど遅れましたが、12 月 16 日に ReactOS 0.3.11 がリリースされました。最初 Linux 上の qemu に ReactOS の iso イメージをインストールしてみましたが、動作が固まってしまったりと不安定でした。そこで、出来合いの VMware 用イメージを Windows 上の VMware で起動してみました。

ReactOS 0.3.11

起動時のイメージが変更されています。なんだか昔の Windows for Workgroups 3.11 (WfW) の起動イメージを連想してしまうのは、自分だけでしょうか…。

前回は Linux 上で qemu を使用することにこだわったので、結局 ReactOS 側からネットワークへ接続できずじまいでしたが、今回は難なくネットワークを利用して Firefox をダウンロードしてインストールすることができました。

2009-12-18

【備忘録】Fedora を yum でアップグレード

Fedora 11 のままだった古いノート PC をようやく Fedora 12 へアップグレードしました。通常は、/home 以下のバックアップをとってクリーンインストールをすることにしていますが、今回は面倒だったので yum でアップデートしてみました。

まず以下の2つの RPM ファイルを入手します。

fedora-release-12-1.noarch.rpm
fedora-release-notes-12.0.0-4.fc12.noarch.rpm


例えば、ftp://ftp.kddilabs.jp/Linux/packages/fedora/releases/12/Fedora/ などから入手できます。

# rpm -Uvh fedora-release-12*
...
# yum clean all
# yum -y upgrade

アップグレード後再起動します。

参考サイト
ずんWiki - Fedora upgrade
 

2009-11-27

【備忘録】VMware で Chrome OS を試す

Chrome OS の VMware 用のイメージをダウンロードし、Windows Vista 上の VMware player で試してみました。VMware player はすでにインストールされているものとして、手順を説明します。

まず、gdgt のサイトから Chrome OS の VMware 用のディスクイメージ chrome-os-0.4.22.8-gdgt.vmdk.zip をダウンロードします。ダウンロードするには gdgt のアカウントを作成する必要があります。アカウント作成は無料でできます。ダウンロードしたファイルを解凍して、適当なフォルダ内に保存しておきます。

次に、VMX ファイルを用意します。このファイルは、pastebin - Chrome OS.vmx - post number 1681237 で紹介してあった記述をコピーし、メモリ容量を 1GB に変更して利用しました。chrome-os.vmx という名前で、ディスクイメージと同じフォルダに保存します。

config.version = "8"
memsize = "1024"

displayName = "Chrome OS"
guestOS = "other"

ide0:0.present = "TRUE"
ide0:0.fileName = "chrome-os-0.4.22.8-gdgt.vmdk"
ide1:0.present = "TRUE"
ide1:0.autodetect = "TRUE"
ide1:0.fileName = "auto detect"
ide1:0.deviceType = "cdrom-raw"


ethernet0.present = "TRUE"
ethernet0.connectionType = "bridged"
ethernet0.addressType = "generated"


sound.present = "TRUE"
sound.virtualDev = "es1371"

VMware player を起動し、「仮想マシンを開く」をクリックして、作成した chrome-os.vmx を読み込み、仮想マシンを再生すると Chrome OS が起動します。

しばらくするとログイン画面が出ますので、GMail のアカウントでログインします。なお、@gmail.com の部分は省略可能で、省略すると自動的に補完してくれます。ちなみにキーボード配列は 101 系のキーボード配列に対応しているようで、@ は Shift + 2 になります。


ログインすると、画面全体がブラウザの画面が表示されます。

Ctrl + Alt + t でターミナル画面を表示できます。シェルは bash です。exit で元の画面に戻ります(元に戻ってくれない時もあります)。

[1] Google Chrome OS (グーグルクロームOS) 使い方辞典 (2009年11月20日版)
 

2009-11-13

【備忘録】Dropbox の導入 (Fedora)

Dropbox は、インターネットを経由して、自分が利用している複数のパソコン間でファイルを自動同期したり、指定したほかのユーザーと共有できるオンラインストレージサービスです。アカウントを取得する必要がありますが、現在のところ 2GB までは無料で利用できます。なお、有料版は 50GB を月額 9.99 ドルあるいは年額 99.99 ドルで利用できます。

Dropbox は、専用のクライアントのソフトウェアをインストールするとで利用できます。Windows の場合、エクスプローラ上で他のフォルダ、ファイルを通常と同じように扱うことができます。すなわち、指定したローカルフォルダ内でファイルやフォルダを追加・削除・更新すると、自動でオンラインストレージに同期、あるいは共有先に反映されます。Linux の場合はエクスプローラの代わりに Nautilus で同じように操作ができるクライアントのソフトウェアが公開されています。

そろそろ Fedora 12 がリリースされるので、先行してβ版をインストールした際に、Doropbox をインストールし直したので、その手順をまとめました。Gnome デスクトップ環境で Nautilus を使用していることを前提にしています。

まず、クライアントソフトを以下から入手します。

[1] Dropbox - Downloading Dropbox - Secure backup, sync and sharing made easy.

Fedora の場合、Fedora Core 10 (x86_64, nautilus-dropbox-0.6.1-1.fc10.x86_64.rpm) あるいは Fedora Core 10 (x86, nautilus-dropbox-0.6.1-1.fc10.i386.rpm) をダウンロードしてインストールします。

インストールすると、GUI が起動して、ファイルの同期などに必要な Daemon のインストールが始まります。

インストールが終わると、次はアカウントを入力する手続きです。アカウントをまだ取得していない場合、ここで I don't have a Dropbox account を選択すると、ここで取得できます。私の場合は、既に Dropbox のアカウントを持っているので、I already have a Dropbox account を選択して、次に進みます。

Dropbox に登録してある電子メールアドレスをパスワードを入力して次に進みます。

この後、Dropbox の使用方法を説明する画面が 3 つほど続きますが、既に知っている場合は Skip tour and finish をクリックして最終画面に進みます。

デフォルトの場所に Dropbox のフォルダを生成する場合は、Finish をクリックして終了します。

Nautilus を開いて、Dropbox のフォルダーが作られていることを確認します。

注意


Fedora 12 をインストール後、既に使っていたアカウントのバックアップを戻してから、Dropbox のクライアント、nautilus-dropbox-0.6.1-1.fc10.x86_64.rpm をインストールしたためか、すぐに設定用のダイアログ画面が現れませんでした。ログアウト/ログインし直しても設定用のダイアログが表示されない場合は、以下の様にコンソール上で起動します。

$ dropbox start -i

参考サイト


[2] Dropbox - Home - Secure backup, sync and sharing made easy.
[3] Dropbox徹底解剖 - 一度使ったら手放せなくなる! オンラインストレージサービスの本命 | Web担当者Forum
 

2009-11-07

Fedora 12 と MinGW クロスコンパイル

Get MinGW Cross Compiler at SourceForge.net. Fast, secure and Free Open Source software downloads
Fedora 12 のベータ版を古いノートパソコン (X31) にインストールして、MinGW クロスコンパイル環境を評価しています。

Fedora がクロスコンパイル環境をサポートする以前は、Windows 用 Tcl/Tk を、Linux でクロスコンパイルできれば、まずまずの満足ができたのですが、このように環境が充実してくると欲が出てきます。

折角、基本的な GTK+ ライブラリが利用できるのですから、最近は Windows 用 GIMP を自前でクロスコンパイルするべく、いろいろ試しています。Fedora 11 では(というより、おそらくは mingw32-glib2 などのバージョンのせいで)クロスコンパイル用にビルドできなかった gegl を、なんとかビルドできたので、babl と一緒に SourceForge.net のプロジェクトサイトへアップしました。(ちなみに babl の方は、F11 でもビルド出来ていました。gegl は、babl に依存しています。)

[LIB] gegl
[LIB] babl

これで、最新の GIMP がクロスコンパイル出来るようになったかというと、そうではありません。しかし、一歩実現に近づいたと思っています。目標は、Win32 用 GTK+ のランタイムパッケージと、GIMP 本体を別々のインストーラで公開出来るようにすることです。

Windows 7 が発売され、64bit OS の普及が加速されそうですが、MinGW クロスコンパイルについては、まだ 32bit に集中しようと考えています。

[1] 2. GIMP 2.6 の新機能
 

2009-10-18

【備忘録】GCC のランタイムライブラリの扱い

Qt や wxWidgets を利用したクロスコンパイルしたバイナリは、mingwm10.dll や GCC のランタイムライブラリ libgcc_s_sjlj-1.dll に依存しています。この2つのファイルについては、ランタイムライブラリのインストーラとして別に作成しておいた方が、Qt や wxWidgets など C++ 系のランタイムライブラリのインストーラを用意する際に運用がしやすいのですが、配布する際のライセンスをどうすればいいのか、いまひとつはっきりしませんでした。

Windows 上で実行する場合、mingwm10.dll は問題がないとしても、GCC のライセンスは GPL に従っているから、libgcc_s_sjlj-1.dll の扱いをどうするか悩みます。

調べてみると、GCC のランタイムライブラリについては、ちゃんと例外条項がありました。これですっきりしました。BSD 系 UNIX が gcc を利用していても BSD ライセンスに従うことができるのは、もしかしてこの例外条項のおかげなのかな?まだまだ勉強不足です。

とにかく、近日中に Windows 用ランタイムライブラリのインストーラをいくつかか追加しようと考えています。

[1] GCC Runtime Library Exception - GNU Project - Free Software Foundation (FSF)
[2] ライセンス(ライトニングトークつづき) - bero の日記
 

2009-10-14

Qt でクロスコンパイル

Get MinGW Cross Compiler at SourceForge.net. Fast, secure and Free Open Source software downloads
MinGW のクロスコンパイル用パッケージ、mingw32-qt のインポートライブラリ libQt4* に、libQT* で始まる名前のシンボリックリンクを加えたところ、Hello World! のプログラムをクロスコンパイルすることができました。編集を加えた RPM パッケージを以下にアップロードしました。

- mingw32-qt-4.5.2-1.1

前回のサンプルをクロスコンパイルしたバイナリを wine 上で実行してみたところ、qmake-qt4make でコンパイルができたものの。日本語フォントの表示ができなかったので、プログラム hello_qt.cpp を若干変更しました。

#include <QApplication>
#include <QPushButton>
#include <QTextCodec>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));

QPushButton hello("こんにちは、世界!");
hello.setWindowTitle("Hello World!");

hello.show();
return app.exec();
}

コンパイルは、前回の Fedora ネイティブ用のコンパイルと同様、qt-devel に収録されている /usr/bin/qmake-qt4 を利用しますが、クロスコンパイルで利用するためには、mingw32-qt-qmake もインストールしておく必要があります。その上で QMAKESPEC 環境変数をクロスコンパイル用の情報を参照するように設定します。
make すると、バイナリはサブディレクトリ release に出力されます。

[bitwalk@localhost qt_hello]$ export QMAKESPEC=fedora-win32-cross
[bitwalk@localhost qt_hello]$ qmake-qt4 -project
[bitwalk@localhost qt_hello]$ qmake-qt4
[bitwalk@localhost qt_hello]$ make
make -f Makefile.Release
make[1]: ディレクトリ `/home/bitwalk/work/qt_hello' に入ります
i686-pc-mingw32-g++ -c -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 --param=ssp-bu
ffer-size=4 -mms-bitfields -O2 -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_NO_DE
BUG -DQT_GUI_LIB -DQT_CORE_LIB -I"/usr/i686-pc-mingw32/sys-root/mingw/include/Qt
Core" -I"/usr/i686-pc-mingw32/sys-root/mingw/include/QtGui" -I"/usr/i686-pc-ming
w32/sys-root/mingw/include" -I"." -I"release" -I"/usr/lib64/qt4/mkspecs/fedora-w
in32-cross" -o release/hello_qt.o hello_qt.cpp
i686-pc-mingw32-g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-ru
ntime-pseudo-reloc -Wl,-s -o release/qt_hello.exe release/hello_qt.o -L"/usr/i6
86-pc-mingw32/sys-root/mingw/lib" -lQtGui -lQtCore
make[1]: ディレクトリ `/home/bitwalk/work/qt_hello' から出ます
[bitwalk@localhost qt_hello]$ ./release/qt_hello &
[2] 2680
[bitwalk@localhost qt_hello]$ err:wintab32:X11DRV_LoadTabletInfo Unable to initi
alize the XInput library.
fixme:win:FlashWindowEx 0x61dd98


wine で実行すると、日本語フォントはきれいではありませんが、とにかく表示されています。

実行に必要な DLL と一緒に Windows へコピーして実行してみます。



コマンドプロンプトのコンソールも表示されてしまいますが、実行できます。また、フォントは wine で実行した時に比べるとずっとまともです。

より詳細な情報は、後日 MinGW クロスコンパイル - Workshop Complex at bitWalk にまとめる予定です。

参考サイト
[1] VikiWiki - Qt
[2] qmake のコンセプト
 

2009-09-24

Windows Vista の再インストール


Windows Vista(32bit版)が、Service Pack 1 のままであることに気がつき、何回か Service Pack 2 にアップデートしようとしましたが、再起動したあとの設定で何かエラーが発生しているようで、前の設定に復元されてしまいます。これではエラーの原因がわからないので、Windows Vista を再インストールすることにしましたが、トラブルにぶつかってしまいました。

300GB HDD の最初の 100GB を Windows 用に、残り 200GB を Linux 用に使っていましたので、必要なバックアップをとり、まずは Windows Vista からインストールし直そうと、以前と同じパーティションを指定したところ、「インストールできるシステム ボリュームが見つかりません。」というメッセージが出てインストールの処理に進めなくなってしまいました。

結局、下記の情報を元に、Diskpart.exe ユーティリティを使用してハード ディスクをクリーンな状態にしたところ、無事インストールができました。

[1] Windows Vista をインストールするときにハード ディスク パーティションの選択またはフォーマットができない

その後、時間を掛けて Windows Vista を SP1 → SP2 と、無事アップデートできました。しかし、Windows のアップデートは、順番があるので長い!Linux のように一度にアップデートできれば楽なんですが…。その後 Linux (Fedora 11) もインストールして、無事元の環境に戻すことができました。

結局のところ、オリジナルの環境で Service Pack 2 へアップデートできなかった理由がわからないし、Diskpart.exe ユーティリティなんて使ったのは初めてだったので、clean all で HDD を隙間なく 0 で埋めたこと以外によく理解していません。時間ばかりかけただけで釈然としません。

そもそも、Windows Vista はたまにしか使いません。久しぶりに使うときにはいつもアップデートが始まり、そして再起動…。そのまま席を立ってしまうのでアップデートがちゃんとされたかどうかもよく見ていませんでした。

Windows 7 を導入する時に、同じようなトラブルに悩まされるのだろうか?
 

2009-08-30

確率プロットの作成


ックスプロットで使ったデータを、確率プロットで表示してみました。凡例には、データ数とメディアンを表示しています。

# CDF PLOT SAMPLE
# =============================================================================
# chart.cdf
# =============================================================================

chart.cdf <- function(tbl, valX = "RAW_VALUE", colBy = "condition",
gTitle = "", xLab = "measured data") {
x <- tbl[, valX]
x <- x[!is.na(x)]
n <- length(x)
x <- sort(x)
y <- (1:n - 0.375) / (n + 0.25)

probs <- c(0.001, 0.01, 0.1, 1, 5, 10, 20, 30, 40, 50,
60, 70, 80, 90, 95, 99, 99.9, 99.99, 99.999) / 100
m <- length(probs)

x_min <- x[1]
x_max <- x[n]
x_pad <- (x_max - x_min) * 0.4

y_min <- qnorm(probs[1])
y_max <- qnorm(probs[m])
y_stp <- (y_max - y_min) * 0.1

plot(c(x_min, x_max + x_pad), c(y_min, y_max),
type = "n", yaxt = "n",
xlab = xLab, ylab = "Cumulative Percent",
main = gTitle, cex.main = 1)
axis(2, qnorm(probs), probs * 100)
abline(h = qnorm(probs), lty = 3, col = "#C0C0C0")
abline(h = 0, lty = 1, col = "#808080")

listBy <- sort(unique(tbl[, colBy]))
k <- length(listBy)
for (i in 1:k) {
valBy <- listBy[i]
x <- tbl[tbl[, colBy] == valBy, valX]
x <- x[!is.na(x)]
n <- length(x)
x <- sort(x)
y <- (1:n - 0.375) / (n + 0.25)

total <- length(x)
x.median <- median(x)
legend_label <- paste(valBy, ':', total, "/", x.median)

points(x, qnorm(y), type='o', col = i, pch = i)

legend_x <- x_max + x_pad * 0.05
legend_y <- y_max - y_stp * (i - 1)
legend_lty = 1
legend(legend_x, legend_y, legend_label, col = i,
lty = legend_lty, pch = i, ncol = 1, cex = 0.7, box.lty = 0)
}
}
# =============================================================================
# open.png
# =============================================================================

open.png <- function(imgName, picWidth = 640, picHeight = 400) {
png(filename = imgName, width = picWidth, height = picHeight,
units = "px", pointsize = 14, bg = "white", res = NA)
}
# -----------------------------------------------------------------------------
# MAIN
# -----------------------------------------------------------------------------
# _____________________________________________________________________________
# READ CSV DATA

file.name <- "./sample_box.csv"
tbl.data <- read.csv(file.name, header = T, as.is = T)
# _____________________________________________________________________________
# generate CDF PLOT

head.y <- names(tbl.data)[1]
head.x <- names(tbl.data)[2]
title.box <- paste("SAMPLE (n = ", length(tbl.data[, head.x]), ")",
sep = "")
label.x <- "Measurement"
chart.cdf(tbl.data, head.x, head.y, title.box, label.x)
# _____________________________________________________________________________
# generate PNG FILE

open.png("sample_cdf.png")

chart.cdf(tbl.data, head.x, head.y, title.box, label.x)
dev.off()
# ---
# END PROGRAM


実行例



Fedora で実行した例を示します。

$ R

R version 2.9.2 (2009-08-24)
Copyright (C) 2009 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
...
(途中省略)
...
'q()'と入力すればRを終了します。

> source("cdf.R")

X Window 上では以下の様に表示されます。

出力された PNG ファイルはこんな感じになります。

 

2009-08-29

ボックスプロットの作成


数条件による測定データをボックスプロットにして表示するスクリプトを紹介します。データは CSV 形式で、一行目がヘッダーになっています。この例では一列目が条件、二列目がデータになっています。

# BOXPLOT SAMPLE
# =============================================================================
# chart.boxplot
# =============================================================================

chart.boxplot <- function(tbl, val_x, val_y,
gTitle = "", xLab = "", yLab = "") {
tmp <- data.frame(x = tbl[, val_x], y = tbl[, val_y])
y_max <- max(tmp$y, na.rm = TRUE)
y_min <- min(tmp$y, na.rm = TRUE)
yLimit <- c(y_min, y_max)

bp <- boxplot(y ~ x, data = tmp, ylim = yLimit,
main = gTitle, xlab = xLab, ylab =yLab,
col = "lightblue", cex.main = 1)
}
# =============================================================================
# open.png
# =============================================================================

open.png <- function(imgName, picWidth = 640, picHeight = 400) {
png(filename = imgName, width = picWidth, height = picHeight,
units = "px", pointsize = 14, bg = "white", res = NA)
}
# -----------------------------------------------------------------------------
# MAIN
# -----------------------------------------------------------------------------
# _____________________________________________________________________________
# READ CSV DATA

file.name <- "./sample_box.csv"
tbl.data <- read.csv(file.name, header = T, as.is = T)
# _____________________________________________________________________________
# generate BOXPLOT

head.x <- names(tbl.data)[1]
head.y <- names(tbl.data)[2]
title.box <- paste("SAMPLE (n = ", length(tbl.data[, head.x]), ")",
sep = "")
label.x <- "Condition"
label.y <- "Measurement"
chart.boxplot(tbl.data, head.x, head.y, title.box, label.x, label.y)
# _____________________________________________________________________________
# generate PNG FILE

open.png("sample_boxplot.png")

chart.boxplot(tbl.data, head.x, head.y, title.box, label.x, label.y)
dev.off()
# ---
# END PROGRAM


実行例



Fedora で実行した例を示します。

$ R

R version 2.9.2 (2009-08-24)
Copyright (C) 2009 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
...
(途中省略)
...
'q()'と入力すればRを終了します。

> source("boxplot.R")

X Window 上では以下の様に表示されます。

出力された PNG ファイルはこんな感じになります。

 

2009-08-28

ヒストグラムの作成


用目的で測定データをヒストグラムにして表示するスクリプトを紹介します。データは CSV 形式で、一行目がヘッダーになっています。この例では一列目のデータをヒストグラムにしています。 X Window 上で表示するのに加えて PNG 画像にも出力するようにしました。

# HISTOGRAM SAMPLE
library(KernSmooth)
# =============================================================================
# chart.hist
# =============================================================================

chart.hist <- function(tbl, val_x, gTitle = "", xLab = "data") {
x <- sort(tbl[, val_x])
h <- try(dpih(x), TRUE)
if (!is.numeric(h)) {
h <- 10**round(log(range(x)[2] - range(x)[1]))
}
bins <- seq(min(x) - 0.1, max(x) + 0.1 + h, by = h)

x_max <- max(x, na.rm = TRUE)
x_min <- min(x, na.rm = TRUE)
xLimit <- c(x_min, x_max)

hg <- hist(x, breaks = bins, freq = FALSE,
main = gTitle, xlab = xLab, xlim = xLimit,
col = "lightblue", cex.main = 1, family = "mono")

points(x, dnorm(x, mean(x), sd(x), log = FALSE),
type='l', col = "magenta", lwd = 1)
points(density(x), type = 'l', col = "orange", lwd = 1)
}
# =============================================================================
# open.png
# =============================================================================

open.png <- function(imgName, picWidth = 640, picHeight = 400) {
png(filename = imgName, width = picWidth, height = picHeight,
units = "px", pointsize = 14, bg = "white", res = NA)
}
# -----------------------------------------------------------------------------
# MAIN
# -----------------------------------------------------------------------------
# _____________________________________________________________________________
# READ CSV DATA

file.name <- "./sample_hist.csv"
tbl.data <- read.csv(file.name, header = T, as.is = T)
# _____________________________________________________________________________
# generate HISTOGRAM

head.x <- names(tbl.data)[1]
title.hist <- paste("SAMPLE (n = ", length(tbl.data[, head.x]), ")",
sep = "")
label.x <- "Measurement"
chart.hist(tbl.data, head.x, title.hist, label.x)
# _____________________________________________________________________________
# generate PNG FILE

open.png("sample_hist.png")
chart.hist(tbl.data, head.x, title.hist, label.x)
dev.off()
# ---
# END PROGRAM


実行例



Fedora で実行した例を示します。

$ R

R version 2.9.2 (2009-08-24)
Copyright (C) 2009 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
...
(途中省略)
...
'q()'と入力すればRを終了します。

> source("hist.R")
KernSmooth 2.23 loaded
Copyright M. P. Wand 1997-2009


X Window 上では以下の様に表示されます。

出力された PNG ファイルはこんな感じになります。

 

2009-08-22

リストの要素を変数に代入する(2)


名さんから lassign で良いのでは、というコメントをいただきました。ハイ、その通りです。ご指摘をありがとうございました。

Tcl/Tk リリース履歴 の Tcl 8.5a1 and Tk 8.5a1 (2004-03-03) における特記事項に、自分でちゃんとこのコマンドを書いておりました。そればかりか、恥ずかしいことに、なんと「要素の値を変数へ代入」で lassign の説明すらしています。それなのに、全然利用していませんでした。利用しないと忘れます。未だに、サブルーチン(proc コマンド)から戻り値をリストで受けとると、値を lindex コマンドで変数に振り分けていました。少なくとも最近書いている Tcl のコードは書き直す必要があります。未熟な知識に反省です。

$ tclsh
% lassign [list 1 2 3] a b c
% puts $a
1
% puts $b
2
% puts $c
3
% exit

2009-08-21

リストの要素を変数に代入する


perl で、リストの要素を変数に代入する場合は次のように記述します。

$ perl
($a, $b, $c) = (1, 2, 3);
print $a, "\n";
print $b, "\n";
print $c, "\n";

^D1
2
3

$

とてもスマートにできます。


Tcl の場合だと次のようにします。perl の表現に比べると、とても武骨です。

$ tclsh
% set z [list 1 2 3]
1 2 3
% set a [lindex $z 0]
1
% set b [lindex $z 1]
2
% set c [lindex $z 2]
3
% exit
$

もっと簡単にできないかと考えたところ、名案が浮かびました。perl ほどではありませんが…。

$ tclsh
% foreach {a b c} [list 1 2 3] {}
% puts $a
1
% puts $b
2
% puts $c
3
% exit
$

考えてみると、だれか他の人の Tcl コードで既にこのように使われていた気がします。その時にはちゃんと理解できず見逃していたのでしょう。
 

2009-08-15

ReactOS 0.3.10 (2)

ReactOS が利用できるようになったので、早速いくつかのアプリケーションをインストールしてみようと、iso イメージを作り、ごく普通の方法でインストールして使えるかどうか試してみました。

まず、試してみるインストーラを適当なディレクトリ(この例では Apps)にコピーして、iso 形式のファイルを作成します。これを CD-ROM のドライブに指定して、qemu で ReactOS を起動します。

$ ls Apps
ActiveTcl8.5.7.0.290198-win32-ix86-threaded.exe jre-6u15-windows-i586-s.exe
Firefox Setup 3.5.2.exe tcltk8.6b1-017-20081224.exe
OOo_3.1.0_Win32Intel_install_en-US.exe winzip121.exe
$ genisoimage -r -l -J -o Apps.iso Apps
I: -input-charset not specified, using utf-8 (detected in locale settings)
4.90% done, estimate finish Sat Aug 15 22:06:33 2009
9.80% done, estimate finish Sat Aug 15 22:06:33 2009
:
(途中省略)
:
92.98% done, estimate finish Sat Aug 15 22:06:37 2009
97.87% done, estimate finish Sat Aug 15 22:06:37 2009
Total translation table size: 0
Total rockridge attributes bytes: 776
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
102189 extents written (199 MB)
$ qemu -m 1024 -smp 1 -cdrom Apps.iso -hda ReactOS.img

結論から言うと、ほとんどまともにインストールできませんでした。結果は以下の通り。

WinZip 12.1


インストールの最後の方でエラー発生でインストールできず。


Firefox 3.5.2


インストールは無事終了するが起動せず。


Java (JRE 6)


インストールの最後でエラー発生。しかし、バイナリーのコピーは終わっていそうだったので、ひきつづき OpenOffice.org をインストールしてみる。


OpenOffice.org 3.1.0 (w/o JRE)


なんと、インストールが終了しました、が、よく読んでみるとちゃんとインストールされたわけではなさそうです。



おまけにリブートすると OS が立ち上がらず…。結局 ReactOS を再インストールすることに。


Tcl/Tk


ActiveTcl は最初の段階でインストーラが止まってしまい(もしかすると、ずっと放置しておけばインストールできたかもしれないが)インストールできませんでした。結局まともにインストールできたのは、レジストリ操作などの作りが一番簡単だと思われる、自製の MinGW クロスコンパイル版の Tcl/Tk 8.6b1 だけでした。



ReactOS はまだアルファ段階(開発レベル)ですので、多くを期待することはできないかもしれません。しかし OpenOfice.org とインターネット関連のソフトウェアが動作するようになれば、Windows の代替として十分注目される OS になることでしょう。

次のバージョン 0.3.11 は早ければ来月にリリースされるとのことですので、新しいバージョンでもこういった評価をしてみたいと考えています。

それまでに qemu でネットワークの設定を正しくできるようにして、さらに qemu の使い方をもっとマスターしておくようにします。