オンスクリーン表示は、Windows® および Linux® のグラフィカル・デスクトップで何年もの間、使用されてきました。最近では、フレームなしの透明ウィンドウがLinux デスクトップで進歩し、別のレベルのグラフィック機能に発展しました。Ghosdで、アンチエイリアスのフォント、トゥルー・カラー、影付き、透明化、および画像ファイル・ローディングを使用すれば、1段階上のレベルのオンスクリーン表示を実装できます。
この記事では、Perl と、カスタム・コンパイルした Ghosd プログラムを使用して、独自のイベント通知システムを実装する方法について説明します。簡単なキーワード・マッチングと、クライアント・サーバーのセットアップを使用することにより、システムがリモート・システムであるかローカル・システムであるかに関係なく、すべてのシステムのオンスクリーン・タイプの通知を受け取ることができます。
西暦 2000 年より後に製造された PC であれば、コードのコンパイルと実行に十分な処理能力が備わっています。グラフィカル・デスクトップがインストールされていれば、高速のプロセッサーがすでに取り付けられている可能性があります。
Ghosd プログラムには、Pango ライブラリーおよび Cairo ライブラリーが必要です。Ghosdをコンパイルおよび構成するには、これらのライブラリーをインストールする必要があります。Cairoライブラリーおよび Pango ライブラリーについては、「参考文献」を確認してください。あるいはこれを飛ばして、これらのライブラリーが事前にインストールされている便利なLinux ディストリビューションをインストールしてください。お勧めは VectorLinux です。この Linux には、これらのライブラリーと、視覚的にすばらしい機能が事前にインストールされています。また、このLinux は、Ghosd をうまく使いこなせるように構成されています。
Pango と Cairo をインストールしたら、Ghosd プログラム自体をコンパイルします。Ghosdソース・コード・アーカイブをダウンロードして抽出したら、./configure &make install というコマンドでコンパイルします。構成およびインストールのプロセスが完了したら、examplesディレクトリーで Ghosd の使用オプションを調べます。Ghosd の一部は関数ライブラリーとして作成されていて、皆さんのアプリケーションからオンスクリーン表示設計メタファーを使用する際に役に立ちます。例として、ここでは、小さなC プログラムを使用して、Ghosd をコマンド・ラインから使用する方法と、Ghosdを皆さんのプログラムに統合する方法について基本事項を説明します。
examples ディレクトリーに移動し、コマンド ./text を発行して text.c プログラムを実行してみます。ハードコーディングされたテキストが、くっきりとした白で右下隅に表示されます。今回の目的は、テキスト・メッセージの色、位置、および内容を指定できるようにすることです。今回は、プログラムを新規に作成する代わりに、要件に合うように既存のtext.c プログラムを変更します。この作業をスキップしたい場合は、変更済みのtext.c ファイルをソース・コード・リポジトリーからダウンロードし、make コマンドを使用してコンパイルしてください。
宣言部で次の変数を追加します。
リスト 1. test.c の宣言の更新
int posX = -50;
int posY = -50;
float red = 1.0;
float green = 1.0;
float blue = 1.0;
int ftSize = 30;
int fadIn = 300;
int fadOut = 1500;
char displayText[500] = "default message";
|
位置、テキストの内容、色、フォント・サイズ、フェードイン速度 (ミリ秒)、フェードアウト速度(ミリ秒) のデフォルト変数があります。また、表示ストリングを保持する配列もあります。次に、テキスト表示部分を変更し、実際に使用する色を指定します。レンダリング機能で、cairo_set_source_rgba(cr,1, 1, 1, 1.0); という行を cairo_set_source_rgba(cr, red, green, blue, 1.0);に変更します。これにより、コマンド・ラインに渡す色の値が使用できるようになります。
すべてのパラメーターがコマンド・ラインに含まれていない場合に、プログラムがクラッシュせずに、デフォルトのメッセージを出力するように、プログラムを変更します。main関数から次の行を削除します。
リスト 2. main() ハードコーディングされた表示
pango_layout_set_markup(layout,
"<span font_desc='Trebuchet 30'>"
"some sample text using <b>ghosd</b>"
/* "ار�~Jد" */
"</span>", -1);
ghosd = ghosd_new();
ghosd_text_set_position(ghosd, -50, -50, layout);
ghosd_set_render(ghosd, render, layout);
ghosd_flash(ghosd, 300, 1500);
|
上のコードを削除したら、下にあるエラー検査と表示のコードを挿入します。
リスト 3. main() エラー検査と表示
if( argc == 10 )
{
posX = atoi(argv[2]);
posY = atoi(argv[3]);
red = atoi(argv[4]);
green = atoi(argv[5]);
blue = atoi(argv[6]);
ftSize = atoi(argv[7]);
fadIn = atoi(argv[8]);
fadOt = atoi(argv[9]);
sprintf(displayText, "<span font_desc='Trebuchet %d'>%s</span>", ftSize, argv[1]);
}else{
sprintf(displayText,"<span font_desc='Trebuchet 30'>Incomplete command</span>");
}
pango_layout_set_markup(layout, displayText, -1 );
ghosd = ghosd_new();
ghosd_text_set_position(ghosd, posX, posY, layout);
ghosd_set_render(ghosd, render, layout);
ghosd_flash(ghosd, fadIn, fadOt);
|
単純なエラー検査のコードが組み込まれ、Pango レイアウトが更新されると、コマンド・ラインで指定された位置に、指定のサイズ、色、およびフェードのパラメーターを使って、テキストが表示されます。makeを実行して新しいテキストの実行可能ファイルを作成します。./text "redtext example" -150 -150 1.0 0.1 0.1 40 500 2000 のようなコマンドを使用して、Ghosdテキスト・サンプル・プログラムを実行します。サンプル・コマンドでは、ストリング"red text example" が、縦横 -150、-150 の位置に 40 ポイントの赤色のフォントで500 ミリ秒を掛けてフェードインします。その後、2000 ミリ秒 (2 秒) 経過すると、テキストが画面からフェードアウトします。
examples ディレクトリーにある画像サンプルは、今回の目的にぴったり当てはまります。コマンド./image /usr/share/pixmaps/x264.png -x 40 -y 40 で、単純な画像を画面に表示してみてください。次の画像は、画像とテキストを同時に表示したときの例です。
図 1. Ghosd サンプル・テキストおよび画像
Ghosd プログラムには、さまざまなサイズ、色、およびスタイルの制限なしで、テキストおよび画像を表示する機能が備わっています。この機能を効果的に使用して、システムの状況やE メール・メッセージなどの希望のパラメーターをモニターするには、このような変化するパラメーターを保持しながら、この機能を使用するための単純なインターフェースを用意する必要があります。以下で実装するシステムでは、クライアント・サーバー・アーキテクチャーを使用して、ローカル・マシンとリモート・マシンからの表示イベントを受け取っています。
メッセージ・ストリングが、クライアントから送信され、情報のキーワード (構成ファイルから読み取られる)について処理され、しかるべき出力が表示されます。例えば、サーバーが「Newe-mail from mark@developerWorks」というストリングを受信した場合、サーバーはE メールのキーワードを検出し、メール・ピクチャーを表示します。画面の右下隅には、テキスト全文が表示されます。クライアントから送信されるメッセージ・ストリングに"error" が含まれている場合は、メッセージ・ストリング全体が画面の中央に大きな赤い文字で表示されます。
この実装を開始して、その動作を確認してみましょう。
サーバーでは、テキストおよび画像の表示方法を決定するために、構成ファイルを読み取る必要があります。また、指定のポートでクライアント接続をリッスンするために無限ループを設定する必要もあります。接続が確立されると、その接続がローカル・マシンからの接続なのかリモート・マシンからの接続なのかに関わらず、着信メッセージが処理され、構成ファイルに指定されたキーワードに一致する内容の検出処理が行われます。そして、その構成ファイルに指定されたパラメーターに応じて、しかるべきテキストまたは画像が表示されます。ここではプログラムの動作について簡単に説明したので、これを基にして、宣言部の先頭を見てみましょう。
リスト 4. osdServer.pl の宣言
#!/usr/bin/perl -w
# osdServer.pl - process incoming text events based on keyword matching and
# display using Ghosd
use strict;
use FileHandle;
use Socket;
if( @ARGV != 1 ){ die "specify a port to listen on " }
my %osdHash = ();
my $proto = ";
my $port = ";
my $sockAddr = ";
my $fullCmd = ";
|
次はサブルーチンです。まずは readOsdFile です。このファイルは、osdServer.configファイルを処理して必要なキーワードと表示の構成を検出するように設計されています。
リスト 5. readOsdFile サブルーチン
# readKeyWordFile reads type, keywords, (text/image) parameters
# text parameters:
# X coordinate, Y coordinate, red, green, blue, font size, fade In, fade Out
# image parameters:
# image filename, X coordinate, Y coordinate
# osdServer.confg format is: type _#_ keywords _#_ osd parameters
sub readOsdFile
{
open(OSDFILE,"osdServer.config") or die "no osdServer.config file: $!";
while(<OSDFILE>){
# ignore comment lines
if( !/^#/ ){
chomp($_);
my @arrLine = split "_#_";
$arrLine[0] =~ s/ //g;
$osdHash{ lc($arrLine[0]) }{ $arrLine[1] } = $arrLine[2];
}#if not a comment line
}#for each line in file
close(OSDFILE);
}#readOsdFile |
キーワードと表示パラメーターのハッシュが作成されたら、単純なキーワード・マッチング・サブルーチンmatchWords の話に移ります。
リスト 6. matchWords サブルーチン
sub matchWords
{
my $msgString = $_[0];
my $type = $_[1];
# for the type specified
for my $kwList ( keys %{ $osdHash{$type} } )
{
# for each word
for my $checkWord ( split " ", $kwList )
{
$checkWord =~ s/ //g;
if( $msgString =~ /$checkWord/i )
{
if( $type eq "text" )
{
$fullCmd .= qq{./text '$msgString' $osdHash{text}{$kwList} &};
}else
{
$fullCmd .= qq{./image -i $osdHash{image}{$kwList} &};
}
}#if matching word
}#for each check word
}#for each key word list
}#checkText
|
matchWords サブルーチンでは、osdServer.config ファイルに指定された語があるかどうかの単純な検査が行われます。次に、希望のオンスクリーン表示のタイプに基づいて、表示コマンドが作成されます。例えば、キーワードの一致が検出され、表示する画像が構成ファイルで指定されている場合は、Ghosd画像コマンドが作成されます。これでサブルーチンのセットアップができたので、次は短いメイン・プログラム・ロジックの説明に移ります。
リスト 7. osdServer.pl のメイン・プログラム・ロジック
readOsdFile();
$proto = getprotobyname('tcp');
socket(SERVER, PF_INET, SOCK_STREAM, $proto) or die "socket: $!\n";
$port = $ARGV[0];
$sockAddr = sockaddr_in($port, INADDR_ANY);
bind(SERVER, $sockAddr) or die "bind: $!\n";
listen(SERVER, SOMAXCONN) or die "listen: $!\n";
# listen forever
while( 1 )
{
my $acceptSock = accept(HANDLER, SERVER) or die "accept: $!\n";
my($acceptPort, $acceptIpAddr) = sockaddr_in($acceptSock);
autoflush HANDLER 1;
while(my $msgString = <HANDLER>)
{
chomp($msgString);
matchWords($msgString,"text");
matchWords($msgString,"image");
$fullCmd = `$fullCmd` unless $fullCmd eq ";
$fullCmd = ";
}#while handler
close HANDLER or die "close HANDLER: $!\n";
}#while forever
|
メイン・プログラム・ロジックの最初の部分では、キーワード・マッチングとパラメーターのハッシュをセットアップするためにreadOsdFile が呼び出されています。ソケットをリッスンする標準的なコードの後で、新しい接続をリッスンするためのメイン・ループが開始されます。接続が検出されるたびに、構成ファイルに指定されたすべてのテキストと画像タイプのキーワード・マッチング検査が行われます。一致するものが見つかった場合、コマンド全体が追加され、すべての表示イベントのコマンド全体が直ちに実行されます。このセットアップでは、単一のイベントに対してセットアップした画像とテキストの表示(例えば、新規 E メールのテキストと画像の表示) がまったく同時に行われます。
サーバー・コードが用意できたら、独自の構成ファイルを作成して、希望の方法でテキストを表示できます。参考のために、構成ファイルの例を次に示します。
リスト 8. osdServer.config ファイルの例
text _#_ email _#_ -250 -250 0.1 0.1 1.0 20 100 4300
text _#_ SYS _#_ -150 -150 0.1 1.0 0.1 30 100 4300
image _#_ SYS _#_ /usr/share/pixmaps/taskmanager.png -x -510 -y -510 |
osdServer.config ファイルのフォーマットは、「type _#_ keyword _#_ ghosdparameters」となっています。ここで、parameters は、最初のフィールドに指定されるtype によって決定されます。例えば、最初の行では、着信ストリングのどこかに「email」という語があれば、縦横-250、-250 の位置に 20 ポイントの赤い文字で 100 ミリ秒掛けてフェードインし、4秒を少し超えるとフェードアウトするメッセージを作成するように指定されています。imageから始まる行には、表示する画像とその座標、およびキーワード "SYS"が指定されています。このキーワードについては、プログラムを使用してログ・ファイルをモニターする方法の例で説明します。
リスト 9. osdClient.pl 実装
#!/usr/bin/perl -w
# osdClient.pl - send simple client text to server
use strict;
use IO::Socket::INET;
use POSIX qw(F_GETFL F_SETFL O_NONBLOCK);
my $sock = ";
if( $#ARGV != 2 ){ die "specify a ip, port, text string" }
eval
{
$sock = IO::Socket::INET->new(
PeerAddr => $ARGV[0],
PeerPort => $ARGV[1]) || die "can't set it up $!";
$sock->blocking(0)
};
if( $@ =~ /socket/i )
{
die "die in record retrieval socket setup with $@";
}
print $sock "$ARGV[2] \n";
|
この単純なコードの断片では、指定のポートで指定のサーバーとの接続をセットアップし、次に、渡されたテキストをサーバーにコマンド・ラインから送信しています。Perlのネットワーク機能については、多くの優れた書籍やハウツー本で詳細な説明があります。詳しくは、「参考文献」を参照してください。
このようなスクリプトを作成するとき (または、ソース・コード・リポジトリーからダウンロードするとき)、そのスクリプトは、確実にGhosd のサンプルと同じディレクトリー (通常は、ghosd-0.0.1/examples) に置いてください。
perl osdServer.pl 9090 というコマンドを使用して、osdServer.pl プログラムを開始します。この時点で、このサーバー・プログラムは、ポート9090 を絶えずリッスンし、ホストからの TCP 接続を待ちます。この記事で説明したサンプル構成を使用した場合、perlosdClient.pl 127.0.0.1 9090 "email test" というコマンドを使用すれば、表示セットアップを試すことができます。これを行うと、画面上に青い文字で"email test" というメッセージが表示されます。
これで準備が整いました。さらに高度な例を以下に示します。
xmms でトラックが変更されるときに必ず、現在演奏されている曲の名前を表示するには、次のようにします。まず、xmmsで Ctrl+P を押して、「Preferences」ダイアログを表示します。「general plug-ins」タブをクリックして、「SongChange」プラグインを有効にします。「configure」をクリックして、次の行を追加します。
/usr/bin/perl (fullpathTo_osdClient.pl) 127.0.0.1 9090 "%n xmms" |
これにより、現在の曲のタイトルがクライアントから osdServer.pl プログラムに自動的に送信されます。次の行をosdServer.config ファイルに追加して、xmms のイベントが正しく認識されるようにしなければなりません。
text _#_ xmms _#_ -150 -150 1.0 1.0 0.1 20 500 2300 |
システム・ログでイベントをモニターし、その通知を osdServer.pl プログラムに送信する、簡単なコードを次に示します。
tail -n0 -f /var/log/messages | \ perl -lane '$_=substr($_,30,50);$r=`perl osdClient.pl 127.0.0.1 9090 "$_ SYS"`' |
tail -n0 -f の部分は、ファイルの終わりへスキップして新規の更新を待つことを示しています。その際、このコードでは、ストリングがosdClient.pl プログラム経由で osdServer.pl プログラムに送信されます。osdClient.plプログラムは、ログ・ファイル項目の有意の先頭 50 バイトで構成されています。特定の内容に関係なく、すべてのシステム・メッセージについてキーワード・マッチングを行うには、osdServer.configファイルの例にある "SYS" が必要です。
これら 2 つの高度な例を使用してみて、Ghosd 対応のオンスクリーン表示のサーバーおよびクライアントをコンピューター環境に統合する方法をよく理解したことと思います。リモート・マシンでイベントをモニターしたい場合は、単にosdClient.pl プログラムをリモート・マシンにコピーして、127.0.0.1 の代わりにサーバーのIP アドレスを指定して実行するだけです。入力がリモート・マシン・ソースからのものである場合は、マッチングするストリングを指定してください。あるいは、特定のマシンに属する画像を指定して、メッセージの発行元のマシンを即時に認識することもできます。また、画像表示機能を使用して、ユーザーに対してのみ意味を持つカスタム・グラフィックス(画面を見ている他のユーザーには知らせずに、自分の E メールの到着を知らせるグラフィックス)を表示することもできます。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| SimpleView Template Plug-ine | os-ghosdPerlText01.zip | 3KB | HTTP |
学ぶために
-
Ghosd プログラムを作成したのは、Evan Martin です。
- Ghosd には、Cairo ライブラリーが必要です。
- Ghosd のコンパイルには、Pango も必要です。
- Linux Journal 誌は、Perl を使用してネットワーク・プログラミングを行うときに大いに役立ちます。
- developerWorks に関するすべてのオープン・ソース・コンテンツを参照してください。
- ソフトウェア開発者の関心をひくインタービューや討論を聴くには、developerWorksのポッドキャストを使用してください。
- developerWorks technical events and webcasts で最新情報を入手してください。
- コンファレンス、見本市、Web 放送など、世界各地で実施予定のイベントを確認してください。これらのイベントは、IBM オープン・ソース開発者にとって興味深いものとなります。
- developerWorks のオープン・ソース・ゾーンにアクセスして、豊富なハウツー情報、ツール、およびプロジェクトの更新を入手してください。これらは、オープン・ソース・テクノロジーを使用して開発を行ったり、そのテクノロジーをIBM 製品とともに使用したりするときに役立ちます。
- オープン・ソース・テクノロジーの豊富なリソースについては、Safari Books Online にアクセスしてください。
製品や技術を入手するために
-
IBM 試用版ソフトウェアを使用して最新のオープン・ソース開発プロジェクトを導入してください。試用版ソフトウェアはダウンロードすることもDVD から入手することもできます。
議論するために
-
developerWorks blogs に参加して、developerWorks のコミュニティーに加わってください。