2008-11-29

TclOO - Tcl の標準オブジェクトシステム(3)


ブジェクト指向プログラミングを採用する大きなメリットは、開発したソフトウェアをコンポーネント(部品)として再利用できることでしょう。再利用性が高ければ、生産性向上が期待できます。

しかし、そもそもプログラムを再利用するとはどういうことでしょうか。既存のプログラムソースからコピーして利用することも再利用には違いありません。しかし、毎回そうするのは効率的ではありません。なんらかの形で再利用するプログラムを共有できるようにできれば、いちいち必要な部分をコピーする手間が省けます。

Tcl では、プログラムをパッケージ化してライブラリとして利用できます。オブジェクト指向とパッケージ化とは同じではありませんが、パッケージ化することでオブジェクト指向プログラミングの高い再利用性というメリットを享受しやすくなります。ここでは Tcl のスクリプトのパッケージ化を支援する機能を紹介し、前回のサンプルに応用してみます。

プログラムのパッケージ化


Tcl では、パッケージに関する操作を package コマンドでおこないます。Tcl プログラムでパッケージを読み込む場合は、

package require パッケージ名 ?バージョン番号?

のようにします。Tcl は変数 auto_path に格納されているパス内から指定されたパッケージを検索し、パッケージ名が存在すれば、パッケージがスクリプトであれば source コマンドで、バイナリの共有ライブラリであれば load コマンドで読み込みます。

変数 auto_path のデフォルト値は、Tcl がインストールされている場所に依存した値が格納されています。自分が使っている Fedora Linux 10 の RPM パッケージ、Tcl 8.5.3 では、次のようになっています。

$ tclsh
% puts $auto_path
/usr/share/tcl8.5 /usr/lib/tcl8.5 /usr/lib/tk8.5
%

TclOO がビルトインパッケージに組み込まれた Tcl/Tk 8.6 系はまだα版ですので、$HOME 内にインストールして使用しています。この場合は、次のようになっています。

$ tclsh8.6
% puts $auto_path
/home/bitwalk/lib/tcl8.6 /home/bitwalk/lib
%

$HOME 内にインストールされていれば、パッケージのインストールパスは、自分でプログラムの編集に利用できる領域ですが、Linux ディストリビューションから配布されているパッケージの場合は、/usr 以下の領域ですのでそうはいきません。

auto_path は、プログラム側で変更可能な変数です。そこで、適当な名前の環境変数を用意してプライベートなパッケージ領域のパスを設定し、Tcl 側の配列 env でその値を読み、変数 auto_path にそのパスを追加することにします。

環境変数を .bashrc に次にように追加しました。

export TCLPKG=$HOME/tclpkg

環境変数名は TCLPKG でなければならない、というわけではありません。しかし、本ブログでの説明では、今後、この環境変数名を使います。

ちなみに csh/tcsh をシェルに使っている場合は、.cshrc あるいは .tcshrc に、

setenv TCLPKG $HOME/tclpkg

と追加します。

Tcl では、配列 env で、この環境変数の値を利用できます。

$ tclsh8.6
% parray env
env(COLORTERM) = gnome-terminal
env(CVSROOT) = :ext:bitwalk@mingw-cross.cvs.sourceforge.net:/cvs...
env(CVS_RSH) = ssh
(中略)
env(TCLPKG) = /home/bitwalk/tclpkg
env(TERM) = xterm
env(USER) = bitwalk
env(USERNAME) = bitwalk
env(WINDOWID) = 48240455
(中略)
%

これで準備ができました。

前のサンプル・プログラム tkwidget_canvas_2.tcl で利用したクラス Draw の部分を分離してパッケージ化します。

まず、パッケージを格納する場所を決めましょう。$HOME/tclpkg 以下に Draw というディレクトリを作成しておきます。

$ mkdir ~/tclpkg
$ mkdir ~/tclpkg/Draw

サンプル・プログラム tkwidget_canvas_2.tcl から分離したプログラムは次のようになります。スクリプトの先頭にある package provide Draw 1.0 は、パッケージ名(Draw)とバージョン(1.0)を、呼び出す側のプログラムで実行した package require コマンドに(間接的に)知らせるためのコマンドです。パッケージ名は先頭を大文字にします。

# ----------------------------------------------------------------------------
# 拡張パッケージ Draw
# ----------------------------------------------------------------------------

package provide Draw 1.0

package require Tk;
package require TclOO; # ビルトインパッケージなので省略可
namespace import oo::*

# ----------------------------------------------------------------------------
# クラス Draw
# ----------------------------------------------------------------------------

class create Draw {
# ------------------------------------------------------------------------
# コンストラクタ
# ------------------------------------------------------------------------

constructor {} {
my variable conf
set conf(color) black
set conf(width) 1
}

# ------------------------------------------------------------------------
# 設定
# ------------------------------------------------------------------------

method init {color {width 1}} {
my variable conf
set conf(color) $color
set conf(width) $width
return
}

# ------------------------------------------------------------------------
# 描画起点の座標を取得
# ------------------------------------------------------------------------

method first {x y} {
my variable conf
set conf(x0) $x
set conf(y0) $y
return
}

# ------------------------------------------------------------------------
# 線を描画
# ------------------------------------------------------------------------

method line {w x y} {
my variable conf
$w create line $conf(x0) $conf(y0) $x $y \
-fill $conf(color) \
-width $conf(width) \
-tags mLine
my first $x $y
return
}

# ------------------------------------------------------------------------
# 線を消去
# ------------------------------------------------------------------------

method erase {w} {
$w delete mLine
return
}
}

# ---
# Draw.tcl


これを Draw.tcl というファイル名で、先ほど作成した ~/tclpkg/Draw に保存します。

次に、呼び出すプログラム側がパッケージを検索するのに必要なインデックスファイル pkgIndex.tcl を生成します。このファイルは、Tcl の pkg_mkIndex コマンドを使うと簡単に生成できます。

$ cd ~/tclpkg/Draw
$ ls
Draw.tcl
$ tclsh8.6
% pkg_mkIndex . *.tcl
% exit
$ ls
Draw.tcl pkgIndex.tcl
$

生成された pkgIndex.tcl は次のようになっています。

# Tcl package index file, version 1.1
# This file is generated by the "pkg_mkIndex" command
# and sourced either when an application starts up or
# by a "package unknown" script. It invokes the
# "package ifneeded" command to set up package-related
# information so that packages will be loaded automatically
# in response to "package require" commands. When this
# script is sourced, the variable $dir must contain the
# full path name of this file's directory.


package ifneeded Draw 1.0 [list source [file join $dir Draw.tcl]]

これで Draw パッケージの作成完了です。

さて、クラスの部分を分離した本体の tkwidget_canvas_2.tcltkwidget_canvas_3.tcl にファイル名を変更)は次のようにします。

#!/bin/sh
# the next line restarts using wish \
exec wish8.6 "$0" "$@"

# 環境変数 TCLPKG が定義されていれば auto_path に追加
if {[info exist env(TCLPKG)]} {
lappend auto_path $env(TCLPKG)
}
package require Draw

# ----------------------------------------------------------------------------
# メイン
# ----------------------------------------------------------------------------

wm title . "canvas"

set color_bg "#f0fff8"
set color_grid "#c0e0d0"
set color_draw "#804040"

# キャンバスの生成
set cw 200
set ch 200
canvas .can \
-width $cw \
-height $ch \
-borderwidth 0 \
-highlightthickness 0 \
-background $color_bg
pack .can

# 方眼
for {set y 0} {$y < $ch} {incr y 10} {
.can create line 0 $y $cw $y -fill $color_grid
}
for {set x 0} {$x < $cw} {incr x 10} {
.can create line $x 0 $x $ch -fill $color_grid
}

# クラス Draw のインスタンス pen を生成
set pen [Draw new]

# メソッド init で描画色を設定
$pen init $color_draw

# マウス左ボタンを .can 上で押した時、メソッド first で座標を取得
bind .can <Button-1> {$pen first %x %y}

# マウス左ボタンを押しながら .can 上を移動した時、メソッド line を実行
bind .can <B1-Motion> {$pen line %W %x %y}

# ---
# tkwidget_canvas_3.tcl

2008-11-26

Fedora 10 リリース


Fedora 10 が 11 月 25 日にリリースされました。「Fedora 10 Desktop エディション」という呼称になっています。前から「Desktop エディション」なんて呼び方していなかったような気がしますが、リリースノートには「4. デスクトップユーザーへの最新事項」という項目があり、まさにデスクトップユーザーに必要な情報が掲載されています。

で、さっそくアップグレードを始めてみました。DVD に iso イメージを焼くことはせず、yum でアップグレードをする方法にしました。Preupgrade が利用できるかと思って最初試しましたが、Fedora 10 のアップグレードを選択できなかったので今回は諦めました。

yum によるアップグレードの方法は、全面的に関連情報の [3] を参考にしました。ただいまパッケージをダウンロード中…。回線が込んでいるようで、度々ミラーサイトを探しています。

明日の朝になってもダウンロードが全部終わっていないかもしれません。

関連情報
[1] Fedora Project
[2] 最新デスクトップLinux「Fedora 10」リリース
[3] 「Fedora 8」が公開。yum で Fedora 7 からアップグレード
[4] Fedora 10が正式リリース − @IT
[5] インフラにおける問題発生を乗り越え『Fedora 10』公開
[6] スラッシュドット・ジャパン | Fedora 10リリース
 

2008-11-23

TclOO - Tcl の標準オブジェクトシステム(2)


Tcl/Tk8.6a1 から、TclOO が標準のオブジェクトシステムとしてコアパッケージに取り込まれましたが、その TclOO を利用したサンプルプログラムを紹介します。オブジェクト指向プログラミングの利点を効果的に活用しているかというと疑問ですが、とにかくいろいろなサンプルを不定期で紹介していきたいと考えています。

サンプル・プログラム


今回は、canvas ウィジェットにマウスで曲線を描画するサンプルです。Tk 入門の canvas の説明で紹介しているサンプルを TclOO を利用したプログラムに書き換えました。

#!/bin/sh
# the next line restarts using wish \
exec wish8.6 "$0" "$@"

package require TclOO; # ビルトインパッケージなので省略可
namespace import oo::*

# ----------------------------------------------------------------------------
# クラス Draw
# ----------------------------------------------------------------------------

class create Draw {
# ------------------------------------------------------------------------
# コンストラクタ
# ------------------------------------------------------------------------

constructor {} {
my variable conf
set conf(color) black
set conf(width) 1
}

# ------------------------------------------------------------------------
# 設定
# ------------------------------------------------------------------------

method init {color {width 1}} {
my variable conf
set conf(color) $color
set conf(width) $width
return
}

# ------------------------------------------------------------------------
# 描画起点の座標を取得
# ------------------------------------------------------------------------

method first {x y} {
my variable conf
set conf(x0) $x
set conf(y0) $y
return
}

# ------------------------------------------------------------------------
# 線を描画
# ------------------------------------------------------------------------

method line {w x y} {
my variable conf
$w create line $conf(x0) $conf(y0) $x $y \
-fill $conf(color) \
-width $conf(width) \
-tags mLine
my first $x $y
return
}
}

# ----------------------------------------------------------------------------
# メイン
# ----------------------------------------------------------------------------

wm title . "canvas"

set color_bg "#f0fff8"
set color_grid "#c0e0d0"
set color_draw "#804040"

# キャンバスの生成
set cw 200
set ch 200
canvas .can \
-width $cw \
-height $ch \
-borderwidth 0 \
-highlightthickness 0 \
-background $color_bg
pack .can

# 方眼
for {set y 0} {$y < $ch} {incr y 10} {
.can create line 0 $y $cw $y -fill $color_grid
}
for {set x 0} {$x < $cw} {incr x 10} {
.can create line $x 0 $x $ch -fill $color_grid
}

# クラス Draw のインスタンス pen を生成
set pen [Draw new]

# メソッド init で描画色を設定
$pen init $color_draw

# マウス左ボタンを .can 上で押した時、メソッド first で座標を取得
bind .can <Button-1> {$pen first %x %y}

# マウス左ボタンを押しながら .can 上を移動した時、メソッド line を実行
bind .can <B1-Motion> {$pen line %W %x %y}

# ---
# tkwidget_canvas_2.tcl




関連情報
[1] Tcl 入門編 - TclOO
 

2008-11-17

wxWidgets でもクロスコンパイル

SourceForge.net Logo
回、FOX Toolkit について、Hello World! 的なプログラムを紹介しましたので、同じくクロスコンパイル用の RPM で公開している C++ 用 GUI ライブラリ wxWidgets についても同じように簡単なプログラムをコンパイルした例を紹介したいと思います。プログラムは以下のチュートリアル用ページをベースにしました。

Hello World - wxWidgets

表示される文字列を日本語にした他は、同じプログラムです。

// Hello World program with wxWidgets
#include "wx/wx.h"

class MyApp: public wxApp
{
virtual bool OnInit();
};

class MyFrame: public wxFrame
{
public:

MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);

void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);

DECLARE_EVENT_TABLE()
};

enum
{
ID_Quit = 1,
ID_About,
};

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Quit, MyFrame::OnQuit)
EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame(_T("こんにちは、世界!"),
wxPoint(50,50), wxSize(450,340));
frame->Show(TRUE);
SetTopWindow(frame);
return TRUE;
}

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
{
wxMenu *menuFile = new wxMenu;

menuFile->Append(ID_About, _T("このプログラムについて(&A)"));
menuFile->AppendSeparator();
menuFile->Append(ID_Quit, _T("終了(&x)"));

wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append(menuFile, _T("ファイル(&F)"));

SetMenuBar(menuBar);

CreateStatusBar();
SetStatusText(_T("wxWidgets へようこそ!"));
}

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close(TRUE);
}

void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
wxMessageBox(_T("はじめてのプログラム、こんにちは、世界!"),
_T("このプログラムについて"), wxOK | wxICON_INFORMATION, this);
}

コンパイルには、Linux の pkg-config を利用するので、MinGW のバイナリがインストールされている /usr/local/i386-mingw32/bin へパスを通しておきます。もし、Linux 側にも wxWidgets がインストールされている場合には、パスの順序を考慮する必要があります。

$ export PATH=$PATH:/usr/local/i386-mingw32/bin
$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/mingw32ce/bin:/home/bi
twalk/bin:/usr/local/i386-mingw32/bin
$ i386-mingw32-g++ hello.cpp `wx-config --libs` `wx-config --cxxflags`
-o hello.exe

$ ./hello.exe




Windows 上での動作確認もしようと思ったのですが、必要なランタイム DLL が多そうだったので、それはまた別の機会に紹介します。

$ i386-mingw32-objdump -p hello.exe | grep DLL
vma: Hint Time Forward DLL First
DLL Name: KERNEL32.dll
DLL Name: mingwm10.dll
DLL Name: msvcrt.dll
DLL Name: msvcrt.dll
DLL Name: wxbase28u_gcc_custom.dll
DLL Name: wxmsw28u_core_gcc_custom.dll

ちなみに、必要なランタイム DLL は wbc を使って調べることができます。

2008-11-16

FOX Toolkit でクロスコンパイル

SourceForge.net Logo
FOX Toolkit は、C++で記述された GUI 用ライブラリです。UNIX 系 OS だけでなく、Windows にも対応しています。そのため、以前から MinGW クロスコンパイルで Windows 用ライブラリを作成しようとしてきましたが、なかなか DLL を作成できません。しかし、スタティックライブラリだけでも、それなりに利用価値があるだろうということで、RPM パッケージを公開することにしました。

[LIB] FOX

スタティックライブラリでコンパイルした場合、必要なルーチンがすべて取り込まれてしまうのでバイナリのサイズが大きくなりますが、その代わり、ファイル単体を他の Windows PC へ移して、DLL のランタイムライブラリなしに即実行することができます。

ここでは、FOX Toolkit を利用した、いわゆる Hello World! 的なプログラムのコンパイル例を紹介します。Hello World! のプログラム hello.cpp は以下のとおりです。このプログラムは、Wikipedia に掲載されていたプログラムをベースとしました。

// Hello World program with FOX toolkit
#include <fox/fx.h>

int main(int argc, char *argv[]) {
FXApp application("Hello", "FoxTest");
application.init(argc, argv);
FXMainWindow *main
= new FXMainWindow(&application, "Hello", NULL, NULL, DECOR_ALL);
new FXButton(main, "こんにちは、世界!(&w)", NULL,
&application, FXApp::ID_QUIT);

application.create();
main->show(PLACEMENT_SCREEN);
return application.run();
}

ファイルのコンパイルは、Makefile を作るほどではないので、次のようにしました。

$ i386-mingw32-g++ hello.cpp -s -o hello.exe -lFOX -lws2_32 -lgdi32 -lcomdlg32
-limm32 -lcomctl32 -lshell32 -mwindows

$ ls -l hello.exe
-rwxrwxr-x 1 bitwalk bitwalk 719360 2008-11-15 16:58 hello.exe
$ ./hello.exe

Wine での実行結果を以下に示します。ソースファイルは UTF-8 で記述されていますが、ボタンのフォントは正しく日本語で表示されています。Alt-w がアクセラレータキーになっています。

日本語フォント表示が心配だったので Windows Vista 上でも確認しました。

ちなみに FOX は Free Objects for X の略です。
 

2008-11-09

Let's Wine(第4回)


環境設定(つづき)


デスクトップの設定


Wine がインストールされていれば、exe の拡張子が付いたファイルを実行しようとすると、自動的に Wine が起動されます。もちろん、Windows と違って、ファイルに実行権限がなければなりません。

$ chmod +x foo.exe
$ ./foo.exe

実行権限があれば、ファイルブラウザからも該当ファイルをダブルクリックで、Wine が起動して、Win32 プログラムを実行してくれます。

Windows 用のプログラムを、Wine を利用して Linux 上で実行するだけであれば、これだけできれば十分でしょう。しかし、クロスコンパイル環境で生成した Win32 用バイナリの動作をチェックする場合には、cmd.exe を Wine で起動して、バイナリの動作を試してみるという CUI 的な使い方が多くなります。

そこで、私は、右図のように「Wine端末」というランチャ(ショートカット)をデスクトップ上に作って利用しています。雰囲気を出すために、端末画面の背景を黒にして、Windows のコマンドプロンプトのデフォルトの状態に似せてあります。

参考までに、設定方法を簡単に紹介しておきます。

まず、gnome-terminal に、Wine の cmd 用のプロファイルを生成します。

ここでは、プロファイル名を WineTerminal としました。

プロファイルの設定において、「タイトルとコマンド」タブの画面で「SHELLの代わりにコマンドを実行する(N)」にチェックを入れて wine cmd を入力します。

デスクトップへのランチャを生成するには、デスクトップ上でマウス右ボタンをクリックし、「ランチャの生成(A)...」を選択します。

プロパティの「ランチャ」のタブで、コマンド入力欄に、gnome-terminal --window-with-profile=WineTerminal と入力して、gnome-terminal を指定したプロファイルで起動するようにします。

2008-11-08

Let's Wine(第3回)


環境設定(つづき)


日本語入力設定


Tcl/Tk の wish を起動したときに、日本語の入力に難があると書きましたが、notepad など他のアプリケーションでも同様の症状でしたので、もう少しまともに入力できるように設定しました。

いろいろ試してみましたが[1]、現在のところ、以下を ~/.wine/user.reg の末尾に加えることに落ち着きました。薄い灰色にした数字の部分は、Wine の起動時に自動的に追加される部分ですので記述する必要はありません。

[Software\\Wine\\X11 Driver] 1226147504
"InputStyle"="root"

例えば notepad を起動して日本語の入力をするときは、次のようになります。

Windows の日本語アプリケーションを Wine で扱うことが主目的ではないので、確実に入力できれば良しとすることで妥協しました。

関連情報


[1] SCIM+Anthyにてwineの日本語入力を可能にする - ccsakuの日記
 

2008-11-07

Let's Wine(第2回)


環境設定


Wine の基本設定


まず Wine の設定をします。winecfg を起動して基本的な設定をします。

$ winecfg

ここでは、「ドライブ」タブの画面で「自動検出(D)...」のボタンをクリックして、Linux の $HOME を Hドライブにマッピングしただけです。

パスの設定


次にレジストリエディタを起動して、パスを設定します。

$ regedit


MinGW クロスコンパイルで生成されたバイナリがインストールされているパスを追加します。もちろん、ここでのパスの区切りは \ になります。


設定後、Wine で cmd.exe を起動してパスを確認します。

$ wine cmd
CMD Version 1.1.5

H:\>echo %PATH%
C:\windows\system32;C:\windows;Z:\usr\local\i386-mingw32\bin
H:\>

H ドライブが追加されて、cmd.exe の起動後の最初のドライブが H になっています。Wine の環境変数 PATH には確かにパスの追加が反映されています。これで、MinGW クロスコンパイル用に作成したパッケージの動作確認がやりやすくなりました。試しに MinGW のクロスコンパイル環境でコンパイルした RPM パッケージの Tcl/Tk wish [1]を起動してみます。

H:\>wish86
H:\>fixme:font:WineEngCreateFontInstance Untranslated charset 255
fixme:comm:set_queue_size insize 4096 outsize 4096 unimplemented stub
fixme:imm:ImmReleaseContext (0x1002e, 0x904468): stub
fixme:imm:ImeHandleNotify WM_IME_NOTIFY:IMN_SETOPENSTATUS
fixme:imm:ImeHandleNotify WM_IME_NOTIFY:IMN_SETCOMPOSITIONWINDOW
:
:

wish のコンソール上のサイズが Windows 上で実行する場合より小さく、さらに日本語の入力時に変換窓が表示されず難がありますが、widget もちゃんと作成できます。



関連情報


[1] [LIB] tcltk
 

2008-11-06

Let's Wine(第1回)


GUI のフォント


クロスコンパイルで生成した Win32 のバイナリの動作を Wine 上で試してみる場合、いつもコマンド・プロンプトで起動する CUI プログラムだけを扱うとは限りません。Windows の GUI プログラムである場合も当然あります。

そこで、まず Wine のパッケージに収録されている notepad(メモ帳)互換のプログラムを起動して、Linux の Gnome デスクトップ上でどのように表示されるかを確認してみることにします。次のように Wine の cmd.exe を起動して、notepad とタイプしてみます。

$ wine cmd
CMD Version 1.1.5

Z:\home\bitwalk>notepad
Z:\home\bitwalk>

GUI 外枠の飾りが Gnome の GUI のままでメモ帳が起動します。メモ帳のメニューのフォントが一部化けています。

そこで、日本語のフォントの環境を整備しておきます。簡単な方法は、Windows で使っているフォントを、C:\Windows\Fonts から、~/.wine/drive_c/windows/fonts へそっくりコピーしてしまうことです。著作権などの点で問題がありそうな行為なので、お薦めはできません。ここでは試しにフォントの表示が期待通りに反映されるかどうかだけ確認してみます。ちなみに、本 Linux は、同一の PC 上、GRUB で切り替えて Windows Vista と Linux を使用していますので、あまり罪悪感はないのですが…。

以下が、Windows のフォントをコピーした時の、メモ帳の実行例です。文字化けの問題は解決されています。

最近では、無料で品質の高い日本語フォントを利用できるようになってきていますので、Windows フォントのコピーに頼らず、それらのフォントを利用してみましょう。今のところ、Wine で使用している領域 ~/.wine には、まだフォントを追加しただけなので、~/.wine をそっくり削除してしまいます。Wine を起動すれば、初期状態の ~/.wine が生成されます。

$ rm -fR .wine
$ wine cmd
wine: created the configuration directory '/home/bitwalk/.wine'
Could not load Mozilla. HTML rendering will be disabled.
wine: configuration in '/home/bitwalk/.wine' has been updated.
CMD Version 1.1.5

Z:\home\bitwalk>

ここでは IPAモナーフォントを利用してみます。関連情報 [1] から、配布パッケージをダウンロードして、必要なフォントをコピーします。

$ tar zxvf opfc-ModuleHP-1.1.1_withIPAMonaFonts-1.0.8.tar.gz
opfc-ModuleHP-1.1.1_withIPAMonaFonts-1.0.8/
opfc-ModuleHP-1.1.1_withIPAMonaFonts-1.0.8/AUTHORS
opfc-ModuleHP-1.1.1_withIPAMonaFonts-1.0.8/COPYING
:
:
opfc-ModuleHP-1.1.1_withIPAMonaFonts-1.0.8/ppd/Makefile.in
opfc-ModuleHP-1.1.1_withIPAMonaFonts-1.0.8/ppd/OPVP-HP-Color_LaserJet_4600.ppd
opfc-ModuleHP-1.1.1_withIPAMonaFonts-1.0.8/ppd/OPVP-HP-Color_LaserJet_5500.ppd
$ cp opfc-ModuleHP-1.1.1_withIPAMonaFonts-1.0.8/fonts/*.ttf ~/.wine/dr
ive_c/windows/Fonts/

$

先ほどと同じように Wine から notepad を起動して、フォントを確認してみます。文字化けは無く、Windows のフォントの場合と比べても遜色ない表示が実現できます。

フォントの文字幅が気になる場合は、ipagui-mona.ttf だけをコピーします。Wine のフォントに関する詳細な設定については、別の機会に扱いたいと思います。

関連情報


[1] IPAモナーフォント
[2] フリーフォント最前線
[3] Microsoft's TrueType core fonts on rpm based system
 

2008-11-05

Let's Wine(第0回)


はじめに


MinGW Cross Compiler プロジェクトで公開しているパッケージの動作チェックなどで利用している Wine に関わる話題を、「Let's Wine」というタイトルで不定期に連載していきたいと思います。

Wine は、Win32 互換レイヤーで、オープンソースの Windows API 実装の一つです。Wine の名称は "Wine Is Not an Emulator" の略で再帰的頭字語になっています。1993 年にスタートした Wine の開発プロジェクトは、紆余曲折を経て、今年ようやくバージョン 1.0 がリリースされました。

ここで使用している OS は Fedora Linux で、デスクトップ環境は Gnome です。Wine が利用できる環境であれば、おそらくここで紹介している内容を同じようにできると思います。

Wine のインストール


Wine のインストールは、管理者権限で次のようにします。

# yum install wine

これで関連するパッケージも一緒にインストールされます。

インストール後、次にようにタイプして Wine で cmd.exe が起動することを確認しておきましょう。

最初の起動時に次のような警告が表示されますが、今のところ無視しておきます。[2], [3]

Could not load Mozilla. HTML rendering will be disabled.

また、以下のディレクトリが自動的に生成されます。

$ ls ~/.wine
dosdevices drive_c system.reg user.reg userdef.reg
$ ls ~/.wine/drive_c
Program Files windows
$ ls ~/.wine/dosdevices
c: z:
$

C ドライブは Linux の $HOME/.wine/drive_c、Z ドライブが Linux のルートディレクトリ / になります。

関連情報


[1] LinuxでWindowsアプリケーションを動かすには − @IT
[2] Mozilla Control
[3] Mozilla ActiveX Control
 

2008-11-03

Live CDでFedora 9 をインストール


マダ電機で中古の ThinkPad X31 が安く売られていたので、衝動買いしてしまいました。中古でもいいから作業用の Note PC が欲しいと物色していたのでした。DRAM は 512MB で、HDD は 40GB しか載っておらず非力ですが、Linux をインストールして使うので、さしあたっては問題なさそうです。

最近流行りの Eee PC のようなタイプの mini Note に興味深々なのですが、コンパイルばかりする用途に SSD を使うのは不安で、憧れはあるものの手が出ません。一方、安物の Note PC を買ってもすぐ壊れてしまいそうで、やはり手が出ません。

IBM ThinkPad は、以前仕事で X41 を使っていて、丈夫なつくりだと実感していたので、古い型ですが購入することにしたのでした。

Windows XP がインストールされていましたが、Fedora Linux 9 の Live CD をダウンロードして CD-R に焼き、USB 経由で CD-ROM からこの Live CD を起動し、HDD へ上書きインストールしました。Live CD によるインストールについては、下記の記事を参考にしました。

[1] Live CDでFedora 7をWindows Vistaにインストールする − @IT

一旦システムがインストールされてしまえば、後は足りないパッケージをインストールするだけです。が、300 を越えるパッケージのアップデートをする必要があり、これにかなりの時間を費やしてしまいました。

日本語の入力ができなかったので、以下のサイトの情報などを参考にして SCIM / Anthy を使用できるようにしました。http://www.blogger.com/img/blank.gif

[2] Anthyの入力メソッドをSCIMにするには − @IT
[3] SCIM-Anthyに関する設定メモ(2008/8/8現在)

これで、コタツに入って作業ができるようになりました。開発用としては非力なので基本的にコンパイル作業は Desktop PC などへ ssh で接続して行います。(i386 用のパッケージは、やっぱりこの PC でコンパイルすることになりそうです。)