2008年8月12日火曜日

Mac OS X で OpenGL プログラミング GLUT 編

レポートからの現実逃避を兼ねて,OpenGL を Mac OS X で使う方法について書いていこう♪といっても,Mac OS X には,最初から Open GL 関係のライブラリが入ってるので,何もインストールする必要はないんだよね.OpenGL でプログラムを組むときによく使われる GLUT も最初から入ってるし.ということで,GLUT 編と題して,Mac OS X での GLUT の使い方を説明する.

さて,さっそくサンプルとなるソースを書いてみる.ウィンドウを出すだけの簡単なソース.

#include <GLUT/glut.h>

void display(void);

int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutCreateWindow("Hello, world!");
glutDisplayFunc(display);
glutMainLoop();

return 0;
}

void display(void)
{
}


初期化,ウィンドウ生成,描画関数設定,イベントループってな処理手順だね.シンプルな GLUT を使ったプログラム.ただ注意してほしいのは,Mac OS X では,#include <GL/glut.h> ではなく #include <GLUT/glut.h> になっているとこ.逆に言えば,そこだけ注意すれば OK なんだよね.

で,コンパイル.今回は展開早いなぁ…….

$ cc -framework GLUT window.c


これだけwいやぁ単純.実行するとウィンドウが表示されると思う.(あと,メニューバーにいくつかのメニューが勝手に表示される.これについての詳細が不明なので,調べてわかったら書こうと思ってる.)

んー,簡単すぎるw参考文献にあげた中に,僕はまだちゃんと見てないんだけど,Mac OS X 上での GLUT のサンプルコードがあるから,それを見ればいろいろとわかるかも.(我ながら,適当だなぁ.)

参考文献:
GLUTによる「手抜き」OpenGL入門
The OpenGL Utility Toolkit (GLUT) Programming Interface API Version 3
Apple Developer Connection: GLUTBasics

追記(2008年9月29日):
参考文献のリンクミスを修正.間違って,GLUT のサンプルコードじゃなくて,GLUT ライブラリのコードにリンクしてたw

2008年8月10日日曜日

OpenMP 入門 #1

OpenMP やろうぜ!最近の CPU はマルチコアだから,「見せてもらおうか、Intel のデュアルコア CPU の性能とやらを」的なノリで始めてみた.大学の講義で,OpenMP と MPI を勉強する機会があったのが大きいけどねw

とりあえず,本家からリンクの張られている OpenMP Tutorial を読みつつ勉強してる.まあ,林檎生活的には,ソースコードとか載せつつ,僕が理解したことを書いていこうと思ってるのでよろしく.間違ってたら教えてね.

OpenMP に正式に対応したのは,4.2 あたりからだとのこと.僕の現在の環境 Mac OS X Leopard (10.5.4) では,GCC 4.0.1 と GCC 4.2.1 が入ってるみたいで,一応コンパイル環境は整っているみたい.GCC がインストールされているかどうかは,実際に次のようにコマンドを打ってみるとわかると思う.(ちなみに cc と gcc は,gcc-4.0 へのシンボリックリンクとなっている.)

$ gcc-4.0 --version
i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5484)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc-4.2 --version
i686-apple-darwin9-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5564)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$


対応するようになったのはわりと最近なので,新しいのを使えばいいことあるかなぁってことで,GCC 4.3.1 と GCC 4.4.0 20080801 をインストールしてみた.その比較とかもやっていけたらなぁと思ってる.インストールは,お約束の MacPorts で♪

$ sudo port -c install gcc43
.
.
.
$ sudo port -c install gcc44
.
.
.
$


時間がかなりかかるので注意.無理していれる必要はないと思う.バージョンはこんなかんじ.

$ gcc-mp-4.3 --version
gcc-mp-4.3 (GCC) 4.3.1
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc-mp-4.4 --version
gcc-mp-4.4 (GCC) 4.4.0 20080801 (experimental)
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$


さて,インストールして終わりってのもあれなので,上述のチュートリアルに出てくるプログラムをちょっと改造したものをコンパイルして実行してみよう.ソースはこんなかんじ.

#include <stdio.h>
#include <omp.h>

int main(void)
{
int nthreads;
int tid;

#pragma omp parallel private(tid)
{
tid = omp_get_thread_num();
printf("Hello World from thread = %d\n", tid);

if (tid == 0) {
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
}

return 0;
}


コンパイルはこう.-fopenmp をつけてコンパイルするのがポイント.

$ gcc-4.2 -fopenmp parallel_region.c


次のように実行すると,スレッドごとに自分のスレッド番号を表示し,最後にマスタースレッドだけがスレッド数を表示する.

$ ./a.out
Hello World from thread = 0
Hello World from thread = 1
Number of threads = 2
$


今回はここまで,なんか面白い例題を見つけて,このくらい性能があがりますよってやりたいなぁ.そして,8コアの Mac Pro が欲しくなるという流れになるというかんじでw

2008年8月8日金曜日

Mac OS X で GLib を使おう

最近,C 言語を使う機会がちょこちょこあったんだけど,リストとか自前で実装すんのが面倒で,適当なライブラリを探してたんだよね.それで,Mac OS X で GLib を使ってみようってことになったんだ.

GLib ってのは,The GTK+ Project で開発されているユーティリティライブラリ.UNIX を始め,Windows や OS/2,BeOS でも動くらしい.ライセンスは,LGPL になっている.

じゃ,早速インストール.MacPorts でサクッとね♪

$ sudo port -c install glib2


これで使えるようになった.GLib の動作確認とコンパイルの流れを確認するために,GLib のバージョン番号を表示するプログラムをつくってみた.ソースはこんなかんじ.

#include <stdio.h>
#include <glib.h>

int main(void)
{
printf("%u.%u.%u\n",
glib_major_version, glib_minor_version, glib_micro_version);

return 0;
}


コンパイル方法と実行結果はつぎのようなかんじ.ちゃんとバージョン番号が表示されただろうか.(pkg-config ってコマンドを使うことでコンパイルオプションを表示することができる.それをバッククォートで囲って,実行結果をコンパイルオプションとしてそのまま使ってるわけだ.)

$ cc `pkg-config --cflags --libs glib-2.0` version.c
$ ./a.out
2.16.4
$


詳しい使い方とかは,ドキュメントを見てね.詳しく説明できるほど GLib を理解していなくて,間違ったことを書くとあれなのでw

2008年8月4日月曜日

ML115 で Windows Vista 用 PC を作ろう♪

という妄想をしてみたら,次のような PC ができた.コンセプトは,Windows Vista がサクサク動いて,Devil May Cry 4 をガンガンやれる PC.(あくまで,僕の妄想なので,この構成で動かなかったとか文句言わないように.また,この構成だと動かないことを知っている人は教えてね.)

本体:ML115 ¥11,500(NTT-X Store)
CPU:Athlon 64 X2 5000+ Black Edition ¥8,862(クレバリー)
RAM:JM2GDDR2-8K ¥5,280(Amazon.co.jp)
DVD:AD-7200A-0B ¥3,748(クレバリー)
GPU:Inno3D Geforce 9600 GT OC ¥14,637(クレバリー)
SC:Sound Blaster 5.1 VX ¥1,888(クレバリー)

送料は全部無料になるように構成したので,占めて46,165円也♪僕の妄想によると,Vista のパフォーマンスのサブスコアは,全部5.0以上はいくはず.GPU は確実に5.9だと思うし,CPU も Over Clock で3.0GHzいくだろうから5.9,RAMも5.9いくのかな.HDDは謎だけど,5.0以上は行くんじゃない?

これはコストパフォーマンス高すぎだろ〜.ML115 安すぎなだけなんだけどさ.まあ,妄想が現実になると懐が非常に痛いのでやめておくけどねw

2008年8月2日土曜日

DNS の仕組み

DNS (Domain Name System) の仕組みを説明する.FreeBSD でサーバ構築するために知っておかないとならない知識なので.ちょっと自信がないけどw

DNS とは,DNS サーバ(ネームサーバ)と DNS クライアント(リゾルバ*)で構成される,ホストネームと IP アドレスを結びつけるための仕組みである.DNS は,www.example.com というホストネーム⁑をリゾルバがネームサーバに問い合わせ,192.0.2.1 という IP アドレスを取得するというように動作する.

このように,DNS の目的は非常に単純なのだ.テキストファイルに,ホストネームと対応する IP アドレスを書いておき,リゾルバからの DNS クエリ(問い合わせ)に応じて,そのテキストファイルを参照して IP アドレスを応答するだけでも目的は達成される.実際に,リゾルバはローカルに存在する hosts というテキストファイルを参照し,そこに問い合わせたいホストネームと IP アドレスの対応が書いてあれば,DNS サーバに問い合わずに,IP アドレスを取得する.

しかし,現実はそう単純ではない.ホストネームというのは星の数ほどあり,それに対応する IP アドレスすべてをテキストファイルに保持しておくのは現実的ではない.どこかで,変更があったら,すべての DNS サーバがその情報を同期することになってしまう.

したがって,DNS は分散してホストネームと IP アドレスの対応を保持するような仕組みになっているのだ.だから,DNS は複雑とか難しいとか言われている気もする…….

実際の DNS は,ドメインネームごとに特定の DNS サーバが,ホストネームと IP アドレスの対応を持つようになっている.たとえば,example.com というドメイン(領域)は,example.com のネームサーバが example.com を含むホストネーム(foo.example.com や bar.example.com など.)と IP アドレスの対応を保持するという具合だ.

なので,www.example.com の IP アドレスを知りたい!ってなったら,example.com のネームサーバに問い合わせればいい.しかし,example.com のネームサーバをどうやって知るのだろうか?これについては,次の図のような仕組みになっているのだ.ネームサーバとリゾルバの関係も一緒に理解しよう.



リゾルバは,自分のコンピュータで動いてるプログラムで,左側のネームサーバは,インターネットにつなぐときに設定したやつだ.普通は,プロバイダのネームサーバになっている.“” で表したのは,ルートだ.すべてのネームサーバは,ルートネームサーバを知っているので,まったくわからないホストネームについては,ルートネームサーバ⁂に問い合わせることになる.また,ドメインを遡って問い合わせることを再帰問い合わせという.

DNS の仕組みってこんなかんじ.ほかにも,負荷分散やセキュリティなどのための仕組みが DNS サーバに備わっているがそれについては,参考文献にあげた本を読んでねw

マスターとスレーブなどについては,BIND を使った DNS サーバの設定を説明するときに一緒にする予定♪

* ブラウザやメーラなどは,裏でこのプログラムを利用している.
⁑ 一般に,www.example.com を FQDN (Fully Qualified Domain Name) といい,www をローカルホストネームといい,example.com をドメインネームという.また,www.example.com と www のどちらもホストネームである.
⁂ 世界に13台ある.むしろ,13台しかない.そのうち1台は,日本にある.サーバの CPU は Athlon XP 1900+ だったりする.

参考文献:
Paul Albitz, Cricket Liu. 第4版 DNS & BIND, オライリー・ジャパン, 2002.

2008年8月1日金曜日

Scala 勉強会に行ってきた

札幌で開かれた Scala 勉強会に行ってきた.

Scala っていうのは,関数型かつオブジェクト指向なプログラミング言語.Java VM の上で動作する.Java のクラスを利用できたりして便利がよく,関数型の利点も使えるというもの.関数型からオブジェクト指向へアプローチすると,関数型の世界でオブジェクト指向できますよっていうかんじになるが,Scala の場合オブジェクト指向と関数型が融合しているかんじ.(僕の勝手な解釈だから怪しいな.)

詳しい話とかは,僕が解説できないので参考文献にあげたサイト(勉強会でプレゼンした方が記事を書いてるw)とか本家とかみてほしい.まあ,機会があったらこの Blog でもちょろっとやってみようかと思う.

Lift っていう Ruby on Rails みたいなフレームワークのモデルが斬新で気になったなぁ.

参考文献:
ITpro: 刺激を求める技術者に捧げるScala講座