MOSA Multi-OS Software Artists

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

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

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

2008-03-25

目次

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

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

  〜Open Directory編〜

 「サーバ環境設定」によるアカウント管理のグループ編です。「サーバ環境設定」を起動し「アカウント」の「グループ」を選択するとグループアカウントの管理ができます。前々回の連載で解説しましたように「システム環境設定」でもグループ(ローカルグループ)の管理ができるようになりましたが、「システム環境設定」ではネットワークグループの管理を行います。
 といいましても、機能的にはいたってシンプルですので「システム環境設定」でグループの管理ができるのであれば、「サーバ環境設定」でも特に問題なく管理ができるでしょう。
 「システム環境設定」の「グループ」画面を表示するとまずは、画面の左側に登録済みのグループのリストが表示されます。前回解説しましたように、「Workgroup」グループがあらかじめ登録されています。「システム環境設定」で登録したユーザは、このグループのメンバーとして設定されていることが確認できます。

◇グループの登録と削除
 まずはグループの登録ですが、ユーザの登録とよく似ています。画面左下の「+」ボタンをクリックし、次の2つのグループアカウントの属性を設定します。

グループアカウントの属性
 ・グループ名
 ・ユーザ名

 グループなのに「ユーザ名」となっているのですが、これはたんにリソースの翻訳上の問題です。英語環境で「システム環境設定」を起動してみると分かるのですが、「Short Name」が英語環境での表記です。ユーザ/グループに関わらずShort Nameをユーザ名と訳してしまっているのですね。
 「グループ名」は日本語の入力が可能ですが、「ユーザ名」に日本語を入力することはできません。またユーザアカウントと同様に、グループアカウントでも登録後は「システム環境設定」から「ユーザ名」を変更することは出来ません。ちゃんと名前を決めてからグループを登録しましょう。「グループ名」のほうは後からでも変更は可能です。
 グループを登録すると自動的に「/グループ」フォルダ内にグループのユーザ名でグループフォルダが作成されます。グループ名が「sample」の場合にはグループフォルダのパスは「/グループ/sample/」なります。さらに画面左側のグループリストには各グループのメンバー数が表示されます。

 次にグループの削除方法ですが、左側のグループリストから削除するグループアカウントを選択し、左下の「ー」ボタンをクリックします。

◇グループ設定
 「システム環境設定」の「グループ」画面は、さらに「グループ設定」と「メンバー」の2画面から構成されています。それでは「グループ設定」からみていきましょう。

 「グループ設定」ではまず「グループ名」と「ユーザ名」の確認ができます。先ほど申し上げたように「グループ名」は後から変更可能です。ただし、他のグループと同じ名前を設定することはできません。
 あとはグループサービスとして次の項目のリンクが表示されます。

グループサービス
 ・ファイル共有フォルダ
 ・メーリングリスト
 ・Wikiとブログ
 ・Webカレンダー
 ・メーリングリストのWebアーカイブ

 これらのリンクが機能するにはあらかじめサービスの設定が必要なものもありますが、それぞれ次のようになっています。
 まず「ファイル共有フォルダ」ですが、グループ登録時に作成されたグループフォルダをFinder上で表示します。「メーリングリスト」は「メール」アプリケーションを起動しグループ宛の新規メッセージを作成します。グループ宛のメールアドレスは次のようになります。

・グループ宛のメールアドレス
 グループのユーザ名@ホスト名

 server.example.com上のsampleグループであれば、このグループ宛のメールアドレスはsample@server.example.comになり、メールを送信すればグループの各メンバーにメールが送られます。
 あとの3つはそれぞれLeopard Serverで新しく導入されたWikiの各画面へのアクセスになります。WikiですのであらかじめWebサービスが正しく設定されサービスが有効になっている必要があります。

・「グループ設定」画面
http://www.htabata.com/Site/LeopardServer/Pages/Server_Preferences%28Standard%29.html#10

◇メンバー
 「メンバー」画面ではその名前のとおり各グループのメンバー設定を行います。「メンバーシップを編集」ボタンをクリックすると登録済みネットワークユーザの一覧が表示されますので、グループのメンバーに加えるユーザをチェックします。逆にメンバーから外す場合にはチェックを外します。メンバーの編集が終われば最後にもう一度「メンバーシップを編集」ボタンをクリックします。

・「メンバー」画面
http://www.htabata.com/Site/LeopardServer/Pages/Server_Preferences%28Standard%29.html#13

 以上が「システム環境設定」でのグループアカウントの管理になります。これで「システム環境設定」を使ったアカウント管理については一通り解説したことになりますが、サーバ構成を「ワークグループ」にした場合にはここにさらに機能が追加されますので、次回はそちらの機能について解説したいと思います。
次回へつづく                             

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

〜 NSDocumentメソッドのオーバライド 〜

今回は、MyDocument.mでオーバライドすべきNSDocumentメソッドの内容を解説します。こうしたメソッド(候補)は、「Cocoa Document-based Application」プロジェクトを新規作成した時点で、最初から5つだけ記述されています。

(1)- (id)init

initは、MyDocumentの初期化メソッドです。MyDocumentのインスタンスが作成される時に何か独自の初期化が必要であれば、このメソッドをオーバライドします。本アプリケーションでは、画像ファイルのパス名などを「ImageFile」オブジェクトに保存することになります。その配列を保管しているNSMutableArrayは、MyDocumentのインスタンス変数(_list)ですので、最初にそれを作成して初期化する必要があります。

@interface MyDocument : NSDocument
{
   NSMutableArray    *_list;
}
@end


後々、MyDocumentのインスタンス変数の種類は増えるかもしれませんが、とりあえず今回のinitは以下のようになります。

- (id)init
{
   if( self=[super init] )
       _list=[[NSMutableArray alloc] init];    // NSMutableArrayの作成と初期化
   return self;
}


独自の初期化をする前に、スーパークラス(今回はNSDocument)の初期化を実行することを忘れないでください。

(2)- (NSString *)windowNibName

windowNibNameメソッドでは、ドキュメント表示用のウィンドウ・オブジェクトが保存されているnibファイルの名称を返します。今回のNibファイルは、MyDocument.nibですので、このメソッドは以下のようになります。これにより、NSDocumentがnibファイルを読み込み適切なウィンドウを作成してくれます。

- (NSString *)windowNibName
{
   return @"MyDocument";
}


ドキュメントの内容をひとつのウィンドウに表示するだけなら上記処理で問題無いのですが、アプリケーションによっては、ドキュメントの内容を複数のウィンドウに表示したい時があります。この場合には、上記メソッドのオーバライドではなく、代わりに以下のmakeWindowControllersメソッドをオーバライドします。

(void)makeWindowControllers;


通常では、このメソッドがwindowNibNameメソッドを呼んでいるわけで。しかし、直接こちらを用いる場合には、アバウトを表示する時に利用したNSWindowControllerクラスのinitWithWindowNibName:メソッドなどを使い、nibファイルからウィンドウを呼び出し、そのWindowControllerをaddWindowController:メソッドでNSDocumentオブジェクトに登録する必要があります。よって、そこでの処理は若干複雑となります。

(3)- (void)windowControllerDidLoadNib:(NSWindowController *) aController

windowControllerDidLoadNib:メソッドは、ドキュメント内容を表示するウィンドウが作成された直後に呼ばれます。ここでは、ウィンドウ、もしくはWindowControllerに必要とされる独自初期化(読み込んだドキュメントのデータをビューに表示するなど)を実行することになります。こちらも、先んじてスーパークラス側のメソッドを呼び出すことを忘れないでください。

- (void)windowControllerDidLoadNib:(NSWindowController *) aController
{
   [super windowControllerDidLoadNib:aController];
   [[aController window] center];    // Windowをスクリーンの中心に表示する
}


今回は、ウィンドウに関する初期化処理は何もありませんが(まだデータ内容の表示については何も準備されていないので)、例題としてウィンドウを強制的にスクリーンの中心に移動させる処理を追加してみました。

(4)- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError

次のdataOfType:error:メソッドには、ドキュメント内容をファイルに書き出すために、それをバイナリデータ(NSData)に変換する処理を実装します。新規ドキュメントであれば、このメソッドが呼ばれる前にファイル名入力ダイアログが表示され、ユーザが保存場所と名称を入力していることになります。typeNameには、書き出すべきファイルタイプが入ってきますが、今回は対象ドキュメントが一種類だけなので(info.plistの登録されている)、何かを判断するためにそれをチェックする必要はありません。

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
{
    NSData    *data=nil;

   if( data=[NSArchiver archivedDataWithRootObject:_list] ) //バイナリーデータ作成
       return data;
   else
   {
       if( outError!= NULL )
           *outError=[NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr
                                                                     userInfo:NULL];
   }
   return data;
}


バイナリーデータは、NSArchiverのメソッドである
archivedDataWithRootObject:に対象となるNSMutableArrayを渡して作成しています。このメソッドから返されたバイナリーデータを、NSDocumentが責任をもってファイルへと保存するわけです。

古いCocoaの解説書の中には、dataOfType:error:の代わりに
dataRepresentationOfType:メソッドが紹介されている場合があります。それを含め、Mac OS X 10.4から、いくつかのNSDocumentメソッドがDEPRECATED宣言(推奨しない)されました。ただし、アプリケーションのターゲット環境にMac OS X 10.3以前が含まれる場合には(今回は違う)dataOfType:error:でなくdataRepresentationOfType:の方をオーバライドする必要がありますので、注意してください。

(5)- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName
                                             error:(NSError **)outError

最後の、readFromData:ofType:error:メソッドはdataOfType:error:の逆で、ファイルから読み込まれたバイナリーデータ(NSData)からドキュメント内容(NSMutableArray)を構築します。つまり、このメソッドが呼ばれる前にはファイル選択ダイアログが表示され、ユーザが対象ファイルを選び、NSDocumentがそのファイルのバイナリーデータを読み込んでくれているわけです。

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName
                                       error:(NSError **)outError
{
   BOOL                    ret=NO;
   NSMutableArray    *array;

   if( array=[NSUnarchiver unarchiveObjectWithData:data] ) // データからArrayを得る

   {
       [_list addObjectsFromArray:array]; //  インスタンス変数に保存する
       ret=YES;                           // 読み込み成功
   }
   else
   {
       if( outError!= NULL )
       *outError=[NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr
                                                                   userInfo:NULL];
   }
   return ret;
}


バイナリーデータは、NSUnarchiverのメソッドであるunarchiveObjectWithData:を使いNSMutableArrayに変換します。その後、addObjectsFromArray:でインスタンス変数の_listに追加します。copyでなくaddなのは、新規だけでなく、画像ファイルの登録追加処理にもこのメソッドを使いたいためです。またバイナリーデータ読み込みの方も、ターゲット環境が10.3以前の場合は、readFromData:ofType:error:の代わりに
loadDataRepresentation:ofType:メソッドをオーバライドする必要がありますので、注意してください。

ファイルのセーブとロードについては、さらに追加処理が必要となるかもしれません。ここまで準備を進めれば、次は実際に画像ファイルを登録してウィンドウに表示する仕組みを用意する番でしょう。次回は、 複数の画像ファイルを読み込んで、そのパス名などをImageFileオブジェクトへと登録する仕組みをどうするのか考えてみます。
 つづく
                               

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

〜  日本語文字コードについて考える (1)〜

 ふだん何気なく使用している日本語の文字列ですが、文字に置き換える処理、あるいはその前処理の段階でいろいろな苦労があります。今回は、日本語文字コードの変換・判定を行う方法について考えます。

・日本語文字コード
 コンピュータにおける文字とは、厳密に言えば「特定の文字に対応付けられた一意の数値情報」ということになります。その符号化された文字集合が「文字コード」であり、かなや漢字など日本語を表現するために必要な文字集合が「日本語文字コード」というわけです。
 代表的な日本語文字コードには、旧Mac OSの時代から使われている「シフトJIS」、UNIX系OSを中心に利用されてきた「日本語EUC」、インターネットメールに用いられる「JIS(ISO-2022-JP)」などがあります。その他に、多言語の文字を単一の文字コードで取り扱うことを目的に制定された「Unicode」があり、UTF-16やUTF-8などいくつかの符号化方式が存在します。
 文字コードのことを慎重に説明しようとすると、本1冊でも足りないほどですが、ここでは「ときとして文字コードは変換が必要」という点を強調しておきます。たとえば、シフトJISで記録(符号化)されたテキストを無理に日本語EUCで開くと意味不明な文字列が出現します。逆もまた然り、日本語EUCで符号化されたテキストは、シフトJISとしては開けません。MOSA伝をお読みの皆さんには、釈迦に説法のような気もしますが、いきなり文字コード変換ツールを紹介するのも唐突なので、敢えて枕詞代わりに書かせていただきました。

・文字コード変換ツール(標準装備)

 文字コード変換ツールは、Leopardにもいくつか収録されています。そのうち、プログラミング不要なものを紹介してみましょう。

i) iconv
 Leopardには、オープンソースの文字コード変換ライブラリ「GNUlibiconv」と、そのインターフェイスである「iconv」コマンドが収録されています。iconvには文字コード自動判定機能がないため、変換前の文字コードを明示する必要があるものの、書式はかんたんです。アップルスクリプトやAutomatorから利用してもいいでしょう。
 iconvで文字コードを変換する場合、「-f」オプション(From)に続けて変換前の文字コードを、「-t」オプション(To)に続けて変換後の文字コードを指定し、変換前のファイル名を引数として与え、他のファイルへリダイレクトして書き出します。以下のコマンド実行例では、シフトJISのファイルをUTF-8に変換しています。なお、指定できる文字コードは、「iconv -l」を実行すれば確認できます。

- - - - -
$ iconv -f SJIS -t UTF8 before.txt > after.txt
- - - - -


ii) 標準装備のテキストエディタ
 標準装備のテキストエディタ(TextEdit.app)も、保存時に文字コードを手動で変更することにより、文字コード変換ツールとして利用できます。そのほかに、ターミナルからEmacsを起動し、内部コマンド(set-buffer-file-coding-system)を使うという方法もありますが、ここでは割愛します。

・文字コード変換ツール(自力で用意)

i) nkf
 nkf(Network Kanji Filter)は、十年以上の歴史を持つUNIX系OS汎用の文字コード変換ツールです。文字コードの変換だけでなく、テキストファイルのエンコード形式の判定など、応用範囲が広いことが特徴です。最新版のバージョン2.0.7ではUTF-8にも対応しているので、Mac OS Xでも利用価値の高いコマンドといえます。まずは、以下のとおりコマンドを実行して、インストールしてみましょう。

- - - - -
$ curl -O http://osdn.dl.sourceforge.jp/nkf/20770/nkf207.tar.gz
$ tar xzf nkf207.tar.gz
$ cd nkf207
$ make
$ sudo cp nkf /usr/local/bin/
- - - - -


 nkfコマンドの特徴の1つが、文字コード自動判定機能です。かなりの精度で入力する(変換前の)ファイルの文字コードを正しく判定し、指定された文字コードへと変換します。以下に示す実行例では、文字コード種不明のテキストファイル「temp.txt」をUTF-8に変換、同じファイルに上書き保存しています。

- - - - -
$ nkf -w --overwrite temp.txt
- - - - -


○nkfコマンドの主なオプション
-j (省略可) : ISO-2022-JPを出力
-e         : 日本語EUCを出力
-s         : S-JISを出力
-w         : UTF-8を出力(BOM無し)
-Lm        : Macintosh改行形式(CR)に変換
-Lu        : UNIX改行形式(LF)に変換
-Lw        : Windows改行形式(CRLF)に変換
-g         : 文字コードを判定する

ii) QKC
 シフトJIS、日本語EUC、ISO-2022-JPの各日本語文字コードを、高速に相互変換するコマンドです。ただし、Mac OS X用バイナリは提供されていないため、UNIX系OS汎用のソースコードをコンパイルし、コマンドの形で使わなければなりません。UTF-8には対応していないこともあり、nkfを使えば十分でしょう。

http://hp.vector.co.jp/authors/VA000501/

 次回は、PerlやRubyを利用した日本語文字コードの変換方法を紹介する予定です。

◇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.