2008-01-31

Win32 Binary Checker (つづき)

SourceForge.net Logo

月はじめにちょっと紹介した、Linux 上でクロスコンパイルしたバイナリが使用する DLL をチェックするプログラム、wbc - Win32 Binary Checker ですが、ウィジェット上に表示されるイメージなどを整備しました。

まだ実装していない機能がありますが、当初自分が欲しかった機能が既に実現できているので、とりあえず今週末をターゲットに最初のリリースを目指したいと考えています。

2008-01-26

Tcl/Tk 8.5.1 RC0


年末に Tcl/Tk 8.5.0 がリリースされてから、あまり日が経っていませんが、予定通り 2 月 1 日に Tcl/Tk 8.5.1 をリリースするべく、リリース候補 0 (RC0) tcl8.5.1rc0-src.tar.gztk8.5.1rc0-src.tar.gz がアップされました。

Date: Fri, 25 Jan 2008 17:02:33 -0500
From: dgp at nist.gov
To: tcl-core at lists.sourceforge.net
Subject: [TCLCORE] Tcl/Tk 8.5.1 RC0 available

First crack at release candidates for Tcl/Tk 8.5.1
are up at ftp://ftp.tcl.tk/pub/tcl/tcl8_5/

Still aiming for the actual release on Feb. 1.

Report problems with these RCs and/or progress
on critical bugs and fixes in the usual way.

DGP

2008-01-13

Smart package of Microsoft's core fonts

Linux を使い始めて、かれこれ10年以上経ちますが、X Window で表示されるフォントの貧弱さはいつも不満の種でした。それでも、最近の Linux のディストリビューションでは質の良いフリーのフォントを使っているため、かなり良くなってきたと感じています。

ただ最近、Linux 上の OpenOffice.org で Windows で作成した文書を扱うことが多くなり、Windows のフォントが利用できれば、もっと使いやすくなるのにと思っていました。
もちろん、 Windows のフォントをコピーして、 X Window で利用することは可能ですが、合法的なやり方ではありません。もっとも商用利用でなければ、問題がないのかもしれませんが…。

先日、Microsoft がインターネット上で公開している True Type Font(英文用のみ)を利用して Linux の RPM パッケージを作成するための spec ファイルを公開しているプロジェクトサイトを SourceForge.net で見つけました。

Smart package of Microsoft's core fonts

Microsoft がインターネット上で公開しているフォントは、Microsoft End-User License Agreement ("EULA") によれば、Microsoft の許可なしに何か他のパッケージに加えて配布することはできないけれど、公開されているフォントをそのままの状態で再配布 することは可能です。上記プロジェクトサイトでは、Microsoft で公開されたフォントの exe ファイル群を SourceForge のプロジェクトサイトで再配布し、RPM を作成するための spec ファイルと、Windows の cabinet ファイルを展開するための Linux 用ユーティリティが公開されています。

Fedora 8 へのインストール方法を簡単に紹介します。ここでは spec ファイルから RPM をビルドする作業が必要になりますが、詳しくは説明をしません。RPM パッケージの作り方については、以下のサイトなどを参考にしてください。

【連載 】カスタムRPMの作成
SPECファイルからのRPMパッケージの作成
自分で作るRPMパッケージ

まず、Fedora 8 で ttmkfdir が利用できるかどうか確認します。

$ rpm -q ttmkfdir
ttmkfdir-3.0.9-24.fc7

もしインストールされていなければ、Fedora 8 のインストールメディアか、インターネットから入手してインストールをしておきます。なお、このパッケージは .fc7 のままになっています。
あと wget もあらかじめインストールされている必要があります。

つぎに、cabextract-0.6-1.src.rpm をダウンロードして、以下のように展開して、spec ファイルの一箇所を修正します。


$ rpm -ivh cabextract-0.6-1.src.rpm
1:cabextract warning: user noa does not exist - using root
warning: group noa does not exist - using root
warning: user noa does not exist - using root 99%)
warning: group noa does not exist - using root
########################################### [100%]


SPEC ディレクトリ内に出力された cabextract.spec を編集し、 CopyrightLicense に変更します。

【参考】RPMパッケージのリビルドで.specにエラーが発生するときは


Summary: a program to extract Microsoft Cabinet files
Name: cabextract
Version: 0.6
Release: 1
Group: Applications/Archiving
Copyright: GPL
Source: http://www.kyz.uklinux.net/downloads/%{name}-%{version}.tar.gz
URL: http://www.kyz.uklinux.net/cabextract.php3
BuildRoot: %{_tmppath}/%{name}-%{version}-root
Prefix: /usr
:
:

編集後、cabextract をビルドしてインストールします。

$ rpmbuild -ba cabextract.spec
Executing(%prep): /bin/sh -e /home/bitwalk/tmp/rpm-tmp.79402
+ umask 022
+ cd /home/bitwalk/redhat/BUILD
+ LANG=C
+ export LANG
:
:
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/bitwalk/tmp/cabextract-0.6-root
Wrote: /home/bitwalk/redhat/SRPMS/cabextract-0.6-1.src.rpm
Wrote: /home/bitwalk/redhat/RPMS/i386/cabextract-0.6-1.i386.rpm
Wrote: /home/bitwalk/redhat/RPMS/i386/cabextract-debuginfo-0.6-1.i386.rpm
Executing(%clean): /bin/sh -e /home/bitwalk/tmp/rpm-tmp.85923
+ umask 022
+ cd /home/bitwalk/redhat/BUILD
+ cd cabextract-0.6
+ rm -rf /home/bitwalk/tmp/cabextract-0.6-root
+ exit 0
$ su
Password:
# rpm -ivh /home/bitwalk/redhat/RPMS/i386/cabextract-0.6-1.i386.rpm

次に、msttcorefonts-1.3-4.spec をダウンロードし、cabextract.spec と同様に、 CopyrightLicense に変更して、ビルドしてインストールします。ビルドに必要なソースファイルは、ビルド中に wget でインターネットからダウンロードします。

$ rpmbuild -ba msttcorefonts-1.3-4.spec
Executing(%prep): /bin/sh -e /home/bitwalk/tmp/rpm-tmp.85774
+ umask 022
+ cd /home/bitwalk/redhat/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ rm -rf msttcorefonts
+ mkdir msttcorefonts
+ cd msttcorefonts
+ for i in andale32.exe webdin32.exe trebuc32.exe georgi32.exe verdan32.exe comic32.exe arialb32.exe impact32.exe arial32.exe times32.exe courie32.exe
+ wget http://easynews.dl.sourceforge.net/sourceforge/corefonts/andale32.exe
--12:33:56-- http://easynews.dl.sourceforge.net/sourceforge/corefonts/andale32.exe
=> `andale32.exe'
Resolving easynews.dl.sourceforge.net... 69.16.168.245
Connecting to easynews.dl.sourceforge.net|69.16.168.245|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 198,384 (194K) [application/octet-stream]

100%[====================================>] 198,384 164.66K/s

12:33:57 (164.34 KB/s) - `andale32.exe' saved [198384/198384]
:
:

これで、Linux 上でも Windows と同じ名前の英文フォントを扱えるようになります。この方法でも、Windows 用のフォントを Linux で利用していることに変わりありませんので、フォントを含んだ RPM パッケージを、Microsoft の許可なしに配布することはできません。spec ファイルを使って、RPM を自分でビルドする手間はかかりますが、RPM パッケージでインストールした方が保守は簡単です。また、RPM を採用しているシステムで、/usr 以下の領域をマニュアル操作でいじりたくはありません。

さて、日本語フォントの場合ですが、Windows 2000 用にインターナショナルフォントのパッケージが公開されていて、そこに日本語フォントも含まれていたように記憶しています。それを利用すれば、同じようにできそうですが、残念ながらどこにあったか記憶にありません。

2008-01-05

Win32 Binary Checker

SourceForge.net Logo

日紹介した、ttk::treeview のサンプルを応用して、Linux 上でクロスコンパイルしたバイナリが使用する DLL をチェックするプログラム、wbc - Win32 Binary Checker を作ってみました。動作環境は、Fedora 8 (Linux) / Tcl/Tk 8.5.0 です。


Tcl/Tk 8.5.0 での実行例

MinGW クロスコンパイラで生成した.exe.dll の拡張子がついたバイナリ ファイル名 に対して、

exec i386-mingw32-objdump -p ファイル名 | grep "DLL Name:"

を実行して得られる、ファイル名 が依存している DLL のリストを、そのファイルのノード下に表示するプログラムです。なお、GUI の部分で使えるところは全てテーマ・ウィジェットを利用しています。

とりあえず、自分のアカウント内でコンパイルした Tcl/Tk 8.5.0 を使っていますが、Fedora で配布されている Tcl/Tk が 8.5 系に対応するまで待つとすると、随分先のことになりそうですので、8.4 系でも動作するようなプログラムにして、プロジェクトサイトにアップロードしようと考えています。

【追記】
Fedora 8 / Tcl/Tk 8.4.x 用に tile-0.8.2 の RPM パッケージ (tile-0.8.2-1.fc8.i386.rpm) を作成して、wbc を Tcl/Tk 8.4 系でも動作するように修正を加えました。フォント表示が異なる他は、機能的に違いはありません。なお、Tcl/Tk 8.4 系(Tcl/Tk 8.4.5 以上)では、拡張パッケージ tile をロードすれば Ttk を Tcl/Tk 8.5.0 と同じように利用できます。


Tcl/Tk 8.4.15 での実行例


wbc をパッケージとして公開するためには、少しドキュメントを用意する必要がありますし、Win32 Binary Checker という名前の割には機能的に寂しいので、もう少し機能を吟味、追加してから公開したいと思います。

2008-01-04

8.5 の次は 8.6 らしい


Tcl/Tk 8.5.0 がリリースされてまだ日が浅いのですが、新しい年を迎え、今年のリリーススケジュール案が Don Porter 氏から発表されました。とりあえず、近日中に Tcl/Tk 8.4.17 がリリースされるようです。既に RC 版が出ています。2月には Tcl/Tk 8.5.1 がリリースされる予定。

なお、8.5 の次のバージョンは 8.6 になるみたいです。随分昔の話になりますが、8.5 の CVS ブランチを作る際に、9.0 にした方が良いのではないかという話で盛り上がったのですが、今回はすんなりと 8.6 になりそうな雰囲気です。ま、どうなるかわかりませんけれども…。

計画通りに開発が進めばバージョン 8.5 は短命になりますが、この手のスケジュールは遅れるのが常です。

Date: Wed, 02 Jan 2008 15:32:26 -0500
From: Donald G Porter <dgp at nist.gov>
To: Tcl Core List <tcl-core at lists.sourceforge.net>
Subject: [TCLCORE] Draft Release Calendar for 2008

Here is my current thinking about release dates in 2008.

January 4, 2008 Tcl/Tk 8.4.17

Get the current set of 8.4 bug fixes out in a release.

February 1, 2008 Tcl/Tk 8.5.1

March 14, 2008 Tcl/Tk 8.4.18; Tcl/Tk 8.5.2; Tcl/Tk 8.6a0

Intent is for 8.4.18 to be the "final" release of Tcl/Tk 8.4.
Any lingering bugs needing fixing... someone should get busy
doing so by then, or get resigned to living with them for good.

The 8.5.2 and 8.6a0 releases are intended to be exactly the
same code, with version number being the only difference.
The development point right between the two releases is the
point where the HEAD will become devoted to 8.6 development,
and a new branch, core-8-5-branch will spawn to generate further
8.5.* patch releases.

May 16, 2008 Tcl/Tk 8.6a1; Tcl/Tk 8.5.3

July 18, 2008 Tcl/Tk 8.6a2; Tcl/Tk 8.5.4

Sept. 19, 2008 Tcl/Tk 8.6b1; Tcl/Tk 8.5.5

This gets us to beta status for Tcl/Tk 8.6 right in time for
the 2008 Tcl Conference (Sept. 22-26, 2008). The schedule
for 8.5.* patch releases proposed here is a minimum. More
frequent patch releases might happen if number/severity of
bug fixes warrants.

In some circles, a full year of development time to get to 8.6 beta
might seem sluggish, but in context of our history, this is a pretty
aggressive schedule.

This schedule offers three target dates for new features in Tcl/Tk 8.6.
If the shouts of protest aren't too loud, what I'd like to do next is
place the proposed 8.6[ab]* release dates on the "Tcl 8.6 Wish List"
page on the Wiki <URL: http://wiki.tcl.tk/20539 > and invite developers
to place their desired features under one of the target dates, and to
name some person(s) actively working to get that feature ready by that
date.

All of this is subject to revision, based on your comments.

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


【追記】
TIP #311: Tcl/Tk 8.6 Release Calendar for 2008

2008-01-03

ttk::progressbar


回は Ttk の話題に戻り、ttk::progressbar を紹介します。このウィジェットは、時間が掛かる処理の進捗具合を表示するウィジェットです。



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


# ----------------------------------------------------------------------------
# dummy work
# ----------------------------------------------------------------------------

proc dummyStart {varName} {
upvar #0 $varName x; # widget variable has gloval scope
for {set i 1} {$i <= 100} {incr i} {
set x $i
update
after 100
}
}

# ----------------------------------------------------------------------------
# MAIN
# ----------------------------------------------------------------------------

wm title . "ttk::progressbar"
ttk::style theme use "clam"

ttk::progressbar .p1 -length 200 -variable p -mode determinate
ttk::progressbar .p2 -length 200 -variable p -mode indeterminate
ttk::button .start -text "START" -command {dummyStart "p"}

grid .p1 -pady 5 -padx 10
grid .p2 -pady 5 -padx 10
grid .start -padx 10 -pady 5 -sticky news
grid columnconfigure . all -weight 1

# ---
# ttkwidget_progressbar.tcl


拡張パッケージ Incr Widgets の feedback ウィジェットでも同じような機能を実現できます。以下に簡単な例を示しました。



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


package require Iwidgets

# ----------------------------------------------------------------------------
# dummy work
# ----------------------------------------------------------------------------

proc dummyStart {w} {
$w reset
for {set i 0} {$i < 100} {incr i} {
$w step
after 100
}
}

# ----------------------------------------------------------------------------
# MAIN
# ----------------------------------------------------------------------------

wm title . "iwidgets::feedback"

iwidgets::feedback .fb \
-labeltext " percentage of completion " \
-steps 100 \
-barheight 10

button .start -text "START" \
-command {dummyStart .fb}

pack .fb -padx 4 -pady 4
pack .start -padx 4 -pady 4
# ---
# iwidgets_feedback.tcl

2008-01-02

Tcl 8.5 の任意精度計算


のところ、立て続けに Tcl/Tk 8.5.0 の新機能を紹介していますが、今回は、Tcl の任意精度計算について紹介します。
Tcl 8.5.0 から、整数計算を任意精度でできるようになりました。任意精度計算処理を行うエンジンには、libtomath (LTM) というライブラリが採用されています。

任意精度計算ライブラリというと、GMP が有名ですが、LGPL で配布されているため、Tcl のライセンスを変更せずにはこのライブラリを使用できません。しかし LTM はパブリック・ドメインのソフトウェアとして配布されており、ドキュメントもよく整備されていることから Tcl のコアに採用されたようです。詳細は以下をご覧下さい。

TIP #237: Arbitrary-Precision Integers for Tcl

ためしに、簡単な計算をしてみました。



任意精度の整数を扱えると何が嬉しいかと言うと…、いろいろあるとは思いますが、すぐに思いつくのは公開鍵暗号に関わる整数処理などでしょうか。

2008-01-01

ttk::notebook


今回は、テーマ・ウィジェット Ttk の ttk::notebook を紹介します。

このウィジェットは、タブをクリックすることで複数のウィジェットの表示を切り替えることができます。
BWidget や Incr Widgets、BLT など多くの拡張パッケージでも同様なウィジェットが用意されていますが、それらのウィジェットと比べると、この ttk::notebook には比較的シンプルな機能しか備わっていません。考えようによれば逆に使いやすいかもしれません。簡単なサンプルを以下に示しました。


ttk::notebook


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


# ----------------------------------------------------------------------------
# add a tab to notebook widget
# ----------------------------------------------------------------------------

proc addTab {w n} {
set m "${w}.tab${n}"
set tlab "TAB ${n}"

ttk::frame $m
$w add $m -text $tlab

return $m
}

# ----------------------------------------------------------------------------
# MAIN
# ----------------------------------------------------------------------------

wm title . "tk::notebook"
ttk::style theme use "clam"

# make the notebook
ttk::notebook .note
pack .note -fill both -expand 1 -padx 2 -pady 2

# TAB 1
set tab1 [addTab .note 1]
$tab1 configure -width 200 -height 200

# TAB 2
set tab2 [addTab .note 2]

# TAB 3
set tab3 [addTab .note 3]

# ---
# ttkwidget_notebook.tcl


変数 tab1, tab2, tab3 は各タブのフレーム・ウィジェットです。このフレーム上に表示したい子ウィジェットを配置します。

参考として、拡張パッケージの BWidget の NoteBook ウィジェットを使った同等なサンプルを示しました。ただし、タブの位置を下にしました。個人的には好んでタブの位置を下にしますが、Ttk の ttk::notebook では、残念ながらタブの位置を指定するオプションが用意されていません。


NoteBook ウィジェット(Bwidget)


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


package require BWidget

# ----------------------------------------------------------------------------
# MAIN
# ----------------------------------------------------------------------------

wm title . "NoteBook"

# make the NoteBook
NoteBook .nb -side bottom
pack .nb

# TAB 1
set tab1 [.nb insert end 1 -text "TAB 1"]
pack [frame $tab1.f -width 200 -height 200]

# TAB 2
set tab2 [.nb insert end 2 -text "TAB 2"]

# TAB 3
set tab3 [.nb insert end 3 -text "TAB 3"]

# show TAB 1
.nb raise 1

# ---
# bwidget_notebook.tcl