MOSA Multi-OS Software Artists

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

プログラマーに興味がある方なら誰でも入会いただけます。
MOSA Multi-OS Software Artists
===SINCE 1995===

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

MOSADenバックナンバー 2006年10月発行分

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

    2006-10-31
     

    目次

    • 湘南ミーティングにはじめて参加して     冨田 真理子
    • 「「Wonderful Server Life」   第24回  田畑 英和
    • 小池邦人の「Carbon API 徒然草」
    • SqueakではじめるSmalltalk入門  第72回  鷲見 正人
    • ニュース・解説               木下 誠

    湘南ミーティングにはじめて参加して  ヤノ電器(株)開発部 冨田 真理子

     今回、MOSA湘南ミーティング初参加者代表として感想記事を書かせて頂くことになりました、Mac歴約半年の冨田です。

    私のMacとの付き合いは、今年の5月にヤノ電器(株)に入社したと同時に始まりました。
     また、社長がMOSAの会長をされておられるとのことで、今回のMOSA湘南ミーティングに参加させて頂くことになりました。
     裏を返せば「ヤノに入らなければMacとは縁はなく、社長が会長でなければ湘南ミーティングには参加しなかった」私なのですが、このような感想記事をメールマガジンに掲載して頂く機会を頂き、大変光栄に思っております。

    最近は、「FreeBSD系」「Boot Camp」というキーワードに惹かれ、UNIXやLinuxユーザーの方が多くMacの世界に入って来られていると聞いています。(私も以前はSIer会社で主にUNIX系/Linux系の仕事を担当していたので、OS Xは親しみやすかったです)私のように最近のMac(OS X)を触りだした人で「Macで仕事をしている人ってどんな人?」「昔のMacってどんなものだったの?」という興味をお持ちの方は、今回のようなミーティングは肌で感じる良い機会になると思います。「Mac大好き!」で「WWDCに参加するのは当たり前」という、熱意溢れる方々が多く参加されていらっしゃるので、「Mac」の今昔の片鱗を知ることができました。

    今回は5個のセッションに参加しましたが、どのセッションも講師の方のレベルが高く、Macの知識を少し深めることができたと思います。個人的には、特に「インテル・ソフトウェア開発製品の紹介」のセッションが印象に残っています。

    また、ミッドナイトセッションは睡魔に負けて参加できませんでしたが、明け方近くまで語り明かしたという方もおられたとのことで、「貴重な機会を逃したかな、、、」と少し残念に感じています。

    ミーティングには何年も前から参加されている方や、既に顔見知り同士の方々も多く、「1人で初参加」だと疎外感みたいなものを感じる場面があるかもしれません。
     しかし、自分から積極的に働きかける心意気があれば、「Mac大好き!」なメンバの仲間に入ることが出来ると思います。また、フリーの方やご自分で会社の代表をなさっておられる方が多く参加されているので、自分の気持ち次第で「情報交換」「人脈を広げる」という場としても活用出来ると思います。

    少しでもMOSA湘南ミーティングに興味をお持ちの方は、来年は勇気を出して是非参加なさって下さい。

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

      〜Open Directory編〜

     前回はOpen Directory上にネットワークユーザを登録する方法について解説しました。今回はクライアントコンピュータからネットワークユーザを利用する方法について解説します。

    ◇「ディレクトリアクセス」
     各クライアントコンピュータからネットワークユーザを利用するには、まずどのディレクトリサーバを使用するのかを各クライアントコンピュータごとに設定します。
     設定を行うには「/アプリケーション/ユーティリティ」にインストールされています「ディレクトリアクセス」を使用します。このツールで設定を行うには管理者権限が必要になりますので、ツールを起動したときにロックがかかっている場合には画面左下のアイコンをクリックして管理者として認証を行います。
     「ディレクトリアクセス」はOpen Directoryのクライアントとしての設定を行うためのツールですが、そもそもOpen Directoryは様々なディレクトリサービスに対応できる仕組みになっています。そのため各ディレクトリサービスを利用するためのプラグインが用意されており、「ディレクトリアクセス」ではプラグインごとに設定を行います。主なプラグインには以下のものがあります。

    ・LDAPv3
     ディレクトリサービスの標準的なプロトコルであるLDAPを使用するためのプラグイン。

    ・NetInfo
     NetInfoとはNeXT時代から存在するディレクトリサービスですが、現在ではローカルディレクトリの管理に使用されています。

    ・Active Directory
     Windowsのディレクトリサービスである「Active Directory」を使用するためのプラグイン。Active DirectoryもLDAP対応ではあるが、より簡単に設定ができるよう「Active Directory」専用のプラグインが用意されています。

    ・BSDフラットファイルおよびNIS
     テキストファイルでアカウント情報などを管理したり、Sunのディレクトリサービス「NIS」を使用するためのプラグイン。

    Open DirectoryのマスターはLDAPを使ってディレクトリ情報を共有しますので、「LDAPv3」プラグインの設定を行うことになります。

    ・「ディレクトリアクセス」
    http://homepage.mac.com/htabata/MXS10.3/img/DA/DA_01.png

    ◇「LDAPv3」の設定
     各プラグインは個別にOn/Offできますので、まずは「LDAPv3」の「使用可能」がチェックされているかを確認し、チェックされていなければチェックを入れて画面右下の「適用」ボタンをクリックします。
     次に「LDAPv3」を選択してダブルクリックするか、「設定」ボタンをクリックして接続先のサーバを設定します。

    ・「LDAPv3」の設定
    http://homepage.mac.com/htabata/MXS10.3/img/DA/DA_02.png

     接続先のサーバを設定するには「新規」ボタンをクリックし、以下の手順で設定を行います。

    (1)アドレスの指定
     「サーバ名またはIPアドレス」に接続先のサーバのアドレスを入力します。「SSLを使って暗号化」は、サーバ側でSSLの設定をしていなければ(サーバ側もクライアント側もデフォルトでSSLはOff)Offのままでかまいません。「認証に使用」「コンタクトに使用」はとりあえずデフォルトのOnのままでよいでしょう。「認証に使用」をOffにした場合にはネットワークユーザを使ってクライアントコンピュータにログインできません。
     サーバのアドレスを入力したら右下の「続ける」ボタンをクリックします。

    http://homepage.mac.com/htabata/MXS10.3/img/DA/DA_03.png

    (2)ディレクトリバインド
     次にディレクトリサーバへの接続のために認証を行う画面が表示されますが、サーバ側で明示的に認証の設定をしていなければ、Open Directoryのマスターに接続(バインドといいます)するさいに認証の必要はありません。ですので、デフォルトのままで「続ける」ボタンをクリックします。

    http://homepage.mac.com/htabata/MXS10.3/img/DA/DA_04.png

    (3)バインドの完了
     画面の下のほうに「新規サーバの設定が完了しました」と表示されれば、バインドに成功したということです。「OK」ボタンをクリックするとバインドしたサーバがリストに追加されていることが確認できます。
     うまくバインドができなければ手順(1)で入力したアドレスに間違いがないかを確認してみましょう。

    http://homepage.mac.com/htabata/MXS10.3/img/DA/DA_05.png
    http://homepage.mac.com/htabata/MXS10.3/img/DA/DA_06.png

     以上の設定でクライアントコンピュータをディレクトリサーバにバインドすることができます。1台のクライアントコンピュータを複数台のディレクトリサーバに接続することもできますが、その場合は手順(1)〜(3)の設定を繰り返します。

    ◇認証とコンタクト
     手順(2)の設定項目「認証に使用」と「コンタクトに使用」ですが、それぞれ「ディレクトリアクセス」の「認証」と「コンタクト」設定画面に反映されます。

    ・「認証」設定画面
    http://homepage.mac.com/htabata/MXS10.3/img/DA/DA_07.png
    ・「コンタクト」設定画面
    http://homepage.mac.com/htabata/MXS10.3/img/DA/DA_08.png

     まず「認証」ですが、この画面の「ディレクトリドメイン」のリストに表示されているサーバが認証に使用できるディレクトリサーバです。つまりここのリストに表示されていないサーバ上のネットワークユーザではクライアントコンピュータにログインできないということです。もしここに目的のディレクトリサーバが追加されていなければ「追加」ボタンからバインド済みのサーバを追加することができます。
     さきほどの手順(2)で「認証に使用」をチェックしておけば、サーバが自動的にリストに追加されます。リストの先頭にあるのはクライアントコンピュータ上のNetInfoです。
     クライアント上での認証はこのリスト順に行われますので、まずはローカルのNetInfoでの認証を試み、失敗した場合には2番目以降のディレクトリに認証をかけます。「認証」のリストにはバインド済みのサーバを複数追加でき、この場合2番目のディレクトリで認証に失敗した場合、3番目、4番目と1つずつ認証を繰り返すことになります。リストの先頭にあるNetInfoは変更することはできません。

    最後に「コンタクト」ですが、Mac OS Xには「アドレスブック」などディレクトリサービスに対応したアプリケーションがあります。「コンタクト」の「ディレクトリドメイン」リストにサーバを追加しておけば「アドレスブック」からディレクトリサーバ上のユーザ情報にアクセスできるようになります。

    以上でクライアント上での設定ができたことになりますが、次回は設定の確認方法について解説する予定です。また、実際にネットワークユーザをクライアント上で使用するにはホームの設定が必要になってきますが、こちらについてもこれから解説していきます。

    つづく

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

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

    前回はPICT画像を取り扱うための代用APIを調査してみました。今回は、文字列(ストリングス)の作成や操作に関係するモダンなCarbon APIを紹介したいと思います。

    従来、Macintosh用アプリケーションの開発で文字列を扱う場合には、Cストリングスの代わりにPascalストリングス(Str255)が多用されてきました。これは、初代Macintoshシステム(ひょっとしてLisaからの遺産だったかも…)の開発用言語としてPascalが使われていたのが原因です。そのため、QuickDrawやToolBoxの各Managerの文字列を取り扱うAPIの引数には、必ずPascalストリングスが渡されるように設計されていました。

    例えば、Text Utility(TextUtils.h)には、GetIndString()というSTR#リソースからインデックス(番号)参照で特定のPascalストリングスを抽出してくる大変便利なAPIがありました。まあ、これも予想通りDEPRECATED指定なので、そのうち利用できなくなるのですが(寂しい)。色々と調査をしてみると、Pascalストリングスの操作に関連したAPIはDEPRECATED指定になったものが多いようです。

    void GetIndString( Str255 theString,short strListID,short index );

    筆者は、アプリケーションでエラーアラートなどを表示する場合、このAPIを用いて、その文字列内容をSTR#リソースから抽出して利用していました。ちなみに、2つめの引数はSTR#リソースのID番号でして、これを切り替えることにより、自作アプリケーションを多国語に対応させるような処理も行えました(随分と昔の話です)。ただし、Pascalストリングスは先頭の1バイトにその文字列長の値が代入されています。そのため、1文字が1バイトだとすると、最長で255文字の文字列しか取り扱うことができません。つまり、何らかの処理において長い文字列を扱いたい場合には、必ず制限が付きまといます。

    ちなみにCストリングスは、その最終バイトにゼロを代入することで文字列の終わりとしますので、文字列の長さには制限がありません。また現在では、Unicode(Mac OS Xのファイルシステムで利用)をはじめとする多種多様の文字エンコーディングが存在しますので、そうしたものを統一して操作するにはPascalストリングスでは力不足です。まあ、ず〜と今までの間(20年以上も)Macintoshのシステムの中心でPascalストリングスが生き残っていたこと自体が奇跡なのですが(笑)、Mac OS Xでは、その主役の座を別の文字列フォーマットに譲ることになりました。Mac OS Xでの文字列は、Core Foundation APIで多用されているCFString(CFStringRef)として参照されます。

    CFStringを直接操作するAPIの解説は後述するとして、古くからあるAPIのCFString対応がどうなっているのかを調べてみましょう。例えば、ウィンドウ、メニュー、コントロールなどのユーザインターフェース・オブジェクトの名称を設定する場合、昔のAPIであれば必ずPascalストリングスが用いられていました。対象がウィンドウであれば、その名称(タイトル)を設定する時にはSetWTitle()を、逆に表示されているタイトルを得る時には、GetWTitle()を用いていました。不思議なことに、実はこの2つのAPIはDEPRECATED指定ではありません。

    SetWTitle( WindowRef window,ConstStr255Param title );
    
    GetWTitle( WindowRef window,Str255 title );

    現在では、こうしたAPIに対してStr255の代わりにCFStringRefを渡す代用品が用意されています。SetWTitle()の代用品としてはSetWindowTitleWithCFString()が、GetWTitle()の代用品としてはCopyWindowTitleAsCFString()が用意されています。Control ManagerやMenu Managerの同種のAPIについてもまったく同じことが言えます。

    SetWindowTitleWithCFString( WindowRef inWindow,CFStringRef inString );
    
    CopyWindowTitleAsCFString( WindowRef inWindow,CFStringRef *outString );
    


    続いて、最初からCFStringを使うように設計されたモダンAPIをいくつか見てみます。以下のopenMyDialog()は、ファイル名が「Dialog.nib」というNibファイルをオープンし、そこに定義されている「Test_Dialog」というオブジェクトを使いウィンドウを作成するルーチンです。

    short openMyDialog( WindowRef *wptr )
    {
        IBNibRef     nibRef;
        short        err=1;
    
        if( ! CreateNibReference( CFSTR( "Dialog" ),&nibRef ) ) // Nibファイルを開く
        {
            if( ! CreateWindowFromNib( nibRef,CFSTR( "Test_Dialog" ),wptr ) )
            {                                    // オブジェクトからウィンドウを作成
                DisposeNibReference( nibRef );   // 不必要になったIBNibRefを削除
                ShowWindow( *wptr );             // ウィンドウをオープン
                err=noErr;
            }
        }
        return( err );
    }
    


    上記の、CreateNibReference()の1つ目の引数とCreateWindowFromNib()の2つ目の引数には、CFStringRefで参照されるNibファイル名とウィンドウオブジェクト名を渡します。定数(固定値)のCFStringRefを引数に渡す時には、例題のようにCFSTR()の内部にCストリングスを記述すればOKです。これは、Pascalストリングスを”\pDialog”と記述したのと同じことです。

    引数として渡すCストリングスが不定の場合には、CストリングスからCFStringを作成することで得られるCFStringRefが必要です。CFStringRefを作成したり操作したりするAPIはCFString.hに定義されています。こうしたAPIを用いれば、Pascalストリングス、Cストリングス、Unicode文字列などをCFStringへと変換し、それを参照するためのCFStringRefを得ることができます。例えばCストリングスをCFStringへ変換するためには、以下のようにCFStringCreateWithCString() APIを用いた簡単なルーチンが利用できます。

    OSErr cToCFString( char *cstr,CFStringRef *cfstr )
    {
        short    err=1;
    
        if( *cfstr=CFStringCreateWithCString( NULL,cstr,
                                            CFStringGetSystemEncoding() ) )
            err=noErr;
        return( err );
    }
    


    得られたCFStringRefが不必要になった場合には、他のCore Foundation APIで作成するオブジェクトと同様、CFRelease()に渡して解放する必要があります。この時の注意点は、CFRelease()に渡すCFStringRefがゼロ(NULL)などであると、CFRelease()を実行した時点でアプリケーションが落ちてしまうことです。筆者は、以下のようなルーチンを作り、こうした事故を未然に防ぐようにしています。

    OSErr disposeCFString( CFStringRef cfstr )
    {
        short    err=1;
    
        if( cfstr )
        {
            CFRelease( cfstr ); // CFStringRefの解放
            err=noErr;
        }
        return( err );
    }
    


    逆にCFStringからCストリングスを得るには、CFStringGetCString() APIを用いた以下の様なルーチンを準備しておくと便利です。

    OSErr cfToCString( CFStringRef cfstr,char *cstr )
    {
        short    err=1;
    
        if( CFStringGetCString( cfstr,cstr,256,CFStringGetSystemEncoding() ) )
            err=noErr;
        return( err );
    }
    


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

    つづく

    S

    queakではじめるSmalltalk入門   第72回  鷲見 正人

    本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。前回は、製作中の簡易GUIビルダにおいて、メソッド「#addFieldTo:」で、設置するテキストフィールドの大きさを任意に指定できる機能を拡張しました。今回は、逆に既存のテキストフィールドを削除するメソッド「#removeWidgetFrom:」と、それをマウス操作により起動するためのメニュー項目「delete」を追加しましょう。

    簡単のため、削除のためのメニュー項目を選択後、GUIビルダウインドウをクリックすると、そこにあるテキストフィールドを削除する…という仕様にします。

    クリックした場所の画面上での座標は、すでに第64回で予習したとおり、クラスPointにメッセージfromUserを送信することで容易に得られます。一方、ウインドウは自分にサブモーフとして登録されているウィジェット(この場合、テキストフィールド)を知っていて、paneMorphというメッセージを送るとそれらを要素として収めたコレクションとして返してきます。これらのことを利用して、クリックした場所にあるウィジェット(サブモーフ)を判断して削除するメソッドは次のように書くことができそうです。

    removeWidgetFrom: window
       | clickPoint selected |
       clickPoint := Point fromUser.
       selected := window paneMorphs
          detect: [:morph | morph bounds containsPoint: clickPoint]
          ifNone: [].
       selected ifNotNil: [selected delete]
    


    クラス「GuiBuilder」のブラウズしている状態で、このコードを選択してコピー&ペーストでGuiBuilderをブラウズ中のシステムブラウザのコードペインに貼り付け、accept(cmd + S)してください。システムブラウザ右上のペインに「removeWidgetFrom:」が追加されれば、コンパイルは成功です。

    クリックした場所に存在するウィジェットを検出する手段はいくつか考えられますが、ここでは#containsPoint:による判定と#detect:ifNone:の組み合わせにより記述しました。

    「#containsPoint:」はRectangleのメソッドで、起動すると、名前の通りレシーバである矩形(a Rectangle)がパラメータとして添えられた座標(a Point)を含んでいるかどうかについて、その結果を真偽値で返してきます。

    (0 @ 0 corner: 10 @ 10) containsPoint: 5 @ 5     " => true  "
    (0 @ 0 corner: 10 @ 10) containsPoint: -1 @ -1   " => false "
    


    もうひとつのキーになるメソッド「#detect:ifNone:」は、レシーバとなるコレクションの中に、第一パラメータとして添えたブロックの評価値が真になる最初の要素を見つけて返します。

    #(1 2 3 4) detect: [:each | each even] ifNone: []   " => 2  "
    'string' detect: [:char | char isVowel] ifNone: []  " => $i "
    


    該当する要素がひとつも見つからない場合は、代わりに第二パラメータに添えたブロックの評価値を返します。ブロック内に何も記述しない場合はnilが返ってきます。

    'rhythm' detect: [:char | char isVowel] ifNone: [#none]  " => #none "
    'rhythm' detect: [:char | char isVowel] ifNone: []       " => nil "
    


    先述の#removeWidgetFrom:では、クリックした場所にウィジェットが存在しない場合がこれにあたり、返値はselectedに関連づけされます。最後の仕上げの式では、selectedがnilでなければ、つまり該当するウィジェットが見つかっていれば、それに対してメッセージ「delete」を送って削除しています。

    さて。このメソッドをGUI上での操作に結びつけるには、ウインドウメニューにこのメソッドを起動するためのメニュー項目を追加しておく必要があります。仮に「delete」とでもいたしましょう。「add field」メニュー項目と同様、

    #addModelItemsToWindowMenu:のコードの改変で簡単に指示できます。
    
    addModelItemsToWindowMenu: aMenu
       | window |
       window := aMenu defaultTarget.
       aMenu addLine.
       aMenu add: 'add field' target: self selector: #addFieldTo: argument: window.
       aMenu addLine.
       aMenu add: 'delete' target: self selector: #removeWidgetFrom: argument: window
    


    システムブラウザ右上のペイン(メソッド名リスト)より「addModelItemsToWindowMenu:」をクリックして選択し、コードを上のように書き換えるか、もしくは、メソッド「#removeWidgetFrom:」のときと同様にコピーしてから、select all(cmd + A)、paste(cmd + V)(既存のコードと置き換え…)して、最後にaccept(cmd + S)してください。

    コンパイルがうまく通れば、その直後からGUIビルダウインドウのウインドウメニューには区切り線と「delete」コマンドが追加されるはずです。

    [fig.A]追加された区切り線と「delete」コマンド

    この「delete」を選択すると、直後にマウスカーソルがクロスヘア(十字)に変わるので、削除したいテキストフィールドをクリックして指定します。クリックした場所にあるテキストフィールドを消すことができれば、動作は正常です。

    バックナンバー:

    [訂正]前回、最後に示した#addFieldTo:中で、「window bounds」とあるのは「window layoutBounds」の誤りです。悩んでしまった方、ごめんなさい。

    ニュース・解説

     今週の解説担当:木下 誠

    ———————————————————————-
    Leopard Dev Centerが開設
    ———————————————————————-

    「Leopard Dev Center」が開設されました。Leopardに関連する開発情報を一手に集めたページです。いよいよLeopardへの移行が現実のものとなってきました。このページでは、ガイド、リリースノート、リファレンス、サンプルコードが提供されています。Leopard Dev Centerへのログインには、ADCのPremierかSelectの権限が必要です。

    同時に、Leopard情報のアップデートとして、「Leopard Technology Series for Developers」が公開されています。こちらは、一般の方も見る事ができます。Image KitやPicture Taker Panelなど、新しい情報も追加されています。

    Leopard Dev Center
    https://developer.apple.com/leopard/devcenter/

    Leopard Technology Series for Developers
    http://developer.apple.com/leopard/overview/index.html

    ———————————————————————-
    Accessibility APIチュートリアル
    ———————————————————————-

    CocoaでAccessibility APIを使う方法を解説したチュートリアルが公開されています。二部構成になっており、Part Iは「Enabling Accessibility in Your Cocoa Application」、Part IIが「Adding Accessibility Support in Custom Views in Your Cocoa Application」となります。

    Part Iでは、Accessibility APIのオーバービューが紹介されています。Part IIは、カスタムビューでそれを実装する、実践編です。

    Enabling Accessibility in Your Cocoa Application
    http://developer.apple.com/ue/accessibility/accessibilityincocoa.html

    Adding Accessibility Support in Custom Views in Your Cocoa Application
    http://developer.apple.com/ue/accessibility/accessibilitycustomviews.html

    ———————————————————————-
    ApertureのSDK
    ———————————————————————-

    Apertureでプラグインを作るためのSDKが公開されています。SDKのオーバービューと、リファレンスの、二種類のドキュメントがあります。

    Aperture SDK Overview
    http://developer.apple.com/documentation/AppleApplications/Conceptual/AppleApp_Aperture_001/index.html

    API Reference: Aperture SDK
    http://developer.apple.com/documentation/AppleApplications/Reference/AppleApp_Aperture_002/index.html

    ———————————————————————-
    ライブラリのリンクに関するQA
    ———————————————————————-

    ライブラリのリンクに関するQAが出ています。「QA1393: Using static versions of exisiting dynamic libraries」です。

    ここでは、システムにスタティックライブラリとダイナミックライブラリがあった場合、明示的にスタティックライブラリをリンクする方法を解説しています。Xcodeで、Library Search Pathsを設定し、かつ-search_paths_firstフラグを指定する事になります。

    QA1393: Using static versions of exisiting dynamic libraries
    http://developer.apple.com/qa/qa2006/qa1393.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.

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

    2006-10-17

    目次

    • 「Wonderful Server Life」      第23回  田畑 英和
    • 藤本裕之のプログラミング夜話 #101
    • 高橋真人の「プログラミング指南」  第99回
    • ニュース・解説                小池 邦人

    「Wonderful Server Life」  第23回  田畑 英和
      〜Open Directory編〜

     今回はOpen Directory上にネットワークユーザを登録する方法について解説します。ネットワークユーザを作成するには「ワークグループマネージャ」を使用して、「/LDAPv3/127.0.0.1(ネットワーク)」のディレクトリを選択するところまでを前回解説しました。間違えてローカル側のディレクトリにユーザを登録しますと、ネットワークユーザとして機能しませんので注意が必要です。

    ◇ネットワークユーザの登録
     ユーザアカウントの一覧を表示した画面で、ツールバーの「新規ユーザ」ボタンをクリックすると新規ユーザを1つ追加できます。ユーザを追加するにはディレクトリの管理者権限が必要になりますが、もし「新規ユーザ」ボタンが押せなく、ツールバーの下に「認証されていません」と表示されている場合には、まずディレクトリ管理者として認証を行う必要があります。
     認証を行うにはツールバーの下(右端)にあるボタンをクリックして、Open Directoryのマスターを設定したときに登録したディレクトリ管理者(デフォルトでは”diradmin”)として認証を行います。

    ・diradminとしてディレクトリに認証
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_User/WGM_User_06.png

     ディレクトリの管理者として認証を行ったあとに、「新規ユーザ」ボタンをクリックすると「名称未設定 1」という名前のユーザが作成されます。あとは「名前」、「ユーザ名」、「パスワード」を入力して、画面右下の「保存」ボタンをクリックすればディレクトリにネットワークユーザが登録されます。

    ・新規ユーザの登録
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_User/WGM_User_07.png
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_User/WGM_User_08.png

    ◇ユーザのパラメータ
     ユーザのパラメータとしては最低限、「名前」、「ユーザ名」、「パスワード」の入力が必要となります。パスワードは省略することも可能ですが、パスワードの省略はセキュリティ上の問題がありますので、省略すべきではないでしょう。
     「ユーザID」というパラメータもありますが、ユーザIDは自動的に割り当てられますので、特に必要がなければ変更する必要はありません。また「ワークグループマネージャ」でユーザを管理する場合、ユーザ名は複数登録することができます。1つ目のユーザ名は一度登録すると基本的には変更することができませんが、2つ目以降のユーザ名であればあとから変更することができます。
     ユーザのパラメータの詳しい仕様は以下のようになっています。

    ・名前
      最大長は255byte、ロングネームとも呼ばれる
      1byte文字の場合は255文字、3byte文字の場合は85文字まで
      フォーマット:UTF-8
    ・ユーザ名
      最大長は255byte、ショートネームとも呼ばれる
      最大16個登録可能(最低1つは必要)
      1つ目のフォーマット:A〜Z、a〜z、0〜9、_、-
      2つ目以降のフォーマット:UTF-8
    ・ユーザID
      500〜2,147,483,648の数値、100未満はシステム用に予約
      フォーマット:32ビットの数値

    ・ユーザレコードの標準属性
    「オープンディレクトリの管理」P.217
    http://images.apple.com/jp/server/pdfs/Open_Directory_v10.4_j.pdf

    ◇管理者権限
     新規に登録したユーザにサーバの管理権限を与えたい場合は「ユーザに許可する操作」を設定します。管理者権限は2つに分かれており、通常のサーバ管理者(「サーバ管理」で管理を行う管理者)として登録するのであれば「サーバを管理する」をチェックします。
     また、ディレクトリの管理者として登録するのであれば「このディレクトリのドメインを管理する」をチェックします。両方をチェックしておけばサーバおよびディレクトリの管理者として登録されます。

    あとは以上の操作を繰り返すことにより、ネットワークユーザをどんどん登録することができます。

    つづく

    藤本裕之のプログラミング夜話 #101

     前回はビューオブジェクトがドラッグ&ドロップの面倒を見るためにインプリメントしておかねばならない4つのメソッド、

    - (NSDragOperation)draggingEntered: (id ) sender;
    - (void) draggingExited: (id ) sender;
    - (BOOL) prepareForDragOperation: (id ) sender;
    - (BOOL) performDragOperation: (id ) sender;
    


    のうち、一番上の draggingEntered: の実装について解説したところまでであった。次のdraggingExited:はつまり上の逆、ドラッグされている物体(というのがテキトーであるかどうかは議論のあるところだが)が当該ビューの上から出て行った場合にやってくるメッセージである。とりあえずこんな風に書いておく。

    - (void) draggingExited: (id ) sender{
         _dragging = NO;
         [self setNeedsDisplay: YES];
    }
    


     簡単ですね。つまり draggingEntered: を受けとったときにオンにしたフラグをオフにしてビューの見た目を「なんにもなかったことにする」んである。人生においては時折、とってもつらい「なんにもなかったことにしましょうね」が訪れるもんであるが、これはお手軽である。なに書いてんだオレ。

    三番目の prepareForDragOperation: はこれに輪をかけてお手軽。普通こんなもんである。

    - (BOOL) prepareForDragOperation: (id ) sender{
         return YES;
    }

    このメッセージはそれまでドラッグされていた物体(もう物体でいいや)がビューの上で「ドロップ」された瞬間にやってくる。これは直前に呼ばれたdraggingEntered: (draggingUpdated: のときもある)がNSDragOperationNone以外の値を返したときにだけ呼ばれるので、まぁかなり特殊な場合を除いてはYESを返しておけばOKである。ちうか、ワタシは正直なところ、draggingEntered: でNSDragOperationNone 以外を返しておいて、そいつのドロップをハンドリングできないという例を思いつかないんだけど、ここでNOを返すって例えばどんなケースなのかしら。

     そして最後の performDragOperation: こそがドラッグ&ドロップ・オペレーションの立役者、花形満である。こいつの仕事を一言で言えば鉄球を鉄バットで打ち返す特訓をして体中ぼろぼろにしつつ大リーグボール1号を打つことなのだが、具体的には(なにが具体的だ)以下のような感じになる。

    - (BOOL) performDragOperation: (id ) sender {
         /* まず(必要があれば)委細構わずアクティブ・アプリケーションになる */
         [NSApp activateIgnoringOtherApps:YES];
         /* ドラッグ&ドロップ用ペーストボードからドラッグされてきた
           ファイル名のアレイを獲得 */
         NSPasteboard*  pb = [sender draggingPasteboard];
         NSArray*   fList = [pb propertyListForType: NSFilenamesPboardType];
         /* ここでこれらのファイルを煮るなり焼くなりするわけだが、ここでは
           コンソールに名前をさらすだけにしておいてやろう。面倒だから(笑) */
         int  index;
         for(index = 0; index < [fList count]; index++){
              NSLog(@"Dragged File #%d is %@",
                   index,  [fList objectAtIndex:index] );
         }
         return YES;    /* ちゃんと処理したぞ */
    }
    


     もちろんこれはサンプルだからこんなふうに単純なのであって、例えば画像ファイルは扱うけど他のだめとか言う場合、上のアレイのなかを一個一個ナメていって一個も画像ファイルがなかったときにはNOを返すとかするわけである。よくファイルをアプリケーションのウインドウにドロップすると、花形に打ち返された大リーグボールみたいにギュイーンって元の場所へ戻っていくときがあるではないの。あれはこのメソッドが(確かめてないけどたぶんprepareForDragOperation: も、だと思う)NOを返した結果なのである。

    (2006_10_12)

    高橋真人の「プログラミング指南」第99回

    プログラマのためのオブジェクト指向再入門(7)

    〜クラス<3>〜

     こんにちは、高橋真人です。
     早速続きです。

    void
    IntType::print()
    {
         printf("%d", number);
    }
    


     前回ご説明した部分に加え、このprint()というメンバ関数の定義で、IntTypeクラスの基本的な実装は完了です。これで連載96回の冒頭にあるコードは動作するようになります。
     と言いたいところなのですが、実はC++のコードとしてはこれだけでは不充分です。「アクセス制御」というものの関係上、このままではコードがコンパイルを通ってくれません。
     アクセス制御の説明はもう少し先になりますので、残念ながらコードの実行を試してみることはまだできませんが、今回のクラスは非常に単純なのでコードを見ただけでどんな動きをするのかの想像をすることは容易でしょう。

    引き続いて、今度はFloatType(連載96回のコード例B')を実装していきますが、その前に連載96回でIntTypeに加えてみたdivideBy()も実装してしまいましょう。

    void
    IntType::divideBy(int n)
    {
         number /= n;
    }
    


     予想通り簡単でしょうから、特に説明の必要もないと思います。ここでは省略しましたが、もちろんクラス定義の方にdividedBy()の宣言を加えておいてください。以下のFloatTypeの例を参照すれば、そんなに難しくないはずです。
     では、FloatTypeです。まずはクラスの定義。

    class FloatType
    {
         FloatType(float n);
    
         void add(float n);
         void dividedBy(float n);
         void print();
    
         float     number;
    };

     IntTypeとの比較がしやすいように、メンバ関数の引数名やメンバ変数名をあえて同じにしてあります。
     では、続いて各メンバ関数の実装。

    FloatType::FloatType(float n)
    {
         number = n;
    }
    
    void
    FloatType::add(float n)
    {
         number += n;
    }
    
    void
    FloatType::print()
    {
         printf("%f", number);
    }
    
    void
    FloatType::divideBy(float n)
    {
         number /= n;
    }
    


     ざっと見ると、IntTypeとほとんど違いがありません。細かい部分を見ますと、intがfloatになったことと、printf()の出力オプションが%dから%fになったことに気付くでしょう。
     ここで一つ注目してほしいことは、divideBy()における/=演算子がIntTypeとFloatTypeでは異なる処理をしていることです。つまり、連載96回で解説したように、/という演算子を処理するに際してコンパイラはオペランド(演算する対象)を見て整数演算にするか浮動小数演算にするかを切り替えています。
     このような「一つの演算子で複数の処理を使い分ける」仕組みのことを「演算子のオーバーロード」と呼びますが、これはオブジェクト指向言語の特徴というわけでもありません。今まで特に意識したことはなかったかもしれませんが、C言語においても備わっている仕組みですから。

    ところで、鋭い読者の方はひっかかっていることがあるかもしれません。それは、IntTypeでもFloatTypeでも、add()やdivideBy()という関数の引数として、intやfloatを与えていることです。「コード例ではintやfloatではなく、同じクラスの別のオブジェクトを与えているではないか」と。
     ご指摘は確かにごもっともです。ただ、その辺は前述のアクセス制御とも絡んでくる話になるので、今の段階では話を単純にするためにその辺を曖昧にしてしまいました。すみません。
     でも、このままじゃコードがちゃんと動いてくれませんので、次回はそれに対しての対策のお話から始めることにいたしましょう。

    ニュース・解説

     今週の解説担当:小池邦人

    ● Carbon ドキュメント & サンプル & SDK ナビゲーション(2006/10/13)

    【開発環境】

    Apple社からMac OS X 10.4.8が発表されました。皆さんのマシンでは問題なく動いているでしょうか? どうやらMac OS X 10.4.8のインテル版の方は「Rosetta」が大きく改良されているようでして、PowerPC版のアプリケーションを動かした場合、その浮動小数点演算能力が大幅にアップするようです。またAltiVec演算のエミュレーションも高速になっているという報告もあります。浮動小数点やAltiVec演算を多用するアプリケーションではかなりの効果が期待できそうです。さっそく浮動小数点やAltiVec演算を多用する自作アプリで試してみたところ、確かにRosettaが改良された効果が出ているようです。ただし、そうは言ってもネイティブで動かす場合の半分以下の速度しか出ませんので、いまだユーザにUniversalアプリケーションを供給できていないメーカーには、気合いを入れてがんばっていただきたいと思います。

    【テクニカルドキュメント】

    前回から10月13日の期間中、Apple社のGuidesサイトやReferenceサイトには新規ドキュメントが多数登録されました。ただし、大部分は今までの内容のマイナーチェンジです。今回は、その中で初版と内容が大幅変更になったドキュメントだけをピックアップしました。初版は、Referenceサイトに登録された3つのドキュメントのみです。また、デベロッパー向け読み物が2つ登録されています。

    「Cocoa Application Tutorial Using Bindings」(PDFあり)
    「Exception Programming Topics for Cocoa」(PDFあり)
    「Shell Scripting Primer」(PDFあり)
    「System Startup Programming Topics」(PDFあり)
    「Final Cut Pro XML Interchange Format」(PDFあり)
    「FxPlug SDK Overview」(PDFあり)
    「Xcode 2 User Guide」(PDFあり)(日本語訳あり)

    http://developer.apple.com/documentation/index-rev-date.html

    「Exception Handling Framework Reference」(PDFあり)(初版)
    「NSExceptionHandler Class Reference」(PDFあり)(初版)
    「WebObjects Bundle Reference」(PDFあり)(初版)

    http://developer.apple.com/reference/index-rev-date.html

    「Growing Your Business: Developer Opportunities with the Apple Store」(読み物)

    http://developer.apple.com/business/macmarket/applestoreanddevelopers.html

    「Mindjet Enhances MindManager 6 Mac: More Than Just Porting」(読み物)

    http://developer.apple.com/business/macmarket/mindmanager.html

    前回から10月13日の期間中、新規テクニカルノートは3つ登録されました。また、新規テクニカルQ&Aの方は11登録されました。

    TN2137「Building Universal Binaries from "configure"-based Open Source Projects」
    TN2138「QTKit Frequently Asked Questions」
    TN2084「Using AppleScript Scripts in Cocoa Applications」(初版)

    http://developer.apple.com/technicalnotes/index-rev-date.html

    QA1367「Finding EXC_BAD_ACCESS bugs in a Cocoa project」
    QA1436「What is the "main bundle" of a command-line foundation tool?」(初版)
    QA1493「How do I access files contained in my AppleScript Studio application bundle?」(初版)
    QA1454「How to make NSTextField accept tab, return and enter keys.」(初版)
    QA1297「Don't forget to cancel your Bonjour resolve」
    QA1323「Interface element identification in Interface Builder」(初版)
    QA1490「Building Objective-C static libraries with categories」(初版)
    QA1486「Programmatically Accessing and Manipulating Multiple Keychain Items」(初版)
    QA1339「The state of mDNSResponder」
    QA1457「Compression Sessions - Multipass encoding and the pass mode flags」
    QA1364「Where are the LiveConnect classes on Mac OS X?」

    http://developer.apple.com/technicalqas/index-rev-date.html

    【サンプルソースコード】

    前回から10月13日の期間中、Apple社のSample Codeサイトには、バラエティーにとんだサンプルソースコードが16登録されました。「BoingX」については、前号の木下さんの記事も参照してみてください。ちなみにこのデモは、デモをするアミガの横で動いていた初代Macintoshでの同じデモ(アミガの方がこんなに高速だと自慢するためのデモ)があまりにもひどかったため、それを見たApple社の技術者が即座に高速のデモを作成してアミガ陣営を見返したのが発端です(笑)。初代Macintoshは裏VRAMを持っていたので、それをうまく利用し美しく高速な表示を実現していました。

    「SayIt」(Web Kit関連)(初版)
    「CarbonCocoa_PictureCursor」(Carbon&NSCursor関連)(初版)
    「BlockAnimation」(Java関連)(初版)
    「Dicey」(Cocoa&Game関連)(初版)
    「OpenGL based game template」(Game&OpenGL関連)(初版)
    「Resizer」(Widget関連)(初版)
    「Birthdays」(Widget関連)(初版)
    「CarbonQuartzComposer_TV」(QuartzComposer関連)(初版)
    「HelloStudio」(AppleScript Studio関連)(初版)
    「Processes」(AppleScript Studio関連)(初版)
    「TextEditPlus」(Cocoa&TextEdit関連)(初版)
    「CxxNewDelete」(C++関連)(初版)
    「Carbon Porting Tutorial」(Carbon関連)(初版)
    「CarbonCocoaCoreImageTab」(CoreImage関連)(初版)
    「AttachAScrip」(AppleScript関連)(初版)
    「ComplexPlayThru」(CoreAudio関連)

    http://developer.apple.com/samplecode/index-rev-date.html

    【デベロップメント SDK】

    前回から10月13日の期間中、Apple社のSDKサイトには新しいSDKが2つ登録されました。Mac OS X 10.4.8に対応した「Kernel Debug Kit 10.4.8」のPowerPC用とインテル用です。またToolsサイトには「CHUD 4.4.3」が登録されています。

    「Computer Hardware Understanding Development (CHUD) Tools version 4.4.3」

    http://developer.apple.com/tools/download/

    「Kernel Debug Kit 10.4.8 - Intel」
    「Kernel Debug Kit 10.4.8 - PowerPC」

    http://developer.apple.com/sdk/

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

  • MOSA Developer News[MOSADeN=モサ伝] 号 外

    2006-10-12       

    目次

      MOSA Software Meeting in 湘南 2006特集

    • 今年のメインテーマは、「実践でのチャレンジ!」
    • スケジュール確定!
    • MOSA Software Meeting in 湘南 2006の見所 その1
    • MOSA Software Meeting in 湘南 2006の見所 その2

    今年のメインテーマは、「実践でのチャレンジ!」

     皆さん、本年も「MOSA Software Meeting in 湘南」の季節が到来いたしました! WWDC2006が8月に開催された関係上、今回は毎年開催していたアップル社とMOSA有志共同によるWWDC報告会も同時開催となります。また、セッション内容も純粋な技術論だけではなく、より現場的、実践的、実務的な話題を提供できるよう、フレッシュな講師陣とテーマのセレクションに努めております。
     もちろん、最新Mac OS XであるLeopardに関する情報や、最新のテクノロジーの話題も満載です。より多くの方々の参加をお待ちしております。
     湘南でお会いいたしましょう!

          MOSA Software Meeting in 湘南 2006 実行委員長  小池邦人

    スケジュール確定!

    (A-1)「Cocoa勉強会 in MOSA(2セッションの前半)」Cocoa勉強会5名
    (A-2)「Cocoa勉強会 in MOSA(2セッションの後半)」(同上)
    (A-3)「いまさら他人に聞けないCocoa」 藤本 裕之氏

    (B-1)「インテル・ソフトウェア開発製品の紹介」菅原 清文 氏
    (B-2)「レーザプリンタとプリンタドライバについて」五十嵐 攻氏
    (B-3)「Audio / Image Application開発環境としてのOSX 」 永野 哲久 氏

    (C-1)「『ドキュメント』とどう向き合うか」海上忍 氏
    (C-2)「RubyCocoa入門 – オブジェクト指向スクリプト言語RubyによるMac OS Xプログラミング」藤本 尚邦 氏
    (C-3)「日常生活のためのユーザインタフェース」渡邊 恵太 氏

    それぞれの概要は次の見所1をご覧ください。
    A-1、B-1、C-1のセッションは13時からはじまります。

    MOSA Software Meeting in 湘南 2006の見所 その1     湘南実行委員

     今年の湘南ミーティングがいよいよ来週に迫りました。今年は会場を湘南国際村センターだけにしました。これまでのようなセッション途中のバス移動がないので余裕を持ったスケジュールになっています。
     会場へはJR逗子駅前からチャーターバスも用意致しました。詳しくはFAQのページでご確認ください。
    http://www.mosa.gr.jp/htmdocs/article/event-181020faq.php

    以下の3トラック9セッションは同時に三つのセッションが並行して開催されます。配布資料はすべてのセッションを含みます。

    ———————————————————————-
    (セッションB-1)
    ●「インテル・ソフトウェア開発製品の紹介 – スレッディング・ビルディング・ブロックによる革新的なマルチスレッド・アプリケーションの開発 」
    インテル株式会社 ソフトウェア&ソリューションズ統括部 ソフトウェア製品部 プロダクトマネージャー 菅原 清文 氏
    ———————————————————————-
    すでにiMacもMac miniもデュアルコアが標準となりMac Proでは4つのCPUを搭載しています。これらを有効活用するのに欠かせないマルチスレッド技術はソフトウエア製品のパフォーマンスを左右する重要な意味を持ちます。

    このセッションでは既に発表済みのインテル・コンパイラー、ライブラリーに関する最新のアップデートと、8月に発表された新製品インテル・スレッディング・ビルディング・ブロックを使用したまったく新しいマルチスレッド・アプリケーションの開発方法を紹介していただきます。

    ———————————————————————-
    (C-2)
    ●「RubyCocoa入門 – オブジェクト指向スクリプト言語RubyによるMac OS Xプログラミング」
    フリープログラマ 藤本 尚邦 氏
    ———————————————————————-
    講師はRubyCocoaという、RubyとCocoaのブリッジを作っている方ご本人
    http://rubycocoa.sourceforge.net/
    http://www.fobj.com/hisa/d/
    Leopardに標準搭載されるRubyCocoaについて開発者から直接お話が聞けます。
    RubyCocoaの紹介、RubyCocoaのアーキテクチャ、開発の苦労話、裏話、などが聞けるかも。

    ———————————————————————-
    (B-3)
    ●「Audio / Image Application開発環境としてのOSX 」
    フリーランスプログラマー 永野 哲久 氏
    ———————————————————————-
    Core ImageとCore AudioをMonalisa Productで融合した永野さんによる興味深いセッションです。
    http://monalisa-au.org/plog/
    Monalisaとは『音と画像を相互変換出来る事を利用し、音に対して画像処理を、画像に対して音処理を行い新たな画像・音処理の可能性を追及するプロジェクト』だそうです。

    ———————————————————————-
    (B-2)
    ●「レーザプリンタとプリンタドライバについて」
    富士ゼロックスプリンティングシステムズ株式会社 商品開発統括部 ソリューション開発推進部 五十嵐 攻 氏
    ———————————————————————-
    情報のあまり出回らないプリンタドライバについてのお話が聞ける貴重な機会です。

    ———————————————————————-
    (C-1)
    ●「『ドキュメント』とどう向き合うか」
    テクニカルライター 海上 忍 氏
    ———————————————————————-
    大規模な開発案件では避けて通る事のできないドキュメント作成。小規模な開発では開発者自ら作成しなければならないドキュメントについて、本業のライターさんがテクニックを伝授してくれるセッションです。

    ———————————————————————-
    (A-3)
    ●「いまさら他人に聞けないCocoa」
    有限会社パムリンク 藤本 裕之 氏
    ———————————————————————-
    モサ伝連載でもおなじみの藤本氏が奥深いCocoaの世界をするどく解説するセッションです。サンプルプログラムも充実しているはずです。

    ———————————————————————-
    (C-3)
    ●「日常生活のためのユーザインタフェース」
    慶應義塾大学 大学院 渡邊 恵太 氏
    ———————————————————————-
    Apple社がiTVを発表しリビングに進出しようとしているこの時期にぴったりのセッションです。近未来のユーザーインターフェースを考えるきっかけになることでしょう。

    ———————————————————————-
    (A-1)(A-2)
    ●「Cocoa勉強会 in MOSA」
    Cocoa勉強会 宮田祐治氏、木村渡氏、新居雅行氏、村上幸雄氏、木下誠氏
    ———————————————————————-
    「Cocoa勉強会」について興味は持っていても、近くで開催されないために参加できなかった方も少なくないのでは? 今回「Cocoa勉強会」が湘南に出張してくれました。
    2コマ(90分×2)を使って、180分を5つのパートにわけて開催します。前半または後半だけの受講ももちろん可能です。

    MOSA Software Meeting in 湘南 2006の見所 その2     湘南実行委員

    キーノートセッション・WWDC報告会・スペシャル企画はそれぞれ単独セッションで全員参加です。

    ———————————————————————-
    【キーノートセッション】
    ●「『Apple 2.0』時代の夜明け」
    テクノロジーライター 大谷 和利 氏
    ———————————————————————-
    湘南ミーティングの顔とも言える大谷さんのキーノートセッションは、参加者に興味深い情報の数々とやる気を届けてくれます。今年も聞き逃せません!

    ———————————————————————-
    【アップルセッション】
    ●「Leopard テクニカルブリーフィング(仮)」
    アップルコンピュータ株式会社 ワールドワイド デベロッパリレーションズ
    ———————————————————————-
    Apple社のWWDRスタッフによるセッションです。Leopardの、新しく提供されるテクノロジーにフォーカスをあて、より革新的なアプリケーションの開発の可能性について解説されます。
    WWDCから二ヶ月が過ぎただけにより新しく深い情報が期待されます!
    【このセッションは守秘義務の対象です】

    ———————————————————————-
    ●「WWDC(Worldwide Developers Conference)報告座談会」
    ———————————————————————-
    Leopardが発表されたWWDC参加者からの報告会です。WWDCは湘南ミーティング以上にトラック数が多く八つのセッションが同時進行します。このためWWDCに参加した人でも聴講できるセッションは限られます。
    報告会はWWDCに参加されていない方にはもちろん参加された方にも役立つはずです。メディアに登場しない生の声にご期待ください。

    ———————————————————————-
    【スペシャル企画】
    ●「初心者優先の大質問コーナー」
    ———————————————————————-
    「MOSA Software Meeting in 湘南 2006」実行委員長の小池です。

    セッションの講師の方々を交え、Cocoa & Carbonアプリケーションに関してはもちろん、Macintosh関連だけではなく、その他一般的な「プログラミング」に関する様々な質問について、ベテランのプログラマがお答えするコーナーです。
    特に日頃から多くの疑問をお持ちだと思われる初心者の方々の質問を優先して、参加者全員で時間の続く限り議論をしたいと考えています。

    何かご質問がある参加者の方は、当日までにその内容をまとめておかれることをお勧めします。早く質問すれば、優先的に回答を得られますしね!

     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.

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

    2006-10-10
     

    目次

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

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

      〜Open Directory編〜

     まずはアップデート情報から。9/29にMac OS XおよびMac OS X Server用の10.4.8アップデートがリリースされました。Mac OS X用のアップデートはPPC用とIntel用とで、それぞれ10.4.7からのアップデートと、10.4.0以降に適用可能なコンボアップデートがリリースされています。一方Mac OS X Server用のアップデートはPPC用のアップデートとUniversal用のアップデートに分かれています。これはUniversal対応したMac OS X Server v10.4.7がパッケージとしてリリースされているためだと思われます。Mac OS X Serverはv10.4.7で初めてUniversal対応したためv10.4.8のコンボアップデートはリリースされていません。
     Intel用およびUniversal用のアップデートのサイズをみてみますと、かなり大きなサイズのアップデートであることが分かります。

    ・Mac OS X 10.4.8 Update(Intel):206MB
    ・Mac OS X Server 10.4.8 Update(Universal):202MB

     Mac OS X Server用のアップデートの内容をみてみますと、Open Directoryのマスターとレプリカ間でのパスワード情報の同期や、「QuickTime Player」へのストリーム配信に関する問題が修正されていることが分かります。
     OSのアップデートはシステムの再起動が必要になりますので、計画的に実施するようにしましょう。

    ・Mac OS X Server 10.4.8 Update(PPC)
    http://www.apple.com/jp/ftp-info/reference/macosxserver1048updateppc.html

    ◇「ワークグループマネージャ」
     前回は、Open Directoryのマスターの設定方法を解説しました。マスターを構築すれば新たにディレクトリが作成され、ネットワーク上で共有可能なユーザ(ネットワークユーザ)を登録できるようになります。
     Open Directoryの設定は「サーバ管理」で行いましたが、Open Directory上のユーザを管理するには「ワークグループマネージャ」を使用します。「ワークグループマネージャ」には大きく分けて次の4つの役割がありますが、今回はアカウントの管理について解説したいと思います。

    ・共有ポイントの管理
    ・ネットワーク表示の管理
    ・アカウントの管理
    ・環境設置の管理

     「ワークグループマネージャ」は、「/アプリケーション/サーバ」にインストールされています。これは「サーバ管理」と同じ場所です。起動するとまずは接続先のサーバを指定する必要があります。つまり「サーバ管理」と同様にネットワークを経由してリモートのサーバを管理できるということです。
     サーバがDNSに登録されている場合、サーバのアドレスはDNSに登録した名前で指定しましょう。また、このとき認証に使用するユーザは、サーバの管理者ユーザであれば大丈夫です。

    ・「ワークグループマネージャ」でのサーバへの接続ダイアログ
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_User/WGM_User_01.png

     「サーバ管理」の場合は、一度接続したサーバは画面左側のリストに登録されますが、「ワークグループマネージャ」にはサーバのリストはありません。そこで、頻繁に使用するサーバであれば、「よく使う項目」メニューから「よく使う項目に追加」を選択して、サーバをメニューに追加しておくと便利です。メニューに追加しておけば、メニューを選択するだけですぐにサーバにアクセスすることができます。

    ・よく使う項目に追加
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_User/WGM_User_02.png

     サーバ接続したらまず選択中のディレクトリを確認します。これはマスターに設定したMac OS X Server上には2つのディレクトリがあり、必要に応じて切り替える必要があるからです。片方のディレクトリは、システムに最初から用意されているローカル用のディレクトリで、もう片方はマスター構築時に作成されたネットワーク用のディレクトリです。
     「システム環境設定」の「アカウント」で管理するユーザアカウントはローカルのディレクトリ(NetInfoで管理)に保存されますが、ネットワークユーザを作成する場合はネットワーク用のディレクトリ(LDAPで管理)に対して操作を行う必要があります。
     ディレクトリの選択方法ですが「ワークグループマネージャ」のツールバーのすぐ下(左端)にポップアップメニューがあり、ここからディレクトリを選択できます。ローカル用のディレクトリを管理するには「ローカル」を選択し、ネットワーク用のディレクトリを管理するには「/LDAPv3/127.0.0.1」を選択します。もしポップアップメニューに「/LDAPv3/127.0.0.1」が表示されない場合は、「その他…」を選択してから目的のディレクトリを選択します。

    ・ディレクトリの選択
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_User/WGM_User_03.png
    ・ディレクトリの選択「その他…」
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_User/WGM_User_04.png

     ディレクトリを切り替えると画面左側に表示されるユーザのリストが切り替わることが確認できます。「ローカル」を選択したときには、「システム環境設定」の「アカウント」で管理しているのと同じユーザのリストが表示されます。また、ポップアップメニューから「検索パス」を選択したときには、ローカルとネットワーク両方のディレクトリに登録されているユーザのリストが表示されます。

    ・ディレクトリ:ローカル
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_User/WGM_User_05.png
    ・ディレクトリ:/LDAPv3/127.0.0.1(ネットワーク)
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_User/WGM_User_06.png

     次回はネットワークユーザの登録方法について解説する予定です。

    つづく

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

    本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。前回は「#addFieldTo:」というメソッドをGuiBuilderクラスに定義しました。

    addFieldTo: window
      | field |
      field := PluggableTextMorph
        on: self text: nil accept: nil readSelection: nil menu: nil.
      window addMorph: field frame: (0.5 @ 0.5 extent: 0.5 @ 0.5)

    このメソッドは、GUIビルダウインドウのウインドウメニューに新たに設けられた「add field」というメニュー項目を選択したときに起動され、ウインドウの右下にウインドウサイズの四分の一の大きさのテキストフィールド(a PluggableTextMorph)を設置します。

    ウインドウサイズの右下に四分の一の…というのは、最終行で起動されるメソッド#addMorph:frame:の第二パラメータである「0.5 @ 0.5 extent: 0.5 @0.5」という式で生成される矩形情報(a Rectangle)により指定されています。表示領域の中央(0.5 @ 0.5)から、縦横幅の半分の大きさ(extent: 0.5@ 0.5)で…という感じでしょうか。ウインドウ内の任意の位置にテキストフィールドを設置するには、この矩形情報を動的に生成する仕組みを設ければよさそうですね。

    マウス操作でインタラクティブに矩形情報を生成するには、すでに第64回で予習したとおり、クラスRectangleにメッセージfromUserを送信するのがお手軽です。直後に画面に描いたのと同じ対角線情報を持つ矩形オブジェクトを得ることができます。

    ただし、そのままでは#addMorph:frame:を起動するメッセージの第二パラメータとしては使えません。この第二パラメータには、新たに追加するウィジェットの画面上での位置ではなく、ウインドウに対する相対的な位置と、ウインドウの幅を1.0、高さを1.0としたときの相対的な大きさで指定しなければならないからです。

    相対的な矩形情報への換算(全体の何割に当たるのか…)には、基準となる特定のウインドウの表示領域(タイトルバーを除いた…)の矩形情報が必要となりますが、これはウインドウにlayoutBoundsというメッセージを送ることで得られます。さらにその矩形情報にメッセージtopLeftを送れば左上の座標を、widthやheightを送れば幅や高さの情報を(extentを送れば、双方をa Pointとして同時に)得ることが可能です。

    これら一連の情報を用い、座標や大きさ(いずれもa Pointで表現…)同士の二項演算を行なうことで、必要な換算式は比較的簡潔に記述できます。たとえば次のスクリプトでは、rectに関連づけされたRectangle fromUserが返す絶対座標の矩形情報を、そのスクリプトが入力されている(つまり、最前面の)ウインドウ表示領域に対する相対比値に変換して返します。

    | rect window bounds relOrigin relExtent |
    
    rect := Rectangle fromUser.
    window := SystemWindow classPool at: #TopWindow.
    bounds := window layoutBounds.
    relOrigin := (rect topLeft - bounds topLeft) / bounds extent * 1.0.
    relExtent := rect extent / bounds extent * 1.0.
    
    ^ relOrigin extent: relExtent
    


    さらに、クラスRectangleには、レシーバを第一パラメータとして添えた別の矩形の相対座標に変換してくれる#scaleFrom:to:という便利なメソッドがあるので、これを使うのもよさそうです。ただ、この#scaleFrom:to:は結果を整数にまるめてしまうため、0.0〜1.0の間の数で割合を表現したい今回は、そのままでは使えません。そこで、同じくRectangleに定義されている#scaleBy:を組み合わせて結果を1.0以下の小数で算出できるよう工夫します。

    | rect window bounds |
    
    rect := Rectangle fromUser.
    window := SystemWindow classPool at: #TopWindow.
    bounds := window layoutBounds.
    
    ^ (rect scaleFrom: bounds to: (0 asPoint extent: 1e3 asPoint)) scaleBy: 1.0e-3

    以上をふまえて、ウインドウメニューから「add field」を選択したときに、任意の大きさのテキストフィールドを設置できるよう冒頭のGuiBuilder >>#addField:to:を書き換えてみましょう。

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


    「add field」選択後、マウスで描いた矩形がその場でテキストフィールドに置き換わり、きちんとGUIビルダウインドウに設置されれば成功です。

    バックナンバー:

    ニュース・解説

     今週の解説担当:木下 誠

    ———————————————————————-
    WebObjectsバンドルのフォーマット
    ———————————————————————-

    WebObjectsで使われるバンドルのフォーマットを解説したドキュメント、「WebObjects Bundle Reference」が公開されています。EOModel Bundleと、WOComponent Bundleの2つが含まれています。

    WebObjectsの開発環境としてXcodeベースのものが望めなくなった今、Apple以外のベンダによる開発環境の充実が待たれます。そのための情報は出していこう、ということでしょうか。

    WebObjects Bundle Reference
    http://developer.apple.com/documentation/InternetWeb/Reference/WO_BundleReference/index.html

    ———————————————————————-
    ExceptionHandlingフレームワークの使い方
    ———————————————————————-

    Cocoaの例外を処理するためのフレームワーク、ExceptionHandling.frameworkの使い方を解説したドキュメント、およびリファレンスが公開されました。

    このフレームワークは、Cocoaで発生した例外をキャッチして処理するための機構を提供します。ここで得られるNSExceptionと、atosというコマンドを利用することで、例外が発生した場所のスタックトレースを行うことができます。こちらについては、「Mac OS X Serverの例外処理について」というドキュメントに説明があります。

    Exception Handling Framework Reference
    http://developer.apple.com/documentation/Cocoa/Reference/ExceptionHandlingFramework/index.html

    Exception Programming Topics for Cocoa
    http://developer.apple.com/documentation/Cocoa/Conceptual/Exceptions/index.html

    Mac OS X Server 1.x: Mac OS X Serverの例外処理について
    http://docs.info.apple.com/article.html?artnum=60115-ja

    ———————————————————————-
    複数のKeychainアイテムにアクセス
    ———————————————————————-

    複数のKeychainアイテムアクセスに関するQA、「Programmatically Accessing and Manipulating Multiple Keychain Items」が公開されています。

    QA1486: Programmatically Accessing and Manipulating Multiple Keychain Items
    http://developer.apple.com/qa/qa2006/qa1486.html

    ———————————————————————-
    Cocoaのテキストビューでリンクの表示
    ———————————————————————-

    NSTextFieldとNSTextViewにハイパーリンクを埋め込む方法を説明したQA、「Embedding Hyperlinks in NSTextField and NSTextView」が公開されています。

    NSLinkAttributeNameという属性を使うことになります。これで、リンククリックでWebブラウザを起動することができるようになります。

    QA1487: Embedding Hyperlinks in NSTextField and NSTextView
    http://developer.apple.com/qa/qa2006/qa1487.html

    ———————————————————————-
    NSTableView、NSOutlineViewの背景に画像を描く
    ———————————————————————-

    CocoaのNSTableView、NSOutlineViewの背景に画像を描くサンプル、「ImageBackground」が公開されています。

    ポイントは、NSTableView、NSOutlineViewのサブクラスを作りdrawRect:を実装することと、それらのsuperviewにあたるNSScrollViewにsetDrawsBackground:メッセージを送ってやることです。

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

    ———————————————————————-
    CarbonからBonjourを使う
    ———————————————————————-

    CarbonアプリケーションからBonjourを利用するサンプル、「CarbonBonjour」が公開されています。

    CFNetServicesを使うことになります。

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

    ———————————————————————-
    帰ってきたBoingX
    ———————————————————————-

    サンプルコードBoingXがアップデートされました。Universal Binary化と、バグフィックスが行われています。

    Boingは、もともとAmigaで動いていたデモソフトでした。それをもとに、OpenGL機能のデモとして、Mac OS Xに移植されます。その後、Mac OS X 10.2では、Quartz Extremeのデモとしても使われます。Quartz Extremeでは、OpenGLとQuartzの描画が統合されました。これにより、いままでウィンドウという枠にとらえられていたBoingが、デスクトップ中を自在に飛び回れるようになったのです!(これを試すには、BoingXを起動して、tキーを押してください。)

    そんなBoingX、デスクトップユーティリティやアニメーションに興味のある方は、ぜひお試しください。

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

    OpenGL Amiga Boing
    http://www.jimbrooks.org/web/opengl/boing/

     

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

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

    2006-10-03

    目次

    • 「Wonderful Server Life」      第21回  田畑 英和
    • 藤本裕之のプログラミング夜話 #100
    • 高橋真人の「プログラミング指南」  第98回
    • ニュース・解説                小池 邦人

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

    〜Open Directory編〜

     今回からOpen Directoryの解説を行います。Open DirectoryとはMac OSで利用可能なディレクトリーサービスの名称です。Open Directoryを使えばユーザアカウントなどの情報をサーバで一元管理することができますが、具体的にどのようなことが実現できるかは第16回の連載ですでに紹介済みですので、設定方法を中心に解説していきたいと思います。

    ◇Open Directoryの役割
     Open Directoryの設定を行うには、まずOpen Directoryの役割について理解しておく必要があります。Open Directoryには以下の4つの役割があります。

    ・スタンドアロンサーバ
    ・ディレクトリシステムに接続
    ・オープンディレクトリの複製
    ・オープンディレクトリのマスター

     Mac OS X Serverの初期設定時に「ディレクトリの利用設定」(第8回の記事で解説)という項目がありますが、ここで特に設定を行っていなければOpen Directoryの役割は「スタンドアロンサーバ」になっています。「スタンドアロンサーバ」とはようするにディレクトリサービスを提供しないサーバのことです。現在の役割を確認するには「サーバ管理」で目的のサーバに接続して、「オープンディレクトリ」サービスの「概要」を表示すれば確認できます。

    ・「スタンドアロンサーバ」
    http://homepage.mac.com/htabata/MXS10.3/img/OD/OD_01.png

     ディレクトリサービスを提供するには役割を「オープンディレクトリのマスター」に設定します。今回設定方法を解説するのはこの役割になります。
     あと2つ役割がありますが、規模の大きなシステムではサーバを複数台設置して、各種サービスを別々のサーバ上で運用することがあります。このようなシステムでは1台のサーバをマスターにして、ほかのサーバはマスターを参照するように設定することができます。マスターを参照するように設定するには役割を「ディレクトリシステムに接続」に設定します。また、Open Directoryの可用性やスケーラビリティを向上させるには「オープンディレクトリの複製」を作成して、マスター上のデータのコピーを別サーバ上で管理することもできます。

    ・4つの役割
    http://homepage.mac.com/htabata/MXS10.3/img/OD/OD_02.png

    ◇設定前の確認
     マスターを設定するには事前にDNS関連のチェックが必要です。マスターに設定するサーバがあらかじめDNSサーバに登録されていて、サーバからの名前解決に応答できる必要があります。
     既存のDNSサーバがあればそちらに登録しておくこともできますし、前回まで解説してきたように、Mac OS X Server上でDNSサービスを設定して、そこに自分自身を登録することもできます。
     DNS関連の設定が正しく設定されているかどうかを確認する方法もこれまで解説してきましたが、あらためて確認に使用するコマンドをまとめますと以下の3つになります。

    ・ホスト名の確認
    % hostname
    ・DNS正引きの確認
    例)% host server.example.com
    ・DNS逆引きの確認
    例)% host 192.168.0.1

     マスターとして設定するサーバのホスト名がDNSサーバに登録されているホスト名になっており、サーバ上で自分自身の正引きと逆引きができればOKです。DNSの設定が不完全な状態でマスターの設定をしますと、設定が正常に行われませんので注意が必要です。

    ◇マスターの設定
     DNS関連の確認ができたらいよいよマスターの設定です。設定は以下の手順で行います。

    1.「サーバ管理」でサーバに接続
    2.「オープンディレクトリ」サービスを選択し「設定」画面を表示
    3.「役割」ポップアップメニューから「オープンディレクトリのマスター」を選択
    4.シートが表示されたら新規アカウントのパスワードを設定し「作成」をクリック
    5. 「サーバ管理」画面右下の「保存」をクリック

    ・マスターの設定画面
    http://homepage.mac.com/htabata/MXS10.3/img/OD/OD_03.png

     以上の手順を実行すればOpen Directoryをマスターとして設定することができます。手順4のシートですがここでは「新規アカウント」と「ドメイン情報」を設定します。
     マスターを設定するとデータを保存するための新たな場所(ディレクトリ)が作成されますが、「新規アカウント」は新たに作成されたディレクトリを管理するためのアカウントです。デフォルトで「diradmin」というユーザ名が設定されていますが、変更することも可能です。あとパスワードを設定します。
     Open Directoryではシングルサインオンを利用することもできますが、シングルサインオンを実現するためにOpen DirectoryにはMITで開発されたKerberosが搭載されています。「ドメイン情報」はこのKerberosに関する設定ですが、デフォルトでパラメータが自動的に設定されます。
     マスターの設定にはしばらく時間がかかる場合がありますが、設定が完了したあとに「概要」画面を確認しますと、役割が「スタンドアロンサーバ」であったときは停止していたサーバがすべて実行中になっていることが確認できます。もし一部が停止のままになっている場合はどこかの設定に問題があるということですので、役割を「スタンドアロンサーバ」に戻してから設定の確認を行い、マスターの再設定を行ってみてください。

    ・「オープンディレクトリのマスター」
    http://homepage.mac.com/htabata/MXS10.3/img/OD/OD_04.png

    つづく

    藤本裕之のプログラミング夜話 #100

     前回は、registerForDraggedTypes: を使ってそのビューがどんなデータのドラッグ&ドロップに応えられるかを登録する、というところまでだった。これはなんつうかいわば麻雀の待ちみたいなもんである。1つのタイプしか扱えないやつはつまりカンチャンとかペンチャン、あタンキもそうか。2つならリャンメン、シャンポン……最高は国士無双の13メンテン……え、麻雀やらないヒトには何のことだか解らない? これはどうも失礼。
     とにかく「こいつらがドラッグ&ドロップされた場合にはメンドーみます」と宣言したわけなので、そのメンドーみるコードを書かねばならない。そのためのメッセージは「NSDraggingInfo」プロトコルとして定義されているのだが、とりあえず以下の4つが必須である。

    - (NSDragOperation)draggingEntered: (id ) sender;
    - (void) draggingExited: (id ) sender;
    - (BOOL) prepareForDragOperation: (id ) sender;
    - (BOOL) performDragOperation: (id ) sender;
    


     まず一番上の draggingEntered: は、ドラッグ&ドロップされたモノが(実際にはそいつをドラッグしているマウス・ポインタが、だが)当該ビューの上に来たときに送られてくるメッセージ、「上に来たとき」というのはこないだカーソルのシェイプを変えるトリガーにしたのと同じなので解りやすいだろ。パラメータであるsenderからなにがドラッグされてきたのかを調べ、それに対する対応を返す。戻り値として返す定数は「NSDragging.h」にこう定義されている。

    enum {
       NSDragOperationNone    = 0,
       NSDragOperationCopy    = 1,
       NSDragOperationLink    = 2,
       NSDragOperationGeneric = 4,
       NSDragOperationPrivate = 8,
       NSDragOperationMove    = 16,
       NSDragOperationDelete  = 32,
       NSDragOperationEvery   = UINT_MAX
    };
    


    意味するところは字面通りだが、ワタシが実際に使ったことがあるのはNoneとCopyとMoveくらいである。以下にこのメソッドの簡単な実例を示す。

    - (NSDragOperation)draggingEntered: (id ) sender{
    
         if([sender draggingSource] != self) {
              NSPasteboard*  pb = [sender draggingPasteboard];
              NSString*      pbType = [pb availableTypeFromArray:
                   [NSArray arrayWithObject: NSFilenamesPboardType]];
              if(pbType != nil){
                   _dragging = YES;      // flag for drawing.
                   [self setNeedsDisplay:YES];
                   return NSDragOperationCopy;
              }
         }
         return NSDragOperationNone;
    }
    


    最初の if 節はこのドラッグがこのビュー自身からのものでないことを確認している。次にドラッグ用のペーストボードオブジェクトを参照して自分が処理できるタイプが入っているか確認。こいつは NSFilenamesPboardType にしか応えないという態度なので簡単である。_dragging というフラグはユーザに「ワシ、このファイル処理できまっせ」という意思表示をする(ビューの枠をハイライトするとか)ためのもの。次の setNeedsDisplay: はその描画をするため。

    もし処理できるタイプがなかったら NSDragOperationNone を返す。この場合、ビューは反応せず、ユーザはこのビューに対してそのパイが通ったことを知ってほっとするわけである(なんか混乱してますか)。

    (2006_09_28)

    高橋真人の「プログラミング指南」第98回

    プログラマのためのオブジェクト指向再入門(6)

    〜クラス<2>〜

     こんにちは、高橋真人です。
     さて今回は、前回説明しました「クラスを使ってオブジェクトを作る」ための具体的なやり方を紹介します。
     ただ、今まで説明に使ってきた“オブジェクト指向言語”は、あくまで私がでっち上げた架空の言語でした。さすがにクラスの定義の仕方までをでっち上げるほどの能力は私にはないので、ここは私が常用しているC++言語の仕組みを借りてくることにします。
     ちなみにC++というプログラミング言語は、決して初心者向きの言語ではありません。言語仕様も小さくありませんし、この言語の習得にはかなりの時間を要することも事実です。それでも、Objective-CやJavaではなく、あえてC++を使うのは、Cを習得した人にとっていちばんスムーズに行くと思うからです。
     と言いますのも、C++のクラス定義の仕方はCの構造体定義の方法を発展させて設計されたものなので、Cプログラマにとって奇異に感じる部分が比較的少ないと思うからです。(もちろん、クラス定義の部分に限ったお話です)
     今回は、あくまでクラス定義のやり方を部分的に借りてくるだけですが、構造体の定義の仕方について余り自信のない人は、いま一度復習をしてから以下を読まれると、よりスムーズに理解できるはずです。

     では早速、IntTypeからやってみましょう。

    class IntType
    {
         IntType(int n);
    
         void add(int n);
         void print();
    
         int      number;
    };
    


     いきなりすべてをやってしまうと、見た目にも複雑になってしまいますから、まずは基本的な部分だけにとどめておき、あとで拡張します。
     全体をざっと見渡しますと、classという識別子、定義するクラスの名前(ここではIntType)、定義の内容という構造になっています。定義の部分はブレースで囲まれていますが、ここは関数ではありませんから、構造体と同じように閉じのブレースのあとにはコロンが必要です。
     定義の中には、3つの関数と1つの変数があります。
     メンバ変数のnumberは、IntTypeから作られたオブジェクトが整数としての性質を保持するための基本となる整数値を入れておくために用意したものです。intという識別子があるように、Cの変数そのものです。唯一の違いは、IntTypeのオブジェクトに所属するということです。だから、メンバ(member)変数と呼ぶのです。
     メンバ関数の方は少し複雑です。3つの関数は、それぞれ少しずつ違います。
     まず最初にあるIntType()という、クラスの名前と同じ関数は、コンストラクタと呼ばれる特殊な関数です。コンストラクタは、クラスからオブジェクトが作られるときに“自動的に”呼ばれることになっています。オブジェクトが生成された直後の初期化処理を行うのが、コンストラクタの一般的な用途です。
     ところで、C++のクラス定義の中にあるメンバ関数の記述は、ただの宣言です。つまり、Cでいうところのプロトタイプ宣言と同じように、動作の定義は記述していません。
     Javaなどの言語では、クラス定義の中にメソッド(Javaでは関数と言わずこう呼びます)の動作内容までを定義するようになっていますが、C++では普通は別の場所(つまりクラス定義の外)で動作定義を行います。
     では、どんな感じになるのかを早速見てみましょう。

    IntType::IntType(int n)
    {
         number = n;
    }
    


     これがコンストラクタの処理内容の実装部分になります。引数で与えられた整数を使って、メンバ変数のnumberを初期化しています。関数の前に付いている「IntType::」という部分は、スコープ指定演算子と言い、この関数がIntTypeクラスのスコープに属していることを示します。
     前述したように、関数の定義を「クラス定義の外側で」行っているため、スコープ指定がないとコンパイラはこの関数がいずれかのクラスに属すことを認識できなくなってしまうのです。
     コンストラクタには、他の関数と違って返し値がないのも一つの特徴です。

    void
    IntType::add(int n)
    {
         number += n;
    }
    


     こんどは、メンバ関数add()の定義です。コンストラクタと同様にスコープ指定があることに注意しましょう。
     具体的な処理内容としては、引数の値をオブジェクトが保持している変数のnumberに加算しているだけです。
     これを見て、「なぁーんだ、オブジェクト指向って言ったって、結局は中で同じことをしているだけじゃないか」と思われた方、正解です(笑)。別にオブジェクト指向と言ったからって特殊なことをしているわけではないんです。
     ただ、分かり切ったことをあえて「オブジェクトの中」という枠組みの中で行うことによって、いくつか付加価値が出てくるのですが、それに関しては追ってお話ししていくことになるでしょう。

     お話は、次回に続きます。

    〈注記〉最初にもお断りした通り、この記事ではC++の解説をすることが目的ではありませんので、C++の説明としては不正確または不適当な部分も一部に含まれていることをご承知置きください。

     

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