2006-09-05
目次
「Wonderful Server Life」 第17回 田畑 英和
■ 〜DNS編〜
今後はディレクトリサービスを中心に解説を行っていく予定ですが、まずはディレクトリサービスを正常に動作させるために必要な、DNSサービスについて解説します。DNSを利用することによりhttp://server.example.comのような名前を使ってInternet上でサーバを公開できます。このとき名前を管理するためのInternet上でアクセス可能なDNSサーバが必要になりますが、ディレクトリサービスを稼働させるために、LAN上でのみ使用するような限定的なDNSサーバを構築することもできます。
◇DNSとは?
さて、そもそもDNSとはなんなのでしょうか? まずは基本的なところから解説していきましょう。例えば、MOSAのWebサイトにアクセスするときには次のようなURLを指定します。
・MOSA WebサイトのURL
http://www.mosa.gr.jp
このときURLで指定した”www.mosa.gr.jp”という名前ですが、コンピュータ同士で通信をするときには名前を使って通信するわけではなく、IPアドレスを使って通信先を指定します。ですが、IPアドレスのような数字の羅列では人間が扱いにくいので、IPアドレスに対応させる形で名前を使用できるようになっています。つまりIPアドレスと名前の対応関係をどこかで管理する必要がでてくるわけですが、この対応関係を管理する仕組みがDNSなのです。
では、”www.mosa.gr.jp”に対応するIPアドレスを実際に調べてみましょう。Mac OS X上でDNSの対応関係を調べるには「ネットワークユーティリティ」が使えます。このツールは「/アプリケーション/ユーティリティ」にインストールされています。「ネットワークユーティリティ」を起動して「Lookup」画面で対応するIPアドレスを調べたい名前を入力します。すると以下のような結果が帰ってきます。
・Lookupの結果(一部抜粋)
;; ANSWER SECTION:
www.mosa.gr.jp. 86400 IN A 211.9.201.59
この検索結果から”www.mosa.gr.jp”に対応するIPアドレスは”211.9.201.59″ということが分かります。このように名前で問い合わせて、対応するIPアドレスを解決してくれるのがDNSサーバの役割になります。WebブラウザにURLを入力してWebサーバにアクセスするときには、このDNSの仕組みを利用して内部で自動的に名前をIPアドレスに変換しています。
名前からIPアドレスを解決することを「正引き」とよんでいますが、逆にIPアドレスから名前を解決することもできまして、こちらのことを「逆引き」とよんでいます。
◇「サーバ管理」の起動
では、DNSをMac OS X Server上で稼働させる方法を解説します。DNSサービスを設定するには「サーバ管理」を使用します。このツールは「/アプリケーション/ツール」にインストールされていますし、Mac OS X Serverであれば最初からDockに入っています。
「サーバ管理」を起動しますと、まず接続先を入力するシートが表示されます。ここでは接続先のサーバのアドレスと、管理権限をもったサーバ上のユーザのユーザ名とパスワードを入力します。アドレスの指定はなるべくDNSで管理している名前(例:server.example.com)を入力するのがよいのですが、そもそもこれから設定するDNSサーバで名前を管理するのでまだDNSに登録されていないといった場合には、とりあえず”server.local”のような形式のローカルホスト名やIPアドレスを入力して接続することもできます。
このような「サーバ管理」からサーバに接続するという操作は、サーバ機上で直接「サーバ管理」を起動した場合でも必要になります。ネットワーク上の別マシンから接続した場合にはリモートでの管理が可能になります。
・「サーバ管理」で接続先を指定
http://homepage.mac.com/htabata/MXS10.3/img/ServerAdmin/Admin_01.png
◇DNSの設定
「サーバ管理」でサーバに接続したら、次に左側の「コンピュータとサービス」リストから「DNS」を選択します。「概要」ではDNSサービスの動作状況を確認できます。
・「DNS」の「概要」
http://homepage.mac.com/htabata/MXS10.3/img/DNS/DNS_01.png
DNSの設定を行うには画面の下に並んでいるボタンから右端の「設定」をクリックします。するとまず「一般」が表示されます。ここではDNSサービスの基本的な設定ができますが、もし検証などの目的でInternetに接続できない環境でサーバを使用している場合には「再帰」のチェックを外しておきます。
「再帰」のチェックが入った状態ですと、DNSサーバは自分自身で解決できなかった問い合わせをInternet上の別のDNSサーバに問い合わせにいきます。ですので、Internetに接続できない環境では「再帰」にチェックがかかっていますとタイムアウト待ちでシステムの動作が遅くなる場合があります。
DNSでは名前とIPアドレスの対応関係を、ゾーンという単位で管理します。ゾーンの設定を行うには、DNSの設定画面で「ゾーン」をクリックしますが、ゾーンの設定につきましては次回解説したいと思います。
・「DNS」>「設定」>「一般」
http://homepage.mac.com/htabata/MXS10.3/img/DNS/DNS_02.png
・「DNS」>「設定」>「ゾーン」
http://homepage.mac.com/htabata/MXS10.3/img/DNS/DNS_03.png
DNSの仕組みにつきましては今回、最小限の基本的な部分しか解説しませんでしたが、より詳しい情報につきましてはDNSの解説書などを参照することをお勧めします。
・DNSの定番解説書
「DNS & BIND 第4版」
http://www.oreilly.co.jp/books/4873110742/
つづく
藤本裕之のプログラミング夜話 #98
前回の続き。マウスカーソルの形を変える話の最終回である。
こないだから作っているテストプログラム……オレは作っているがみなさんはどうですか。たぶん作ってみてるヤツの方が少ないとは思うけどこういうのはいわゆるひとつのお約束だからみなさんも作っているとして人生を続ける、ご了承されたい。プログラムでは、手前にある(つうか後から描いてるだけだが)水色で塗られた矩形の上に来るとマウスカーソルが人さし指1本を立てた形(pointingHandCursor)に変わり、そのままドラッグするとこの矩形を動かせた。
この、ドラッグしている間だけカーソルを変えたい、というのが今回の話である。いやみなさんの中にはオレはそんな面倒くさいことをしたくない、というヒトも少なくないとは思うが、そこはそれ、気は心というか人生至る所青山ありなので(自分でも言ってる意味が判らないが)、そうする方法を覚えておくのも悪くないよと。
ちょっと整理すると今までの「マウスカーソルの変更」はなんつうか「待ち伏せ型」であった。あらかじめ「この線から入ったらこれに変わるからね」という設定をしておき、「ほら近づいてきた近づいてきた、もうすぐ変わるよ変わるよ、ほら変わったぁ」とやってたわけね。
これに対して今度は能動的、というかこっちから打って出るというか「変わる」ぢゃなくて「変える」。例えばカーソルをゲンコツの形(closedHandCursor)に変更するときには以下のようにすればいい。
[[NSCursor closedHandCursor] set];
こんだけである。テストプログラムではドラッグが始まったときこれに変わるのはpointingHandCursorに決まっているので、ドラッグが始まったときにこれを呼び、終わったら
[[NSCursor pointingHandCursor] set];
を呼べばそれでいい。
が、みなさんご存知の通り世の中はテストプログラムのようではない。もし黄色で塗ってる矩形(この上に来るとopenHandCursorに変わることになってる)もドラッグしたくなったとしたら、「今ドラッグしてるのは黄色の方だったから、えっと……おおそうぢゃopenHandCursorに戻すんだった」とかやらねばならない。Photoshopとかのようにオリジナルのカーソル・シェイプがたくさんあったりするとこういう処理は幾何級数的に煩雑になってしまう。
そこで、NSCursor には実に便利なしかけが用意されている。ヒト呼んで(別に呼ばないか)push と pop 。すげぇ便利、マウスボタンが押されてドラッグを開始するとき、ただclosedHandCursorをセットするだけではなく、それまでのシェイプを push しておく。
[[NSCursor currentCursor] push];
[[NSCursor closedHandCursor] set];
で、マウスボタンがリリースされドラッグが終わったら、popすれば元通り。
[NSCursor pop];
これさえあれば、元がどんなカーソル・シェイプだったかをプログラムで管理する必要はない。知ってれば簡単、知らないとすげぇ苦労を強いられる仕事の典型だよね、こういうの。
PS. 結局テストプログラムを作らなかったあなたのために、オレが作ったヤツをMOSAのサーバにアップしてもらうので、以下のURLからダウンロードをどうぞ。
(2006_09_01)
高橋真人の「プログラミング指南」第96回
〜オブジェクト<3>〜
こんにちは、高橋真人です。
早速ですが、訂正です。前回のコード例の2番目で、変数の名前を2つともaにしてしまいました。混乱してしまった方、ごめんなさい。
そこで、訂正の意味も含め改めて「オブジェクト指向の流儀」で書くことを想定した架空の言語のコード例を見てください。
IntType a(3);
IntType b(5); // ここ。前回は変数名がaになってしまっていた
a.add(b);
a.print();
見ていただいたところで、早速話を先に進めます。(前回)最初に見ていただいた「普通の」Cのコードと、いま書いたオブジェクト指向のコードですが、加算処理の部分で、特に違いが際立っています。
a += b;
と
a.add(b);
の違いは、単に書き方だけのように見えるかもしれませんが、ここには大きな意味の違いがあります。
前者では、Cの略記法として+=という演算子を使ってはいるものの、これは
a = a + b;
と書いたのと同じです。実際、aにbの値を加算する場合に、こういう書き方しかできない言語はたくさんあります。
それに対して後者は、加算処理はaというオブジェクトに委ねています。
前回、「aというオブジェクトが持つ機能」という表現を使いましたが、ここではそれを利用しているわけです。
Cの書き方では、数値の加算処理が「双方の変数とは別のところで行われて」います。それに対しオブジェクトに委ねている方では、加算処理は「オブジェクトの内部で」行われています。
この「オブジェクトの内部」という表現に余りとらわれないようにしてください。コンピュータのコードは、どんな言語を使おうが、どんな技術を使おうが、最終的にCPUで実行される段階ではすべてがマシン語になっています。マシン語のレベルにおいては、構造化手法だとかオブジェクト指向だとかはほとんど関係のない状態になってしまっていますので、そういう方向でいくら追求していっても、オブジェクト指向などの本質が見えてくるわけではないのです。ですから、余りにも本質の追求にとらわれ過ぎると、却って本質を見失うことにもなり兼ねないのです。
そもそも、オブジェクト指向とは「コードを書く上での考え方」の一つなのですから、たとえそれが実体に合っていようがなかろうが、「オブジェクト指向に合った動作のイメージ」を自分の中に作り上げることが大切です。
ところで、このように「処理をオブジェクトの中で行う」ことに果たしてどんなメリットがあるのでしょうか?
もちろんメリットはたくさんありますが、今回は「処理の詳細を隠してしまえること」という点に注目してみましょう。
以下の2つのコード例を見てください。
〈コード例A〉
int x = 9;
int y = 5;
x /= y; // x = x / y; と同じ
printf("%d", x);
〈コード例B〉
float x = 9;
float y = 5;
x /= y; // x = x / y; と同じ
printf("%f", x);
これまたCの入門段階の極めて単純なプログラムですが、今度は割り算です。出力結果がどうなるかもお分かりですね?
これらのコードの違いで気を付ける必要のあるのは、割り算の部分と出力の部分です。特に、割り算の部分で注目しなければならないのは、「両者では別の処理が行われている」ということです。
表面上同じ「割り算」に見える式ですが、処理の中身は異なります。プログラミング経験のない人にとって例Aの割り算はちょっと意外なものです。もちろんCを学ばれた方にはおなじみですね? 例Aは整数同士の演算、その名も「整数演算」なので、演算処理後のxの値は1となります。ちなみに例Bは「浮動小数演算」で、xの処理後の値は1.8です。
それでは、どのようにして複数の演算処理(整数演算と浮動小数演算)のうちの一つが、「同一の/という演算子」によって選択されるのかの仕組みを考えてみましょう。
少し考えてみればお分かりと思いますが、大して複雑な仕組みがあるわけではありません。Cのコンパイラはコードを解析する際に/という演算子を見つけると、前後の値の型を見て「どんな演算をするのか」を判別しているのです。(演算子の前後の値の型が異なる場合には、一定の決まりに従って型が統一されてから、演算が選ばれます)
もっとも、世の中はそんなに単純なことばかりではないので、上記のようなシンプルなコードだけで済むことはまれです。xやyの宣言(つまり型指定)が、演算処理のずっと手前にあった場合、目で見ただけで「どの演算処理が行われるのか」を瞬時に判断するのは困難な場合もあります。また、皆さんの中にはprintf()のフォーマット指定で、つい%fの代わりに%dと書いてしまって予想外の結果に戸惑った経験のある方もおいでではないでしょうか?
まあ、「そのように書いた自分が悪い」と言って、ちまちまコードを直すとか、はたまたハンガリアン記法などといった、変数名に型情報を持たせるような「規則」で縛るなどというアプローチもありなのかもしれませんが、本音としては、「xはfloatなんだから、コンパイラが自動で判断して処理してくれればいいのに」なんて思ったりするんじゃないでしょうか?
オブジェクト指向技術は、こういうケースにも解決策をもたらします。例によってでっち上げのオブジェクト指向言語で上記の処理を書くと、以下のような感じになります。
〈コード例A'〉
IntType x(9);
IntType y(5);
x.divideBy(y);
x.print();
〈コード例B'〉
FloatType x(9);
FloatType y(5);
x.divideBy(y);
x.print();
最初の変数定義の部分が違う(そもそもここが違わなければ、変数自体が「私は誰?」となってしまいますから)だけで、あとは全く同じコードになっています。処理の詳細を隠してしまうことで、内部では別々の処理が行われているにもかかわらず、呼び出す側のコードでは全くその違いを「意識する必要がない」のです。このように、「必要のないところで頭に負担がかからない」のもオブジェクト指向を使う一つのメリットです。
ところで、誤解のないようにというか、ぬか喜びをしてもらいたくないので言っておきますが、上記のdivideBy()やprint()の処理内容に関しては、当然「自分で実装」しなければなりません。コンパイラが「自動で生成してくれるわけではない」ので、くれぐれも誤解のないようにお願いします。
ニュース・解説
今週の解説担当:小池邦人
● Carbon ドキュメント & サンプル & SDK ナビゲーション(2006/09/01)
【開発環境】
インテル社より、Mac版「インテル(R)スレッディング・ビルディング・ブロック (インテル(R)TBB) 1.0 」が発表されました(Windows版とLinux版もあり)。パッケージの内容は、一般的なアルゴリズムとデータ構造を並列化して提供するC++ ラインタイム・ライブラリーです。つい最近発表されたインテルの最新CPU「Core 2 Duo」の能力を十二分に引き出したいと考えている開発者にとっては、頼もしい助っ人になると思います。詳しくは販売元のエクセルソフト株式会社のウェブサイトを参照してみてください。
「インテル(R)スレッディング・ビルディング・ブロック (インテル(R)TBB) 1.0」
http://www.xlsoft.com/jp/products/intel/threading/tbb/index.html
多分、上記の発表に合わせてだと思いますが、大阪においてインテル(R) ソフトウエア・カレッジ主催セミナーが開催されます。コースは「マルチコア プロセッサー対応アプリケーション開発」となっています。興味ある方は参加されてみてはいかがでしょうか?
http://www.xlsoft.com/jp/products/intel/college/index.html?b=t5
【テクニカルドキュメント】
前回から9月1日の期間中、Apple社のGuidesサイトには新規ドキュメントが2つ登録されましたが、Referenceのサイトには新規登録はありませんでした。Mac Proが登場したことによる、ハードウエア関連「Developer Note」の更新です。それにしても、Mac Pro用のRAMは高価ですね! 油断すると(しなくても)MacBookが購入できてしまう(涙)。また、デベロッパ向け読み物もひとつだけ新規登録されています。
「RAM Expansion Developer Note」
「Video Developer Note」
http://developer.apple.com/documentation/index-rev-date.html
http://developer.apple.com/reference/index-rev-date.html
「Zimbra on Mac OS X: An “Elegant” Solution with Sync Services」(読み物)
http://developer.apple.com/business/macmarket/zimbra.html
前回から9月1日の期間中、新規テクニカルノートはひとつだけ登録されましたが、新規テクニカルQ&Aの方はひとつも登録されませんでした。「TN2163」は、Xcode 2.4が登場したことに対する内容の更新です。
TN2163「Building Universal I/O Kit Drivers」(Xcode2.4用アップデート)
http://developer.apple.com/technicalnotes/index-rev-date.html
http://developer.apple.com/technicalqas/index-rev-date.html
【サンプルソースコード】
前回から9月1日の期間中、Apple社のSample Codeサイトには新しいサンプルソースコードがひとつも登録されませんでした。
http://developer.apple.com/samplecode/index-rev-date.html
【デベロップメント SDK】
前回から9月1日の期間中、Apple社のSDKサイトには新しいSDKがひとつも登録されませんでした。
http://developer.apple.com/sdk/
◇MOSAからのお知らせと編集後記は割愛します◇