2008-06-03
目次
「Wonderful Server Life」 第71回 田畑 英和
〜Open Directory編〜
前回までOpen Directoryへの接続方法や設定内容について解説してきましたが、今回はさらに掘り下げてどのような処理が内部的に行われているかをみていきたいと思います。いったいなにが行われているのかを理解しておくことはトラブルシューティングなどにも役に立ちます。
◇ユーザ認証
「ディレクトリユーティリティ」でOpen Directoryへの接続を行う時にネットワークユーザとの関連付けおよびアプリケーションの自動設定を行うと、設定後にログアウトを求められます。
アプリケーションの自動設定時にメール/iCal/iChatにアカウントが自動登録され、シングルサインオンを実現するKerberos認証が設定されることは前回解説しましたが、設定後に再ログインすると接続したOpen DirectoryサーバからKerberosのチケットを自動的に取得します。チケットとはKerberosにおける認証情報のことですが、「/システム/ライブラリ/CoreServices/Kerberos」を使って取得済みのチケットを確認できます。
・Kerberosのチケット(TGT)の確認
http://www.htabata.com/Site/LeopardServer/Pages/DirectoryUtility.html#26
このときKerberos認証は設定時に関連付けたネットワークユーザに対して、サーバ上で行われますが、関連付けたネットワークユーザのパスワードはローカルユーザのパスワードと同期していますので、ローカルユーザとしてログインすればKerberos認証が行われます。
つまり、ローカルユーザでログインするだけでKerberosによるシングルサインオンが有効な状態になっているということです。シングルサインオンが有効になると、あらかじめKerberos認証を使うように自動設定されていたメール/iCal/iChatではパスワードを入力することなく各サービスを利用することができます。さらにサーバ上のAFPサービスもKerberos対応していますので、他のKerberos対応サービスでもシングルサインオンが可能になります。ファイルAFPサービスへのアクセスには関連付けたネットワークユーザが用いられます。他のユーザとしてアクセスしたい場合には、サイドバーからサーバに接続することで任意のユーザとしてアクセスできます。
・各サービスにアクセスしたときのKerberosチケット
http://www.htabata.com/Site/LeopardServer/Pages/DirectoryUtility.html#27
◇ネットワークユーザとの関連付け
ではなぜローカルユーザでログインすると、サーバ上のネットワークユーザでKerberos認証ができるのでしょうか。ローカルユーザのアカウントの情報を詳しくみてみるとその仕組みが分かります。
ユーザアカウントにはユーザ名やユーザIDなど様々な属性がありますが、その中には認証方式を設定するための属性(AuthenticationAuthority)もあります。ローカルユーザはデフォルトの状態で認証方式としてシャドウパスワード(ShadowHash)が設定されており、認証はクライアント上で行われます。さらにLeopardからはサーバ上だけでなくクライアント上でもKerberosが用いられていますので、ローカルのKerberosも認証方式のユーザ属性として設定されています。
ネットワークユーザとの関連付けを行うと、ローカルユーザの認証方式が自動的に変更され、サーバ上でのKerberos認証が可能になるのです。ネットワークユーザと関連付けたローカルユーザのユーザレコードを確認すると認証方式として、次の2つが設定されていることを確認できます。
・認証方式
- LocalCachedUser
- Kerberosv5
まず1つ目のLocalCachedUserですが、この属性を参照すればサーバ上のどのユーザと関連付けを行ったかが分かります。そして2つ目のKerberosv5ではサーバ上のネットワークユーザによるKerberos認証が設定されています。
・認証方式(LocalCachedUser)のパラメータの例
http://www.htabata.com/Site/LeopardServer/Pages/DirectoryUtility.html#4
このようにローカルユーザの認証方式を変更することによってローカルユーザを使いつつ、サーバ上のネットワークユーザを使ったKerberosによるシングルサインオンを実現しているわけです。シングルサインオンを実現するのであれば、サーバ上のネットワークユーザを直接使用するという従来の方法ももちろんあるわけですが、この場合ネットワークホームの運用なども別途考慮しなければなりません。
ところが、ネットワークユーザとの関連付けというLeopardでの新機能を使うことによって、今までどおり既存のローカルユーザを使いつつ、さらに簡単な設定を行うだけでサーバのサービスも効率的に使えるようになるというわけです。ユーザごとに使用する端末が固定しているような環境では有効な方法となるでしょう。
さて、これまで主に基本構成のLeopard Serverを中心に解説をしてきましたが、次回はからは「サーバ管理」を使った各種サービスの管理について解説していく予定です。
次回へつづく
小池邦人のCarbon視点でCocoa探求(2008/05/30)
〜 Image Kitで可能なことは何か? 〜
前回では、TableViewの代わりに「Image Kit」のIKImageBrowserView(画像ブラウザ機能)クラスを使うことに決めました。ImageBrowserと名称が付いているわけですから、画像のリストアップには最適ではないかと思うのですが、さてどうなのでしょうか?
ImageBrowserの機能を実際に使ってみる前に、せっかくですのでImage Kitを使うと何が可能なのかを調べてみましょう。まず注意すべきは、Image KitはLeopard(Mac OS X 10.5)以降でないと使用できない点です。今回開発しているアプリケーションの利用環境はMac OS X 10.5以上と設定しているので問題ありませんが、それより下位バージョンのMac OS Xも動作環境に想定されていると、残念ながらImage Kitを利用することはできません。Image Kitは「PDF
Kit」や「QuartzComposer」と同様に、Quartz Frameworkに含まれています。そのクラス(ヘッダファイル)の先頭には「IK」という接頭語が付きますので、他のクラスと簡単に区別することができます。
Cocoaで画像関連のアプリケーションを開発する場合、NSImageやNSBezierPathといったCocoaネイティブの描画機能に加え、Quartz 2D、OpenGL、ImageI/O、Core Image、Core Animation、QuartzComposerといった強力なグラフィックス関連のFrameworkを利用することができます。しかし、アプリケーションの目的に応じてこれらのAPIを使いこなす事は、数多くの技術習得という意味も含め、かなり大きな労力を必要とします。そこで、グラフィックス関連で頻繁に使われる典型的な機能(ユーザ操作)を、Cocoaアプリケーションで容易に実現するためにImage Kitが提供されています。これは、QuickTime技術の習得が大変困難なのをカバーするために、より簡易的でCocoaとの親和性が高い「QTKit」が用意されているのと同じ理由です。
そう言う意味では、Image KitはMac OS Xのグラフィック能力を十二分に生かせるよう、よりローレベルのFrameworkの能力をフル活用してくれます。 Image Kitの基本的な利用方法を解説した技術ドキュメントは「Image Kit Programming Guide」です。 各クラスのメソッド等の一覧については「Image Kit Reference Collection」の方を参照してみてください。
「Image Kit Programming Guide」
http://developer.apple.com/documentation/GraphicsImaging/Conceptual/ImageKitProgrammingGuide/Introduction/chapter_1_section_1.html
「Image Kit Reference Collection」
http://developer.apple.com/documentation/GraphicsImaging/Reference/ImageKitReferenceCollection/ImageKitReferenceCollection.pdf
Image Kitの各機能は対応するクラスに分かれ実装されていますので、まずはそれらを簡単に紹介したいと思います。各クラス定義は、Image Kitのヘッダファイルと一対一で対応していますので、その内容を参照すればさらに理解が深まると思います。
・ IKImageViewクラス
IKImageViewはNSViewのサブクラスとして実装されており、画像イメージの表示とその編集を行うことができます。「プレビュー」アプリケーションで利用されている数多くの機能が取り込まれており、このクラスを用いることで簡単に画像ビューアを作成できます。サンプルソースコードとしては「IKImageViewDemo」というビューアのデモがあったのですが、幾つかのバグのためか、現在はデベロッパサイトから削除されています。
・ IKImageEditPanelクラス
画像イメージのカラーやガンマ、エフェクトを編集するためのパネルを表示することができます。 このパネルは「プレビュー」アプリケーションで表示されるカラー調整パネルとよく似ています。
・ IKImageBrowserViewクラス
「しんぶんし3」で実装する予定のクラスです。複数の画像を表示、選択するためのブラウザ機能を提供します。 Apple社のデベロッパーサイトに、サンプルソースコードとして「ImageBrowser」が用意されています。
http://developer.apple.com/samplecode/ImageBrowser/
・IKSlideshowクラス
「Quick Look」で実行できる画像スライドショーとまったく同じスライドショーを実行することが可能となります。Apple社のデベロッパーサイトに、サンプルソースコードとして「IKSlideshowDemo」が用意されています。
http://developer.apple.com/samplecode/IKSlideshowDemo/
・ IKPictureTakerクラス
iSightやデジタルカメラから画像(サムネイル)を取り込むことが可能です。画像にはエフェクトも加えられます。Apple社のデベロッパーサイトに、サンプルソースコードとして「PictureTaker」が用意されています。
http://developer.apple.com/samplecode/PictureTaker/
・ IKSaveOptionsクラス
IKImageEditPanelクラスと同時に用い、画像保存時にフォーマットとオプションの設定を行います。画像ファイルに対して保存用ダイアログ(シート)を表示した時に、ポップアップメニューから画像の種類とオプション(圧縮率や圧縮の種類など)を選択することが可能です。
それ以外にも、Core Imageの機能を補完するための(Core Imageフィルタをさらに活用しやすくする)機能を幾つか有しています。Core Imageのフィルタ用ブラウザとしては IKFilterBrowserViewクラスとIKFilterBrowserPanelクラスが、フィルタのパラメータ編集用としてはIKFilterUIViewクラスが用意されています。
例えば、アプリケーションパッケージ内のResourcesフォルダからimage.jpgファイルを読み込んでKImageViewに表示させるには、おおよそ以下のようなソースコードを記述すればOKです。
IBOutlet IKImageView *imageView; // Interface Builderから
NSDictionary *imageProperties; // インスタンス変数
- (void)awakeFromNib
{
CGImageRef image=NULL
NSString *path=[[NSBundle mainBundle] pathForResource: @"image"
ofType: @"jpg"];
NSURL *url=[NSURL fileURLWithPath: path];
image=CGImageSourceCreateImageAtIndex(isr, 0, NULL); //画像を読み込み
imageProperties=(NSDictionary*)CGImageSourceCopyPropertiesAtIndex(isr,
0,(CFDictionaryRef)imageProperties);
[imageView setImage: image imageProperties: _imageProperties];
// 画像と画像のプロパティを設定
[imageView setDoubleClickOpensImageEditPanel: YES];
// 色々なオプションを設定
[imageView setCurrentToolMode: IKToolModeMove];
[imageView zoomImageToFit: self];
[imageView setDelegate: self];
}
次は、 IKSlideshowクラスを用いてスライドショーを実行する場合です。スライドショーの開始ソースコードは、以下ような記述となります。
- (IBAction)start: (id)sender
{
[[IKSlideshow sharedSlideshow] runSlideshowWithDataSource:
(id
後は、IKSlideshowDataSourceプロトコルに準拠したクラス(今回はself)を用意して slideshowItemAtIndex:メソッドで渡されるインデクス値(順番)で選択した指定オブジェクト(画像ファイルへのパスなど)を返せば、その内容を表示してくれます。
-(id)slideshowItemAtIndex: (NSUInteger)index
{
NSString *path;
// ここでインデックス値(順番)に相当する画像ファイルのパスを得る
return path;
}
スライドショーの終了ソースコードは、以下のような記述となります。
(void)stopSlideshow: (id)sender
{
[[IKSlideshow sharedSlideshow] stopSlideshow: self];
}
上記の例のように 、Imege Kitを利用すれば、割と簡単な記述のみで画像ファイルに対する高度な操作が実装できることが理解できます。次回は、実際に「しんぶんし3」にIKImageBrowserViewクラスを実装してみることにしましょう。
つづく
ターミナルの向こうから 第26回 海上 忍
〜 番外編(2):irbの環境整備〜
前回は、マルチバイト文字対応のGNU readlineを利用するよう再コンパイルした「irb」をインストールしましたが、そのままではデフォルト(/usr/bin/irb)と挙動が異なります。それでは困る、というirb遣いの方もいらっしゃるはずですから、デフォルトと同じかそれ以上に使いやすいよう、日本語環境向けにカスタマイズする方法を紹介してみましょう。
・irbで日本語を扱うときの基本
前回紹介した方法でインストールしたirbは、「ことえり」などのIMEを利用した日本語入力が可能です。従来どおりターミナルから「irb」と実行すれば、インタラクティブモードに移行しても文字化けすることなく、IMEを使い日本語を入力できます。
しかし、そのままでは、変数や配列に日本語を含む文字列を代入した場合、バイト列として扱われ、非ASCII文字は8進数で表示されます。これはirbが結果出力にinspectメソッド(デバッグ用出力)を利用するためで、漢字コードが未設定のときにこのような結果となります。
- - - - -
$ irb
irb(main):001:0> print ("モサ伝")
モサ伝=> nil
irb(main):002:0> moji = "モサ伝"
=> " 343 203 242 343 202 265 344 274 235"
- - - - -
このような結果を回避する方法はいくつかありますが、漢字コードを設定することが基本です。ターミナルの文字エンコーディング形式にあわせ、UTF-8を設定しておけばいいでしょう。UTF-8を漢字コードに設定する場合、「irb -Ku」として起動するか、環境変数RUBYOPTに「-Ku」をセットします。irb上で行う場合は、「KCODE=’u'」と実行すればいいでしょう。
なお、「irb –noinspect」として起動すれば、値が文字列の場合にはそのまま、文字列以外の場合にはto_sメソッドで文字列に変換したうえで出力されます。
- - - - -
$ irb -Ku
または
$ export RUBYOPT=-Ku
$ irb
または(irb実行中に)
irb(main):001:0> KCODE='u'
- - - - -
ターミナルを起動するたび環境変数を定義する手間を省きたい場合には、シェルのログインスクリプト(~/.bash_profileや~/.bashrcなど) に「export RUBYOPT=-Ku」の記述を追加します。LANG環境変数もUTF-8に一致させる必要があるので、最低限以下の内容があればいいでしょう。なお、先頭が「.」で始まるファイルは、Finderでは非表示属性となることをお忘れなく、
- - - - -
export PATH=/usr/local/bin:/usr/X11R6/bin:$PATH
export LANG=ja_JP.UTF-8
export RUBYOPT=-Ku
・
・
- - - - -
これで、支障なくirbで日本語を扱うことができるはずです。ファイルをオープンするときなど、irbで作業するときも日本語文字列を使う機会は少なくないため、意外に重宝するのではないかと思います。
- - - - -
$ irb
irb(main):001:0> p "日本語"
"日本語"
=> nil
irb(main):002:0> dummy = ["モサ伝","原稿"]
=> ["モサ伝", "原稿"]
- - - - -
・irbカスタマイズの基本
irbは、起動時に初期化ファイルの有無を確認し、存在すれば読み込みます。確認の順序は以下のとおりで、存在しなければシステム標準の設定が適用されます。Mac OS Xの場合、1に挙げた「~/.irbrc」に設定を記述することが、もっともオーソドックスな方法です。
- - - - -
1. ~/.irbrc (ホームフォルダ上の「.irbrc」)
2. .irbrc (カレントディレクトリ上の「.irbrc」)
3. irb_rc
4. _irbrc
5. $irbrc (環境変数)
- - - - -
「~/.irbrc」には、irbコマンドのオプションに相当する情報を記述します。Rubyスクリプトですので、「require “****”」といったライブラリを読み込むための命令も記述しておくことができます。たとえば、以下の行を記述しておくと、デフォルトで入力補完機能が有効になり、TABキーを押すことで構文要素やメソッド、クラスの候補が画面に現れます。
- - - - -
require "irb/completion"
- - - - -
オプションを設定する場合は、以下の要領で記述を行います。この場合、irbで実行した命令の履歴(カーソルキーで遡ることができる)を最大100行に、自動インデント機能をONにしています。
- - - - -
IRB.conf[:SAVE_HISTORY] = 100
IRB.conf[:AUTO_INDENT] = true
- - - - -
◇MOSAからのお知らせと編集後記は割愛します◇