MOSA Multi-OS Software Artists

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

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

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

2006-11-14

目次

  • 「「Wonderful Server Life」   第26回  田畑 英和
  • 小池邦人の「Carbon API 徒然草」
  • SqueakではじめるSmalltalk入門  第73回  鷲見 正人
  • ニュース・解説               木下 誠

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

・  〜AFP編〜

 これまでOpen Directoryを使ったネットワークユーザの作成方法について解説してきました。ネットワークユーザを使いますとサーバ上でユーザアカウントを一元管理できますが、ユーザ管理ではホームディレクトリをどこで管理するのかについても考えなければなりません。せっかくユーザをサーバ上で管理しているのですから次はホームディレクトリもサーバ上で一元管理できないかということになります。
 ネットワークユーザを使った場合、ユーザアカウントはサーバ上にありますので、ネットワークを経由してどのクライアントコンピュータからも同じアカウントでのログインが可能になります。このとき、ローカル上のホームを使ってしまうと、ログインするコンピュータごとにファイルがちらばってしまいますので、これでは効率的とはいえません。そこで、ユーザアカウントに加えてホームもサーバ上で管理すれば、どのコンピュータからも同じアカウントでログインができ、かつ同じホームが利用できるようになります。
 サーバ上で管理するホームのことを「ネットワークホーム」と言いますが、サーバ上でホームを管理するには、ネットワークを経由してクライアントコンピュータからサーバ上のホームにアクセスできる必要があります。ですので、ネットワークホームを実現するにはまずファイルサービスを設定する必要があります。そこで、今回からはファイルサービスについて解説していきたいと思います。

◇ファイルサービス
 Mac OS X Serverで提供可能なファイルサービスには、Mac向けのAFPのほかにもWindows向けのSMBや、Unix向けのNFSなどがあります。またFTPやWebDAVを使って様々なプラットフォーム間でファイル共有を行うこともできます。
 このように、Mac OS X Serverでは様々なプラットフォーム向けにファイルサービスを提供することができますが、Mac上でネットワークホームを使用するにはMac向けのファイルサービスであるAFPを使用します。
 AFPはApple Filing Protocolの略で、もともとはAppleTalkでのファイル共有プロトコルでしたが、現在はTCP/IP上でも使用できるようになっています。AFPサービスの管理を行うには「サーバ管理」と「ワークグループマネージャ」の2つの管理ツールを使用します。
 2つの管理ツールを使うのはSMBを提供するWindowsサービスや、NFS、FTPにも共通しています。「サーバ管理」ではアクセス方法の設定などサービス全体の設定を行い、「ワークグループマネージャ」では共有ポイントの設定を行い、どのフォルダを公開するかなどを設定します。

◇「サーバ管理」でのAFPサービスの設定
 「サーバ管理」でAFPサービスの設定や開始/停止を行います。デフォルトの設定のままで問題なければ、サービスを開始するだけでAFPを利用することができますが、まずはどのような設定が可能かを確認していきましょう。
 AFPサービスの設定を行うには「サーバ管理」でコンピュータとサービスリストから「AFP」を選択し、「設定」ボタンをクリックします。設定画面は次の4つに分かれています。

【一般】
 クライアントからのブラウジングに関する設定を行います。ファイルサーバの検出に使用するプロトコルがMac OS XとMac OS 9では異なり、Mac OS X向けにはBonjour、Mac OS 9向けにはAppleTalkによるブラウズを有効にします。
 またMac OS XはUnicodeベースでの国際化対応を実現していますが、Mac OS 9の時代には言語ごとにOSが分かれていましたので、そのような古いクライアント用にはエンコードを指定する必要があります。
 「ログオンメッセージ」を設定しておくと、クライアントからの接続時に画面上にメッセージを表示することができます。

http://homepage.mac.com/htabata/MXS10.3/img/AFP/AFP_ADMIN_03.png

【アクセス】
 クライアントからのアクセス方法を設定します。「認証」の設定は次の3つから選択可能です。

・標準
・Kerberos
・すべてのメソッド

 「Kerberos」を選択した場合にはシングルサインオンによるAFPの認証が有効になります。Mac OS X Serverでは、Open Directoryのマスターの機能を使ってシングルサインオンを実現することができます。
 「すべてのメソッド」を選択した場合にはまずKerberosによるシングルサインオンを実行し、もし失敗した場合には通常どおりの認証(つまり「標準」)を行います。
 また、ゲストアクセスに関する設定もありますが、実際にゲストアクセスを有効にするには「サーバ管理」での設定に加え、「ワークグループマネージャ」での共有ポイントの設定も必要になります。
 「安全な接続を有効にする」はSSH経由での暗号化した通信のための設定です。実際にSSH経由での通信を行うには、クライアントからの接続時にもクライアント側でオプションの設定を行う必要があります。
 「最大接続数」の設定では接続数の上限を設定することができます。

http://homepage.mac.com/htabata/MXS10.3/img/AFP/AFP_ADMIN_04.png

【ログ/アイドル状態のユーザ】
 「ログ」設定画面では、アクセスログおよびエラーログの設定ができます。アクセスログはイベントごとに設定することができます。
 「アイドル状態のユーザ」設定画面では、接続を解除するまでのアイドル時間などが設定できます。

http://homepage.mac.com/htabata/MXS10.3/img/AFP/AFP_ADMIN_05.png
http://homepage.mac.com/htabata/MXS10.3/img/AFP/AFP_ADMIN_06.png

 というわけで、今回は「サーバ管理」を使ったAFPサービスの設定方法について解説しました。次回は「ワークグループマネージャ」を使った共有ポイントの設定について解説する予定です。

つづく

小池邦人のCarbon API 徒然草(2006/10/11)

〜 Carbonモダンアプリケーションへの道(その6) 〜

前回は、Pascalストリングスの代わりとして登場したCFStringを簡単に紹介しました。今回は、さらに詳しくその特徴や活用方法などについて解説したいと思います。

前回、CreateNibReference() APIにCFStringRefで参照されるNibファイル名を渡す時、引数が定数(固定値)であれば、CFSTR()の内部にCストリングスを記述すればOKだと解説しました。以下のような感じです。

CreateNibReference( CFSTR( “Dialog” ),&nibRef );

ただし、この記述方法が利用できるのは、CFSTR()内の文字列が半角英数字の場合に限ります。例えば、「ウィンドウ.nib」というNibファイルを作成しておき…

CreateNibReference( CFSTR( “ウィンドウ” ),&nibRef );

と記載したとしても、ソースコードをコンパイルする時点でエラーが発生します。このエラーを回避するには、日本語のCストリングについてはソースコード内に記述可能ですので、前回紹介したcToCFString()ルーチンでCFStringRefを得てからCreateNibReference()に渡します。作成したCFStringRefは、disposeCFString()により解放することを忘れないでください。

cToCFString( “ウィンドウ”,CFStringRef &cfstr );
CreateNibReference( cfstr,&nibRef );
disposeCFString( cfstr );

ところが、この方法で万事うまく行くかと言うと現実はそんなに甘くありません(笑)。例えば「一覧表.nib」というNibファイルを作成し、同処理をするためのソースコードを以下のように記述しておきます。

cToCFString( “一覧表”,CFStringRef &cfstr );

すると、この行でコンパイルエラーが発生することが分かります。原因は「表」という文字のShift-JISコードにあります。「表」のコードは0x955Cですが、その2バイト目の0x5Cがアルファベットのバックスラッシュ(日本語キーボードだと\マーク)に相当するため、コンパイラが正しくソースコードを解釈出来ないわけです。

こうした制限を把握した上で、日本語文字列をソースコード内に記述することについては自己責任であり大きな問題はありません。しかし通常は、外部ファイル(テキストファイルやリソースファイル)に文字列を保存しておき、そこから逐次読み出してAPIや自作ルーチンで使うのが一番安全で確実な方法です。よって前回でも書きましたが、筆者はGetIndString()というSTR#リソースからインデックス番号参照で特定のPascalストリングスを抽出してくるAPIを使い、様々な文字処理に活用していました。ところが、このAPIがDEPRECATED指定になってしまったので、現在は以下のような代用ルーチンを作成して活用しています。

OSErr getIndCString( short id,short nb,char *cstr )
{
    short     i,ct,len,*ss;
    short     err=1;
    Handle    hd;
    Ptr       pp;

    *cstr=0;
    if( hd=GetResource( 'STR#',id  ) ) // STR#リソースからデータを得る
    {
        HLock( hd );                   // データはHandleとして変える
        ss=(short *)*hd;
        ct=*ss;                        // 最初の2バイト(short)が文字列の個数

        #if __LITTLE_ENDIAN__
        ct=Endian16_Swap( ct );        // x86環境ではワードスワップが必要
        #endif

        if( ct >=nb )                  // 指定番号がない場合はエラー
        {
            pp=*hd;
            pp+=2;
            for( i=1;i<=ct;i++ )
            {
                len=*pp++;
                if( i==nb )            // 指定番号の文字列を引数へコピー
                {
                    BlockMoveData( pp,cstr,len );
                    *(cstr+len)=0;
                    err=noErr;
                    break;
                }
                else
                    pp+=len;
            }
        }
        ReleaseResource( hd );       // 得られたHandleを解放する
    }
    return( err );
}


このgetIndCString()ルーチンでは、引数としてリソースIDと文字列のインデックス番号を渡すことで、指定されたSTR#リソースからCストリングスを抽出してきます(オリジナルはPascalストリングスだった)。この場合に注意する点は、リソースデータはすべてビッグエンディアンで保存されているということです。そのため、x86などのリトルエンディアン環境では、ワードデータ(shot)やダブルワードデータ(long,float)などはスワップ処理をする必要があります。

こうして得られたCストリングスを色々な処理に活用するわけですが、Cストリングスの変数をいちいち配列として記述するのが面倒な場合には、PascalストリングのStr255を真似して、typedefにより以下のような定義をしておくと便利です。そして、必要な文字列の長さにより、これらをうまく使い分けるようにします。

typedef char    CStr1023[1024];
typedef char    CStr511[512];
typedef char    CStr255[256];
typedef char    CStr63[64];
typedef char    CStr31[32];
typedef char    CStr15[16];

また、STR#リソースから直接CFStringRefが欲しい場合には、以下のようなルーチンを用意します。

OSErr getIndCFString( short id,short nb,CFStringRef *cfstr )
{
    short      err=1;
    CStr255    cstr;

    if( getIndCString( 129,3,cstr )==noErr ) // リソースからCストリングスを得る
    {
        if( *cfstr=CFStringCreateWithCString( NULL,cstr,
                                               CFStringGetSystemEncoding() ) )
            err=noErr;                      // CストリングからCFStringRefを得る
    }
    return( err );
}

上記ルーチンを利用して、ID番号で指定した文字表示用コントロール(カラム)にSTR#リソースから抽出した文字列を表示するのには、以下のようなルーチンを使います。

OSErr drawCFStringControl( WindowRef window,long cid,short id,short nb )
{
    short          err=1;
    CFStringRef    cfstr;
    ControlRef     chd;
    ControlID      cid;

    if( ! getIndCFString( id,nb,&cfstr ) )   // リソースからCFStringRefを得る
    {
        cid.id=cid;
        cid.signature='MosA';                // signatureは'MosA'に指定済み
        GetControlByID( window,&cid,&chd );  // 指定IDのControlRefを得る
        SetControlData( chd,kControlNoPart,kControlEditTextCFStringTag,
                                               sizeof(CFStringRef),&cfstr );
                                             // コントロールに文字列をセット
        DrawOneControl( chd );               // コントロールを再描画
    }
    return( err );
}


こうしてソースコード内ではなく外部ファイルから文字列データを持ってくる方法は、自作アプリケーションを多国語対応にするには最適な方法です。ただし、多国語対応の場合には、Shift-JISコードで表記できない文字列を用意しなければいけない場合が多々あります。そこで登場するのがユニコードです。次回はユニコードを操作するAPIについて、その特徴や活用方法などを解説したいと思います。

つづく

SqueakではじめるSmalltalk入門   第73回  鷲見 正人

本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、製作途上の簡易GUIビルダで、テキストフィールドだけでなく、プッシュボタンも追加できるように拡張します。

▼メニュー項目の追加
まずは変化が見えやすいところから始めましょう。GUIビルダウインドウのウインドウメニューに手を入れます。ブラウザの右上のペインから「addModelItemsToWindowMenu:」をクリックして選択し、下のペインに表示されたその内容を次のように変更してください。

addModelItemsToWindowMenu: aMenu
   | window |
   window := aMenu defaultTarget.
   aMenu addLine.
   aMenu add: 'add field' target: self selector: #addFieldTo: argument: window.
   aMenu add: 'add button' target: self selector: #addButtonTo: argument: window.
   aMenu addLine.
   aMenu add: 'delete' target: self selector: #removeWidgetFrom: argument: window


ボタンを追加するためのメソッド名を#addButtonTo:とあらかじめ決めてしまい、それを起動するメニュー項目「add button」を追加する行を「add field」の行の直下に挿入しています。accept(cmd + S)してコンパイルが済むと、GUIビルダウインドウのメニューには、記述通り「add button」という項目が現われます。

[fig.A]追加された「add button」コマンド

ただ、もちろん現時点では、このメニュー項目を選択しても起動するメソッドが見つけられずエラーになります。

[fig.B]起動するメソッドが存在しないため起こるエラー

▼ボタン追加のためのメソッドの定義
テキストフィールド(a PluggableTextMorph)をGUIビルダウインドウに追加するためのメソッドは次のようなものでした(GUIビルダをブラウズ中のブラウザで、右上のペインの「addFieldTo:」をクリックすると呼び出せます)。

addFieldTo: window
  | field relFrame |
  field := PluggableTextMorph
    on: self text: nil accept: nil readSelection: nil menu: nil.
  relFrame := (Rectangle fromUser
    scaleFrom: window layoutBounds
    to: (0 asPoint extent: 1e3 asPoint)) scaleBy: 1.0e-3.
  window addMorph: field frame: relFrame


これにちょっと手を加えるだけで、新たに#addButtonTo:を簡単に作ることができます。

Smalltalkのメソッド定義の最初の行は「メッセージパターン」と呼ばれ、このメソッドを起動するためのメッセージの概要を示すと同時に、メソッド名(セレクタともいう。この場合、#addFieldTo:)とメッセージに添えられたパラメータ(引数)を関連づける変数(パラメータ変数。window)を宣言する場でもあります。したがって、この行のメソッド名の部分を書き換えるだけで、新しいメソッド(たとえば、#addButtonTo:)を定義することが可能です。

手始めに「addFieldTo:」の「Field」部分を「Button」に書き換えてから、accept(cmd + S)してみてください。ただちにコンパイルが終了し、右上のペインに「addButtonTo:」が追加されるはずです。「add button」メニュー項目はこれでエラーを出さなくなりますが、相変わらずテキストフィールドしか作れません。

メソッド本体も#addButtonTo:という名前にふさわしく、テキストフィールドではなくプッシュボタン(a PluggalbeButtonMorph)を追加する内容に置き換えましょう。二行目の「field」を選択した状態で「button」とタイプしてからcmd + shift + Jとタイプすると、テンポラリ変数fieldからbuttonへの全置換を行なえます。さらに、三行目から四行目をボタン用に変更、accept(cmd+ S)すれば作業は完了です。

addButtonTo: window
  | button relFrame |
  button := (PluggableButtonMorph
    on: self getState: nil action: nil) label: 'button'; yourself.
  relFrame := (Rectangle fromUser
    scaleFrom: window layoutBounds
    to: (0 asPoint extent: 1e3 asPoint)) scaleBy: 1.0e-3.
  window addMorph: button frame: relFrame


これで、GUIビルダウインドウに新たに設けられたメニュー項目「add button」は、以後、正常に機能するはずです。

[fig.C]「add button」により追加が可能になったプッシュボタン

ただ、既存メソッドをちょっと書き換えるだけで簡単に追加できたということは、裏を返せば書き換えた部分以外まったく同じ内容のメソッドの“複製”ができてしまったということを意味します。このまま安易な拡張を続けることで、同内容の処理を分散させ、メインテナンス性が損なわれるようではいけません。次回は今回のようなコード複製をせずとも、ウィジェットの種類を増やすことができるしくみを考えます。

バックナンバー:

ニュース・解説

 今週の解説担当:木下 誠

----------------------------------------------------------------------
ADC StoreとADC on iTunes
----------------------------------------------------------------------

Lepoard向けの開発情報を続々と出し続けているAppleですが、開発者の利便性を上げるために、ADCのサイトにも新機能が追加されています。

まず、皆様ご存知の通り、現時点ではLeopardの情報を得るにはADCのPremierかSelect会員である必要がある訳ですが、というよりはAppleとしてはPremierかSelect会員を増やしたいという思惑からか、これらの会員権の購入がさらにやりやすくなりました。

いままではADCのWebページで購入手続きを行っていたものが、Apple Storeに統合されています。いつもの使い慣れたインタフェースが使える訳ですね。こちらには、「Leopard Early Start Kit」の「Buy Now」から移動する事が出来ます。または、"http://developer.apple.com/products/"からアクセスできます。

もう一つ。今年の8月に行われたWWDCでのセッションが、ビデオという形での公開が始まっています。これらが、iTunesからダウンロード、管理できるようになっています。「ADC on iTunes」です。

これを利用するには、「Leopard Early Start Kit」の「Watch Now」をクリックします。iTunesが起動して、ADCのiTunes Storeに移動できます。ここから、ビデオとスライドのダウンロードができます。もちろん、視聴にiTunesを使う事が出来ます。

iTunesとADCの統合は、予想以上に使いやすいものがあります。iTunesの新たな使い方ですね。

Leopard Early Start Kit
http://developer.apple.com/leopard/

The Apple Store - International
http://developer.apple.com/products/

----------------------------------------------------------------------
薬学ソフトウェアの移植事例
----------------------------------------------------------------------

ADCに時折登場する、他プラットフォームからMacへの移植事例紹介ドキュメントですが、新しいものが追加されました。「OpenEye and Mac OS X: Opening to the Pharmaceutical Industry」です。

OpenEye社は、薬学関係のソフトウェアを開発する会社で、その製品では膨大な科学技術計算が必要になるようです。ソースコードは、UNIX向けにC++で書かれていましたが、それをMac OS Xに移植し、最適化を行った事例が紹介されています。

OpenEye and Mac OS X: Opening to the Pharmaceutical Industry
http://developer.apple.com/business/macmarket/openeye.html

----------------------------------------------------------------------
Mac Proのメモリと、Core 2 Duo MacBookに関するドキュメント
----------------------------------------------------------------------

ハードウェア関係のTechnical NoteとDeveloper Noteが出ています。

まず、Mac Proのメモリと熱に関する、「TN2156: Thermal considerations for Mac Pro FB-DIMMs」です。

FB-DIMMs (Fully Buffered Dual In Line Memory Modules)は、Mac Proで採用されているメモリモジュールのアーキテクチャです。このTNでは、Mac Pro向けのFB-DIMMsモジュールには、熱センサーを付ける事と、許容される発熱量が記述されています。

それと、先日発表されました、Core 2 Duoを搭載したMacBookに関するDeveloper Noteも公開されています。

TN2156: Thermal considerations for Mac Pro FB-DIMMs
http://developer.apple.com/technotes/tn2006/tn2156.html

MacBook Developer Note
http://developer.apple.com/documentation/HardwareDrivers/Conceptual/MacBook_0611/index.html

----------------------------------------------------------------------
VFSプラグインのサンプル
----------------------------------------------------------------------

Mac OS Xで、VFSプラグインを作るためのサンプルが、2つ公開されています。「EmptyFS」と「MFSLives」です。

「MFSLives」は、なんと初代Macintoshで採用されていたMFS(Macintosh File System)をサポートします。曰く、「シンプルなのでサンプルに最適」だそうです。ま、確かにそのとおりですが、2006年にもなって、MFSの文字を見る事があるとは驚きです。

EmptyFS
http://developer.apple.com/samplecode/EmptyFS/index.html

MFSLives
http://developer.apple.com/samplecode/MFSLives/index.html

----------------------------------------------------------------------
ステッパーのサンプル
----------------------------------------------------------------------

Carbonでステッパーを動作させるサンプル、「LittleArrowsShowcase」が公開されています。

LittleArrowsShowcase
http://developer.apple.com/samplecode/LittleArrowsShowcase/index.html

 

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

 

MOSA Developer News   略称[MOSADeN=モサ伝]
      記事投稿受付 http://www.mosa.gr.jp/topics/mdn-toukou.html
Apple、Mac OSは米国アップルコンピュータ社の登録商標です。またそのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。
このメールの再配信、および掲載された記事の無断転載を禁じます。
特定非営利活動法人MOSA  http://www.mosa.gr.jp/
Copyright (C)2006 MOSA. All rights reserved.