2009-01-27

Let's Wine(第6回)


ファイルマネージャーいろいろ


Wine には、winefile という、Windows のエクスプローラに相当するツールがあります。winefile & とタイプするか、パネルの「アプリケーション」以下にある「Wine」のメニューから選択できます。

Wine の winefile の実行例

Windows 3.1 時代のファイルマネージャーを思い出させるスタイルで、機能もシンプルです。Windows のエクスプローラの操作に慣れてしまうと、これではなんだか物足りません。他にフリーで入手可能なものがないか探してみました。

PathFinder


FOX Toolkit と一緒にビルドされるアプリケーションのひとつに PathFinder というツールがあります。日本語フォントの表示はされますが、メニューなどの表示は英語です。FOX ツールキットは MinGW クロスコンパイラのパッケージで公開されています。パスが通っている状態で、PathFinder.exe とタイプします。

PathFinder の実行例


[1] [LIB] FOX

xplorer² lite



Windows 用のシェアウェアで公開されている高機能ファイラー xplorer² に、フリーな lite 版があります。Wine 上でも動作します。日本語メッセージにも対応しており、インストール時に指定します。ファイルを表示するペインの数はシングルとデュアルを切り替えられます。私は、右図の様にデスクトップにショートカットを作ってあります。

ただ、残念な事に exe ファイルをダブルクリックしても、 wine (1.1.12) ではアプリケーションが起動してくれない事です。たぶん、wine の方に問題があるのだと思いますが…。

xplorer² lite の実行例


[2] xplorer² Windows File Manager (Explorer replacement)
[3] xplorer² lite: free windows explorer replacement (file manager)

MFiler


和製の多機能なファイラーで、外部コマンドが充実しています。

[4] MFiler(Windows95/98/Me / ユーティリティ)
[5] MFiler説明
[6] 竜の子ソフト

他にも良いのが見つかれば、随時紹介していきます。
 

2009-01-14

Incr Tcl も?


うやら Incr Tcl が Tcl のコアパッケージにバンドルされるらしい。

ずいぶん前のことになりますが、TIP 6 で、Incr Tcl を Tcl のコアに取り込もうと Mark Harrison 氏が提案した時、Tcl/Tk の考案者 John K. Ousterhout 氏の反対で棄却されています。バンドルということは、コアには含まれないが、モジュールとして一緒に配布されるということなのだろうか?まずは pkgs とは何なのか確認しなくては…。

TclOO が既にコアに取り込まれていると思っていましたが、別のバージョン番号が付いているし、扱いはバンドルなんだろうか?深く考えていなかったので混乱してきました。今夜にでも CVS からソースを持ってきて確認をしよう。

Date: Tue, 13 Jan 2009 16:49:29 -0500
From: dgp at nist.gov
To: tcl-core at lists.sourceforge.net
Subject: [TCLCORE] TIP 50: Final

I've just imported the source code for
Itcl 4.0b2 into our cvs repository as
the new module "itcl". I've also revised
the "pkgs" module to include it, so now
fresh checkouts of the "tcl" modules will
include it in the pkgs directory as a
bundled package. (The "tcl-only" module
should be unchanged).

I think this completes TIP 50.

Big thanks to Arnulf Wiedemann for the
work getting things ready.

DGP

参考情報


[1] バンドルとは 【bundle】 - 意味・解説 : IT用語辞典
 

2009-01-13

R で Tcl/Tk パッケージを試す


R で Tcl/Tk パッケージを使ってみました。以前から試してみたかったのですが、(自前の R スクリプトを使った)目の前の作業に追われて、ゆっくりと GUI を検討する暇がありませんでした。

で、今更なんですが R: Tk widgets で説明されている例を Fedora 上で実行してみてびっくり。簡単に Tk ウィジェットが R で利用できます。Ttk ウィジェットなど、最新の Tcl/Tk のウィジェットにも対応しているようです。これだったら、業務用に作った R スクリプトを GUI 化するために時間を割くことを検討する余地が十分ありそう。GUI 化できれば、作業を他の人に移管できる…。

$ R

R version 2.8.1 (2008-12-22)
Copyright (C) 2008 The R Foundation for Statistical Computing
ISBN 3-900051-07-0

Rはフリーソフトウェアであり、「完全に無保証」です。
...
(省略)
...
[以前にセーブされたワークスペースを復帰します]

> library(tcltk)
Tcl/Tkインターフェースのロード 終了済
> ls("package:tcltk")
[1] "addTclPath" "as.tclObj" "getTkProgressBar"
[4] "is.tclObj" "is.tkwin" "setTkProgressBar"
[7] "tcl" "tclArray" "tclObj"
[10] "tclObj<-" "tclObj<-.tclVar" "tclRequire"
...
(省略)
...
[241] "ttkbutton" "ttkcheckbutton" "ttkcombobox"
[244] "ttkentry" "ttkframe" "ttkimage"
[247] "ttklabel" "ttklabelframe" "ttkmenubutton"
[250] "ttknotebook" "ttkpanedwindow" "ttkprogressbar"
[253] "ttkradiobutton" "ttkscrollbar" "ttkseparator"
[256] "ttksizegrip" "ttktreeview"
> tt <- tktoplevel()
> label.widget <- tklabel(tt, text="Hello, World!")
> button.widget <- tkbutton(tt, text="Push",
+ command=function()cat("OW!\n"))
> tkpack(label.widget, button.widget)
<Tcl>
>


 

2009-01-03

GTK+ でクロスコンパイル

SourceForge.net Logo

Features/Windows cross compiler の Release Notes によると、Fedora 11 で、MinGW Cross Compile 環境が提供されるようになるとのことです。

SourceForge.net に開設している MinGW Cross Compiler のプロジェクトの役割は、今後は前述のプロジェクトがカバーしていない、ニッチな分野のパッケージが対象になりそうです。しかし、短期的には Fedora 11 用のレポジトリから spec ファイルを持ってきて Fedora 10 でリビルドしたパッケージを公開しようとコンパイル作業に明け暮れています。

その中で、GTK+ のパッケージをアップしましたので、動作確認として簡単なプログラムをコンパイルしてみました。サンプルは、以下の GTK+ プロジェクトのサイトで公開されている Tutorial に掲載されているサンプルを流用しました。

[1] GTK+ 2.0 Tutorial/Getting Started


#include <gtk/gtk.h>

/*
* This is a callback function. The data arguments are ignored in this example.
* More on callbacks below.
*/

static void
hello (GtkWidget * widget, gpointer data)
{
g_print ("Hello World!\n");
}

static gboolean
delete_event (GtkWidget * widget, GdkEvent * event, gpointer data)
{
/*
* If you return FALSE in the "delete_event" signal handler, GTK will emit
* the "destroy" signal. Returning TRUE means you don't want the window to be
* destroyed.
* This is useful for popping up 'are you sure you want to quit?' type
* dialogs.
*/

g_print ("delete event occurred\n");

/*
* Change TRUE to FALSE and the main window will be destroyed with a
* "delete_event".
*/

return TRUE;
}

/* Another callback */
static void
destroy (GtkWidget * widget, gpointer data)
{
gtk_main_quit ();
}

int
main (int argc, char *argv[])
{
/* GtkWidget is the storage type for widgets */
GtkWidget *window;
GtkWidget *button;

/*
* This is called in all GTK applications. Arguments are parsed from the
* command line and are returned to the application.
*/

gtk_init (&argc, &argv);

/* create a new window */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

/*
* When the window is given the "delete_event" signal (this is given by the
* window manager, usually by the "close" option, or on the titlebar), we ask
* it to call the delete_event () function as defined above. The data passed
* to the callback function is NULL and is ignored in the callback function.
*/

g_signal_connect (G_OBJECT (window), "delete_event",
G_CALLBACK (delete_event), NULL);

/*
* Here we connect the "destroy" event to a signal handler.
* This event occurs when we call gtk_widget_destroy() on the window, or if
* we return FALSE in the "delete_event" callback.
*/

g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);

/* Sets the border width of the window. */
gtk_container_set_border_width (GTK_CONTAINER (window), 10);

/* Creates a new button with the label "Hello World!". */
button = gtk_button_new_with_label ("Hello World!");

/*
* When the button receives the "clicked" signal, it will call the function
* hello() passing it NULL as its argument.
* The hello() function is defined above.
*/

g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (hello), NULL);

/*
* This will cause the window to be destroyed by calling
* gtk_widget_destroy(window) when "clicked". Again, the destroy signal
* could come from here, or the window manager.
*/

g_signal_connect_swapped (G_OBJECT (button), "clicked",
G_CALLBACK (gtk_widget_destroy),
G_OBJECT (window));

/* This packs the button into the window (a gtk container). */
gtk_container_add (GTK_CONTAINER (window), button);

/* The final step is to display this newly created widget. */
gtk_widget_show (button);

/* and the window */
gtk_widget_show (window);

/*
* All GTK applications must have a gtk_main(). Control ends here and waits
* for an event to occur (like a key press or mouse event).
*/

gtk_main ();

return 0;
}

動作チェックは、一次評価として Fedora の wine 上で行っています。以下は bash 上で必要なパスを設定してコンパイル、実行した結果です。バイナリの実行では、もちろん wine が起動しています。

$ export PKG_CONFIG_PATH=/usr/i686-pc-mingw32/sys-root/mingw/lib/pkgconfig
$ i686-pc-mingw32-gcc -Wall -g hello.c -o hello.exe `pkg-config gtk+-2.0 --cfl
ags` `pkg-config gtk+-2.0 --libs`

$ ./hello.exe


Windows 上で実行する場合は、コンパイルしたプログラム hello.exe が参照しているランタイムライブラリ (DLL) もコピーしなければなりません。直接参照している DLL をチェックするには次のようにします。

$ i686-pc-mingw32-objdump -p hello.exe | grep "DLL Name"
DLL Name: libglib-2.0-0.dll
DLL Name: libgobject-2.0-0.dll
DLL Name: libgtk-win32-2.0-0.dll
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll

このうち、KERNEL32.dllmsvcrt.dll は、Windows ではシステム側の DLL ですので、コピーする必要はありません。と言っても MinGW 上では同名の DLL は存在しません。さらに libglib-2.0-0.dll などが参照している DLL も Windows 側にコピーする必要があります。wbc を利用すると、参照している DLL を簡単にチェックできます。大文字のファイル名の DLL がシステム DLL ですので、それ以外の DLL がコピーの対象になります(ただし、msvcrt.dll は除きます)。