サーバー・クリニック: Perl/Tkを使ってサーバー・プログラミングにGUIを取り入れる

最近のGUIツールキットを使えば、システム・レベルのGUIも簡単

システム・プログラマーの皆さんは、コマンド・ライン・インターフェースを扱うのが常でしょう。ひょっとすると、軽量のグラフィカル・ユーザ・インターフェース (GUI) を使って、現在使われている機能を簡単にラップできることなど忘れてしまったのではないでしょうか。そんな中、Perl/Tkの新リリースは、高品質で使い方の簡単なGUIもあることを思い出させてくれます。

Cameron Laird (Cameron@Lairds.com), Vice President, Phaseit, Inc.

Photo of Cameron LairdCameronは、Phaseit, Inc. の常勤のコンサルタントです。オープン・ソースなどの技術的なトピックについて、数々の執筆や発言を行っています。Cameronのメール・アドレスはclaird@phaseit.net です。



2002年 11月 01日

生産性の高いサーバーサイド・プログラミングを行うことを中心に考えながらも、ときにはインターフェースを華やかなものにすることができます。その上、Perl/Tkのような軽量のツールキットの場合、もっと本格的なGUIの手法を利用する場合に必要なコストをかけずに、これを実現できます。

ツールキットの状況

どんなコストがかかるのでしょうか。GUIは、通常、対応するものをコマンド・ライン・インターフェースで実現する場合に比べ、プログラミング、テスト、移植、配備が難しくなります。Microsoft Visual Basic (VB) は、簡単にGUIを構築できることで広く認知されていますが、実質的にWindowsの世界に限定され、プログラミング言語として扱いにくい面があり、それがVBの足枷となっています。VBのそうした欠点の詳細については、稿末の参考文献を参照してください。Java、GTK+、Qtは、Linuxや関係するオープン・ソース開発向けとして、受け入れられてきてはいますが、それを利用するまでには、かなりの量の学習とかなりの行数のコードが必要です。その「敷居の高さ」が、文字型プログラミングからWIMP (ウィンドウ、アイコン、メニュー、ポインター) プログラミングへの穏やかな移行の妨げとなっています。

Webモデルは、ユーザーとの対話を単純化しすぎていますが、たくさんの小さな仕事には、これで充分です。実際、私が行うGUIプログラミングは、ほとんどがWebアプリケーション関係です。

しかし、Webで用が足りないこともあります。もっと洗練されたプログラミング方法や別のセキュリティー・モデルも必要です。「セカンド・ソース」が必要な場合もあります。WebサーバーにWebベースのコントロール・パネルを使うと、システムが脆弱になりすぎます。Webが多すぎる 場合もあります。通常、サーバーやクライアントは、大きなメモリー量を占有し、構成を設定する必要があります。

しかしながら、良い知らせがあります。生産性の高いプログラミング方法は、そのまま続けてください。Perl/TkやTkinterなどの軽量の高度な言語バインディングを加味すればよいのです。そうすれば、開発済みのプログラムを、移植性がよく、保守も容易で、驚くほど性能のよい「GUI化」バージョンに仕立て上げることができます。

好みの言語がRubyであろうがFortranであろうが、適当な付属品を利用することで、同じような結果を得ることができます。今回は、Perlを使い慣れているプログラマー向けに、そのようなプログラミングの効果を示す例を紹介します。


Perl/Tkの準備運動

Perlのことはご存じのことと思います。Perlは気の利いた簡潔な言語であり、他の言語であれば1日かかるようなレポート作成やネットワーク探査、テキスト・フィルター、プロセス・モニターといったツールを5分でコーディングすることができます。

しかし、さらに数行追加すれば、Perlアプリケーションを行儀がよく、見栄えのよいGUIアプリケーションにすることができることを、皆さんはご存じでしょうか。Teodor Zlatanovがcfengine や関係するPerlユーティリティーについてdeveloperWorks に寄稿した記事 (記事へのリンクは、参考文献 参照) には、以下のようなちょっとしたスクリプトでinetdプロセスをすべてシャットダウンする便利なツールの記述方法が示されています。

リスト1. kill_inetd.plのソース・コード
   use Proc::ProcessTable;
    $t = new Proc::ProcessTable;  foreach $p (@{$t->table}) {
            # note that we will also kill "xinetd" and all processes
            # whose command line contains "inetd"
        kill 9, $p->pid if $p->cmndline =~ 'inetd';
    }

質 (たち) の悪いCGIプロセスをシャットダウンする必要がある場合はどうでしょうか。あるいは、冷酷なkill 9ではなく、もっと上品なシグナル処理にしたい場合はどうでしょうか。皆さんの外出時に、皆さんの上司や交替要員がこのスクリプトを使う必要がある場合はどうでしょうか。エディターを起動し、inetd の代わりにcgi を使うなどして、perl kill_inetd.pl をコマンド・ラインから実行し直すというのが、従来までの答でしょう。

しかし、最初のリストをリスト2に変えてみてください。

リスト2. 修正版kill_inetd.plのソース・コード
   use Proc::ProcessTable;
    use Tk;
       
    sub kill_them {
        $t = new Proc::ProcessTable;  foreach $p (@{$t->table}) {
            kill $signal, $p->pid if $p->cmndline =~ $keyword;
        }
        $result_text = "Signal $signal sent to all '$keyword' processes.";
    }
    
    $main = MainWindow->new();
    $main->Label(-text =>
          "Control panel for killing processes\n   enter keyword here")->pack();
    $main->Entry(-textvariable =>\$keyword)->pack();
    $radiobutton_frame = $main->Frame->pack();
    $radiobutton_frame->Radiobutton(-text => "KILL",
                       -variable =>\$signal,
                       -value => 9)->pack(-side => left);
    $radiobutton_frame->Radiobutton(-text => "TERM",
                       -variable =>\$signal,
                       -value => 15)->pack(-side => left);
    $main->Button(-text => "Send kill signal to named processes",
                  -command =>\&kill_them)->pack();
    $main->Label(-textvariable =>\$result_text)->pack();
    # Set reasonable defaults.
    $keyword = "inetd";
    $signal = 9;
    MainLoop();

リスト2を実行すると、以下のような、小さいながらも、ちゃんと動くGUIのコントロール・パネルが現れます。

シグナル送信用の単純なコントロール・パネル
図1

このコントロール・パネルは、一度立ち上げておけば、表示させたままにしておくことができます。何度もタイプする必要はありません。

しかし、この20行のスクリプトで行っていない ことがあります。宣言や構成のページを設けていません。例のPerlが課しているもの以上のライセンス上の制約は何もありません。新しい言語を学習する必要はありません。


新しい展望

これは感動的なことです。Perlでコーディングした現存のアプリケーションをすべて、わずかばかりのGUIスクリプトでラップすることで、対話性能は変更することなく、「ユーザー・フレンドリー」なプログラムにすることができます。実際、現在あるユーティリティーを、適当なコマンド・ライン引数が指定されたときには通常の「バッチ」モードで動作し続け、そうした引数が指定されなかったときには処理を分岐させGUIウィンドウを作成するように書き換えることは簡単です。

リスト3. コマンド・ライン動作にするかGUI動作にするかの選択
     sub batch_operation {
	    }
	    sub start_GUI {
	       use Tk;
	       ...
	       MainLoop();
            }
	    if (0 == scalar(@ARGV)) {
		start_GUI();
	    }
	    if (errors_detected_in_@ARGV()) {
		start_GUI();
	    }
	    batch_operation();

考えてみてください。すでに理解しているPerl (とかPythonとか) のコードを何行か付加するだけでこのような結果が得られるのです。また、Perlは外部アプリケーションとの「接着剤」の働きをしますので、いまさら触りたくない昔のFortranやCのアプリケーションをラップするのにも、こうした手法を使用することができます。少々のPerlをバックティック (逆シングル・クォーテーション) かexec でラップしてやればよいのです。

Perl/Tkも、進化しています。生化学シミュレーターや地理測量プログラム、飛行管制システム、その他さまざまな分野で、かなりのPerl/Tkアプリケーションが世界中で日常的に利用されています。大規模なPerl/Tkプログラミングの感じを伝達するのは、難しいのですが、Perlのコードを何行か追加することで容易に「GUI化」できることが、上に示した例でおわかりいただけることと思います。Perl/Tkプログラミングの全体像を、もっと完璧な形で把握したいという方は、稿末の参考文献に示した文献を当たり、自分で複雑なプログラムのソース・コードを研究してみてください。

大まかなプロトタイプは別にして、私がまだ記述したことのないプログラムがあります。Zlatanov氏の遺伝的アルゴリズム・モデルのグラフィカル版です (参考文献に掲げたdeveloperWorks 掲載の同氏の記事を参照してください)。満足のいくバージョンは、読者への練習問題としておきます。私が実験したところでは、遺伝的アルゴリズムのGUI版は、このコラムで推奨している手法が応用可能な好例となりそうです。Perl/TkのCanvas ウィジェットが都合よく利用でき、これを使って視覚化してやると、バッチ・モード動作が、まさに活き活きとした動きを示すようになります。

何年か前にPerl/Tkを使ってみたが、あまりぱっとしなかったという感じをお持ちの方は、もう一度試してみてはいかがでしょうか。Perl/Tkプロセッサーは、最近になって、大きな進化を遂げています。Perl/Tkの初心者でも、よく使われるプラットフォームにはバイナリーを簡単にインストールできるようになっていますし、Windowsの移植性は格段によくなっていますし、また最近のリリースは、高い品質を示すようになっています。おそらく、それよりも重要なことは、Perl/Tk関係の書籍が増えているということです。O'Reillyが7月に発行したPerl in a Nutshell、第2版には、Perl/Tk関係の参考文献が示されており、非常に役に立ちます。一番ありがたいのは、O'Reillyが2002年にNancy WalshとStephen LidieによるMastering Perl/Tk を刊行したことです。Perk/Tkを何時間か以上触ってみる気があるなら、Mastering Perl/Tk は、購入しておくべき文献の1つです。


まとめ

システム・プログラマーや管理者にとって、GUIプログラミングは、謎に満ちたものに見えることがあります。われわれが通常「サーバー・クリニック」で行っているような類の開発からはかけ離れた特殊な仕事のように見えます。

しかし、そんなことはないはずです。Perl/Tkなどの最近のGUIツールキットは、性能や機能がよく、しかも、本稿でさんざん強調したように、生産性や習得のしやすさの面でも優れています。今月は、Perl/Tkに1、2時間費やして、プログラムを魅力的なものに変身させることを考えてみてはいかがでしょうか。

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=230706
ArticleTitle=サーバー・クリニック: Perl/Tkを使ってサーバー・プログラミングにGUIを取り入れる
publish-date=11012002