2008-12-28

Tcl and the Tk Toolkit (2nd Edition)


っとTcl/Tk のサイトを運営されている、いまいさんのブログ、つれづれなるままに − つれづれブログ を久しぶりに読んでいたら、耳寄りな情報を発見!

2008年12月06日の記事によると、Tcl/Tk を考案した John Ousterhout 氏が、Tcl and the Tk Toolkit を 15年ぶりに改訂するらしいのです。なんと 600 ページもあるらしい。発売予定が来年の 6 月ということで、ずいぶん先ですが、Amazon.com に予約を入れておきました。

Order #: XXX-XXXXXXX-XXXXXXX
Shipping Method: Expedited International Shipping
Shipping Preference: Group my items into as few shipments as possible
Subtotal of Items: $42.70
Shipping & Handling: $13.98
------
Total for this Order: $56.68

Delivery estimate: June 18, 2009 - June 30, 2009
Shipping estimate for these items: June 8, 2009
1 "Tcl and the Tk Toolkit (2nd Edition) (Addison-Wesley Professional Computing Series)"
John K. Ousterhout; Paperback; $42.70

Sold by: Amazon.com, LLC


 

2008-12-27

X31 のメモリ増設

X 端末に使おうと先月購入した中古の IBM ThinkPad X31 について、やはりメモリが 512MB というのは少なすぎるので、純正 (PC2700 DDR SDRAM) と互換性があるメモリカードを探してみました。

アイ・オー・データ機器の SDD333 シリーズ、バッファローの DN333 シリーズ、エレコムの ED333-N シリーズが使えそうです。

これらの 1GB のメモリカードの価格帯を、ネットで調べてみると1万円前後でちょっと高い。古いメモリモジュール規格 (PC2700) のカードなので店頭で売っているか心配でしたが、市内のヤマダ電機でも探してみました。なんとエレコムの ED333-N1G が、最後の一枚でほとんど叩き売り状態の値段と思える 7,800 円で売られていました。もっと安いものがどこかで入手できるかもしれませんが、欲求と価格とのバランスが取れていると考え、即購入しました。

X31 の空きスロットに装着して起動。メモリが増えていることを top コマンドで確認。スワップ領域は当然ながら以前と同じ 1GB のままですが、とりあえず問題はなさそうです。

free コマンドでも確認(ま、同じなんですけどね)。

$ free
total used free shared buffers cached
Mem: 1553412 859536 693876 0 65536 372392
-/+ buffers/cache: 421608 1131804
Swap: 1048568 0 1048568

2008-12-24

Tcl/Tk 8.6b1 リリース


Tcl/Tk 8.6 の最初の β 版が 12 月 23 日付けでリリースされました。TIP #234(Zlib の圧縮サポート)は、このリリースに間に合うように取り込まれましたが、TIP #244(PNG Photo Image のサポート)の方は、このリリースには含まれませんでした。TIP #329 の Try/Catch/Finally ロジックの機能が取り込まれたことも大きな変更/拡張点でしょう。良いサンプルがあれば紹介をしていきたいと思います。

なお、Tcl/Tk 8.5.6 も同日付けでリリースされました。

Date: Tue, 23 Dec 2008 09:38:33 -0500
From: Donald G Porter <dgp at nist.gov>
To: Tcl List Core <tcl-core at lists.sourceforge.net>
Subject: [TCLCORE] Tcl/Tk 8.6b1 RELEASED

Tcl/Tk 8.6b1 Release Announcement
December 23, 2008

The Tcl Core Team is pleased to announce the 8.6b1 releases of the Tcl
dynamic language and the Tk toolkit. This is the first beta release
of Tcl/Tk 8.6. More details can be found below. We would like to
express our gratitude to all those who submit bug reports and patches.
This information is invaluable in enabling us to identify and eliminate
problems in the core.

Where to get the new releases:
------------------------------

Tcl/Tk 8.6b1 sources are freely available as open source from the
Tcl Developer Xchange web site at:

http://www.tcl.tk/software/tcltk/8.6.html

This web page also contains additional information about the releases,
including new features and notes about installing and compiling the
releases. Sources are always available from the Tcl SourceForge
project's file distribution area:

http://sourceforge.net/project/showfiles.php?group_id=10894

Binaries for most major platforms are available from:

http://www.activestate.com/Tcl

For additional information:
---------------------------

Please visit the Tcl Developer Xchange web site:

http://www.tcl.tk/

This site contains a variety of information about Tcl/Tk in general, the
core Tcl and Tk distributions, Tcl development tools, and much more.

Summary of Changes since Tcl/Tk 8.6a3:
--------------------------------------

The following were the main changes in Tcl/Tk 8.6b1. A complete list
can be found in the changes file at the root of the source tree. The
more complete ChangeLog is also included with each source release.

This is a beta release of 8.6. The beta designation means that the
feature set for 8.6 is believed to be complete, and the focus is now
on testing and bug fixing moving quickly toward an 8.6.0 release.
All relevant bug fixes (and some more) up to and including 8.5.6 changes
are included in 8.6b1. This release is a development release, and should
only be considered for deployment use after considerable testing.

* [TIP 329] New commands: [try], [throw]

* [TIP 234] New command: [zlib]

* [TIP 343] Enhanced commands: [format], [scan] add %b specifier.

* [TIP 332] Enhanced command: [close $chan read|write].

* New widget: [ttk::spinbox].

* [TIP 210] New subcommand: [file tempfile].

* [TIP 321] New subcommand: [tk busy].

* [TIP 324] New subcommand (dialog box): [tk fontchooser].

* [TIP 97] New subcommands: [$canvas imove], [$canvas rchars].

* [TIP 341] Enhanced subcommand: [dict filter] takes multiple patterns.

* [TIP 119] New canvas option: -angle for text items.

* [TIP 197] New text option: -insertunfocussed.

* New ttk theme: vista -- uses new "hover" state.

* [TIP 308] New package: tdbc 1.0b1 .

* [TIP 322] New routines: Tcl_NR*(): non-recursive eval for extensions.

* [TIP 336] New routines: Tcl_*ErrorLine().
*** POTENTIAL INCOMPATIBILITY in interp->errorline access ***
*** Define USE_INTERP_ERRORLINE for legacy code support ***

* [TIP 307] New routine: Tcl_TransferResult().

* [TIP 335] New routine: Tcl_InterpActive().

* [TIP 337] New routine: Tcl_BackgroundException().

* [TIP 338] New routines: Tcl_*StartupScript()
*** POTENTIAL INCOMPATIBILITY for callers of Tcl*Startup*() ***

* New feature: build script support for bundled packages.

* System encoding during initialization now iso8859-1, not identity.
*** POTENTIAL INCOMPATIBILITY ***

* [oo::define] revised context for name resolution, includes caller.
*** POTENTIAL INCOMPATIBILITY with earlier TclOO ***

* [event generate] support for events.

* Fixed broken [for $start $end $incr continue].

* New demos: ctext.tcl, fontchoose.tcl .

--
Tcl Core Team and Maintainers
Don Porter, Tcl Core Release Manager


--
| Don Porter Mathematical and Computational Sciences Division |
| donald.porter at nist.gov Information Technology Laboratory |
| http://math.nist.gov/~DPorter/ NIST |
|______________________________________________________________________|

------------------------------------------------------------------------------
_______________________________________________
Tcl-Core mailing list
Tcl-Core at lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tcl-core

2008-12-23

Let's Wine(第5回)


環境設定(補足)


パスの変更


MinGW クロスコンパイラ関連のパッケージのインストール先が変更されたので、wine のパス(環境変数 PATH)も変更しておく必要が出てきました。PATH の設定は既に紹介しましたが、念のため。


$ wine cmd
CMD Version 1.1.9

H:\>echo %PATH%
C:\windows\system32;C:\windows;Z:\usr\i686-pc-mingw32\sys-root\mingw\bin
H:\>

2008-12-20

【備忘録】Fedora Live CD の作り方


るトラブルから、やむなく Fedora 9 へ戻し、Fedora 10 をインストールしなおす羽目になりました。そこで、Live CD の iso イメージを USB のフラッシュメモリに書き込んで、これで起動した後に、Live CD から HDD へイメージのインストールをすることにしました。つまり、大事な情報は既にバックアップされており、Fedora 10 の Live CD でクリーンインストールするだけです。

今回は、その Live CD を USB フラッシュカードへ書き込む手順の備忘録です。

$ su
パスワード:
# yum install livecd-tools
...
...
Installed:
livecd-tools.i386 0:017.1-1.fc9

Dependency Installed:
squashfs-tools.i386 0:3.3-2

Complete!
# /usr/bin/livecd-iso-to-disk /home/bitwalk/src/F10-i686-Live.iso /dev/sdb1
Verifying image...
/home/bitwalk/src/F10-i686-Live.iso: f21debace1339dbdefff323064d40164
Fragment sums: c22bcc22b29728f2a7136396121621caf6c18169f3326e5c7e66153cd57e
Fragment count: 20
Checking: 100.0%

The media check is complete, the result is: PASS.

It is OK to use this media.
Copying live image to USB stick
Updating boot config file
Installing boot loader
USB stick set up as live image!
#


PC の BIOS の設定で、boot 時にフラッシュメディアをメインの HDD より先に読み込むように変更して、USB フラッシュを付けて PC を起動します。無事起動したらログインして、デスクトップ上の Install To Hard Drive アイコンをダブルクリックして、ガイドに従い HDD へイメージをコピーします。

2008-12-17

Zlib と PNG


ようやく Tk で、PNG 形式のイメージが扱えるようになりそうです。TIP #234(Zlib の圧縮サポート)、TIP #244(PNG Photo Image のサポート)のどちらも、Tcl Core Team の投票で承認されています。一方、Tcl の CVS のレポジトリでは zlib 圧縮への対応が始まっていることが確認できます。Tk のソースで PNG 形式をサポートする方はまだのようです。年末までにはリリースされるであろう 8.6a4 あるいは 8.6b1 では、さらになんらかの機能追加があるかもしれません。
 

2008-12-16

Tcl Core Team 刷新


んと、Tcl/Tk を考案した John K. Ousterhout 氏までもが Tcl コアチームを離れるようです。その他に D. Richard Hipp, Jim Ingham, Brent Welch の各氏もチームから外れます。一方で Daniel Steffen 氏がチームに加わります。

Date: Mon, 15 Dec 2008 17:11:44 -0500
From: Kevin Kenny <kennykb at acm.org>
Newsgroups: comp.lang.tcl
To: Tcl Core List

Subject: [TCLCORE] TCL CORE TEAM ANNOUNCES: John Ousterhout retires from Tcl Core Team

TCL CORE TEAM
SPECIAL RESOLUTION 2008-3

WHEREAS, John K. Ousterhout advises the Tcl Core Team that, in his
opinion, he has not made a significant contribution to Tcl in the last
five years; and further

WHEREAS, Dr. Ousterhout further advises the team that he is confident
that Tcl and the Tk toolkit are in good hands with the current Tcl
Core Team; and further

WHEREAS, Dr. Ousterhout further advises the team that he wishes to be
accounted a Tcl Core Team member emeritus; and further

WHEREAS, it is impossible to give an adequate account of
Dr. Ousterhout's accomplishments as the true "father of Tcl/Tk:" from
overseeing its initial construction in the laboratories at Berkeley,
through overseeing its publicity and recruiting community development,
through its period of commercial development at Sun, Scriptics, and
Ajuba, into the community-maintained system that it is today:
activities for which he richly deserved the ACM Software System Award
that the Association for Computing Machinery granted him in 1997, his
induction as a Fellow of the Association for Computing Machinery in
1994, and his membership in the National Academy of Engineering; and
further

WHEREAS, Dr. Ousterhout is mentioned by name in the fundamental
documents (TIP #0 and TIP #2) defining the Tcl Core Team, and accorded
especial privileges as "Benevolent Dictator" with the ability to
resolve any deadlocks by executive fiat; and further

WHEREAS, the "Benevolent Dictator Clause" has been long regarded by
the Tcl Core Team as an important "safety valve" in its process; and
further

WHEREAS, Dr. Ousterhout's departure will necessitate reonsideration of
that element of the Tcl Core Team's charter;

NOW THEREFORE be it

RESOLVED, that the Tcl Core Team accepts with the profoundest regret
the resignation of Dr. John K. Ousterhout from its ranks, and offers
him heartfelt thanks and admiration for his many years of tireless
service; and be it further

RESOLVED, that Dr. John K. Ousterhout shall be designated

FOUNDER AND MEMBER EMERITUS OF THE TCL CORE TEAM

a title that can be rightfully applied only to him; and further be it

RESOLVED, that the Tcl Core Team do at once commit to a Committee of
the Whole to propose appropriate Amendments to its Constitution and
By-Laws (as set forth in Tcl Improvement Proposals #0 and #2), and
that said Committee of the Whole shall rise and report at such time as
it shall find convenient, but in any event no later than 31 January
2009.

DONE, this fifteenth day of December, 2008

For the Tcl Core Team

Mo DeJong
Joe English
Donal K. Fellows
Jeffrey Hobbs
George A. Howlett
Kevin B. Kenny
Andreas Kupries
Karl Lehenbauer
Jan Nijtmans
John K. Ousterhout, founder and member emeritus
Donald G. Porter
Miguel Sofer
Daniel A. Steffen

_______________________________________________
Tcl-Core mailing list
Tcl-Core at lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tcl-core

関連情報


[1] TCL CORE TEAM ANNOUNCES: Daniel Steffen named to Tcl Core Team.
[2] TCL CORE TEAM ANNOUNCES: Harrison, Hopp, Ingham, Welch leave Tcl Core Team
[3] TCL CORE TEAM ANNOUNCES: John Ousterhout retires from Tcl Core Team
 

2008-12-14

【備忘録】Nautilus に Tcl アイコンを表示する


に表示上だけのことなんですが、Gnome のファイルマネージャー Nautilus 上で Tcl のアイコン(実際には Tk アイコン)を表示させたかったので、設定してみました。

まず、MIME タイプで Tcl の拡張子が定義されているかどうか調べてみます。

$ rpm -q gnome-mime-data
gnome-mime-data-2.18.0-3.fc10.noarch
$ rpm -ql gnome-mime-data
/etc/gnome-vfs-mime-magic
/usr/share/application-registry
/usr/share/application-registry/gnome-vfs.applications
/usr/share/doc/gnome-mime-data-2.18.0
:
:
/usr/share/mime-info
/usr/share/mime-info/gnome-vfs.keys
/usr/share/mime-info/gnome-vfs.mime
/usr/share/pkgconfig/gnome-mime-data-2.0.pc
$ grep tcl /usr/share/mime-info/gnome-vfs.mime
text/x-tcl
ext: tcl

Tcl の拡張子は MIME タイプに含まれているので、ローカルにイメージを用意しておけばなんとかなりそうです。とりあえず、~/.icons 以下に、32x32 と 48x48 の固定サイズのイメージを Tcl 用に用意しました。ディレクトリの階層は以下のようになります。イメージは PNG 形式で、ファイル名をどちらも gnome-mime-text-x-tcl.png とします。

一旦ログアウトしてログインし直します。Nautilus を起動して、拡張子が tcl のファイルの表示が変わっていることを確認します。

2008-12-12

【備忘録】X端末


は X サーバ が利用できる Linux マシンから、他の Linux マシンに次のような手順で接続して使用していました。

[bitwalk@laptop ~]$ xhost +
access control disabled, clients can connect from any host
[bitwalk@laptop ~]$ telnet 192.168.11.2
Connected to 192.168.11.2
Escape character is '^]'.
Red Hat Linux (192.168.11.2) (ttyp3)
login: ログイン名を入力
Password: パスワードを入力
Last login: Sun Dec 13 17:15:33 1998 from 192.168.11.8
[bitwalk@desktop ~]$ export DISPLAY=192.168.11.8:0.0
[bitwalk@desktop ~]$ netscape &

Fedora を使うようになって、telnet の代わりに ssh で接続するようになりましたが、ssh -X で接続しても X サーバを利用できず、どうするのか判りませんでした。telnet で接続する部分を単純に ssh に置き換えれば良いと思い込んでいたのでした。その時は X 端末として利用する強いニーズがなかったので、そのままにしていました。

しかし、この冬はコタツに暖まりながら、中古で買った非力な PC を X 端末にして使いたいと思い、ssh を使って X 端末として利用する方法を調べ直しました。すると、下記のリンクに欲しい情報があり、目から鱗が落ちた思いでした。

/usr/bin/xterm Xt error [Archive] - FedoraForum.org

要は、xhost+ とか export DISPLAY=... なんていう入力は不要で、単に次のようにするだけで良かったのでした。

[bitwalk@laptop ~]$ ssh -X 192.168.11.2
bitwalk@192.168.11.2's password:
Last login: Fri Dec 12 18:22:29 2008 from 192.168.11.8
[bitwalk@desktop ~]$

出来てみれば、なんてことはないのでした。ホント思い込みって怖い。
 

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 でコンパイルすることになりそうです。)