ライプラリ - みる会図書館


検索対象: UNIX MAGAZINE 1999年8月号
33件見つかりました。

1. UNIX MAGAZINE 1999年8月号

CD-Recordable 図 22 ldd コマンドの実彳デ列 bash# ldd /sbin/restore 1ibext2fs . so . 2 = > /1ib/1ibext2fs . so . 2 ( 0X40003000 ) libcom—err. so. 2 = > /lib/libcom-err. so. 2 ( 0X40015000 ) 1ibe2p. so . 2 = > /1ib/1ibe2p. so. 2 ( 0X40017000 ) libc . so . 6 = > /lib/libc . so . 6 ( 0X4001C000 ) /lib/ld—linux. so . 2 = > /lib/ld—linux. so . 2 ( 0X00000000 ) bash# ロ すると、 dump や restore などのコマンドが /sbin に マニュアル類が /usr/man などにインストールされます。 さきほど述べたように、 Red Hat では 1.44MB のイ ンストール・フロッピーのイメージファイルしか提供さ れておらず、インストールに必要なコマンドやライプラリ はインストール CD から実行するようになっています。 /mnt/cdrom にインストール CD をマウントしていると すると、必要なファイルは /mnt/cdrom/RedHat 以下 にあります。 したがって、次のようにしてこれらを CD イメージ作 成時のルート・ディレクトリにコピーします 12 bash# cd /mnt/cdrom/RedHat bash# ls RPMS/ TRANS . TBL base/ i386 instimage/ bash# mkdir /cdr/root/RedHat 13 i386 は空のファイルですが、アーキテクチャの不軽頁を識号けるために 10 数 MB 程度です。 12 ちなみに、コピー後の /cdr/root/RedHat ディレクトリの容量は age/lib に揃っているので問題はありません。 になっていますが、必要とする共有ライプラリは instim- しておけば便利です。 restore のプログラムは重加勺リンク きはどインストールした restore コマンドはここにコピー ドのディレクトリはシェルの本鑠パスに含まれるので、さ リカバリー CD を利用してマシンを起重丿けると、コマン もコピーしないように気をつけてください。 400MB 弱の容量があります。間違えてこのディレクトリ ィレクトリにはバイナリ・パッケージが置かれていて、 age/lib にライプラリが収められています 13 。 RPMS デ レクトリです。 instimage/usr/bin にコマンド、 instim- base はインストール・プログラムの実行に必要なディ bash# 日 bash# cp —R base 土 386 instimage /cdr/root/RedHat 30 イ叫つれます。 ちなみに (FreeBSD もそうですが ) 、重加勺リンクされ たプログラムがどの共有ライプラリに依存しているのかは ldd コマンドを使えは簡単に分かります。実行ガ去は、引 数にプログラム・ファイルを指定するだけです ( 図 22 ) 。 ほかのコマンドを j 助日したい場合は、ます ldd て依存す るライプラリを調べます。これらのライプラリが instim ー age / lib にあるかどうかをチェックし、なければ / lib など にあるライプラリを /cdr/root/RedHat/instimage/lib にコピーすれはいいでしよう。もちろん、ソースファイル を入手して静的リンクされたプログラム・ファイルを作る のであれば、ライプラリを気にする必要はありません。 UNIX MAGAZINE 1999.8 14 、第 6 版 " などと呼はれることもあります。 これに対し、 dump はパーティション単位でバックアッ クに書き戻す際に苦労します。 カイプには言求されないので、アーカイプをハードディス やディレクトリがどのパーティションにあったかはアー をまるごとバックアップします。もちろん、どのファイル ディレクトリで tar などを実行すると、ファイルシステム 数のパーティションから構成される場合、叫屯にルート・ やディレクトリです。たとえば、ファイルシステムが複 dump 以、外のコマンドはバックアップの対象がファイル ックアップ・コマンドといえなくもありません。しかし、 ほかにも tar や cpio といったコマンドがあり、 cp もノ たんにファイルのバックアップをとるという意味なら、 dump コマンド ます。 で、 UNIX の伝糸勺なバックアッフ・プログラムといえ スされた UNIX のバージョン 614 から登場したコマンド dump と restore は 1975 年に AT&T によってリリー バックアッフ・ファイルの作成

2. UNIX MAGAZINE 1999年8月号

ストール・フロッピーのイメージファイルを用意するだけ イメージファイル (boot. img) は Red Hat のインス トール CD に含まれているので、図 16 のように実行し て /cdr/root にコピーします。 復旧時に必要なコマンドの準備 インストール・フロッピーかできたら、インストール・フ ロッピーに含まれていないコマンドを準備します。 Free- BSD では必要なコマンドをすべて含むインストール・フ ロッピーのイメージファイルが作成できたので、この作業 が必要なのは Slackware と Red Hat のみです。ただし、 FreeBSD の場合も、インストール・フロッピーのイメー ジファイル ( コ乂まらないコマンドについては同しようなテ SIackware の場合 クニックが使えます。 なお、ここではソースファイルからコンパイルします はいいので、ほかのエデイタでもかまいません。 の間題です。青知勺リンクでプログラムをコンパイルできれ elvis 、 nvi 、 vim などがありますが、どれを選ぶかは好み 介します。 SIackware に付属する vi 系のエデイタには である nvi というコマンドのインストールもあわせて紹 dump や restore コマンドとともに、ⅵ工デイタの亜種 がみつからない」というエラーになります。したがって、 まれていますが、 elvis を実行すると「必要なライプラリ メージファイルには el ⅵ S11 というテキストエデイタが含 さらに、 Slackware のインストール・フロッピーのイ を入手してコンパイルしなくてはなりません。 ようなバイナリ・パッケージがないので、ソースファイル にインストールできます。しかし、 SIackware にはこの Hat のパッケージ管理コマンドである rpm を使えは簡単 がバイナリ・パッケージとして提供されているので、 Red マンドカ鰾忝付されていません。 Red Hat ではこれら テムをバックアッフするための dump および restore コ Red Hat も同様ですが、 SIackware にはファイルシス 11 ⅵ工デイタのクローンてす。ⅵという名前でシンポリック・リンクが が、すべてのプログラム・ファイルを青勺リンク (static 張られています。 link) で作成します。 UNIX MAGAZINE 1999.8 ブータブル・リカバリー CD ① 基本的なシステム管理用のコマンドを除き、一イ勺なコ マンドやツールのプログラム・ファイルのほとんどは動 的リンク (dynamic link) になっています。重加勺リンク の場合は実行時に共有ライプラリをリンクして利用するた め、プログラム・ファイルのサイズを小さくできるメリッ トがあります。その反面、システム・クラッシュなどで共 有ライプラリカイ吏えなくなると、重加勺リンクされたコマン ドか実行できなくなってしまいます。また、自分でソース ファイルからコンパイルした場合はます起こりませんが、 FTP サイトなどからバイナリ・パッケージを入手してイン ストールした場合、共有ライプラリの名前か 1 司しでもバー ジョンが異なっていたりすると、やはり実行できません。 これに対し、ソースファイルを静的リンクとしてコン パイルすると、必要なライプラリをすべて含んたプログラ ム・ファイルが作られるので、共有ライプラリの有無や ライプラリのバージョンの違いに左右されません。もちろ ん、プログラム・ファイルのサイズは重加勺リンクの場合に くらべて大きくなりますが、フロッピーではなく CD-R であれば容量に注意しなくてもいいでしようから、緊急』芋 に使うコマンドは静的リンクにしておきます。 dump/restore のコン / ヾイノレ Slackware てオリ用できる dump および restore コマン ドは、 4.4BSD から移植されたソースアーカイプが FTP サイトで公開されています。必要なソースアーカイプは dump-(). 3. tar. gz と e2fsprogs-1.14. tar. gz で、月リ者は dump 、 restore コマンド本イ本のソースファイル、後者に は dump と restore か利用するライプラリのソースファ イルが含まれています。 ソースアーカイプの 1 朝己布元は、 ・ ftp://tsx-11.mit.edu/pub/linux/packages/ ext2fs/ です。国内では、 ・ ftp://ftp ・ iamas ・ ac ・ jp/pub9/Linux/packages/ ext2fs/ などの FTP サイトから入手できます。これらのファイル を取得し、 /var/tmp に置いたものと仮定してコンパイル 手順を説明します。 25

3. UNIX MAGAZINE 1999年8月号

図 1 OpenGL/GLUT による 8 本回転醯 (FreeBSD) ロ lglut の OpenGL 互換ライプラリを利用する必要があります。 FreeBSD では MESA も GLUT もノヾッケージになって いるため、 sysinstall コマンドで簡単にインストールでき ます。最新版も前述の URL で手に入ります。 # Makefi1e for MESA / X11 -I/usr/X11R6/inc1ude —L/usr/X11R6/1ib CFLAGS —IGL —lglut —IGLU ー 1X11 —1Xext —1Xi \ LIBS —1Xmu -lm glut : glut. 0 、 Vindows 95/NT の場合 Windows 95 / 98 / NT には、 Microsoft カ甘是供する OpenGL のランタイム・ライプラリ openg132. dll と長 ライプラリ g1u32. d Ⅱか最初から入っているので、そのま ま OpenGL アプリケーションを動かすことができます。 OpenGL 対応のグラフィックス・アクセラレータのなか には独自の openg132. dll をもつものがあり、それを使え ば OpenGL の実行は格段に高速化されます。 Visual C 十十などで OpenGL のプログラム開発をお こなう場合は、これらに加えてライプラリ定義ファイル openg132. lib と g1u32. lib 、およびヘッダファイルが必要 になります。これらは、 Microsoft の FTP サーバー 3 か らダウンロードできます。 Windows 用の GLUT は、 Nate Robins 氏の Web ページ 4 から入手できます。 3 ftp://ftp.microsoft.com/Softlib/MSLFILES/Openg195. 4 http://www.xmission ・ com/-nate/glut.html UNIX MAGAZINE 1999.8 インターフェイスの街角 図 2 OpenGL/GLUT による 8 面体回車云 (Windows) 言回ロ は H : \ 0 い岶 on 学 00 he \ 00 he & on. を x を 147 5 http://home.pacbell.net/atai/guitool/ しい一覧があります。このうち、 OpenGL カ硬えるもの トについては、 Li-Cheng (Andy) Tai 氏のページ 5 に詳 も利用できるものなどカ咄てきました。各種のツールキッ 表さオ蹊 OpenGL が使えるもの、あるいは Windows で UNIX の流行にともなって数多くの GUI 開発ツールが発 開発は一 - イ下火になっていました。しかし、匠のフリー ットカ甘昌されていました。その後、これらのシステムの UNIX 上の GUI ツールの開発も活発で、各種のツールキ X ウインドウ・システムの開発がさかんだったころは には不一ト分です。 されていないので、これらの高度な GUI 部品を利用する GLUT にはメニューやスライダなどの GUI 部品は用意 ウやマウスなどの処理ができるようになります。しかし、 GLUT を使えは、とりあえす OpenGL 上でウインド OpenGL 対応のツールキット したところです。 図 2 は、 Windows 95 上でリスト 3 のプログラムを動か は、リスト 3 のようなアプリケーションカイ乍成できます。 ネルで openg132. d Ⅱ、 g ⅲ 32. d Ⅱ、 glut32. dll を追加すれ 納します。そして、 Visual C 十十のプロジェクト設定パ gram Files*DevStudio*VC*include*gI など ) に格 *lib など ) とヘッダファイル用ディレクトリ (C:*Pro- ディレクトリ (C:*Program Files*DevStudio*VC ます、これらのファイルを VisuaIC 十十のライプラリ・

4. UNIX MAGAZINE 1999年8月号

0 リスト 3 回転する正 8 可本を描く GLUT プログラム / / glut ・ c / / 回転する正 8 面体をウインドウに描く GLUT プログラム g1Rotatef (rot , 1 . 0 , 1 . 0 , 1 . 0 ) ; gIPushMatrix ( ) ; g1C1ear (GL—COLOR_BUFFER_BIT) ; 0 . 0 ; static GLf10at rot void display(void) / / 回転させながら表示 #include く GL/gIut . > rot 十 = 4 . 0 ; ohdraw ( ) ; g1PopMatrix ( ) ; g1F1ush() ; g1utSwapBuffers ( ) ; void reshape (int , int h) ohreshape ( (h) ; void keyboard(unsigned char key , if (key Ox1b) exit ( 0 ) ; void idle(void) g1utPostRedisp1ay ( ) ; int main (int argc , char** argv) glutlnit(&argc,argv) ; g1utInitDisp1ayMode (GLUT-DOUBLE ー GLUT—RGB) ; g1utInitWindowSize ( 300 , 300 ) ; g1utInitWindowPosition( 100 , 100 ) ; g1utCreateWindow (argv [ 0 ] ) ; ohinit() ; g1utDisp1ayFunc (display) ; g1utReshapeFunc (reshape) ; g1utKeyboardFunc (keyboard) ; g1utId1eFunc (idle) ; g1utMainLoop ( ) ; return 0 ; int X , int y) 表 1 GLUT のおもな関数 glutlnit() glutInitWindowSize() gIutInitWindowPosition glutInitDisplayMode() glutCreateWindow() glutDisplayFunc() glutReshapeFunc() glutKeyboardFunc() glutIdIeFunc() glutMainLoop() glutSwapBuffers() glutPostRedisplay() ネ川月化 無入力時のコーノレヾック関数の定義 キーポード入力用コーノレヾック関数の定義 ウインドウサイス変 ) コールバック関数の定義 表小用コールバック関数の定義 ウインドウの生成 表示モードげプノレヾッフアを使うカ驕かなど ) の設定 ウインドウの位置設定 ウインドウの大きさの設定 タンフレヾッフアの切替え メインループ さきはど説明したように、 OpenGL はもともとは 3 次 元表示のためのライプラリですが、 2 次元表示しか扱わな いプログラムでも、共通のソースコードを使えるという特 徴を活かしてクロス・プラットホームでの GUI 開発に利 用できます。 各種システムでのコンバイル例 SGI のシステムの場合 GL ライプラリは SGI のワークステーションには標準 で付属しているので、 GLUT ライプラリを追加インスト 146 ールすればリスト 3 のプログラムを動かすことができま す。 GLUT は、前述の URL から入手できます。 # Makefi1e for SGI / X11 CFLAGS —XcpIuscomm —lglut -IGLU —IGL —1Xmu -1Xi ー 1X11 LIBS glut : glut . 0 FreeBSD/X11 と MESA を使う場合 FreeBSD などで OpenGL/GLUT のプログラムを開 発する場合は、 GLUT ライプラリのほかに MESA など UNIX MAGAZINE 1999.8

5. UNIX MAGAZINE 1999年8月号

0 CD-Recordable 図 17 configure の実行 (Slackware) bash# cd e2fsprogs-1.14 bash# 1s COPYING ChangeLog I NSTALL Makefi1e . in README RELEASE-NOTES INSTALL . dllbin SHLIBS INSTALL. elfbin config ・ guess MCONFIG . in config. sub configure configure. in contrib debugf s depfix. sed do c e2fsck e2fsprogs . Ism e2fsprogs ・ spec inc lude install—sh install—utils lib mlsc mkinstalldirs tests uti1 ve て S10 Ⅱ . bash# mkdir build bash# cd build . /configure bash# creating cache . /config ・ cache Generating configuration file for e2fsprogs version 1 . 14 creating tests/progs/Makefi1e ( 略 ) Disab1ing DLL shared libraries by default LD defaults tO cc CC defaults to cc checking host system type. i586—pc—IinuxIibcI ReIease date is January, 1999 creating doc/Makefi1e bash# bash# cd /var/tmp bash# tar zxf dump-0.3. tar 1. ソースアーカイプの展開 それぞれのソースアーカイプに対して tar を実行し、 /var/tmp ディレクトリにソースファイルを展開しま す。 26 を実行すると、ライプラリも含めたソースファイル本 MakefiIe か生成されたら、同しディレクトリで rnake ます。 あるので、図 17 のように実行して Makefile を生成し ディレクトリを作ってそこで c 。 nfigure を実行しろ」と ンストール・マニュアル (INSTALL) を読むと、「 build OS に合わせた MakefiIe が自重加勺に生成されます。イ トリの直下にある configure スクリプトを実行すると、 toconf が使われているので、 e2fsprogs-1.14 ディレク e2fsprogs-1.14 のソースノ、ツケージには GNU の au- 2. ライプラリのコンノヾイル いるはすです。 成さオ L 、その下にそれぞれのソースファイルか置かれて dump-(). 3 と e2fsprogs-1.14 というディレクトリが作 bash# ロ bash# tar zxf e2fsprogs—1.14. tar ・ gz がコンパイルされます ( 図 18 ) 。 さらに、作成されたライプラリが正しく機能するかをチ ェックするため、図 19 のように make check を実行 します。失敗した項目がなけれは作業は完了てす。 make install を実行するとライプラリなどがインスト ールされますが、今回は dump と restore のコンパイ ルに利用できればいいので、インストールはせすに次の ステップに進みます。 3. dump と restore のコン / ヾイノレ dump-(). 3 のソースノヾッケージも、基本的には make を実行するだけですが、 e2fsprogs-1.14 で作成したラ イプラリの場所を指定するとともに、青弸勺リンクとして コンパイルするよう設定する必要があります。 dump-0.3 のコンパイルとインストールに必要な情報 は MCONFIG というファイルてオ旨定します。 dump および rest 。 re のプログラム・ファイルを青勺リンク にするには、 STATIC-LINK-DUMP および STAT- IC-LINK-RESTORE という / ヾラメータのイ直を YES に設定します。デフォルトの MCONFIG ファイル ではこれらのパラメータはコメントアウトされているの で、ます該当部分のコメント記号 ( # ) を削除します。 #STATIC_LINK_DUMP= YES UNIX MAGAZINE 1999.8

6. UNIX MAGAZINE 1999年8月号

イ ン タ フ ェ イ ス の 街 角 OpenGL によるクロス・プラットホームの GUI 開発 増井俊之■ ・丘は、 UNIX システムと Windows や Macintosh とを状況に応して使い分ける機会か増えてきたように思い ます。会社では UNIX ワークステーションを使い、社 外では Windows のノート PC を使っている人も多い のではないでしようか。私の場合、会社では SGI (Sili- con Graphics lnc. ) のワークステーションを使っていま すが、社外でのデモなどでは Windows の PC しか利用 できないことがよくあります。自宅にワークステーション を置いているわけではないので、新しい GUI を開発しよ うとする場合など、 UNIX や Windows などで共通に使 える GUI ツールが欲しいといつも思っています。 144 GL と OpenGL 能をすべて含んでいます。 ど、 3 次兀処理を扱うアプリケーションの作成に必要な機 ディン久見変換、隠面消去、入力 / ウインドウ処理な に使われる 3 次兀表示ライプラリで、図牙豸苗画やシェー の代表的なメーカーです。 GL は SGI のシステムで共通 SGI は、 3 次元グラフィックス・ワークステーション くインターフェイス開発環竟を紹介します。 今回は、異なる環竟で共通に使える OpenGL にもとづ 開発されています。 イダなどの GUI をサポートするツールキットもいろいろ 在は、さまざまなシステム上で実装さメニューやスラ 数のプラットホームてイ吏えるように拡張したものです。現 と SGI カ鯛発した 3 次元表示 / 操作ライプラリ GL を複 OpenGL を好んで使っています。 OpenGL は、もとも とすぐに Java か思い浮かびますが、私自身はこのところ さまざまなプラットホームで共通に使えるツールという リスト 1 GL によるプログラム」 / * GL sample program * / #include く gl / gl. h> main() prefposition(O,200,0, 100 ) ; winopen( "GL Examp1e" ) ; RGBmode ( ) ; gconfig() ; RGBc010r(O,0, 100 ) ; clear() ; cmov2i ( 40 , 45 ) ; RGBc010r ( 255 , 255 , 255 ) ; charstr("He110, Wor1d! " ) ; GL Exam p le s1eep(10) ; UNIX MAGAZINE 1999.8 ものを取り除き、各種のシステムで共通して使えるライプ イプラリからウインドウや入力処理など処理系に依存する ンと一緒に使えるように拡張されました。現在は、 GL ラ ンドウ・システムと統合され、通常の X アプリケーショ ンドウ・システムて動くライプラリでした。その後、 X ウィ GL は、もともとは SGI のワークステーション上のウィ テキストを描画しています。 新しいウインドウを winopen() で作成し、 charstr() で 1 に示します。 prefposition() で場所と大きさを指定した GL を用いた簡単なプログラムの例と実行結果をリスト He 1 10 , Wo r 1 d !

7. UNIX MAGAZINE 1999年8月号

インターフェイスの街角 リスト 2 正 8 面体を描く OpenGL プログラム g1C010r3f ( 0.0 , 1 . 0 , 1 ・ 0 ) ; / / octahedron. c / / OpenGL による正 8 面体描画 #include く GL/g1ut . h> void ohinit(void) / / 初期化 g1C1earC010r ( 0.0 , 0.0 , 0.4 , 0.0 ) ; g1FrontFace (GL-CW) ; g1Enab1e (GL—CULL-FACE) ; g1Cu11Face (GL—BACK) ; void ohreshape (int w, int h) / / 再描画時 g1Vievport(O,O,(GLsizei)w,(GLsizei)h) ; g1MatrixMode (GL-PROJECTION) ; g1LoadIdentity() ; g1uOrth02D ( ー 1 . 2 , 1 . 2 , ー 1 . 2 , 1 . 2 ) ; gIMatrixMode (GL—MODELVIEW) ; void ohdraw (void) / / 正 8 面体描画 g1Begin(GL_TRIANGLE—FAN) ; g1End() ; g1Begin(GL_TRIANGLE -FAN) ; g1C010r3f ( 1.0 , 0.0 , 0.0 ) ; g1Vertex3f ( 1.0 , 0.0 , 0.0 ) ; g1C010r3f ( 1.0 , 0.0 , 1.0 ) ; g1Vertex3f ( 0.0 , ー 1.0 , 0.0 ) ; g1C010r3f ( 0.0 , 1.0 , 1.0 ) ; g1Vertex3f ( ー 1.0 , 0.0 , 0.0 ) ; g1C010r3f ( 0.0 , 1.0 , 0.0 ) ; g1Vertex3f ( 0.0 , 1.0 , 0.0 ) ; g1C010r3f ( 1 . 0 , 0.0 , 0.0 ) ; g1Vertex3f ( 1 . 0 , 0.0 , 0.0 ) ; g1C010 て 3f ( 0.0 , 0.0 , 1.0 ) ; g1Vertex3f ( 0.0 , 0.0 , 1.0 ) ; g1Ve て tex3f ( 1 . 0 , 0 . 0 , 0.0 ) ; g1Ve て tex3f ( 0.0 , 1 .0 , 0.0 ) ; g1Vertex3f ( ー 1 . 0 , 0.0 , 0.0 ) ; g1Vertex3f ( 0.0 , ー 1.0 , 0.0 ) ; 0.0 ) ; g1Vertex3f ( 1 . 0 , 0.0 , 0.0 ) ; g1Vertex3f ( 0.0 , 0.0 , ー 1 . 0 ) ; g1End() ; g1C010r3f ( 1 .0 , 0.0 , g1C010r3f ( 0.0 , 1 . 0 , 0. g1C010r3f ( 1 . 0 , 0.0 , g1C010r3f ( 1 . 0 , 0.0 , g1C010r3f ( 1 . 0 , 1 . 0 , 0 ) ; 0 ) ; 1 . 0 ) ; 0 . 0 ) ; 0 . ラリを規格化した OpenGL が 3 次元表示ライプラリの 標準として普及しています。 OpenGL は、 Windows 95 や Windows NT では Microsoft の孑是供するライプラリ によって利用できますし、 X 上でもフリーな互換ライプラ リ MESAI を介して使えます。 リスト 2 は、正 8 面体を描く OpenGL プログラムで す。、 gl" で始まるのが OpenGL の基本関数、、、 glu" で 始まるのか拡張関数です。 GL では、ウインドウ操作関数 や描画関数などがすべて同様に扱われていました。一方、 OpenGL で定義されている関数は描画部分だけで、ウィ ンドウを開いたりューザーの操作を検知したりといったシ ステムに依存する部分はシステムごとに異なります。 GLUT 複数のプラットホームで共通して使えるようにするた め、 OpenGL の標準化は描画ライプラリに焦点カ駮られ ています。たとえばリスト 1 にある win 。 pen ( ) のような 関数は OpenGL では定義されていません。このためウィ ンドウの操作や入力イベント処理などの機能については、 ウインドウ・システムごとに異なる関数を呼ぶ必があり ます。しかし、これでは不便なので、各種システムで共通 に使えるウインドウ / イベント操作ライプラリ GLUT2 が 1 FreeBSD や Linux ではパッケージとして酉 i されていて、インストー ルもごく簡単てす (http://www.mesa3d ・ org/)o 2 http://reality.sgi ・ com/mjk-asd/glut3/glut3.html UNIX MAGAZINE 1999.8 開発されました。 OpenGL と GLUT を併用すれば、 SGI Windows 95/NT のいすれでも、ソースをまったく変更 FreeBSD などの UNIX システムと MESA との組合せ、 リスト 3 のプログラムは、 SGI のワークステーション、 出されます。 る GLUT のメインルーチン glutMainLoop() から呼び はれるコーノレヾック関数を定義するもので、最後に呼ばれ のうち、 glut... Func() は、イベントが発生したときに呼 GLUT のおもな関数を表 1 に示します。これらの関数 glutKeyboardFunc() などて定義されています。 に呼はれるコーノレヾック関数が glutReshapeFunc() や ンドウの大きさか変わったりキーポード入力があったとき GLUT のメインルーチンは glutMainLoop() で、ウィ て始まるのが GLUT の関数です。 ています。、、 gl " て始まるのが OpenGL の関数、、 glut" めの関数のはかに、 GLUT のライプラリを用いて実現し す。そこで、リスト 2 で使っている正 8 面体を表示するた インドウを開いたり入力イベントを取得する必がありま に表示したり、ユーサーからク巣作を可能にするには、ウ GLUT プログラム刎列です。ウインドウ・システムの画面 リスト 3 は、回転する正 8 面体を表示する OpenGL/ 利用して開発を進めることか可能になります。 テムや Windows などでもまったく同しソースコードを のシステムだけでなく、 X カリ用できる重 UNIX シス せずにコンパイル、実行できます。 145

8. UNIX MAGAZINE 1999年8月号

連載 / IJN Ⅸ知恵袋ー① 図 8 XPG4 版 Hello World プログラム #include く stdio . h> #include く nl—types . h> XPG4 にも msgfmt と様のオ幾能をもつ gencat コマ ンドがあります。 gencat コマンドはメッセージカタログ・ ソースからメッセージ・カタログを生成します。 XPG4 を利用するためには、 XPG4 ライプラリが必 要です。現在、はとんどのシステムが XPG4 ライプラリ を提供しているので、標準て利用できる竟も多いでしょ う。 FreeBSD などではヘッダファイルが /usr/include/ nl-types. h に、ライプラリが /usr/lib/libxpg4. a にあり ます。なお、ライプラリが libc. a に含まれているシステ int main(int argc , char** argv) { nl_catd catd; catd = catopen( "helloworld" , NL—CAT-LOCALE) ; printf (catgets(catd, 1 , 1 , " He110 WorId! \ Ⅱ " ) ) ; catclose(catd) ; ・メッセージ・カタログの作成 ・メッセージカタログ・ソースの作成 ・プログラムの XPG4 対応 libintl を使う場合とほは 1 司しです。 図 2 を XPG4 を使って国際化してみましよう。手順は XPG4 を使う ムもあります。 UNIX MAGAZINE 1999.8 ています。 用する関数も、名前こそ違いますが似たような機能を備え XPG4 も libintl も、機育顎勺にははとんど同しです。利 XPG4 版 Hello World 場合、最後の、、一ⅸ pg4 " は不要です。 catgets() など、 XPG4 の関委羊が libc. a に含まれる $ gcc ー 0 helloworld helloworld. c —1xpg4 きます。 XPG4 版 Hello World は以下の手順でコンパイルで 示します ( ェラー処理は省いてあります ) 。 図 8 に XPG4 版 Hello World プログラムのソースを XPG4 では、前述したように catopen() 、 catgets() 、 catclose() という 3 つの関数を使います。それぞれの引 数と説明を表 4 に示します。 catopen() は bindtextdomain() に相当します。引 数 c 観襯四一 7 田 me で指定したメッセージ・カタログを開 き、メッセージ・カタログのカタログ記述子を取得しま す。それ以後は、メッセージ・カタログへのアクセスは すべて catopen() で得られたメッセージ・カタログ記 述子をとおしておこないます。 bindtextdomain() には メッセージカタログ・ディレクトリの指定がありました が、 catopen() にはありません。ディレクトリは環境変 数 NLSPATH で指定します。たとえは、 /usr/local/ share/locale/ja-JP. EUC/LC-MESSAGS の下にメッ セージ・カタログを置きたい場合は、 NLSPATH を次の ように指定します。 /usr/10ca1/share/10ca1e/ja—JP. EUC/• LC_MESSAGES/%N 127 制御命令と数字で始まるメッセージ定義部からなります。 XPG4 のメッセージカタログ・ソースは、 $ て始まる ます。メッセージカタログ・ソースの例を図 9 に示します。 グ・ソースを gencat コマンドて処理することで生成され XPG4 のメッセージ・カタログは、メッセージカタロ XPG4 メッセージカタログ・ソース catclose() はメッセージ・カタロ外当子を閉します。 り当てることができます。 ので、同しメッセージ識別子を異なるメッセージ集合に割 各メッセージ集合ごとにメッセージ識別子は独立している にいくつかのメッセージの集まりをもっことができます。 セージ集合を使うと、 1 つのメッセージ・カタログのなか タログにはメッセージ集合という考え方があります。メッ て指定した文字列が返されます。 XPG4 のメッセージ・カ 取り出します。対応する文字列がみつからないと、虎 ? 襯 catgets() はメッセージ・カタログから各国語文字列を LOCALE を指定します。 性を保つ場合は 0 を、その必要がない場合は NL-CAT- open() の第 2 引数はフラグク旨定です。 XPG3 との互換 ッシュ ) か含まれる場合は竟変数を参照しません。 cat- / ( スラ 置き換えられます。ただし、 catalog-name に NLSPATH 中の、、 % N " は catopen() の第 1 引数で

9. UNIX MAGAZINE 1999年8月号

連載 / UN Ⅸ知恵袋ー① 表 1 gettext パッケージかインストールするファイル gettext xgettext msgfmt msgunfmt msgcmp msgmerge libintl.h libintl.a 文字列取得コマンド メッセージカタログ・ソース芻豐生成コマンド メッセージ・カタロク生成コマンド メッセージ・カタログからメッセージカタロ グ・ソースへの変換コマンド メッセージカタログ・ソースの上は交コマンド メッセージカタログ・ソース統合コマンド ライプラリへッダ プログラム用ライプラリ 目を集めている GNOME2 や KDE3 などの統合工鼬竟でも gettext がイ目されています。 プログラムの作成にはさまざまな牛がからんでくると 田います。自分の牛に合った方法を選んでください。 gettext UNIX MAGAZINE 1999.8 3 http://www.kde.org/ 2 http://www.gnome ・ org/ ってみましよう。国ヒの手順は以ドのようになります。 intl を使って国際化メッセージを表示するプログラムを作 「案するより産むが易し」という言葉に従い、実際に lib- libintl を使う と書いた場合はコマンド名を表すことにします。 化メッセージの十咎目みを libintl と呼び、たんに gettext を避けるため、以降では gettext パッケージを使った国際 すコマンド名は、パッケージ名と同し gettext です。混乱 メッセージ・カタログから各国語のメッセージを取り出 リンクするライプラリです。 使ったプログラムを書くときに読み込むヘッダファイルと 用します。 libintl. h と libintl.a は、国ヒメッセージを す。各国語用のメッセージ・カタログを作成するときに利 ジ・カタログを操作するためのコマンドライン・ツールで msgfmt 、 msgunfmt 、 msgcmp 、 msgmerge はメッセー ンストールされます。これらのうち、 gettext 、 xgettext 、 gettext をインストールすると表 1 に示すファイルがイ できるでしよう。 る自動設定をサポートしているので、簡単にインストール 引斤バージョンは 0.10 です。 configure スクリフトによ イプラリです。 GNU の FTP サイトから入手できます。 gettext は GNU による国際化メッセージサポート・ラ 図 2 国際化していない HeIIo World プログラム #include く stdio . h> ・プログラムソースの libintl 対応 ・メッセージカタログ・ソースの作成 ・メッセージ・カタログの作成 今回、例としてとりあげるプログラムは、世界的に有名 な、、 He Ⅱ 0 WorId" です。 ます、国際化を考えない HeIIo WorId を図 2 に示し ます。このフログラムは次のようにしてコンパイルできま す。 $ gcc ー 0 helloworld helloworld. c このフログラムの出力メッセージを libintl を使って国 際化するには、プログラムを図 3 のように書き換えます。 プログラムの変更はこれだけです。図 3 は libintl を使 うので、リンクオプションを追加してコンパイルします ( 誌面の都合ーヒて折り返しています。以ー科司様 ) 。 $ gcc ー 0 helloworld —l/usr/local/include - —L/usr/Ioca1/1ib helloworld . c —lintl libintl.h や libintl.a が /usr/local 以外の場所にイン ストールされている場合は、コンパイラのスイッチを適切 な値に変史します。 あとは、メッセージ・カタログを用意すれは国際化さ れた HeIIo World の完成です。なお、メッセージ・カ タログを作らないまま実行すると、メッセージ識別子その ものが出力されます。つまり、とりあえす libintl を使っ てコーディングし、英語阪のプログラムとして動かしてお き、あとでメッセージ・カタログを追加すれは順次各国語 int main(int argc , char** argv) { printf ( " He110 Wor1d! \ Ⅱ " ) ; 図 3 libintl 版 HeIIo WorId プログラム #include く stdio . h> #include く libintl . h> int main(int argc , char** argv) { bindtextdomain ( "helloworld" "/usr/local/share/locale") ; textdomain("helloworld") ; printf (gettext("He110 Wor1d! \n") ) ; に対応させることができるのです。 123

10. UNIX MAGAZINE 1999年8月号

連載 / UN Ⅸ知恵袋ー① 図 1 国際化メッセージ取彳士組み メッセージ・テータヘース 本 日 ドイツ語 択 選 の 五ロ cp cp cp 2. メッセーシ・カタログの選択 合計 バイト所有者 3. メッセージの選択 total bytes owne r たとえは、 ls コマンドのメッセージを集めたメッセージ・ printf(catgets(cat—id, 1 , 1 , " He110 WorId! " ) ) ; カタロ久 cp コマンドのメッセージを集めたメッセージ・ cat-id は nl-catd 型の変数です。メッセージ・カタ カタログなどです。ふつう、 1 つのプログラムに対して 1 ログにアクセスするためのファイル記述子と考えてくださ つのメッセージ・カタログを作成します。もちろん、複数 い。 nl-catd は nl-types. h で定義されます。 のフログラムのメッセージを集めたメッセージ・カタログ 続く 2 つの数字は、カタログ内でのメッセージ集合識別 を作っても間題はありません。メッセージ・カタログのな 子とメッセージ識別子です。 catgets の場合、 1 つのメッ かには、各メッセージにヌ寸応するメッセージ識別子と、実 セージ・カタログのなかで複数のメッセージ集合を作るこ 際のメッセージが対になってオ内されています。 とができます。メッセージ集合識別子は、 1 つのメッセー ポイントは、メッセージ・カタログ名とメッセージ識別 ジ・カタログ内で重複しないように割り付けなけ川まなり 子です。これら 2 つの情報は、言語によらず固定の値をも ません。次のメッセージ識別子は、メッセージ集合のなか ちます。プログラムは、現在〕尺されている言語か何かを て特定のメッセージを指定するためのものです。 gettext 考えすとも、メッセージ・カタログとメッセージ識別 - 子さ では文字列でしたが、 catgets では数値になります。 え指定すれば、適切な言言 ) メッセージを取得できるので 最後の文字列はカタログに対応する文字列がなかったと す。また、メッセージ・カタログが分離されているため、 きのデフォルトの文字列です。したがって上の例は、「メッ 他の言語を追加サポートするのも容易です。 セージ集合 1 に含まれるメッセージ識別子 1 に対応する gettext と catgets の技ヤ勺な違いは、メッセージ識別 各国言 ) 文字列を、それがない場合は、 HeIIo WorId!" を 子窈旨定方法です。 gettext ではメッセージ識別イ・に英語 表小する」という意味になります。 文字列を使うのに対して、 catgets では数値を使います。 個人的には、 gettext のはうカワ。ログラマーからみて使 具ー勺なコード例をみてみましよう。 gettext の場合は次 いやすいように思います。しかし、コードをイ崧第する立場 のようになります。 としては、今後標準になっていく手法を用いたいと思うで printf (gettext ( " He110 WorId! " ) ) ; しよう。占鄲点では、どちらも標準になっていません。た だし、 catgets は XPG4 ライプラリの一部に含まれてお gettext() 関数は、引数として渡された文字列をメッセ り、現在多くのべンダーが XPG4 ライプラリを提供して ージ識別 - 子として、対応する各国語の文字列へのポインタ います。これに対して、 gettext を採用している商用べン を返します。対応する文字列か存在しない場合は、メッセ ダーは Sun のみであり、あまり普及しているとはいえま ージ識別子自体へのポインタを返します。よって、この せん。しかし、 gettext はメッセージの国際化に関する 例は「メッセージ識別子、、 He World!" に対応する国 機能だけを集めた小さなライプラリであり、プログラムと 際化メッセージ文字列を、それが存在しなけれは、、 HeIIo ともに簡単に配布することができます 1 。さらに、山も匠注、 W 。 rld ! " を表小する」プログラムになります。 catgets を使う場合は次のようになります。 1 ただし、 GPL2 の条件を守る必喫があります。 122 UNIX MAGAZINE 1999.8