MOSA Multi-OS Software Artists

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

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

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

2008-05-20

目次

  • 「「Wonderful Server Life」    第70回   田畑 英和
  • 小池邦人のCarbon視点でCocoa探求
  • ターミナルの向こうから      第25回  海上 忍 

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

  〜Open Directory編〜

 前回は「ディレクトリユーティリティ」を使ってクライアントコンピュータをOpen Directoryのサーバへ接続する方法と、ローカルユーザとネットワークユーザの関連付けについて解説しました。今回はOpen Directoryサーバへの接続時に行われる自動設定およびネットワークユーザとの関連付けについて解説します。

◇自動設定
 まず自動設定ですが、Open Directoryのサーバに接続するとクライアントコンピュータのメール/iChat/iCal/VPNに関する自動設定が可能です。このため、あらかじめサーバ側の準備が整っていれば各サービスをすぐに利用できるようになります。具体的にはそれぞれ次のような設定が行われます。

[メール]
 接続先のOpen Directoryサーバ上でメールサービスが稼働している場合、クライアント上ではメールのアカウント設定が自動的に行われます。このときアカウントの種類はIMAPとして設定され、IMAPの認証にはKerberosを用いることになります(SMTPは認証なし)。アカウントはローカルアカウントと関連付けたサーバ上のネットワークユーザが使用されます。
 なおメールアドレスですが、username@hostname.example.comのようにホスト名も含んだアドレスが設定されます。自動設定されるといっても、運用上問題がないか、どのようなパラメータが設定されているかを事前に一通り確認するようにしましょう。

・メールのアカウント設定画面(自動設定)
http://www.htabata.com/Site/LeopardServer/Pages/DirectoryUtility.html#28

[iChat]
 次にiChatですが、こちらもメールと同様にローカルアカウントと関連付けたネットワークユーザがJabberアカウントとして自動登録され、Kerberos認証が有効になります。つまり、同じサーバに接続しているユーザ同士であればすぐにiChatでのコミュニケーションが可能になります。

・iChatのアカウント設定画面(自動設定)
http://www.htabata.com/Site/LeopardServer/Pages/DirectoryUtility.html#24

[iCal]
 iCalサービスはLeopard Serverの新機能ですが、これもネットワークユーザを使ってアカウントが自動設定されます。認証にはやはりKerberosが利用できるように設定され、LeopardではKerberosを積極的に利用するようになってきたことが分かります。

・iCalのアカウント設定画面(自動設定)
http://www.htabata.com/Site/LeopardServer/Pages/DirectoryUtility.html#21

[VPN]
 VPNはTigerのころは「インターネット接続」を使って設定していましたが、Leopardでは「インターネット接続」が廃止され「システム環境設定」の「ネットワーク」に統合されました。自動設定ではVPNの設定も行われます。ネットワーク関連の設定は基本的にはシステム全体の設定になりますが、VPNはユーザ認証に関する設定をともない、Open Directoryへの接続時にログインしていたユーザでしか設定は有効になりません。他のユーザでもVPN接続を行うには個別に設定する必要があります。VPN接続の認証に使用するユーザはやはり関連付けを行ったネットワークユーザになります。

・VPNのアカウント設定画面(自動設定)
http://www.htabata.com/Site/LeopardServer/Pages/DirectoryUtility.html#32

 以上が自動設定の内容になりますが、自動設定を行うかどうかは設定時に選択することができます。また自動設定を行った場合、クライアントコンピュータのネットワーク設定も自動更新され、接続先のサーバがDNSサーバとして追加されます。
※サーバが詳細構成の場合、自動設定はできません。

◇ネットワークユーザとの関連付け
 ローカルユーザとネットワークユーザの関連付けは「ディレクトリユーティリティ」を使ったOpen Directoryへの接続時に設定できますが、「システム環境設定」を使って後から設定することもできます。
 Open Directoryへ接続中のクライアントコンピュータで「システム環境設定」の「アカウント」を表示すると「サーバアカウント」という設定項目が追加されているのを確認できます。「設定」ボタンをクリックしてローカルユーザのパスワードと関連付けるネットワークユーザのアカウント名およびパスワードを入力するとローカルユーザとネットワークユーザを関連付けることができます。
 「ディレクトリユーティリティ」での関連付けではログイン中のユーザに対する設定しかできませんが「システム環境設定」で関連付ければ任意のローカルユーザに対する設定ができます。さらに「システム環境設定」を使えば関連付けているネットワークユーザを確認したり、ネットワークユーザとの関連付けを解除することもできます。ただしネットワークユーザとの関連付けはサーバが詳細構成の場合は設定できませんのでご注意ください。
 「ディレクトリユーティリティ」を使ってOpen Directoryとの接続を解除した場合もネットワークユーザとの関連付けは解除されます。接続を解除した場合ですが、自動設定された内容はそのまま残るものもありますので注意してください。

・サーバアカウントの設定画面
http://www.htabata.com/Site/LeopardServer/Pages/DirectoryUtility.html#2

 それでは次回はネットワークユーザと関連付けたときのユーザ認証や、設定時にアカウント情報がどのように処理されているのかを解説します。
次回へつづく                             

小池邦人のCarbon視点でCocoa探求(2008/05/16)

〜 NSTableViewクラスを試してみる 〜

前回は、ドキュメントや画像ファイルについて実装すべき処理を列挙してみました。ただし、先んじてウィンドウに画像を表示する仕組みを作らないと、こうしたファイル処理の動作確認は困難です。今回は、登録された画像ファイルの内容をウィンドウに表示する方法について色々と考察してみたいと思います。

以前の「しんぶんし 2」では、こうした画像表示をCarbon FrameworkのDataBrowserコントロールを利用することで実現していました。用意したカラムの種類は、ファイル名とファイルの種類(OSType)の2種類のみですが、ファイル名の左側に画像アイコン表示を加えていました。しかし、このアイコン表示があまりにも小さいために(笑)一覧をざっと見て必要な画像を見極めるという役割にはあまり適していませんでした。

CocoaのAppKit FrameworkでCarbonのDataBrowserに準拠するものと言えば、そ
れはNSTableViewクラスとなります。このクラスから作成されるTableViewコントロールのカラムには、ファイル名(パス名)やファイルタイプだけでなく、画像ファイルから得られたNSImageも表示できますので、CarbonでDataBrowserを実装した時とほとんど同じ状況を再現できます。カラムに表示する画像を通常よりも大きめ(カラムの高さを変更する)にしてやれば、選択の見極めにも有効かもしれません。

NSTableViewクラスを利用することは、そんなに難しくありません。InterfaceBuilderでウィンドウ上にTableViewを配置して各種アトリビュート設定を行う点は、CarbonのDataBrowserの場合とほとんど同じです。DataBrowserの場合には、コールバックルーチン経由でカラムに表示するデータ(文字列など)を渡します。また、選択カラムが変更された情報や、カラムがダブルクリックされた時のイベントなどもコールバックルーチンで受け取る仕組みが用意されています。例えば、以下の様なソースコードを記述することで、DataBrowserにそうしたコールバックルーチンを設定してやります。

OSErr setupDataBrowser( ControlRef browser )
{
   OSErr                    err=1;
   DataBrowserCallbacks    call;

   call.version=kDataBrowserLatestCallbacks;
   if( ! InitDataBrowserCallbacks( &call ) )
   {
       call.u.v1.itemDataCallback=setgetDataBrowser; // データの入出力
       call.u.v1.itemNotificationCallback=notifiDataBrowser; // イベント受信
       SetDataBrowserCallbacks( browser,&call ); // コールバックルーチン設定
       err=noErr;
   }
   return( err );
}


setgetDataBrowserの方が、DataBrowserに表示用のデータを渡す(もしくはBrowser側で編集されたデータを受け取る)コールバックルーチンです。
notifiDataBrowserの方は、DataBrowser上で発生したイベント情報(マウスクリックによるカラム選択など)を受け取るコールバックルーチンです。DataBrowserのカラムに、パス名やファイルタイプを表示するだけであれば(内容の編集しない)、setgetDataBrowserコールバックルーチンは以下の様な感じとなります。ここでのgetMyData()ルーチンは、指定行番号のデータを得るための自作ルーチンです。

OSStatus setgetDataBrowser( ControlRef browser,DataBrowserItemID itemID,
         DataBrowserPropertyID property,DataBrowserItemDataRef itemData,
         Boolean changeValue )
{
   CFStringRef    path,type;
   short            err=noErr;

   if( ! changeValue )
   {
       if( itemID )
           getMyData( itemID-1,&path,&type ); // 指定行番号のデータを得る
       switch( property )
       {
           case 'path': //  パス名の表示

               SetDataBrowserItemDataText( itemData,path );
               break;

           case 'type': //  タイプ名の表示

               SetDataBrowserItemDataText( itemData,type );
               break;
       }
   }
   return( err );
}


表示対象の切り分けに使われるproperty値(DataBrowserPropertyID)は、Interface Builderで各カラムに対し設定しておいたOSType値です。ちなみに、Interface Builder 3では、DataBrowserの各種設定が非常に設定しづらく改悪されています(涙)何とかして欲しいと思うのですが…今回はとりあえず横に置いといて、notifiDataBrowserコールバックルーチンの例も見てみることにします。

void noteDataBrowserMosa( ControlRef browser,
           DataBrowserItemID itemID,DataBrowserItemNotification message )
{
   DataBrowserItemID    item;
   WindowRef            wptr;

   wptr=GetControlOwner( browser ); //  ブラウザを配置したウィンドウ
   switch( message )
   {
       case kDataBrowserSelectionSetChanged:

           //  ここにカラムが選択された時の処理を記述する
           break;

       case kDataBrowserItemDoubleClicked

           //  ここにカラムがダブルクリックされた時の処理を記述する
           break;
   }
}


TableViewを使う時も、これらのコールバックルーチンと同様の役割(完全に同等ではない)を持つメソッドを実装する必要があります。TableViewへのデータ入出力については、dataSource(データソース)として選んだクラスに指定メソッドを実装しておきます。TableViewに対するイベントに対しては、delegate(デリゲート)として選んだクラスに必要なメソッドを実装します。例えば「しんぶんし 3」用の「Cocoa Document-based」プロジェクトであれば、とりえあず、NSDocumentを継承したMyDocumentクラスをdataSourceやdelegateとして指定すれば大丈夫です。

TableViewのOutlet(アウトレット)として用意されているdataSourceとdelegateのリンク先は、他のアウトレット同様、Interface Builderにより線で接続することで設定します。TableViewを選択し、Inspector(インスペクタ)の「Table View Connection」の「Outlet」に表示されている、dataSourceとdelegateを好みのオブジェクト(青い立方体)へと接続します。
先ほど言及したMyDocumentであれば「File’s Owner」に接続することになります。どんな目的に対して、どのような種類のdataSourceやdelegateメソッドがあるかについては、技術ドキュメント「Table View Programming Guide」や、ヘッダファイルの「NSTableView.h」を参照してください。まずは、最小限必要なふたつのdataSourceメソッドを紹介しておきます。これらは、表示すべき行の総数を返すメソッドと、その行番号へ表示する内容(オブジェクト)を返すメソッドです。

- (int)numberOfRowsInTableView:(NSTableView *)aTableView
{
   return [array count];   // テーブルが表示する全行数を返す
}

(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTbableColumn row:(int)rowIndex
{
   ImageFile    *image;
   NSString    *ident;

   ident=[aTbableColumn identifier];    // 表示対象となるカラムのキーを得る
   image=[list objectAtIndex:rowIndex]; //  配列から対象行のオブジェクトを得る
   return [image valueForKey:ident];    //  キーから得た表示用 プロパティを渡す
}


続いて、delegateメソッドであるtableViewSelectionIsChanging:を紹介しておきます。このメソッドは、ユーザにより選択カラムが変更された時に呼び出されます。delegateメソッドの方は、そのアプリケーションがどんな機能を実現したいかにより、実装すべき種類が大きく変わります。

- (void)tableViewSelectionIsChanging:(NSNotification *)aNotification
{
   long    row;

   row=[table selectedRow];  //  選択された行番号(ゼロ以上)
   if( row>=0 )
   {
       //  ここには選択カラムの内容を利用する処理を記述する
       //  例えば別のTextFieldに選択内容を代入するなど...
   }
}


今回は、データ表示にdataSourceメソッドを使う方法を解説しましたが、TableViewでデータ表示する場合には、Mac OS X 10.3から導入された「Cocoa Binding」の仕組みを使うと便利です。この場合には、上記のようなdataSourceメソッドを用意することなく、データ(オブジェクト)のプロパティ値(インスタンス変数)をカラムに表示できます。 ただし、こちらの仕組みについては説明すべき技術項目が膨大ですので、機会があれば、別途「Cocoa Binding」に特化した解説を行いたいと思います。

さて、試しにTableViewを利用して領域を広げたカラムに画像(NSImage)を表示してみると、それなりに使えることが分かりました。しかし、画像に付随したパス名などが横の矩形枠の中に小さく表示され、間の抜けた感じが拭えません。やはり、TableViewは画像中心の一覧表示には向いているとは言い難いようです。画像と、それに付随する情報を美しく一覧表示するのには、何か別の「ブラウザ機能」を採用した方が良さそうです。

そこで次回は、TableViewの代わりに、Mac OS X 10.5から採用された「ImageKit」のIKImageBrowserView(画像ブラウザ機能)クラスを利用してみます。ImageBrowserと名称が付いているわけですから、今回の様な役割にはもってこいだと予想されますが、さてどうなるでしょうか?
つづく
                                

ターミナルの向こうから      第25回  海上 忍

〜  番外編:LeopardのRubyを入れ替える(irbで日本語を!)〜

 前回は、Rubyを利用した日本語文字コードの変換について説明しました。今回は、RubyCocoaを利用して多少見栄えのいいものを……と考えていましたが、途中から脱線気味の内容となっています。とはいえ、irbで日本語入力できない問題が解決しますので、Leopardユーザには有用かと思います。

・まずは「CocoaRepl」の準備
 今回の作業には、Developer Tools付属の「CocoaRepl」を使用します。RubyCocoaを活用したプログラミングの体系的な話については、藤本尚邦さんの連載「りんご味Ruby」のバックナンバー、またはマイコミジャーナルの特集(http://journal.mycom.co.jp/articles/2007/07/27/WelcomeToRubyCocoa/index.html)が参考になることでしょう。
 CocoaReplはソースコードのみ収録されているため、利用に際してはコンパイルが必要です。Developer→Examples→Ruby→RubyCocoa以下にある「CocoaRepl」フォルダを開き、Xcodeのプロジェクトファイル(CocoaRepl.xcodeproj)をオープン、ツールバー上の「ビルドして進行」ボタンをクリックすれば、ビルドからCocoaReplの起動までを処理できます。
 このCocoaReplは、RubyCocoaの機能を対話形式で利用できる、藤本さんの手によるRubyCocoaのインタープリタです。コンパイル・リンクなしに実行結果をその場で確認できるため、プロトタイプにも至らない”叩き台”のようなコードを試すには最適なツールといえます。文字媒体のMOSA伝ではお伝えしにくいUIデザインのような要素を省いた、文字変換ツールのコア部分をこのCocoaReplで作成してみよう、というわけです。

・CocoaReplの基本的な使い方
 CocoaReplの画面は、上段(スクラッチビュー)がコード入力用、下段が結果出力用という設定が基本です。スクラッチビューにRubyのコードを入力し、下段で確認しつつ作業を進めることになりますが、コードを実行するときには行末で[command]-[enter]を押すこと(またはメニューバーから[Ruby]→[Eval Line]を実行)に注意してください。単純に[enter]を押すだけでは、コードは実行されません。
 それでは、以下のコードを1行ずつ(各行末で[command]-[enter])実行してください。最後の行を実行したとき、変数mojiに格納した文字列の文字コード(UTF-8)を意味する「6」が、画面下段に戻り値として表示されるはずです。

- - - - -
require 'kconv'
moji = "日本語"
Kconv.guess(moji)
- - - - -


・Rubyのインストールでirbが日本語レディに
 前回から気になっていたのですが、Leopardに付属のirbは、日本語入力に対応しない困った仕様です。その原因はRuby / irbサイドにあるのではなく、文字入力用ライブラリ「GNU readline」が適切に使用されていないことが原因です。CocoaReplもよくできていますが、この際Ruby / irbを入れ替えてしまったほうがいいのでは、と最新のRubyをインストールすることにしました。以下のコマンドラインをターミナルにコピー&ペーストするだけで作業は完了するはずですので、よろしければお使いください。

- - - - -
・GNU Readline 5.2
$ curl -O http://ftp.iij.ad.jp/pub/GNU/readline/readline-5.2.tar.gz
$ tar xzf readline-5.2.tar.gz
$ cd readline-5.2
$ ./configure --disable-static
$ perl -i -pe "s/darwin [78 ]/darwin [789 ]/g" support/shobj-conf
$ ./configure --disable-static
$ make
$ sudo make install
- - - - -


- - - - -
・Ruby 1.8.6-p114
$ curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p114.tar.bz2
$ tar xjf ruby-1.8.6-p114.tar.bz2
$ cd ruby-1.8.6-p114
$ ./configure --with-readline-dir=/usr/local --enable-shared
$ make
$ sudo make install
- - - - -

 上記の手順に従った場合、Rubyは/usr/localディレクトリ以下にインストールされるので、それに対応したRubyCocoaも必要です。RubyCocoaのソースコードは、こちら(http://rubycocoa.sourceforge.net/)から入手してください。脱線ついでに、次回もreadlineおよびirb周辺のトピックを取り上げたいと思います。

- - - - -
$ tar xzf RubyCocoa-0.13.2.tgz
$ cd RubyCocoa-0.13.2
$ /usr/local/bin/ruby install.rb config --prefix=/usr/local
$ /usr/local/bin/ruby install.rb setup
$ sudo /usr/local/bin/ruby install.rb install
- - - - -

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

 

 MOSA Developer News   略称[MOSADeN=モサ伝]
        配信停止 mailto:mosaden-ml@mosa.gr.jp
 記事内容に関するご意見 mailto:mosaden-toukou@mosa.gr.jp
      記事投稿受付 http://www.mosa.gr.jp/?page_id=850
Apple、Mac OSは米国アップル社の登録商標です。またそのほかの各製品名等
はそれぞれ各社の商標ならびに登録商標です。
このメールの再配信、および掲載された記事の無断転載を禁じます。
特定非営利活動法人MOSA  http://www.mosa.gr.jp/
Copyright (C)2007 MOSA. All rights reserved.