高度なPerl/Tkウィジェットを使う

Perlで表現力豊かなユーザー・インターフェースを構築する

Perlは世にある言語のうち最も普及しているものの一つであり、基幹業務のプロジェクトからWebアプリケーションまで、「接着剤」として使用されています。ただしGUIプログラミングやプロトタイピングにはそれほど使われてはいません。Philipp K. Janertはそうした用途にも、もっと頻繁に使われてしかるべきだと考えています。Perl/Tkに用意されている、より複雑なウィジェットの幾つかをこの記事で読んでみると、おそらく読者も著者に同意するようになるでしょう。

Philipp Janert (janert@ieee.org), Software Project Consultant, IEEE.org

Philipp K. Janertは、ソフトウェア・プロジェクト・コンサルタントであり、サーバー・プログラマーであり、設計者でもあります。彼の興味は、ソフトウェアエンジニアのベストプラクティスの選別、確定、伝導にあります。彼はBeyondCode.orgWebサイトを保守しており、彼が投稿した記事は、IEEE Software,Linux JournalおよびO'Reilly Networkのサイトで参照することができます。彼はシアトルのワシントン大学で理論物理学の博士号を取得しました。彼の連絡先は、 janert-at-ieee.org です。



2004年 8月 10日

Perl言語が広く使われているのと対照的に、PerlのGUIツールセットPerl/Tkはほとんど知られていません。これはおかしなことです。Perl/Tkは(少なくともUNIXプラットフォームでは)最もプログラムが容易なGUIツールキットの一つであることはほぼ間違いなく、従って、ユーザインタフェースのプロとタイピングやコマンドラインツールを隠蔽するラッパーを作成することに適しているはずなのです。

Perl/Tkに対して比較的関心が低い理由の一つは、Perl/Tkがそれほど強力ではなく、高度なアプリケーションには不向きだと思われているためのようです。ところが、CPANのユーザー貢献の中に、より複雑な機能を提供するような幾つかのウィジェットがあるのです。この記事ではその幾つかを見ながら、どのように使用すれば表現力豊かなユーザー・インターフェースを実現できるかを示したいと思います。また、Perl/Tkでのプログラミングに便利な、より一般的な手法の幾つかについても指摘するつもりです。

(Perl/Tkのもう一つの問題はもちろん、そのウィジェットが醜悪に見え、テーマ付け不能なことでしょう。残念ながら、これに関しては私にはどうにもできません。)

前提条件と入手場所

全体を通しての前提条件として、Perlに関して十分な知識があり、最低限Perl/Tkを少し使った経験があること、そして一般的なGUIプログラミングの概念、つまりイベント、ウィジェット、コールバック、ジオメトリ・マネージャーなどを理解していることが必要になります。 参考文献 にPerl/Tkの入門資料を挙げておきます。

この記事で取り上げる全てのウィジェットはCPAN(Comprehensive Perl Archive Network)から無料でダウンロードできます。大部分のウィジェットには、ここで説明できないほど多くのオプションがあります。各ウィジェットの究極的かつ完全な資料として、perldoc、場合によってはソースコード、があります。

タブ付きのフレーム:Tk::NoteBook

一般的なGUIウィジェットである Tabを使うことにより、多数のオプションを小さなサブグループにグループ分けすることができるようになり、また、例えば複雑なダイアログ・ボックスに対して構造を与えられるようになります。

Perl/Tk で、Tab風の外観と意味体系を持つウィジェットは Tk::NoteBook です。3つのタブを使った例を 図1 に示します。3番目のタブが使用禁止になっていることに注意して下さい。

図1. NoteBookウィジェット
Figure 1. The NoteBook widget

この例は次のコードで生成されています。

リスト1. NoteBookウィジェットを使う
use Tk;
use Tk::NoteBook;

$mw = MainWindow->new();
$mw->geometry( "400x100" );
$book = $mw->NoteBook()->pack( -fill=>'both', -expand=>1 );

$tab1 = $book->add( "Sheet 1", -label=>"Start", -createcmd=>\&getStartTime );
$tab2 = $book->add( "Sheet 2", -label=>"Continue", -raisecmd=>\&getCurrentTime );
$tab3 = $book->add( "Sheet 3", -label=>"End", -state=>'disabled' );

$tab1->Label( -textvariable=>\$starttime )->pack( -expand=>1 );
$tab2->Label( -textvariable=>\$raisetime )->pack( -expand=>1 );
$tab3->Button( -text=>'Quit', -command=>sub{ exit; } )->pack( -expand=>1 );

MainLoop;

sub getStartTime {
  $starttime = "Started at " . localtime;
}

sub getCurrentTime {
  $raisetime = " Last raised at " . localtime;
  $book->pageconfigure( "Sheet 3", -state=>'normal' );
}

コールバックのパラメーターを規定する方法として、2つの別な方法を見ています。つまり一つは次のようにフラットなリストとして規定する方法、

-command=>[ \&fct, $slide, $bar1, $bar2 ]

もう一つは、匿名サブルーチン内からの、コールバックの直接呼び出しとして規定する方法です。

-command=>sub{ convert( $input, $label ) }

この2つの方法の違いは可変領域、より正確に言うと、パラメーターが評価される、正にその時間、に関係しています。

最初の場合では、パラメーターは command 属性を含むコンストラクターが実行される時に評価されます。後でパラメーターの値が変わっても、その変化はコールバック内部では見えません。これは ProgressBar の例では問題ありません。パラメーターはアプリケーションのウィジェットへの参照であり、これは一旦コンストラクトされると変化することはないためです。

これとは対照的に、2番目の方法で使われる匿名サブルーチンの内容は、このサブルーチンが実際に呼び出されるまで評価されません。言い換えればコールバックは、実行する時にパラメーターの値を見るのです。 DateEntry の例では $input 変数が最も最近のユーザー入力を持っており、従ってプログラム全体に渡って頻繁に変化するので、これは重要です。

最後に、 convert 機能の本体は大きすぎてインラインの sub{ } 宣言内にうまく入らなかったので convert を別の機能として分け、単に匿名サブルーチン内部から呼ぶことにしました。

どのPerl/Tkアプリケーションでも同じですが、最初にこれから使おうとするモジュールを規定し、それから MainWindow を作ります。注意して欲しいのですが、 Tk::NoteBook はCPANに貢献されている他のウィジェットと同様、標準のTkディストリビューションの一部ではなく、従って明示的に規定する必要があります。

ここでは MainWindow の子として NoteBook ウィジェットを作り、それから3つのタブを追加します。 add() 機能への最初の引き数はシンボル名で、生成されたページはノートブックの中で、このシンボル名で呼ばれます。下ではこれを利用します。

ここで、 NoteBook ウィジェットを使う上でのジオメトリ管理に関して2つコメントしておくべきでしょう。まず、タブはウィジェットそのものですが、 pack する必要はないという点です。タブのジオメトリ管理は、タブを含んでいる NoteBook が処理します。もう一つは、 NoteBook ウィジェットの親ウィンドウがサイズ変更可能な場合には、 NoteBookpack する時に -fill 属性と -expand 属性の両方を規定することが重要だという点です。後者により、 NoteBook が割り付ける長方形が、必ず使用可能な空間一杯に拡張されるようになります。また前者により、実際の NoteBook ウィジェットが、割り当てられた長方形一杯に拡張されるようになります。

このタブは様々な属性を受け付けますが、ここでは -createcmd-raisecmd それに -state の例を取り上げます。初めの2つはコールバックの登録に使い、それぞれタブが最初に作られる時、またタブが立てられる時には必ず呼び出されます。最後の1つは normaldisabled という値をとります。また2番目のタブにも -raisecmd コールバックを使い、2番目のタブが初めて立てられると、3番目のタブを使用不可から使用可能な状態に切り換えます。これを、タブを囲む NoteBook ウィジェットにある pageconfigure() 機能を使って行い、参照されたタブのシンボル名を最初の引き数として渡します。

多用途のグラフィカル・ディスプレイ:Tk::ProgressBar

Tk::ProgressBar はスカラー値をグラフィカルに表示するウィジェットです。大きなファイルをダウンロードしたり、実行時間が長くかかる類似のタスクを実行したりする時には、ユーザーへのフィードバックとしてプログレス・バーが一般的に使われます。これに対応するPerl/Tkのウィジェットでは、他の用途にも使いたくなるような、特別な機能を幾つか用意しています。

図2. ProgressBarウィジェット
Figure 2. The ProgressBar widget

この例には2つの ProgressBar ウィジェットがあり、標準の Scale と組み合わされています。スライダーを動かすと表示される色のバーの長さが変わりますが、これは ProgressBarvalue 機能を呼んで新しい長さを設定する、 fct という名前のコールバックを呼び出すことによって行われます。値 100 が(目に見える)色のバーの全長に対応します。この値は、長さゼロのバーに対応する値と同様、それぞれ -to-from 属性を使って変更することができます。

リスト2 は、色のバーの外観をカスタム化するための幾つかの方法を示しています。下側の ProgressBar は10のブロックに分割され、それぞれが1ピクセルの隙間で分けられています。これらはデフォルトの値であり、 blocksgap 属性に明示的に値を規定することで設定できます。通常は、 -padx-pady-length それに -borderwidth などの属性を使った、少しばかりの実験が必要になります。

-colors 属性には位置と色の組を含む配列への参照が入ります。(位置は昇順で並べ替えておく必要があることに注意して下さい!)色のバーでは、次の位置に達するまで最後に規定された色が使用され、次の位置に達すると色が変わります。ですから @colors = ( 0, "red", 50, "green" ); を定義すると、左側が赤で右側が緑のバーになります。ここではそれぞれ異なる100の値を使っており、上側の ProgressBar で色が虹のようになるようにしています。上側の ProgressBar はウィンドウのサイズが変更されると長さが変わることに注意して下さい。

リスト2. ProgressBar ウィジェットを使う
use Tk;
use Tk::ProgressBar;

@colors = (  0, '#ff002a',  1, '#ff0014',  2, '#ff000a',  3, '#ff0500',  4, '#ff1000',
	     5, '#ff1b00',  6, '#ff3000',  7, '#ff3b00',  8, '#ff4600',  9, '#ff5100',
	    10, '#ff6100', 11, '#ff7600', 12, '#ff8100', 13, '#ff8c00', 14, '#ff9700',
	    15, '#ffa100', 16, '#ffbc00', 17, '#ffc700', 18, '#ffd200', 19, '#ffdd00',
	    20, '#ffe700', 21, '#fffd00', 22, '#f0ff00', 23, '#e5ff00', 24, '#dbff00',
	    25, '#d0ff00', 26, '#baff00', 27, '#afff00', 28, '#9fff00', 29, '#95ff00',
	    30, '#8aff00', 31, '#74ff00', 32, '#6aff00', 33, '#5fff00', 34, '#54ff00',
	    35, '#44ff00', 36, '#2eff00', 37, '#24ff00', 38, '#19ff00', 39, '#0eff00',
	    40, '#03ff00', 41, '#00ff17', 42, '#00ff21', 43, '#00ff2c', 44, '#00ff37',
	    45, '#00ff42', 46, '#00ff57', 47, '#00ff67', 48, '#00ff72', 49, '#00ff7d',
	    50, '#00ff87', 51, '#00ff9d', 52, '#00ffa8', 53, '#00ffb8', 54, '#00ffc3',
	    55, '#00ffcd', 56, '#00ffe3', 57, '#00ffee', 58, '#00fff8', 59, '#00faff',
	    60, '#00eaff', 61, '#00d4ff', 62, '#00c9ff', 63, '#00bfff', 64, '#00b4ff',
	    65, '#00a9ff', 66, '#008eff', 67, '#0083ff', 68, '#0079ff', 69, '#006eff',
	    70, '#0063ff', 71, '#004eff', 72, '#003eff', 73, '#0033ff', 74, '#0028ff',
	    75, '#001dff', 76, '#0008ff', 77, '#0200ff', 78, '#1200ff', 79, '#1d00ff',
	    80, '#2800ff', 81, '#3d00ff', 82, '#4800ff', 83, '#5300ff', 84, '#5d00ff',
	    85, '#6e00ff', 86, '#8300ff', 87, '#8e00ff', 88, '#9900ff', 89, '#a300ff',
	    90, '#ae00ff', 91, '#c900ff', 92, '#d400ff', 93, '#df00ff', 94, '#e900ff',
	    95, '#f400ff', 96, '#ff00f3', 97, '#ff00e3', 98, '#ff00d9', 99, '#ff00ce' );

$mw = MainWindow->new();
$mw->geometry( '250x150' );
$mw->resizable( 1, 0 );

$bar1 = $mw->ProgressBar( -borderwidth=>2, -blocks=>100, -gap=>0,
			  -troughcolor=>'white',-colors=>\@colors,
			  -length=>106 )->pack( -padx=>5, -pady=>5, -fill=>'x' );

$slide = $mw->Scale( -orient=>'horizontal', -length=>150,
		     -showvalue=>0, -tickinterval=>20 )->pack;

$bar2 = $mw->ProgressBar( -padx=>2, -pady=>2, -borderwidth=>2,
			  -troughcolor=>'#BFEFFF', -colors=>[ 0, '#104E8B' ],
			  -length=>106 )->pack;

$mw->Button( -text=>'Quit', -command=>sub{ exit } )->pack( -padx=>15, -pady=>15,
							   -anchor=>'se' );

$slide->configure( -command=>[ \&fct, $slide, $bar1, $bar2 ] );

MainLoop;

sub fct {
  my ( $slide, $bar1, $bar2 ) = @_;
  my $val = $slide->get();
  $bar1->value( 100 - $val );
  $bar2->value( $val );
}

ここでは Scale ウィジェットに対するコールバックを、そのコンストラクターの中ではなく、後で configure 機能を使って規定します。これは、コールバックへの引き数として両方の ProgressBar への参照が必要であり、 Scale コンストラクターが呼び出された時に全ての参照がまだ定義されているわけではないためです。ウィジェット・コンストラクターが呼ばれる順番を変更することはできません。これは、呼ばれる順番を変更すると、ウィジェットがパックされる順番を変更することになるためです。

このコードはまた、コールバックへの引き数を規定する一つの方法も示しています。つまり(最初の要素として呼び出される)コールバックへの参照があり、それに続いて必要なパラメーターがある匿名リストとしての規定方法です。もしコールバックが引き数を必要としないのであれば、Perlはリスト・コンテキストで評価されるスカラー値を単一要素の配列として扱うため、匿名リストを作る必要はありません。(Perlでのリストに関する情報については、 参考文献 にある、Learning Perl, 2nd editionを見て下さい。)この先、下の方で、コールバックにパラメーターを送るための別の方法を説明します。2つの方法の差に関する説明が 囲み記事 にありますので見て下さい。

色のバーのどのセグメントに対しても自由に任意の色を選べるので、 ProgressBar を一般的な表示ウィジェットとして、面白い使い方をすることができます。例えば、表示されている変数が「通常な」パラメーター範囲にあるかどうかを色で示すことができます。残念ながらこのウィジェットは、 -orient 属性をサポートしません。ですから ProgressBar は常に水平に表示されます。


簡単化したデータ入力: Tk::DateEntryとTk::PathEntry

Tk::DateEntry ウィジェットと Tk::PathEntry ウィジェットを使うと、有効な入力が表示され、ユーザーがそこから入力を選択できるようになるので、構造化データ(つまり、それぞれ日付とファイル・パス)の入力が簡単になります。

DateEntry ウィジェットはテキスト入力フィールドを表示し、その隣にボタンを表示します。そのボタンをクリックするとドロップダウン・メニューにカレンダーが表示され、マウスでデータを選択すると、その選択に対応した文字列がテキスト入力フィールドに入力されます。

図3. DateEntryウィジェット
Figure 3. The DateEntry widget

リスト3 はこの例に関連したコードを示します。 Convert を選択するとUnixエポックの開始からの秒数を計算し、その値をテキスト入力フィールドの上にある Label ウィジェットに表示します。

リスト3. DateEntryウィジェットを使う
use Tk;
use Tk::DateEntry;

use Time::Local;

%idx_for_mon = ( JAN=>1, FEB=>2, MAR=>3, APR=> 4, MAY=> 5, JUN=> 6,
		 JUL=>7, AUG=>8, SEP=>9, OCT=>10, NOV=>11, DEC=>12 );

$input = '01-APR-2004'; # Initial value for display

$mw = MainWindow->new();
$mw->geometry( '200x80' );
$mw->resizable( 0, 0 );

$label = $mw->Label( -text=>'' )->pack;
$entry = $mw->DateEntry( -textvariable=>\$input, -width=>11,
			 -parsecmd=>\&parse, -formatcmd=>\&format )->pack;

$mw->Button( -text=>'Quit', -command=>sub{ exit } )->pack( -side=>'right' );
$mw->Button( -text=>'Convert',
	     -command=>sub{ convert( $input, $label ) } )->pack( -side=>'left' );

MainLoop;

# called on dropdown with content of \$textvariable, must return ( $yr, $mon, $day )
sub parse {
  my ( $day, $mon, $yr ) = split '-', $_[0];
  return ( $yr, $idx_for_mon{$mon}, $day );
}

# called on user selection with ($yr, $mon, $day), must return formatted string
sub format {
  my ( $yr, $mon, $day ) = @_;
  my %mon_for_idx = reverse %idx_for_mon;
  return sprintf( "%02d-%s-%2d", $day, $mon_for_idx{ $mon }, $yr );
}

# perform the conversion to epoch seconds when the corresponding button is pressed
sub convert {
  my ( $input, $label ) = @_;
  my ( $yr, $mon, $day ) = parse( $input );
  my $output = "Epoch seconds: " . timelocal( 0, 0, 0, $day, $mon-1, $yr-1900 );
  $label->configure( -text => $output );
}

文字列形式で日付を表す方法はあまりにも多くあるので、日付の入力は簡単ではありません。 DateEntry には3つの標準的な日付フォーマット(MM/DD/YYYYとYYYY/MM/DD、それにDD/MM/YYYY)があり、 -dateformat オプションを使って選択することができます。別の日付フォーマットが欲しい場合には、コールバック -parsecmd-formatcmd を使って、明示的に変換ルーチンを示す必要があります。上記の例では、月を3文字の略語を使って表示するカスタムの日付フォーマットを使っています。入力文字列を数字要素に構文解析する時には、3文字の略語に対応する各月の数字インデックス(1..12)を持つハッシュ、 %idx_for_mon を使います。ユーザーがドロップダウン・メニューから日付を選択すると、その日付は対応した文字列にフォーマットする必要がありますが、これには逆の参照、つまり数字インデックスに対応する略語、が必要になります。 reverse を使って処理しながら、 format ルーチンの中でそうしたデータ構造を作ります。このコマンドは配列を想定しているので、元々のハッシュは、配列中の各キーの後に値が来るような形で配列に戻されます。次にこの配列は逆(今度は値の後にキーが来る)にされ、変換されてハッシュに戻ります。ここではキーも値もそれぞれ唯一のものなので、この細工がうまく行きます(この件に関しても、 参考文献 に挙げたLearning Perlを見て下さい)。

convert 機能は Label が示す値を変更することができるように、パラメーターとして入力文字列を含む変数と Label ウィジェットへの参照をとります。ここではコールバックへの参照や匿名配列にあるパラメーターの値を -command 属性に渡すことはせず、(closureである)匿名サブルーチン内部からコールバック機能を直接呼び出します。こうする理由は可変領域と関係しています。詳しい説明については 囲み記事 を見て下さい。

最後に、 Tk::PathEntry ウィジェットは非常に単純です。このウィジェットはパス名用のテキスト入力フィールドを提供するのですが、ちょっとした仕掛けがあるのです! tcsh やEmacsのミニ・バッファーの振る舞いと同じように、 Tab キーを押すと、入力フィールドの内容が可能な限り埋められます。曖昧さ無く現在の内容を埋めることができない場合には、可能な選択項目のリストを含んだボックスがポップアップされます。奇怪なことに、(下にあるPerlモジュールのコードを編集しようとしない限り)このリスト・ボックスの色を変更することはできません。

図4. PathEntryウィジェット
Figure 4. The PathEntry widget
リスト4. PathEntryウィジェットを使う
use Tk;
use Tk::PathEntry;

use Cwd;

$path = cwd();

$mw = MainWindow->new();
$mw->geometry( '300x80' );
$mw->resizable( 0, 0 );

$mw->PathEntry( -textvariable=>\$path )->pack;
$mw->Label( -textvariable=>\$path, -foreground=>'blue' )->pack;
$mw->Button( -text=>'Quit', -command=>sub{ exit } )->pack;

MainLoop;

PathEntry が面白いのは、 PathEntry が単なるウィジェットであって、ダイアログ・ボックスではない、という点です。 PathEntry はプログラム中の他のウィジェットと組み合わせることができます(というよりも実は、組み合わなければなりません)。ですから非常に軽量な方法で、アプリケーションにファイル選択機能を追加することができるのです。


まとめ

ここに挙げたものは、Perl/Tk GUIツールキットのうち「高度な」ウィジェットのごく一部にすぎません。Perl/Tk GUIツールキットを使うことによってより表現力豊かな、より強力なユーザー・インターフェースが、Perlを使用して作れるようになります。ここで取り上げたウィジェットはすべて、CPANからユーザー貢献として無料で入手することができます。

参考文献

  • Perl/Tk FAQ はCameron Lairdが維持管理しており、まだシステムにPerl/Tkがインストールされていない時には どこからダウンロードし、どのようにインストールするか を説明しています。
  • また、comp.lang.perl.tkニュース・グループと ptkメーリング・リスト もあります。 Perl/Tk Wiki も見て下さい。
  • CPANのUser Interfaceセクション には、この記事で説明した高度なモジュールがあります。
  • Steve Lidieが The Perl Journal の最初の3部にPerl/Tkについて記事を書いており、そのうちの最初「 Perl and the Tk Extension 」を彼のWebサイトで再発表しています。このWebサイトには Important Perl/Tk links のページもあります。
  • Steve Lidieは入門的な「 Getting Started with Perl/Tk 」(Perlmonth, 1999年4月)も書いています。これも彼のサイトで再発表されています。Steveによる「 A Drag-and-Drop Primer for Perl/Tk 」(perl.com, 2001年12月)と「 Creating Custom Widgets 」(perl.com, 2002年1月)は、より高度な話題についての説明です。
  • Cameron Lairdによる記事「 Perl/Tkを使ってサーバー・プログラミングにGUIを取り入れる 」(developerWorks, 2002年11月)では、Perl/Tkを使ってユーザーが使いやすいインターフェースを簡単に作る方法を説明しています。
  • Perlに慣れていて、単にPerl/Tkに慣れていない人であれば、perl.comにあるプレゼンテーションのスライド Perl/Tk Tutorial (perl.com, 1999年10月)も面白いかも知れません。
  • 以前PhilippがdeveloperWorksに「 Perl/Tkを利用してのデータのビジュアル化 」(developerWorks, 2003年8月)を書いています。ここではPerl/Tkを使ってカスタムのプロット用ツールやグラフ作成用ツールを作る方法を説明しています。
  • Perl/Tkの概要は標準的Perlディストリビューションに付属しています。コマンドラインで perldoc Tk をタイプしてみて下さい。これとは別に、Perl/Tkでのコールバックについて簡単な説明もあります。 perldoc Tk::callbacks を見てみて下さい。
  • Stephen LidieとNancy Walshによる Mastering Perl/Tk (O'Reilly & Associates, 2002年刊)は初心者にも熟練者にも好適です。
  • Randal L. SchwartzとTom Christiansenによる Learning Perl, 2nd edition (O'Reilly & Associates, 1997年刊)はPhilippが好んで参照する本です。現在は 第3版 が出ています(2001年)。
  • developerWorksの Linux ゾーン にはLinux開発者のための資料が豊富に用意されています。
  • Developer BookstoreのLinuxセクションで Linux関連の技術書が値引きして購入 できます。
  • Linux上で実行する、より抜きのdeveloperWorks Subscription製品の無料の試用版をダウンロードして下さい。developerWorksの Speed-start your Linux app セクションからWebSphere Studio Site DeveloperやWebSphere SDK for Web services、WebSphere Application Server、DB2 Universal Database Personal Developers Edition、Tivoli Access ManagerそれにLotus Domino Serverが入手できます。もっと手早くしたければ、ハウ・ツー記事や技術サポートが製品毎に集められていますので、ご自由に入手して下さい。

コメント

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=229882
ArticleTitle=高度なPerl/Tkウィジェットを使う
publish-date=08102004