2009-04-07
目次
Wonderful Server Life」 第90回 田畑 英和
いよいよ新年度がスタートしました。このシーズンになりますと学校では新入生が、会社では新入社員ということになります。学校によっては学生にノートパソコンを配布するようなところもありますし、春休みの期間を利用して学内のパソコンを入れ替えたりします。会社であれば新入社員用のパソコンが必要になりますね。用意する台数は組織の規模によって異なるでしょうが、一般的に複数台のパソコンを一時期にセットアップする必要が出てきます。
こういった背景をふまえて、今回からクライアントコンピュータの効率的なセットアップについて考えていきたいと思います。
◇セットアップの問題点
複数台のパソコンをセットアップするとなると、なんといっても問題になるのはその手間と時間でしょう。パソコンをセットアップするには次のような作業が考えられます。
・OSのインストール
・アカウントの登録
・ネットワークなどシステムの設定
・アプリケーションのインストール
・OSやアプリケーションのアップデート
1台のパソコンをセットアップするだけであれば、1つ1つ手作業で対応していってもよいのですが、例えば100台のパソコンをセットアップするとなるとなんとか作業を効率化したいところです。1台1台異なるセットアップが必要になれば、やはり手作業で対応しなければならない部分も出てくるでしょうが、共通の部分に関してはできるかぎり自動化して効率化をはかりたいところです。
そこでまずはOSのインストールに注目して、セットアップの効率的な手法について解説していきたいと思います。もっとも新規に購入したパソコンでしたら、その時点での最新のOSがプレインストールされていてそのまま使用する場合もあるでしょうが、今回はOSのインストールから実施することを前提とします。
◇OSのインストール
OSのインストール方法を考えてみますと、通常のやり方ではOSのインストールディスクから起動して、インストールを行います。このやり方では1台1台セットアップするのにかなり手間がかかってしまいます。この問題を解決する方法はいくつかあるのですが、Mac OS X Serverに標準で用意されている機能を活用してみましょう。
Mac OS X Serverには「NetBoot/NetInstall」という機能が搭載されています。まずNetBootですが、これはサーバ上にあらかじめ準備しておいたOSのディスクイメージから、ネットワーク経由でクライアントコンピュータを起動するサービスです。この方法ですとそもそもクライアント側に直接OSをインストールする必要がなくなります。
次にNetInstallですが、これはNetBootと共通のテクノロジーを使用しています。NetBootではクライアントを起動するたびに、ネットワーク経由でサーバ上のディスクイメージにアクセスしますが、NetInstallではネットワーク経由でクライアントのハードディスクにインストールを行います。
つまりNetBootもNetInstallも、あらかじめサーバ上にクライアントに必要なものを用意しておき、ネットワーク経由で配布することになります。このような仕組みを利用すれば、ネットワークの準備さえできれば、あとはサーバを用意するだけでクライアントのセットアップができてしまうということになります。
◇NetBootとNetInstall
ではNetBootとNetInstallはどのように使い分ければよいのでしょうか。これは環境によって変わってきます。例えばノートパソコンのように持ち運んで利用するような場合には、常時ネットワークに接続しているわけではありませんので、起動のたびにサーバへのアクセスが必要となるNetBootは利用できないということになります。またNetBootでは毎回サーバへのアクセスが必要になりますので、サーバやネットワークへの負荷は高まりますし、通常はディレクトリサービスやネットワークホームを組み合わせたユーザ管理が必要になってきます。
一方NetInstallの場合は、インストールさえ完了してしまえばあとはクライアントコンピュータを単独で利用できることになります。
このようにそれぞれ特徴がありますので、システムの環境や目的によってどちらかを使い分けるということになります。
というわけでまずは概要を解説したわけですが、次回からは具体的な設定方法について解説していく予定です。また、機会があればNetBoot/NetInstall以外のソリューションについても紹介していければと思います。
次回へつづく
小池邦人のCarbon視点でiPhone探求(2009/04/03)
今回は、画像ファイルの話です。画像ファイルは、Modelオブジェクトのドキュメントからは分離して別に保存します。登録一覧(UITableView)に画像を表示するためには、画像ファイルから小サイズ画像(UIImage)を作る必要もあります。
iPhoneアプリケーションで画像を取り扱う場合には、Quartz2DフレームワークのCGImageRefやUIKitフレームワークのUIImageクラスを利用します。片方からもう片方への変換は簡単です。UIImageからCGImageRefを得るには、UIImageのCGImageプロパティを参照します。
UIImage *uiimage;
CGImageRef cgimage;
cgimage=uiimage.CGImage // プロパティを参照する
逆に、CGImageRefからUIImageを得るには、UIImageクラスのimageWithCGImage:メソッドを利用します。
uiimage=[UIImage imageWithCGImage:cgimage]; // メソッドを利用する
UIImageクラスには色々と便利なメソッドが用意されていますが、Quartz2Dの強力な機能を利用したいケースも出てきます。そうした場合には、上記に示したオブジェクトの変換が必要ですので注意してください。
さて、次は画像ファイルの読み込みです。XcodeプロジェクトのResourcesグループに登録した画像やサウンドファイル(内部利用)は、各アプリケーションパッケージ内に保存されています。そこに保存されている画像ファイル(ボタンなどのユーザインターフェースなどに使う)については、UIImageクラスのImageNamed:メソッドを利用することで簡単に読み込むことが可能です。以下は、与えたフラグの内容により異なる画像(PNGファイル)を読み込むサンプルルーチンです。
UIImage *getLockImag (BOOL flag )
{
UIImage *image;
NSString *str;
if( flag&LOK_FLAG ) // ロックフラグON/OFF
str=@"Lock.png"; // 画像ファイル名
else
str=@"Unlock.png";
image=[UIImage imageNamed:str]; // 画像(UIImage)を得る
return image;
}
imageNamed:メソッドで読み込まれた画像はシステムでキャッシュされるため、再描画される時には高速に処理されます。つまり、Cocoaのルールとは異なり、このメソッドで得られたUIImageオブジェクトはAutoReleaseされません。このメソッドを使うと画像は例外なくキャッシュに入ってしまいますので、大容量の画像ファイルを読み込むことは厳禁です。間違いなくアプリケーションの使用可能メモリを圧迫します。
以下は、iPhone OSで描画できる画像フォーマットです。ただし、iPhone OSの場合は、描画システムがPNG形式の画像に最適化されているので、頻繁に描画するUIImageには、そのソースとしてPNG形式の画像を使うことが推奨されています。
・PortableNetworkGraphic(PNG) .png
・TaggedImageFileFormat(TIFF) .tiff, .tif
・JointPhotographicExpertsGroup(JPEG) .jpeg, .jpg
・GraphicInterchangeFormat(GIF) .gif
・WindowsBitmapFormat(DIB) .bmp, .BMPf
・Windowsアイコン形式 .ico
・Windowsカーソル .cur
・XWindowビットマップ .xbm
続いて、アプリケーションのDocumentsフォルダに保存されている画像ファイルの読み込みです。アプリケーション内部の作業で入手した(例えばカメラ撮影した画像など)については、もし継続して使うなら、そのままDocumentsフォルダに保存しておくことになります。以下は、拡張子を外したファイル名を与えることで、UIImageをJPEG画像ファイルとして保存するメソッドの一例です。
- (BOOL)saveJPEGImage:(UIImage *)image name: (NSString *)name
{
NSString *name,*path;
BOOL ret=NO;
NSData *data;
if( data=UIImageJPEGRepresentation( image,0.5 ) ) // 圧縮率設定しデータ作成
{
name=[name stringByAppendingString:@".jpg"];
path=getDocumentPath( name ); // 保存ファイルのパスを得る
ret=[[NSFileManager defaultManager] createFileAtPath:path
contents:data attributes:nil];
} // 指定パスにファイルを作成する
return ret;
}
ここで、画像ファイルのパス(保存場所)を得るためにgetDocumentPath()というルーチンを利用していますが、これはDocumentsフォルダ経由のファイルパスを得るための自作ルーチンです。リソースとして保存されている画像ファイルのパスについては、以前作成したsysBeep()ルーチン同様に、NSBundleクラスのpathForResource:メソッドを使えば簡単に得ることができます。
path=[[NSBundle mainBundle] pathForResource:name ofType:@"jpg"];
しかし、アプリケーションのDocumentsフォルダのパスを得るには、以下の様に少し複雑な処理が必要となります。次期バージョンのiPhone OSでは、CarbonのFindFolder()ルーチンのような便利なメソッドを用意してもらいたところですね。
NSString *getDocumentPath( NSString *name )
{
NSString *path=nil;
NSArray *paths;
NSString *dir;
paths=NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,NSUserDomainMask,YES );
// ドキュメントディレクトリーを含むリスト
if( [paths count] > 0 ) // 得られた項目が配列(NSArray)に格納される
{
dir=[paths objectAtIndex:0]; // ドキュメントディレクトリのパス
path=[dir stringByAppendingPathComponent:name];
// 画像ファイルのパスを得る
}
return path;
}
次は、拡張子を外したJPEGファイルの名前を与えることで、Documentsフォルダに保存されている画像ファイルを読み込むメソッドの一例です。
- (UIImage *)loadJPEGImage:(NSString *)name
{
NSString *str,*path;
UIImage *image;
str=[name stringByAppendingString:@".jpg"]; // 拡張子を追加する
path=getDocumentPath( str ); // 保存ファイルのパスを得る
image=[[UIImage alloc] initWithContentsOfFile:path]; // UIImageの読み込み
return image;
}
次回は、こうしてファイルから読み込んだ画像の矩形サイズを変更する処理を考えてみます。 大きなオリジナルサイズの画像をメモリーに常駐させておいては、iPhoneのメモリーがいくらあっても足りません。サムネイルサイズに小さくして活用します。
ターミナルの向こうから 第45回 海上 忍
前回、chmodコマンドとパーミッションのお話をしましたが、後から読み返してみると説明不足だった気がしてなりません。今回は補足情報として、chmodコマンドで使う8進数の話と、Tigerから導入されたACLの話をしてみます。
・「r」と「w」、「x」
前回、chmodコマンドに「+x」オプションを指定することで、ファイルに実行権限を付与できることを説明しました。このオプションは、実行権限を意味する記号(x)をファイルに与える(+)という意味で、反対に実行権限を取り去る場合は「-x」です。読み取り権限(r)、書き込み権限(w)についても同様で、権限を与える場合は「+r」および「+w」、取り去る場合は「-r」および「-w」となります。
「r」と「w」、「x」の3要素は、所有者とグループ、その他ユーザという3種類のフィールドで分けて管理されます。Mac OS Xのファイルシステム(HFS+)では、1つのファイル/フォルダに対して3要素が3種類、すなわち3×3で9の情報が必ず与えられます。
この記号は、ファインダーの情報ウインドウ下部に表示される「共有とアクセス権」、およびターミナルで「ls」コマンドを「-l」オプション付きで実行したときに表示される情報と連動しています。ただし、情報ウインドウでは「x」の情報が無視されるため、シェルスクリプトに実行権限を与える場合にはUNIXコマンドを使わざるを得ません。
・lsコマンドで確認する
実際に「ls -l」で確認してみましょう。適当なファイルを引数に与えコマンドを実行すると、以下のような情報が表示されるはずです。前述したパーミッション情報は2文字目以降に表示されるので、この場合所有者は「rw-」で読み書き可だが実行は不可、グループとその他ユーザは「r–」で読み取り以外は不可ということがわかります。ちなみに、先頭の文字は種類を意味し、「-」が通常のファイルで「d」がディレクトリ(フォルダ)、「l」がシンボリックリンクです。
- - - - -
$ ls -l 43.txt
-rw-r--r-- 1 shinobu staff 4459 3 21 15:55 43.txt
- - - - -
なお、Mac OS X 10.5ではこのパーミッション情報が拡張され、「ls -l」を実行すると11文字のパーミッションフィールドが表示されます(末尾に「@」がある場合は拡張属性付きのファイル/フォルダ)。
・謎の8進数
パーミッション情報は、人間が直感的に理解しやすい記号(r、w、x)のほかに、8進数でも表現されます。冒頭にレンタルサーバが云々と書きましたが、パーミッションに関する情報を収集していると、「パーミッションを666にせよ」といった記述を目にすることがあるかと思います。この666は悪魔の数字ではなく、その「rwx」を8進数で表現しているに過ぎません。
この8進数は、許可を「1」、拒否を「0」とした2進数で表現できます。たとえば、「rwx」は2進数で「111」、8進数に置き換えると「7」ということになります。同様に「rw-」は「6」、「r–」は「4」となります。前述した「パーミッションを666にせよ」は、「rw-rw-rw-」、つまりファイルを読み書き(実行は不可)の権限を所有者・グループ・その他ユーザに対し与える、という意味であることがわかります。
・ここでようやくACLの話
Tiger以降に収録されているchmodコマンドとlsコマンドは、ACL(Access Control List)に対応しています。ACLとは、詳細なアクセス権限管理を可能とする拡張であり、chmodコマンドでは「+a」オプション、lsコマンドでは「-e」オプションで利用できます。なお、TigerのときはfsaclctlコマンドでACLを有効にする必要がありましたが、Leopardではデフォルトで有効になっています。
- - - - -
$ chmod +a "admin allow delete" iroha.tex
$ ls -le iroha.tex
-rw-r--r--@ 1 shinobu staff 1029 5 18 2006 iroha.tex
0: group:admin allow delete
- - - - -
HFS+に限定していえば、ACLの設定はPOSIXのパーミッション情報に優先します。たとえば、管理者のみ書き込みできるファイル(所有者がroot)に対し、一般ユーザに書き込み権限を与えるACLの設定を行うことも可能です。以下の例では、管理者権限がないかぎり上書きできなかったファイルを、「shinobu」というユーザにかぎり上書きできる設定にしています。
- - - - -
$ sudo chmod +a "shinobu allow write" hostconfig
Password:
$ ls -le hostconfig
-rw-r--r--@ 1 root wheel 202 4 5 00:36 hostconfig
0: user:shinobu allow write
- - - - -
◇MOSAからのお知らせと編集後記は割愛します◇