MOSA Multi-OS Software Artists

MOSAはソフトウェア開発者を支援します

  • iPhone/iPod touch アプリ紹介
  • MOSA掲示板
  • 活動履歴
  • About MOSA(English)

MOSA Developer News[MOSADeN=モサ伝]第223号

2006-10-03

目次

  • 「Wonderful Server Life」      第21回  田畑 英和
  • 藤本裕之のプログラミング夜話 #100
  • 高橋真人の「プログラミング指南」  第98回
  • ニュース・解説                小池 邦人

「Wonderful Server Life」  第21回  田畑 英和

〜Open Directory編〜

 今回からOpen Directoryの解説を行います。Open DirectoryとはMac OSで利用可能なディレクトリーサービスの名称です。Open Directoryを使えばユーザアカウントなどの情報をサーバで一元管理することができますが、具体的にどのようなことが実現できるかは第16回の連載ですでに紹介済みですので、設定方法を中心に解説していきたいと思います。

◇Open Directoryの役割
 Open Directoryの設定を行うには、まずOpen Directoryの役割について理解しておく必要があります。Open Directoryには以下の4つの役割があります。

・スタンドアロンサーバ
・ディレクトリシステムに接続
・オープンディレクトリの複製
・オープンディレクトリのマスター

 Mac OS X Serverの初期設定時に「ディレクトリの利用設定」(第8回の記事で解説)という項目がありますが、ここで特に設定を行っていなければOpen Directoryの役割は「スタンドアロンサーバ」になっています。「スタンドアロンサーバ」とはようするにディレクトリサービスを提供しないサーバのことです。現在の役割を確認するには「サーバ管理」で目的のサーバに接続して、「オープンディレクトリ」サービスの「概要」を表示すれば確認できます。

・「スタンドアロンサーバ」
http://homepage.mac.com/htabata/MXS10.3/img/OD/OD_01.png

 ディレクトリサービスを提供するには役割を「オープンディレクトリのマスター」に設定します。今回設定方法を解説するのはこの役割になります。
 あと2つ役割がありますが、規模の大きなシステムではサーバを複数台設置して、各種サービスを別々のサーバ上で運用することがあります。このようなシステムでは1台のサーバをマスターにして、ほかのサーバはマスターを参照するように設定することができます。マスターを参照するように設定するには役割を「ディレクトリシステムに接続」に設定します。また、Open Directoryの可用性やスケーラビリティを向上させるには「オープンディレクトリの複製」を作成して、マスター上のデータのコピーを別サーバ上で管理することもできます。

・4つの役割
http://homepage.mac.com/htabata/MXS10.3/img/OD/OD_02.png

◇設定前の確認
 マスターを設定するには事前にDNS関連のチェックが必要です。マスターに設定するサーバがあらかじめDNSサーバに登録されていて、サーバからの名前解決に応答できる必要があります。
 既存のDNSサーバがあればそちらに登録しておくこともできますし、前回まで解説してきたように、Mac OS X Server上でDNSサービスを設定して、そこに自分自身を登録することもできます。
 DNS関連の設定が正しく設定されているかどうかを確認する方法もこれまで解説してきましたが、あらためて確認に使用するコマンドをまとめますと以下の3つになります。

・ホスト名の確認
% hostname
・DNS正引きの確認
例)% host server.example.com
・DNS逆引きの確認
例)% host 192.168.0.1

 マスターとして設定するサーバのホスト名がDNSサーバに登録されているホスト名になっており、サーバ上で自分自身の正引きと逆引きができればOKです。DNSの設定が不完全な状態でマスターの設定をしますと、設定が正常に行われませんので注意が必要です。

◇マスターの設定
 DNS関連の確認ができたらいよいよマスターの設定です。設定は以下の手順で行います。

1.「サーバ管理」でサーバに接続
2.「オープンディレクトリ」サービスを選択し「設定」画面を表示
3.「役割」ポップアップメニューから「オープンディレクトリのマスター」を選択
4.シートが表示されたら新規アカウントのパスワードを設定し「作成」をクリック
5. 「サーバ管理」画面右下の「保存」をクリック

・マスターの設定画面
http://homepage.mac.com/htabata/MXS10.3/img/OD/OD_03.png

 以上の手順を実行すればOpen Directoryをマスターとして設定することができます。手順4のシートですがここでは「新規アカウント」と「ドメイン情報」を設定します。
 マスターを設定するとデータを保存するための新たな場所(ディレクトリ)が作成されますが、「新規アカウント」は新たに作成されたディレクトリを管理するためのアカウントです。デフォルトで「diradmin」というユーザ名が設定されていますが、変更することも可能です。あとパスワードを設定します。
 Open Directoryではシングルサインオンを利用することもできますが、シングルサインオンを実現するためにOpen DirectoryにはMITで開発されたKerberosが搭載されています。「ドメイン情報」はこのKerberosに関する設定ですが、デフォルトでパラメータが自動的に設定されます。
 マスターの設定にはしばらく時間がかかる場合がありますが、設定が完了したあとに「概要」画面を確認しますと、役割が「スタンドアロンサーバ」であったときは停止していたサーバがすべて実行中になっていることが確認できます。もし一部が停止のままになっている場合はどこかの設定に問題があるということですので、役割を「スタンドアロンサーバ」に戻してから設定の確認を行い、マスターの再設定を行ってみてください。

・「オープンディレクトリのマスター」
http://homepage.mac.com/htabata/MXS10.3/img/OD/OD_04.png

つづく

藤本裕之のプログラミング夜話 #100

 前回は、registerForDraggedTypes: を使ってそのビューがどんなデータのドラッグ&ドロップに応えられるかを登録する、というところまでだった。これはなんつうかいわば麻雀の待ちみたいなもんである。1つのタイプしか扱えないやつはつまりカンチャンとかペンチャン、あタンキもそうか。2つならリャンメン、シャンポン……最高は国士無双の13メンテン……え、麻雀やらないヒトには何のことだか解らない? これはどうも失礼。
 とにかく「こいつらがドラッグ&ドロップされた場合にはメンドーみます」と宣言したわけなので、そのメンドーみるコードを書かねばならない。そのためのメッセージは「NSDraggingInfo」プロトコルとして定義されているのだが、とりあえず以下の4つが必須である。

- (NSDragOperation)draggingEntered: (id ) sender;
- (void) draggingExited: (id ) sender;
- (BOOL) prepareForDragOperation: (id ) sender;
- (BOOL) performDragOperation: (id ) sender;


 まず一番上の draggingEntered: は、ドラッグ&ドロップされたモノが(実際にはそいつをドラッグしているマウス・ポインタが、だが)当該ビューの上に来たときに送られてくるメッセージ、「上に来たとき」というのはこないだカーソルのシェイプを変えるトリガーにしたのと同じなので解りやすいだろ。パラメータであるsenderからなにがドラッグされてきたのかを調べ、それに対する対応を返す。戻り値として返す定数は「NSDragging.h」にこう定義されている。

enum {
   NSDragOperationNone    = 0,
   NSDragOperationCopy    = 1,
   NSDragOperationLink    = 2,
   NSDragOperationGeneric = 4,
   NSDragOperationPrivate = 8,
   NSDragOperationMove    = 16,
   NSDragOperationDelete  = 32,
   NSDragOperationEvery   = UINT_MAX
};


意味するところは字面通りだが、ワタシが実際に使ったことがあるのはNoneとCopyとMoveくらいである。以下にこのメソッドの簡単な実例を示す。

- (NSDragOperation)draggingEntered: (id ) sender{

     if([sender draggingSource] != self) {
          NSPasteboard*  pb = [sender draggingPasteboard];
          NSString*      pbType = [pb availableTypeFromArray:
               [NSArray arrayWithObject: NSFilenamesPboardType]];
          if(pbType != nil){
               _dragging = YES;      // flag for drawing.
               [self setNeedsDisplay:YES];
               return NSDragOperationCopy;
          }
     }
     return NSDragOperationNone;
}


最初の if 節はこのドラッグがこのビュー自身からのものでないことを確認している。次にドラッグ用のペーストボードオブジェクトを参照して自分が処理できるタイプが入っているか確認。こいつは NSFilenamesPboardType にしか応えないという態度なので簡単である。_dragging というフラグはユーザに「ワシ、このファイル処理できまっせ」という意思表示をする(ビューの枠をハイライトするとか)ためのもの。次の setNeedsDisplay: はその描画をするため。

もし処理できるタイプがなかったら NSDragOperationNone を返す。この場合、ビューは反応せず、ユーザはこのビューに対してそのパイが通ったことを知ってほっとするわけである(なんか混乱してますか)。

(2006_09_28)

高橋真人の「プログラミング指南」第98回

プログラマのためのオブジェクト指向再入門(6)

〜クラス<2>〜

 こんにちは、高橋真人です。
 さて今回は、前回説明しました「クラスを使ってオブジェクトを作る」ための具体的なやり方を紹介します。
 ただ、今まで説明に使ってきた“オブジェクト指向言語”は、あくまで私がでっち上げた架空の言語でした。さすがにクラスの定義の仕方までをでっち上げるほどの能力は私にはないので、ここは私が常用しているC++言語の仕組みを借りてくることにします。
 ちなみにC++というプログラミング言語は、決して初心者向きの言語ではありません。言語仕様も小さくありませんし、この言語の習得にはかなりの時間を要することも事実です。それでも、Objective-CやJavaではなく、あえてC++を使うのは、Cを習得した人にとっていちばんスムーズに行くと思うからです。
 と言いますのも、C++のクラス定義の仕方はCの構造体定義の方法を発展させて設計されたものなので、Cプログラマにとって奇異に感じる部分が比較的少ないと思うからです。(もちろん、クラス定義の部分に限ったお話です)
 今回は、あくまでクラス定義のやり方を部分的に借りてくるだけですが、構造体の定義の仕方について余り自信のない人は、いま一度復習をしてから以下を読まれると、よりスムーズに理解できるはずです。

 では早速、IntTypeからやってみましょう。

class IntType
{
     IntType(int n);

     void add(int n);
     void print();

     int      number;
};


 いきなりすべてをやってしまうと、見た目にも複雑になってしまいますから、まずは基本的な部分だけにとどめておき、あとで拡張します。
 全体をざっと見渡しますと、classという識別子、定義するクラスの名前(ここではIntType)、定義の内容という構造になっています。定義の部分はブレースで囲まれていますが、ここは関数ではありませんから、構造体と同じように閉じのブレースのあとにはコロンが必要です。
 定義の中には、3つの関数と1つの変数があります。
 メンバ変数のnumberは、IntTypeから作られたオブジェクトが整数としての性質を保持するための基本となる整数値を入れておくために用意したものです。intという識別子があるように、Cの変数そのものです。唯一の違いは、IntTypeのオブジェクトに所属するということです。だから、メンバ(member)変数と呼ぶのです。
 メンバ関数の方は少し複雑です。3つの関数は、それぞれ少しずつ違います。
 まず最初にあるIntType()という、クラスの名前と同じ関数は、コンストラクタと呼ばれる特殊な関数です。コンストラクタは、クラスからオブジェクトが作られるときに“自動的に”呼ばれることになっています。オブジェクトが生成された直後の初期化処理を行うのが、コンストラクタの一般的な用途です。
 ところで、C++のクラス定義の中にあるメンバ関数の記述は、ただの宣言です。つまり、Cでいうところのプロトタイプ宣言と同じように、動作の定義は記述していません。
 Javaなどの言語では、クラス定義の中にメソッド(Javaでは関数と言わずこう呼びます)の動作内容までを定義するようになっていますが、C++では普通は別の場所(つまりクラス定義の外)で動作定義を行います。
 では、どんな感じになるのかを早速見てみましょう。

IntType::IntType(int n)
{
     number = n;
}


 これがコンストラクタの処理内容の実装部分になります。引数で与えられた整数を使って、メンバ変数のnumberを初期化しています。関数の前に付いている「IntType::」という部分は、スコープ指定演算子と言い、この関数がIntTypeクラスのスコープに属していることを示します。
 前述したように、関数の定義を「クラス定義の外側で」行っているため、スコープ指定がないとコンパイラはこの関数がいずれかのクラスに属すことを認識できなくなってしまうのです。
 コンストラクタには、他の関数と違って返し値がないのも一つの特徴です。

void
IntType::add(int n)
{
     number += n;
}


 こんどは、メンバ関数add()の定義です。コンストラクタと同様にスコープ指定があることに注意しましょう。
 具体的な処理内容としては、引数の値をオブジェクトが保持している変数のnumberに加算しているだけです。
 これを見て、「なぁーんだ、オブジェクト指向って言ったって、結局は中で同じことをしているだけじゃないか」と思われた方、正解です(笑)。別にオブジェクト指向と言ったからって特殊なことをしているわけではないんです。
 ただ、分かり切ったことをあえて「オブジェクトの中」という枠組みの中で行うことによって、いくつか付加価値が出てくるのですが、それに関しては追ってお話ししていくことになるでしょう。

 お話は、次回に続きます。

〈注記〉最初にもお断りした通り、この記事ではC++の解説をすることが目的ではありませんので、C++の説明としては不正確または不適当な部分も一部に含まれていることをご承知置きください。

 

◇MOSAからのお知らせと編集後記は割愛します◇

 MOSA Developer News   略称[MOSADeN=モサ伝]
      記事投稿受付 http://www.mosa.gr.jp/topics/mdn-toukou.html
Apple、Mac OSは米国アップルコンピュータ社の登録商標です。またそのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。
このメールの再配信、および掲載された記事の無断転載を禁じます。
特定非営利活動法人MOSA  http://www.mosa.gr.jp/
Copyright (C)2006 MOSA. All rights reserved.