Macintosh Developer Online (MDOnline)


2001年11月27日発行号 - Xのプログラミングのガイドライン



アスキーの経営権が来年にもユニゾンに移るようで、その後は、ゲーム関連、出版関連に事業を集約するとしています。アスキーはほんとに危ないという状況をくぐり抜けているわけですが、10年近く前に最初に倒産しそうになったときには、結果的に政府の側が業界の代表的な企業を潰すのは良くない…みたいな論理で官によるバックアップで立ち直ったという経緯をやはり思い出します。少し前の日経ビジネスにあった記事ですが、今、元気がない業種や町、企業はおしなべて、公共事業に頼っていたとか、政府の補助金や支援に頼っていたりしている点で共通しているとか。一方、ホタテの養殖や、馬路村なんてのを引き合いに出して、国の庇護に頼らないで、自力でビジネスを切り開いてきて、ここまできている(しかも田舎でも)ということを紹介していました。もちろん、10年前と今では状況が違うけど、やはり来るところには来たというところでしょうか。もっとも、まだ収益の出せる媒体があるだけ立派だとは思います。ところで、ユニゾンのプレスリリースでは月刊アスキーなどの基幹雑誌の強化をすると言っていますが、マック系の雑誌はどうなるんでしょうか? そういえば、日経MACがなくなって1年、そろそろ次の波が来るかいなとも思うところです。
専門誌と言えば海外ですが、Java ReportとJournal of Object-Oriented Programmingの2誌が合併するそうで、その後には隔月刊の雑誌になるそうです(現在は月刊誌)。景気後退という理由になっていますが、いずれにしても業務の縮小であることは確かです。この辺りの雑誌はちょっと大きな書店だと売っているくらいの専門誌ですから、主要雑誌と言ってもいいかと思います。Javaの状況もあるのでしょうし、紙媒体はどうなんだということも言われていますが、結果として出版というビジネスも大きく様変わりしてきていることは確かです。特にインターネットの普及によって、ビジネススケールが大きくないといけないみたいになり、小さなスケールでは相手にされないどころか、なんとかビジネスを回すということも厳しくなっているのは確かです。結局は多様性が失われるのは避けられないでしょうね。
(新居雅行 msyk@mdonline.jp


Mac OS Xでのプログラミングを行うときの基本原則を示す文書が公開

Technical Noteに「Mac OS X Programming Guidelines」と題した文書が掲載された。概要を報告しておこう。まず、バイナリはMac OS Xのネイティブ形式であるMach-O形式で作成する必要がある。そして、top、MallocDebug、fs_usage、sample、leaks、Samplerといったパフォーマンスツールを利用して、パフォーマンスのチューニングを行う。また、マルチタスクで動作していることを配慮し、無駄なループを避け、ユーザが何もしないときにはプログラム上でも何もしないようにする。Carbon Eventを使うようにする。リソースの利用は避け、フラットなファイルを利用するようにする。ファイルには拡張子を付けるようにする。Carbonではファイル処理にFSSpecを使うのではなくFSRefを使うようにして、ボリュームのフォーマットに依存しないようにする。国際化を目指してバンドルを利用したりUNICODE対応のAPIを使うようにする。パスを基調にしたファイルシステムを使うようにする。Cocoaがキラーアプリケーションを素早く開発する手段となる。C++の利用は分別をもって行うこと。
これまでは、さまざまな文書が公開されたが、詳細なものが一般的であり、ガイドライン的な文書はあまり例がなかった。新しい機能を眺めながら、どういう方針を取るべきかを考えることもあったかもしれないが、この文書は、その意味ではMac OS X向けのネイティブなアプリケーション作成においての基本原則を与えるものとなるだろう。拡張子を使うなど、従来のMac OSユーザには抵抗のある箇所もあるかもしれないが、いずれにしても、各項目ごとに、詳細な技術情報をしるした文書へのリンクもあるので、まずは、「この文書からはじめる」ということも言えるようになった。Mac OS Xのプログラミング環境も、混沌から整理される方向に行きつつあることが伺える。

関連リンク:TN2034: Mac OS X Programming Guidelines
カテゴリ:Technote, 開発情報


大津真=XはUNIXでサーバで》LAN内でDNSサーバを立ち上げる(1)

【MDOnline読者様限定コンテンツ】

――――ホスト名の管理方法
最近ではSOHOや一般家庭でも複数のパソコンをLANで接続して情報の共有や一元管理をするのはめずらしくなくなってきました。そこで頭の痛い問題のひとつがそれぞれのホスト名をどのように管理するかでしょう。もちろん、AFP(Apple Filing Protocol)のみを使用して、Macどうしでファイル共有を行うだけであれば、「システム環境設定 - 共有」の「コンピュータ名」で設定した名前でそれぞれのマシンにアクセスできます。ただし、ここで設定した「コンピュータ名」は、Appleのファイル共有のみで有効な名前です。したがって、WebサーバやSSHサーバを立てた場合には、ホスト名とIPアドレスの相互変換をなんらかの方法で行わないと、サーバーマシンにアクセスするのにIPアドレスを「192.168.1.1」のように直接指定しなければならない羽目になってしまいます。
たとえば、クライアントマシンからOS X上で動作しているWebサーバApacheにアクセスするのに、ブラウザの「アドレスに」

http://192.168.1.1

のように指定しないとなりません。やっぱり

http://myhosts

のようにホスト名で指定した方がわかりやすいですよね。
で、ホスト名とIPアドレスの変換には一般的に次のような方法があります。

[方法1] マシンごとにhostsファイルで管理
[方法2] LAN内にDNSサーバを立てて集中管理

[方法1]のhostsファイルで管理する方法は、現在でも小規模LANでよく使用されています。OS 9以前のMac OSでは、「TCP/IP」コントロールパネルで「Hostsファイルの選択」ボタンをクリックしてIPアドレスとホスト名の対応を記述したテキストファイルを選択していました。Windowsであればlmhostsファイルですね。一般的なUNIXであれば、/etc/hostsファイルに記述します。
Mac OS Xもその中身はUNIXということで/etc/hostsファイルがありますが、これはシングルユーザモード(付録「UNIXの基礎知識」参照)でしか参照されません。OS Xの場合、通常の起動モードであるマルチユーザモードではネットワークリソースはすべてNetInfoデータベースで管理されるからです。NetInfoデータベースへのホストの登録は、NetInfo Managerを使用して行うと簡単です。具体的には/machinesディレクトリに新たなディレクトリを作成し、「ip_address」と「name」という2つのプロパティを設定します。

 

hostsファイルによる管理では、LANにマシンが追加されたような場合、すべてのマシンのhostsファイル(OS Xの場合にはNetInfoデータベース)を更新する必要がありちょっと面倒です。その手間を省くには、NISサーバやMac OS X Serverを導入することで集中管理することもできます。ただし、NISはクライアントがUNIX、Mac OS X ServerはクライアントがMacに限定されてしまうため、Windows、Mac、UNIXが混在する環境ではあまり現実的ではありません。
それよりは、[方法2]のLAN内にDNSサーバを立てる方がなにかと便利でしょう。ちょっと前置きが長く長くなりましたが、そういうことで、今月はMac OS XでDNSサーバを立ち上げる方法を説明しましょう。

――――BINDのインストール
DNSの実装でもっとも広く普及しているのがBINDです。

◇BIND
 http://www.isc.org/products/BIND

BINDはなにかとセキュリティホールになりやすいためLAN内といえどもできるだけ最新版を使用したほうが無難です。現時点での最新版はバージョン9.1.3になります。OS Xには標準でBINDの8.2.3がインストールされていますが、せっかくですから、ここでは最新版のインストール方法について説明しましょう。
まず、BINDのオフィシャルサイトからBINDのTarボール(bind-9.1.3.tar.gz)をダウンロードし、次のようにして展開します。

% tar xvzf bind-9.1.3.tar.gz <return>
bind-9.1.3/
bind-9.1.3/bin/
bind-9.1.3/bin/check/
bind-9.1.3/bin/check/Makefile.in
…以下略

次に、展開したディレクトリに移動し、すでにおなじみの「configure」「make」「make install」でコンパイル、インストールします。ただし、初期状態で用意されているconfigureスクリプトはホストタイプとしてMac OS Xを認識できないため、/usr/libexecディレクトリのconfig.guessとconfig.subをコピーして上書きします。また、OS Xではマルチスレッドを有効にするとリンク時にエラーとなるのでconfigureには「--disable-threads」オプションを指定しています。

% cd bind-9.1.3/ <return>
% cp /usr/libexec/config.guess . <return>
% cp /usr/libexec/config.sub . <return>
% ./configure --disable-threads<return>
loading cache ./config.cache
checking host system type... powerpc-apple-darwin5.1
checking whether make sets ${MAKE}... yes
…以下略
% make <return>
making all in /Users/o2/Documents/Download/bind-9.1.3/make
making all in /Users/o2/Documents/Download/bind-9.1.3/lib
making all in /Users/o2/Documents/Download/bind-9.1.3/lib/isc
…以下略
% sudo make install <return>
Password: ←パスワードを入力
making install in /Users/o2/Documents/Download/bind-9.1.3/make
making install in /Users/o2/Documents/Download/bind-9.1.3/lib
…以下略

以上でインストールは完了。BINDのプログラム本体は「named」(/sbin/named)です。rehashでコマンドハッシュを更新し「named -v」でバージョンを確認してみましょう(「-v」はバージョンを表示するオプション)。

% rehash <return>
% named -v <return>
BIND 9.1.3 ←BIND 9.1.3がインストールされた

(続く)
[大津真/makotoo2@mac.com]

関連リンク:http://www.o2-m.com/
カテゴリ:ネットワーク管理, ネットワーク, 大津真=XはUNIXでサーバで


大津真=XはUNIXでサーバで》LAN内でDNSサーバを立ち上げる(2)

【MDOnline読者様限定コンテンツ】
――――BINDの設定
次に、設定に移ります。ここではドメイン名が「xx.dyndns.org」、IPアドレスとしてプライベートアドレス「192.168.1.0/24」のドメインを想定しています。余談ですが、ドメイン名に「xx.dyndns.org」を使用しているのは、筆者はwww.dyndns.orgが提供するDynamic DNSサービスを利用しているからです。Dynamic DNSは、ダイアルアップサービスなどIPアドレスがころころ代わってしまうような場合でも、あらかじめ登録したドメイン名でのアクセスが可能になるため、インターネットからアクセス可能なサーバを自宅に立てることができるとても便利な仕組みです。Dynamic DNSの利用法については機会をあらためて説明しましょう。

〈BINDの設定ファイル〉
BINDが最初に読み込む設定ファイルは/etc/named.confです。次にリストを示しますので、「xx.dyndns.org」と「1.168.192」の部分を適当に書き換えて使用してください。(「リスト:」の後がファイルのパスで、その後にラインで区切って、ファイルの中身を記載します。)

リスト:/etc/named.conf
 ― ― ― ― ― ― ― ― ― ― ― ― ― ―
options {
directory "/var/named";
};

zone "." {
type hint;
file "named.root";
};

zone "0.0.127.in-addr.arpa" {
type master;
file "named.local";
};

zone "xx.dyndns.org" {
type master;
file "db.xx.dyndns.org.zone";
};

zone "1.168.192.in-addr.arpa" {
type master;
file "db.xx.dyndns.org.rev";
};
 ― ― ― ― ― ― ― ― ― ― ― ― ― ―

次に、/var/namedディレクトリをsudoコマンド経由で作成し、その下にゾーン(DNSサーバが管理する情報)を定義するデータベースファイルを保存します。各ファイルの名前は/etc/named.confの「file」で設定したものを使用してください。

〈ルートサーバのキャッシュファイル「named.root」〉
DNSは、インターネット上の複数のサーバから階層的に構成される分散システムです。そのトップには複数のルートサーバーが配置されています。named.rootはルートサーバのアドレスを記述したファイルです。ルートサーバは変更される可能性があるので、ftp://rs.internic.net/domain/named.rootから最新のものをダウンロードしてnamed.rootという名前で保存してください。

〈ローカルループバック用逆引きファイル「named.local」〉
主にテスト用に使用されるループバックアドレス(127.0.0.1)用の逆引きファイルです。このまま使用してください。

リスト:named.local
 ― ― ― ― ― ― ― ― ― ― ― ― ― ―
@TTL 86400
@ IN SOA localhost. root.localhost. (
2001111801 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS localhost.
;
1 IN PTR localhost.
 ― ― ― ― ― ― ― ― ― ― ― ― ― ―

〈正引きファイル 「db.xx.dyndns.org.zone」〉
ホスト名からIPアドレスを求めるためのファイルです。ここではg3macというホスト上でBINDが動作していることを想定しています。

リスト:db.xx.dyndns.org.zone
 ― ― ― ― ― ― ― ― ― ― ― ― ― ―
$TTL 86400
@ IN SOA g3mac.xx.dyndns.org. root.v1.xx.dyndns.org. (←[1]
2001111801; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS g3mac.xx.dyndns.org.
localhost IN A 127.0.0.1

v1 IN A 192.168.1.25 ←[2]
taitan IN A 192.168.1.22
g3mac IN A 192.168.1.27
g4mac IN A 192.168.1.18
mars IN A 192.168.1.26
gmachine IN A 192.168.1.32
ibook IN A 192.168.1.31
www IN CNAME v1 ←[3]
ns IN CNAME gmachine
mail IN CNAME v1
 ― ― ― ― ― ― ― ― ― ― ― ― ― ―

まず[1]のSOAレコードですが、これはDNSの権限に関する設定で「SOA」の後にネームサーバーのホスト名と管理者のメールアドレスの「@」を「.」に変更したものを指定します。このとき、ホスト名の最後には「.」が必要なことに注意してください。シリアル値と呼ばれる番号に注目してください。この番号が増えるとゾーン内のデータが更新されたと見なされます。一般的には「年」「月」「日」と2桁の番号をつなげた数値を指定します。
[2]以降では、

(ホスト名) IN A (IPアドレス)

の形式でホストを設定します。なお、[3]のように

(別名) IN A CNAME (ホスト名)

でホストに別名を付けることができます。

〈逆引きファイル 「db.xx.dyndns.org.rev」〉
正引きファイルとは逆に、IPアドレスからホスト名を求めるためのファイルです。

リスト:db.xx.dyndns.org.rev
 ― ― ― ― ― ― ― ― ― ― ― ― ― ―
$TTL 86400
@ IN SOA g3mac.xx.dyndns.org. root.v1.xx.dyndns.org. (
2001111801 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS g3mac.xx.dyndns.org.
25 IN PTR v1.xx.dyndns.org.
22 IN PTR taitan.xx.dyndns.org.
27 IN PTR g3mac.xx.dyndns.org.
18 IN PTR g4mac.xx.dyndns.org.
26 IN PTR mars.xx.dyndns.org.
32 IN PTR gmachine.xx.dyndns.org
31 IN PTR ibook.xx.dyndns.org
 ― ― ― ― ― ― ― ― ― ― ― ― ― ―

SOAレコードの後に、

(アドレス) IN PTR (ホスト名)

を登録します。ここで、IPアドレスのネットワーク部は/etc/named.confであきらかなので、最後の1オクテットだけを記述するだけでかまいません。

(続く)
[大津真/makotoo2@mac.com]

関連リンク:http://www.o2-m.com/
カテゴリ:ネットワーク管理, ネットワーク, 大津真=XはUNIXでサーバで


大津真=XはUNIXでサーバで》LAN内でDNSサーバを立ち上げる(3)

【MDOnline読者様限定コンテンツ】

――――BINDを起動する
BINDの制御には、ndcコマンドを使用します。

ndc start   BINDを開始する
ndc stop   BINDを停止する
ndc restart  BINDをリスタートする

設定ファイルとデータベースファイルを作成したら、「システム環境設定 - ネットワーク」で「ドメインサーバ」に自分自身のIPアドレスを「192.168.1.27」のように指定し、次のようにしてBINDを起動してみましょう。

% sudo ndc start <return>
new pid is 516

これで、BIND本体(named)がデーモンとして起動します。psコマンドで確認しましょう。

% ps ax | grep named <return>
297 ?? Ss 0:00.14 /usr/sbin/named
22317 std R+ 0:00.00 grep named

残念ながら作成した設定ファイルもしくはデータベースファイルにエラーがあれば「ndc start」を実行した時点で/var/log/system.logにエラーが出力されるので

% tail -f /var/log/system.log <return>

で確認します(付録のUNIXの基礎知識参照)。エラーがあった場合には、設定ファイルを見直してBINDをリスタートさせます。

% sudo ndc restart <return>

問題がないようだったら、ホスト名からIPアドレスが引けるか、あるいはその逆ができるかどうかを確認しましょう。BIND9はこれまでのnslookupコマンドに代わってhostコマンド(あるいはdigコマンド)を使用します(Finder上で確認するには「Applications - Utilities」のNetwork Utilityの「Lookup」を使用するといいでしょう)。

$ host g3mac <return> ←正引き(LAN内のホスト)
g3mac.o2.dyndns.org. has address 192.168.1.27
$ host 192.168.1.27 <return> ←逆引き(LAN内のホスト)
27.1.168.192.in-addr.arpa. domain name pointer g3mac.o2.dyndns.org.
% host www.locus.co.jp <return>←正引き(インターネット上のホスト)
www.locus.co.jp. is an alias for mail.locus.co.jp.
mail.locus.co.jp. has address 164.46.155.84

――――BINDの自動起動
OS Xでは、システムのブート時にサービスを起動したい場合に、/System/Library/StartupItemsおよびLibrary/StartupItems/ディレクトリにサービス名のディレクトリを作成し、その下に起動スクリプトをおいて、/etc/hostconfigファイルで起動するかどうかを設定します。この機能を使用してBINDを自動起動するようにしてみましょう。

まず、/Library/StartupItems/BINDディレクトリを作成し、次のような起動スクリプトを「BIND」という名前で保存します。ここではBINDという変数が「-YES-」の場合に、「ndc start」でBINDを起動するという処理を行っています。

リスト: BIND
 ― ― ― ― ― ― ― ― ― ― ― ― ― ―
#!/bin/sh

##
# Start DNS server (BIND/named)
##

. /etc/rc.common

if [ "${BIND:=-NO-}" = "-YES-" ]; then
ConsoleMessage "Starting domain name server"

ndc start
fi
 ― ― ― ― ― ― ― ― ― ― ― ― ― ―

保存したら次のようにして実行権を付けます。

% sudo chmod +x /Library/StartupItems/BIND/BIND <return>

次に、説明や依存関係、起動時に表示するメッセージなどを記述したStartupParameters.plist を、同じく/Library/StartupItems/BINDディレクトリに保存します(メッセージはResourcesディレクトリに対応するファイルを用意することにより国際化することが可能ですが今回は省略しています)。

リスト:StartupParameters.plist
 ― ― ― ― ― ― ― ― ― ― ― ― ― ―
{
Description = "BIND domain name server";
Provides = ("DNS");
Requires = ("Disks");
Uses = ("Network Time");
OrderPreference = "None";
Messages =
{
start = "Starting DNS server";
stop = "Stopping DNS server";
};
}
 ― ― ― ― ― ― ― ― ― ― ― ― ― ―

最後に、/etc/hostconfigに次の行を加えます。

BIND=-YES-

以上で、システムを再起動すればBINDが自動起動するようになります。なお、自動起動させたくない場合には、/etc/hostconfigの追加した行を

BIND=-NO-

にしてください。

――――付録
■■ログファイルについて
カーネルおよび、いろいろなサービスは、「起動したとき」「アクセスされたとき」「エラーが起こったとき」などに、さまざまなログを出力するが、それらのログを統括して管理するのがsyslogdというデーモンだ。設定ファイルは/etc/syslog.confになる。
実際に/etc/syslog.confを覗いてみるとわかるが、ログはコンソールデバイス(/dev/console)および、/var/log以下のファイルに保存される。
コンソールに出力されるログを監視したい場合には、Finder上で「Applications→Utilities」フォルダのConsoleを立ち上げればよい。
なお、Consoleでは、「ファイル」メニューから「ログを開く」を選択し「アドレス」に「/var/log」を指定することによりログファイルを選択することが可能だ。
Terminal上で、ログを監視したい場合には、

tail -f ログファイルのパス

を実行するとよい。tailコマンドはファイルの最後の部分を表示するコマンド。「-f」オプションを付けると「control + C」を押すまでコマンドを終了せず、ファイルになにかが追加された時点で表示が更新される。

■■シングルユーザモード
UNIXの起動モードにはマルチユーザモードとシングルユーザモードがある。マルチユーザモードは通常のモードで、シングルユーザモードはバックグラウンドプロセスが動作していないモードだ。シングルユーザモードでは、ファイル共有やSSHなどのネットワークサービスはもちろん、GUI(OS XではAqua)も動作しないためコンソール画面によるログインになる。このモードは、主にシステムのバックアップを取ったり、マルチユーザモードで立ち上がらなくなった場合の復旧といった目的で使用される。Mac OS Xの場合「Command + S」を押しながら起動するとシングルユーザモードとなる。シングルユーザモードで、システムを終了するには

shutdown -h now <return>

再起動するには

shutdown -r now <return>

とする。
なお、「Command + V」で起動するとVerboseモードとなり周辺機器が認識されていく過程などを表示できる。

(この項、以上)
[大津真/makotoo2@mac.com]

関連リンク:http://www.o2-m.com/
カテゴリ:ネットワーク管理, ネットワーク, 大津真=XはUNIXでサーバで


ATSUIの機能を利用してフォントのグリフ情報を得る方法

Technical Noteに、ATSUI(Apple Type Services for Unicode Imaging)の機能を利用して、フォントのグリフのアウトラインデータを得る方法が解説されている。ATSUIの知識を前提としているが、グリフの情報を得るためのAPIについての詳しい解説となっており、APIのリファレンスと、その利用方法をまとめたものとなっている。

関連リンク:TN2033: How to use the ATSUI Low Level APIs to get glyph outlines
カテゴリ:Technote, テキスト/フォント


CarbonLib 1.5f2 SDKがリリース、Ver.1.5は最終段階か

CarbonLib 1.5f2 SDKが、ADC(Apple Developer Connection)会員向けに公開されている。バージョン番号にfが入ったものは、通例ではほぼ完成に近いバージョンだとされている。Ver.1.5の正式リリースも近いようだ。CarbonLibは、Mac OS 8.6〜9.xで、Mac OS Xとの互換APIであるCarbonのフレームワークを実現するライブラリである。

関連リンク:Carbon
カテゴリ:Carbon/CF