MOSA Multi-OS Software Artists

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

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

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

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

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

    2006-09-26
     

    目次

    • MOSA理事コラム          第8回   小林 正明
    • 「「Wonderful Server Life」   第20回  田畑 英和
    • 小池邦人の「Carbon API 徒然草」
    • SqueakではじめるSmalltalk入門  第70回  鷲見 正人
    • ニュース・解説               木下 誠

    MOSA理事コラム  第8回   MOSAカフェWestへの取り組み
                  大谷 和利   テクノロジーライター

     皆さん、MOSA理事でテクノロジーライターの大谷和利です。
     自宅を大阪に移して(と言ってもインターネットのおかげで、仕事上、物理的な場所はあまり関係ありません。良い時代です)足かけ13年のときが過ぎました。その間に一度国外に転出したので、大阪市内でも、一回引っ越しをしたことになります。
     大阪は東京に比べるとこぢんまりとしていて坂もほとんどないため、ボストンやニューヨークに近い、自転車サイズの街だと感じます(ちょっと交通マナーがアレなので、その点は注意が必要ですが)。

    関西圏のMacユーザーの熱意は、昔から東京に負けず劣らず熱く、厚いものとして知られてきました。しかし、その熱気を発散させるイベントもいつしかなくなり、アップルストアも、銀座、渋谷に次いで原宿店まで噂されるようになった東京に対して心斎橋の1店舗だけと、差がついています。
     しばらく前から、MOSA会長の矢野さんより、小規模であっても関西のユーザーや開発者のためのイベントや会合を開けないだろうかとの相談を受け、ヤノ電器さんの本社で1日限りのミニ展示会+トークセッションを試みたこともありました。その時に感じたのは、単発では告知も行き届きにくく、不定期だとつい本業の忙しさなどにかまけて準備などが後手に回ってしまいがちということです。

    そんな折、MOSAカフェの関西版をやってみてはどうかという話が出て、それならば続けられるかもしれないと感じ、今年1月の1回目からお手伝いさせていただいてきました。なるべく2ヶ月に1度、定期的に開催するという目標を掲げたおかげで、(9月は諸般の事情でスキップしましたが)次の10月のミーティングで5回目を迎えます。これもひとえに、忙しい中、興味を持って毎回のように顔を出していただいている参加者の皆さんのおかげです。中には、東京やはるばる北海道から参加されたメンバーの方もおられ、そんな中から少しでも交流の輪が広がっていければと思います。
     また、会社業務の合間を縫ってスケジュールを調整し、当日は飲み物の買い出しなどまでお願いしている矢野会長にもいつも感謝しています。
     単なるオフ会にならないように、毎回、ゲストスピーカー(レギュラー参加者の中で、独自のテーマを持たれている方にお願いすることもあります)をお呼びして、興味深い話をしていただくのですが、このセッティングが楽しくもあり、大変なところでもあります。何か面白い話題のあるときには自分自身も発表者になりますが、やはり様々な方にお話をしていただきたいので、あまり世話役が出しゃばってしまうのもどうかとは感じています。

    そのような中、毎回12名程度の参加者で進めてこられましたが、これからも最低限同程度、できれば多少増やす方向で参加人数を確保し、関西におけるMOSAの情報発信の拠点として機能していければと考えています。これを読まれた方の中にも、もしMOSAカフェWestで話してみたいという方がおられましたら、ぜひとも事務局までご連絡下さい。もちろん、参加者としてでも結構ですし、大歓迎いたします。
     次回、MOSAカフェWestは10月12日に、佐藤徹理事のWWDC報告を中心テーマとして開催いたしますので、奮ってご参加を。

    また、10月20、21日のMOSA湘南ミーティングのキーノートセッション「『Apple 2.0』時代の夜明け」でお会いする方もおられるでしょう。今年もご期待通り、いやご期待以上の「変なもの」をお見せできればと思っております。

    【プロフィール】
    大谷 和利  Kazutoshi Ohtani
    テクノロジーライター、私設Macintoshエバンジェリスト、自称路上写真家、原宿AssistOn(www.assiston.co.jp)アドバイザー。1958年生まれ。Macは初代128Kからのユーザー。現在のメインマシンはMacBok Pro/15/2.0GHz。Mac雑誌全般、デザイン雑誌「AXIS」、バイシクルクラブ別冊「自転車生活」などに連載、単発記事執筆多数。

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

      〜DNS編〜

     これまでMac OS X Server上でのDNSについて解説してきました。ゾーンを追加して、ゾーン内でコンピュータを管理する方法について説明してきたわけですが、これでようやくネットワーク上からの名前解決に答えられるようになったわけです。今回はDNSの動作確認と、あとDNSが動作する仕組みについて改めて解説します。

    ・DNSの動作確認
     DNSの設定が一通り終わったら、さっそく正常に動作しているかどうかを確認してみましょう。第17回の連載で「ネットワークユーティリティ」を使用した確認方法を紹介しましたが、今回は「ターミナル」を使用してコマンドライン上で確認を行ってみたいと思います。
     ネットワーク上のマシンから動作を確認するには、まず、コマンドを実行するマシン上で「システム環境設定」の「ネットワーク」を開いて「DNSサーバ」を動作を確認したいDNSサーバのIPアドレスに変更します。
     DNSの名前解決を実行するコマンドとして”host”コマンドが用意されています。使い方はいたって簡単で引数に名前解決を行いたい名前を指定して”host”コマンドを実行します。例えば、”server.example.com”に対応するIPアドレスを調べたい場合には以下のようにコマンドを実行します。

    ・"host"コマンドの実行例(正引き)
    % host server.example.com
    server.example.com has address 192.168.0.1

     コマンドの実行結果をみると”server.example.com”に対応するIPアドレスは、”192.168.0.1″であることが分かります。では次に逆引きの名前解決も行ってみましょう。さきほど得られたIPアドレス”192.168.0.1″に対応する名前がなんであるのかを確認するには”host”コマンドの引数にIPアドレスを指定します。

    ・"host"コマンドの実行例(逆引き)
    % host 192.168.0.1
    1.0.168.192.in-addr.arpa domain name pointer server.example.com.
    


     この実行結果から”192.168.0.1″に対応する名前は”server.example.com”であることが分かります。つまり正引きと逆引きでそれぞれ同じ組み合わせのIPアドレスと名前が対応付けられていることが分かります。
     このようにクライアントから名前解決の要求を行ったときには、DNSサーバ上ではあらかじめ設定しておいたゾーンファイルの情報をもとにレスポンスを生成しているわけです。
     では、DNSサーバが管理するゾーンファイルに存在しないコンピュータに関する名前解決が要求された場合どうなるのでしょうか。結果がどうなるかは環境にも依存しますが、インターネットに接続されている環境ですとおそらく無事名前解決ができるはずです。DNSは1台のサーバで全ての情報を管理するようなことはせず(そもそもそんなこと無理ですが)、インターネット上のあちらこちらに存在するDNSサーバが分散して、それぞれのゾーンを管理しています。ですのであるDNSサーバで解決できなかった要求は、別のDNSサーバが解決してくれるのです。
     DNSサーバが自分自身で名前解決できなかった場合、次にどのDNSサーバに問い合わせるかですが、次に問い合わせるDNSサーバの情報が以下のファイルに書き込まれています。

    ・ルートネームサーバのリスト
    /var/named/named.ca
    


     次に問い合わせるDNSサーバはルートネームサーバと呼ばれており、ルートネームサーバでは”.com”や”.jp”といったDNSの名前空間のトップレベルのゾーン情報を管理しています。このようなルートネームサーバは世界中に十数台存在しますが、ルートネームサーバの情報が「named.ca」に書き込まれています。
     ルートネームサーバはトップレベルのゾーン情報を管理していますが、その次のレベル(例えば”apple.com”)のゾーンはまた別のDNSサーバが管理していたりします。このようにいくつかのDNSサーバをたどって目的の名前が解決できる仕組みになっています。
     実際に外部のDNSサーバを参照するには「DNS」の「一般」設定で「再帰」がチェックされている必要があります。「再帰」のチェックが外れていると、DNSサーバは外部への参照を行いません。

    外部のDNSサーバを参照する場合があるということは、自分が管理しているDNSサーバ(例えば”server.example.com”)も、ほかのDNSサーバから参照される場合があるということになります。では、ほかのDNSサーバはどのようにして”server.example.com”の所在を知ることができるのでしょうか。残念ながらこれまで解説してきた設定を行っただけでは、ほかのDNSサーバから参照されることはありません。そもそも設定するゾーン名(ドメイン名)も勝手に付けられるわけではなく、ドメイン名を取得する手続きが必要になります。また、ドメイン名はすでにどこかで使われている場合もありますので、必ずしも希望するドメイン名が取得できるわけではありません。
     ドメイン名の取得方法については特にMac OS X Serverに依存するような話ではありませんので、本連載では省略しますがドメイン名取得の手続きを行ってくれる業者がありますので、ネット上で検索するとすぐ取得方法がみつかるはずです。
     つまりインターネット上で動作するDNSサーバを設置するにはあと一仕事必要だということですが、少なくともこれまで説明してきた設定方法でローカルネットワーク用のDNSサーバを設定することはできます。ローカル内でのみ使用するサーバであれば、ローカルのDNSサーバだけで十分な場合があります。

    DNSにはほかにもセカンダリーゾーンの設定などもありますが、DNSの解説はここらへんにして、次回からはOpen Directoryの解説を始めていきたいと思います。

    つづく

    小池邦人のCarbon API 徒然草(2006/09/21)

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

    前回はDrag Managerについて代用APIを調査してみましたが、前回の例題と同じような状況はCarbon Frameworkの広範囲に及んでいます。今回は、QuickDrawの引退により絶滅が危惧(笑)されているPicture画像フォーマット(PICT画像)の作成や描画について調査してみます。

    なにせ、QuickDrawのほとんどのAPIがDEPRECATED指定されていますので、結局のところPICT画像(PicHandle)の作成や描画をつかさどるAPIもすべてDEPRECATEDです。それに加えて、PictUtils.hで定義されているユーティリティ関連のAPIもすべてDEPRECATED指定となっています。とは言っても、開発者側としてはアプリケーションで利用したいPICTファイルがまだ存在するかもしれません。そのために、Apple社では、QuickDrawの代わりとなるPICT画像表示の手段を用意しています。

    そうしたAPIは、ヘッダーファイルのQDPictToCGContext.hに定義されています。全部で以下の7つしかなく、画像データの参照にはPicHandleの代わりにQDPictRefを用います。

    QDPictRef QDPictCreateWithProvider( CGDataProviderRef provider );
    
    QDPictRef QDPictCreateWithURL( CFURLRef url );
    
    QDPictRef QDPictRetain( QDPictRef pictRef );
    
    void QDPictRelease( QDPictRef pictRef );
    
    CGRect QDPictGetBounds( QDPictRef pictRef );
    
    void QDPictGetResolution( QDPictRef pictRef,float *xRes,float *yRes );
    
    OSStatus QDPictDrawToCGContext( CGContextRef ctx,CGRect rect,QDPictRef pictRef);

    PICT画像のウィンドウへの描画は可能ですが、残念ながらPICT画像を作成するAPIは含まれていません。ただし、QDPictCreateWithProvider()を使えば、ベタの画像データ(ビットマップ)をPICT画像へ変換することは可能です。結論として、PICTファイルを描画する場合には、QDPictCreateWithURL()とQDPictDrawToCGContext()を用いることになります。以下のdrawPICTFile()は、アプリケーションパッケージのResourcesフォルダ内に存在する「Sample.pct」というPICTファイルを読み込み、ウィンドウ上のHIView(CGContextRefで参照)へ描画するためのサンプルルーチンです。

    void drawPICTFile(WindowRef window,CGContextRef cont )
    {
        CFURLRef    url,url1;
        CGRect      prt;
        QDPictRef   pref;
    
        if( url1=CFBundleCopyResourcesDirectoryURL( CFBundleGetMainBundle() ) )
        {                                    // ResourcesフォルダのCFURLRefを得る
            if( url=CFURLCreateWithString( kCFAllocatorDefault,
                                                  CFSTR("Sample.pct"),url1 ) )
            {                                // Sample.pctファイルのCFURLRefを得る
                if( pref=QDPictCreateWithURL( url ) ) // CFURLRefからQDPictRefを得る
                {
                    CGContextSaveGState( cont );      // 現在のCGContextの状態を保存
                    prt=QDPictGetBounds( pref );      // PICT画像の矩形枠を得る
                    QDPictDrawToCGContext( cont,prt,pref ); // CGContextへ描画する
                    CGContextFlush( cont );           // 描画結果の表示を実行
                    QDPictRelease( pref );            // QDPictRefをリリース(解放)
                    CGContextRestoreGState(cont );    // CGContextの状態を戻す
                }
                CFRelease( url );  // Sample.pctファイルのCFURLRefをリリース(解放)
            }
            CFRelease( url1 );     // ResourcesフォルダのCFURLRefをリリース(解放)
        }
    }
    


    すでに昔話になってしまいましたが、以前は画像サムネイルを作成する時など、以下のようなPICT画像のリサイズルーチンをよく使いました。しかしなんと、この中で使っているAPIでDEPRECATEDでないモノは、QDGetPictureBounds()とGetPortBitMapForCopyBits()だけになってしまいました。とても寂しいことです…(涙)

    short createPict( Rect *frt, PicHandle pp,PicHandle *pict )
    {
        GWorldPtr    gptr,off;
        Rect        srt,drt;
        short        ret=1;
        GDHandle    ghd;
    
        GetGWorld( &gptr,&ghd );                   // DEPRECATED
        QDGetPictureBounds( pp,&srt );             // 生き残り
        fitRect( 1,frt,&srt,&drt );                // 自作ルーチン
        if( ! NewGWorld( &off,32,&drt,0L,0L,0 ) )  // DEPRECATED
        {
            LockPixels( GetGWorldPixMap( off ) );  // DEPRECATED
            SetGWorld( off,ghd );                  // DEPRECATED
            DrawPicture( pp,&drt );                // DEPRECATED
            if( *pict=OpenPicture( &drt ) )        // DEPRECATED
            {
                CopyBits(GetPortBitMapForCopyBits(off),
                   GetPortBitMapForCopyBits(off),&drt,&drt,0,NULL ); // DEPRECATED
    
                ClosePicture();                    // DEPRECATED
                ret=noErr;
            }
            DisposeGWorld( off );                  // DEPRECATED
        }
        SetGWorld( gptr,ghd );                     // DEPRECATED
        return( ret );
    }
    


    ちなみに、最新のCoreGraphics APIを利用しなくても、QuickTime APIを利用すれば、PicHandleを入手したり、それをウィンドウに描画することが可能です。これらのAPIはImageCompression.hに定義されています。とりあえず、こうしたAPIはDEPRECATED指定されていません。ただしPicHandleに関しては、それを直接描画するAPIが存在しなくなりますので、一度ファイルに保存してから操作する必要があるでしょう。GetPicture()で得ていたPICTリソースも同様です。ただし、GetPicture()自体がDEPRECATEDですので、代わりにGetResource()を使う必要があります。

    最初のサンプルでは、FSSpecで示されたPICTファイルからPicHandleを得ています。もう片方は、FSSpecで示されたPICTファイルの内容をウィンドウに描画するサンプルです。

    short importPictureFile(FSSpec *fsc, PicHandle *pict)
    {
        short                      ret=1;
        GraphicsImportComponent    gi;
    
        if( ! GetGraphicsImporterForFile( fsc,&gi ) ) // 対応コンポーネントを得る
        {
           ret=GraphicsImportGetAsPicture( gi,pict ); // ファイルからPicHandleを得る
           CloseComponent( gi );                      // コンポーネントを解放する
        }
        return( ret );
    }
    
    short loadOffScreen( WindowRef window,FSSpec *fsc )
    {
        short                      ret=1;
        Rect                       drt;
        GraphicsImportComponent    gi;
    
        if( ! GetGraphicsImporterForFile( fsc,&gi ) ) // 対応コンポーネントを得る
        {
            if( ! GraphicsImportGetNaturalBounds( gi,&drt ) ) // 指定画像の矩形枠
            {
                OffsetRect( &drt,-drt.left,-drt.top );
                GraphicsImportSetGWorld( gi,GetWindowPort( window ),0L );
                                                         // 描画先のCGrafPortを指定
                GraphicsImportSetBoundsRect( gi,&drt );  // 描画矩形枠の設定
                GraphicsImportDraw( gi );                // 描画を実行する
                ret=noErr;
            }
            CloseComponent( gi ); // コンポーネントを解放する
        }
        return( ret );
    }
    


    PICT画像フォーマットは、イメージのみでなく、ある程度のベクトル図形やテキスト、加えてパタンやカラー情報も一緒に含めることができ、プログラマにとっては手軽で便利なフォーマットでした。しかし、Mac OS Xのイメージングモデルは、イメージ、ベクトル図形、テキスト情報の混在画像フォーマットとしてPDFを採用しています。また、イメージのみを表示する場合には、JPEG、TIFF、PNGなどのファイルを用いるのが妥当でしょう。なにせ、Windowsなどの別環境での表示や取り扱いが難しいとなれば、このご時世、切り捨てられても仕方がないのかもしれません。

    今回はPICT画像を取り扱うための代用APIを調査してみました。次回は、代用APIと言うわけではありませんが、文字列操作(表示や作成)に関係するモダンAPIを調べてみたいと思います。

    つづく

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

    本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。前回は、作成中のGUIビルダウインドウのウインドウメニューにダミーのメニュー項目を追加し、それらが機能するかどうかを確認しました。今回は、このメニュー項目を、当初の目的に沿った、ウィジェット追加のためのメニュー項目に置き換える作業をします。

    ダミーのメニュー項目を、ウインドウメニューに追加するために書き足されたコードは、次のようなものでした。

    aMenu add: 'inspect model' target: self action: #inspect.
    aMenu add: 'inspect window' target: aMenu defaultTarget action: #inspect.

    この場合、「ターゲット」として、前者にはモデル自身(self)、後者にはGUIビルダウインドウ(たまたま、項目を追加しようとしているメニューの、省略時ターゲットに指定されている…)に対して、メニュー項目選択時にinspectというメッセージを送り、それぞれのインスペクタを起動するためのアクション(実体はセレクタである#inspect)がパラメータとして添えられています。

    つまり、ダミーにおいて「インスペクタを開く」ためのアクションである#inspectを、「ウィジェットを追加する」ためのしかるべきアクション(たとえば仮に#addFieldとでもしておきましょうか…)に差し替えれば、今回の目標は容易に達成できそうです。

    addModelItemsToWindowMenu: aMenu
      aMenu addLine.
      aMenu
        add: 'add field'
        target: self
        action: #addField

    あとは、このメニュー項目選択時に起動される#addFieldを定義するだけ…のはずなのですが、いざ、振る舞いを記述しようとするとちょっと困ったことが起こります。一般に、モデルはウインドウのことを知らない、つまり、GUIビルダウインドウを参照する手段がないため、それにウィジェットを新たに追加する手続きを記述することができないのです。

    ただ、幸い、メソッド#addModelItemsToWindowMenu:内は例外で、パラメータとして与えられているメニュー(aMenu)のデフォルトターゲット(aMenu defaultTarget)として、間接的にGUIビルダウインドウのことを知ることができます。そこで、問題の解決をはかるために、ウィジェットを追加するためのメソッドを起動する際に、パラメータとしてGUIビルダウインドを受け渡すことができるよう、次のような工夫を施すことにいたしましょう。

    addModelItemsToWindowMenu: aMenu
      aMenu addLine.
      aMenu
        add: 'add field'
        target: self
        selector: #addFieldTo:
        argument: aMenu defaultTarget
    


    メニュー項目の追加用メソッドには、パラメータ無しの#add:target:action:の代わりに、パラメータを添えることができる#add:target:selector:argument:に差し替えます。アクションも、パラメータ無し(つまりコロンで終わらない)#addFieldから、パラメータを添えることができる(コロンで終わる)#addFieldTo:に改めます。

    こうしておくことで、メニュー項目選択時にターゲットであるselfに対しては「addField」の代わりに、「addFieldTo: aMenu defaultTarget」というメッセージが送られることになり、#addFieldTo:内でも無事、GUIビルダウインドウを参照できるようになります。やや、バッドノウハウっぽい“香り”もしますが、必要だがselfが知りえない情報(オブジェクト)をパラメータとして受け渡してあげる方法も、この種の問題を解決する常套策のひとつとして覚えておくことも、悪くはないでしょう。

    以上で「add field」というメニュー項目が追加されます。しかし、まだ、選択してもエラーになります。モデル(a GuiBuilder)が#addFieldTo:を起動できないからです。当然ですね。

    #addFieldTo:の定義は、今回はとりあえず、次のようなものにしておきます。簡単のため、追加されるフィールドの大きさや位置は、ウインドウ中央に固定にしてあります。#addModelItemsToWindowMenu:を全選択して削除(cmd + A、delete)した後、下の内容をタイプして入力するか、ここからコピー&ペーストしてaccept(cmd + S)すれば、#addFieldTo:として追加されます(#addModelItemsToWindowMenu:に対する置き換えにはならないので大丈夫です)。

    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)

    accept後には、メニュー項目「add field」は記述どおりの動作をしてくれるはずです。次回は、ウィジェットの位置と大きさを任意に指定できるよう、この#addFieldTo:に手を加えます。

    バックナンバー:

    ニュース・解説

     今週の解説担当:木下 誠

    ———————————————————————-
    Intel Developer ForumにAppleセッション
    ———————————————————————-

    9月26日から28日まで、サンフランシスコで「Intel Developer Forum Fall 2006」が開催されますが、そこでMac OS Xに関するセッションが2つ行われるようです。「Mac OS X Overview: Performance OS for a Performance Processor」と「Creating Applications on Mac OS X: Power at Your Fingertips」です。

    スピーカはAppleの方ですので、非Mac開発者に向けたMac OS X開発環境の紹介、のような内容になるのでしょう。Intel Macが登場して以来、IntelとAppleの間での様々な動きが目立つようになりました。今年のMOSA湘南でも、インテルの方がセッションを行いますしね。

    Intel Developer Forum
    http://developer.intel.com/idf/us/fall2006/index.htm

    Mac OS X Overview: Performance OS for a Performance Processor
    http://www28.cplan.com/cv125/session_details.jsp?isid=283844&ilocation_id=125-6&ilanguage=english

    Creating Applications on Mac OS X: Power at Your Fingertips
    http://www28.cplan.com/cv125/session_details.jsp?isid=283744&ilocation_id=125-6&ilanguage=english

    ———————————————————————-
    Cocoaセミナー初級編、再び開催
    ———————————————————————-

    10月13日に、アップルが「Cocoaセミナー初級編」を開催します。これは、前回行われたもののリピートセミナーとなります。

    中級編、上級編は、11月に開催が予定されています。

    Cocoaセミナー初級編
    http://developer.apple.com/jp/briefing/cocoa1/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.

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

    2006-09-19

    目次

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

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

    ■  〜DNS編〜

     前回まででDNSのゾーンが作成できました。今回はゾーン内にコンピュータを追加する方法を解説します。ゾーンを作成した段階では、コンピュータが1台だけ(サーバ自身)登録された状態になっています。この状態ではサーバ自身の名前解決を行うことはできても、ゾーン内のほかのコンピュータについてはまだ名前解決をすることができません。任意のコンピュータをゾーンに追加することにより、複数のコンピュータの名前解決ができるようになります。

    ◇「サーバ管理」でサーバに接続
     DNSサービスを設定するには「サーバ管理」を使用しますが、第17回の連載で解説しましたように、サーバがまだDNSサーバに登録されていない状態では接続時にDNSで管理している名前での接続ができませんでした。
     ですが、ここまでの手順ですでにサーバがDNSサーバに登録されましたので、これまで”server.local”のようなローカルホスト名などでサーバに接続していた場合には、あらめて”server.example.com”のようなDNSで管理している名前を使って接続をやり直すようにしましょう。
     Mac OS X Serverでは様々なサービスがDNSに依存しているため、なるべくDNSで管理している名前を使うようにします。

    ・「サーバ管理」で接続先を指定
    http://homepage.mac.com/htabata/MXS10.3/img/ServerAdmin/Admin_02.png

    ◇コンピュータの編集
     DNSへのコンピュータの追加方法を解説する前に、既存のコンピュータを編集する方法を紹介しておきましょう。ゾーン内に登録済みのコンピュータ(つまりサーバ自身)を編集してみます。
     ゾーン内のコンピュータを表示するには「サーバ管理」で「DNS」>「設定」>「ゾーン」の順でクリックしてゾーンのリストを表示し、該当するゾーンをダブルクリックします。この時点ではまだゾーンは1つしか存在しませんが、1台のサーバで複数のゾーンを管理することも可能です。
     ゾーンの編集画面で「コンピュータ」をクリックすると、コンピュータのリストが表示されます。ここに表示されるのは、ゾーン内に登録されているコンピュータのリストです。この時点では、リストにコンピュータが1台だけ表示されるはずですのでこれを編集してみましょう。コンピュータを編集するには、編集するコンピュータを選択して、リストの左下に並んでいるボタンから一番右側のボタン(鉛筆アイコンのボタン)をクリックします。あるいはリスト上で編集したいコンピュータをダブルクリックしてもOKです。

    ・コンピュータの編集画面
    http://homepage.mac.com/htabata/MXS10.3/img/DNS/DNS_06.png

     コンピュータが表示されるとシートが表示されて、パラメータを編集することができます。「IPアドレス」と「名前」はすでに入力済みの状態になっていますので、ほかのパラメータについてみてみましょう。
     まず「エイリアス」という項目があります。設定を行っているコンピュータにはすでに「server」という名前が設定されていますが、「エイリアス」を設定することにより1台のコンピュータに複数の名前を付けることができます。たとえばサーバをWebサーバとして公開する場合に、別名として「www」を設定するようなことができます。この「エイリアス」はCANME(canonical name)とも呼ばれています。
     コンピュータをメールサーバとして使用するには「このコンピュータをゾーンのメールサーバにする」をチェックします。チェックをすることによりDNSのゾーンファイルにMXレコードと呼ばれるレコードが作成され、どのサーバがメールを処理するホストなのかが識別できるようになります。
     通常メールを送信するときの宛先のアドレスは”foo@example.com”のように記述し、メールサーバの名前まで直接指定するようなことはしません(つまりfoo@server.example.comのようには記述しない)。ですので、メールアドレスだけではどのサーバ宛のメールなのかが判断できないことになりますが、あらかじめMXレコードを作成しておくことにより、DNSを参照すればどのホストがメールを処理するのかが分かるようになります。
     「メールサーバの優先順位」には優先順位を数値で指定し、値が低いほうが優先され、もっとも優先度が高い値は”0″です。

    「ハードウェア情報」および「ソフトウェア情報」には通常コンピュータのハードウェアの種類とオペレーティングシステムを記述します。ですが、ここに入力した情報はネットワークを経由して参照できてしまいますので、特にインターネットからアクセス可能なDNSサーバを設定するさいにはセキュリティに注意する必要があります。サーバの情報がある程度特定できるということは悪意をもった侵入者に情報を与えることにもなりかねません。これらの項目は入力を省略してもかまいません。
     最後の「コメント」はその名のとおり、コメントを入力する項目です。たとえばコンピュータの設置場所を書き込んでおくことができます。「ハードウェア情報」「ソフトウェア情報」「コメント」に日本語を入力することはできません。

    ◇コンピュータの追加
     ゾーン内にコンピュータを追加するにはコンピュータのリスト画面でリストの左下に並んでいるボタンから一番左側のボタン(「+」アイコンのボタン)をクリックします。するとコンピュータの編集に使用したものと同じシートが表示されますので、ここに「IPアドレス」と「名前」を入力します。ほかの項目は省略してもかまいませんので、必要に応じて入力します。
     コンピュータを追加した場合、シートの右下の「OK」ボタンをクリックしたあとに、「サーバ管理」画面の右下の「保存」ボタンをクリックするのを忘れないようにしてください。「保存」ボタンをクリックするまで設定内容は保存されません。
     このようにしてコンピュータを追加すれば、追加したコンピュータの正引きと逆引きの両方ができるようになります。ゾーンファイルは正引き用と逆引き用とでそれぞれ個別に管理されますが、「サーバ管理」からは一括して設定を行うことができます。また、最新版の「サーバ管理」ではコンピュータの編集画面で逆引きに関する設定も行えるようになりました。

    DNSが稼働している状態で「サーバ管理」を使って「DNS」の概要を表示するとゾーンの数やBINDのバージョンを確認することができます。また「ログ」をクリックしますとDNSに関するログを確認することができます。

    ・稼働中の「DNS」の「概要」
    http://homepage.mac.com/htabata/MXS10.3/img/DNS/DNS_07.png

    つづく

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

     さて今回からまた新しい話を始める。実を言うと編集長のタカハシさんから「スプラッシュスクリーンの出し方なんでどーですか」と言われていたんだが、それってあんまり基本的ぢゃないような気がする。
     やり方としては……プログラムの起動時にロードされるMainMenu.nibに持つウィンドウをそのスプラッシュスクリーンだけにし、そいつを表示してから自分で他のnibファイルのロードを行う。必要な分だけのロードが終わったらMainMenu.nibのウインドウを閉じるって方法になるのかな、と思うけど、それを説明するにはnibファイルの分割を解説しなくちゃならず、そのためにはWindowControllerのサブクラスを作る話をしなくちゃならなくて……って、なんか大河漫画の第三部「青春群像編」とかが始まっちゃいそうでしょ(笑)。この連載のテーマとしてはもそっと小粒の方が適当かな、と。
     あ、ひとつ断っておくけど、スプラッシュスクリーンを出す上のヤリクチはいまパッとこんな風にやるのかな、と考えただけのもので、実際にやって検証したわけぢゃないのでそこんとこはオフ汲み置きを……オフを汲み置いてどうする、お含みおきを。やってみて上手くいかなくても怒らないように。
     で、ほんぢゃ何をやるかというと、ずばり、ドラッグ&ドロップである。いや、これだとこないだ NSCursor の説明のために作ったサンプルプログラムを使い回しできるな、と思っただけなんだけどね。

    Cocoaでプログラミングをしていると(Carbonも同様かもしれないけど)、クラシック環境のときに比べて自分でドラッグ&ドロップをハンドリングする必要が生じることは少ない。
     例えばウインドウを作ってそこに NSTextView を置きアトリビュートでSelectableをオンにすればそのビュー上で選択したテキストをドラッグしてよそへ持って行けるし、Editableをオンにすれば(これをやると自動的にselectableもオンになる)その逆、つまりドラッグされてきたテキストを受け入れることも可能だ。Multiple fonts allowed がオンならフォントや文字の色も受け渡しできるし、毒を食らわば皿までってんでGraphics allowedまでオンにすればイメージだって扱える。この部分、全くコードを書く必要はない。NSImageViewも同様、アトリビュートでEditableをオンにしておけば、jpeg、tiff、bmpなどのイメージファイルをドラッグ&ドロップしてその内容にすることが可能だ。これらに比べればちょっとだけコーディングは必要になるが、NSTableViewなどでアイテムの順番を並べ替えるとかという操作も、クラシックの頃に比べるとめちゃくちゃ楽になった。
     ……が、楽なものを使ってるだけぢゃそれを作れるようにはならない。レトルトカレーを何度食ってもうまいカレーを作れるようにはならないのである。

    というわけで基本から。まずは小麦粉をバターで炒め……ぢゃなかった、ドラッグ&ドロップされたものを受け取るためにビューは何をしておくべきか、というところから話をはじめよう。そのためにNSViewには以下のようなメソッドが用意されている。

    - (void)registerForDraggedTypes:(NSArray*)pboardTypes
    


    このメソッドが何をするかというと、渡されたタイプのデータを自分に「ドラッグ&ドロップされ得るもの」として登録……ちょっとニュアンスが違うような気がするがしょうがないか、登録するのである。例えばビューオブジェクト(NSViewのサブクラス)の awakeFromNibの中でこんな風に使う。

    [self registerForDraggedTypes:
              [NSArray arrayWithObjects:NSFilenamesPboardType,nil]];
    


     NSFilenamesPboardTypeは NSPasteboard.h に定義されている「ペーストボードを介してやり取りできる一般的なデータタイプ」のうちの一個で、見ればわかる通りファイル名……つうか実際にはファイルのフルパスだ。awakeFromNibでこのコードを実行しておくと、ファインダでファイルのアイコンをつかまえてそのビューの上にドラッグしたときそれに反応することができる。どうやって反応するのかって? それにはいくつかのメソッドをオーバーライドする必要がある。

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

    次回は前に作ったサンプルプログラムのビュー(覚えてるかな、あの矩形を2個描いたビューである)にこれらをインプリメントしてドラッグ&ドロップに反応させてみよう。ほんぢゃ。

    (2006_09_16)

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

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

    〜クラス<1>〜

     こんにちは、高橋真人です。
     さて、前回まではオブジェクトを作り、計算などをさせるという簡単な例を通してオブジェクトというものを垣間みました。
     話をさらにこの方向で掘り下げてみることもできるのですが、この連載はあくまで初心者向けですからそれはやりません。読んでくださる方の中にオブジェクトというもののイメージがおぼろげながら出来上がったら、それでOK。次は視点を切り替えて、オブジェクト動作の仕組みについて見ていきたいと思います。
     そこで今回のテーマである「クラス」です。オブジェクトを作るためには、このクラスの存在が不可欠です。
     ところで、クラスという言葉そのものは私たちは学生時代から日常的に使ってきたもののはずですが、ひとたびこれがオブジェクト指向というくくりで語られ始めると、途端に「よくわからない言葉」になってしまうのも事実です。
     私もかつてAppleScriptを学んだときに、このクラスという言葉が出てきて戸惑った経験があります。
     しかし、ここで皆さんに言っておきたいのは「決して大げさに考える必要はない」ということです。クラスというのは「型のようなものだ」と取りあえずは考えておきましょう。「型」という概念と完全なイコールではないものの、これで当面は困らないはずです。

     さて、今まで見てきた例では、intというシンプルな型が少しだけ高機能になってIntTypeというものになりました。このIntTypeというのもクラスです。
     では、高機能になったことで、どんなものが加わったのかを見てみましょう。
     具体的に考えるために、前回も使用したIntTypeを例にします。intというただの型がIntTypeというクラスになることによって、何かが加わるわけですが、そこには当然intが持っていた役割、つまり「値を格納する」という役割もそのまま残っています。しかしクラスの場合、格納できる値は一つだけではありません。必要によっていくらでも増やすことが可能です。
     「複数の値を格納できる」と聞けば、配列や構造体を思い浮かべる人も多いでしょう。確かに構造体を使えば複数の値をいくらでも格納することは可能ですね。ではクラスとは構造体のようなもなのでしょうか?
     その答えは、イエスでもあり、ノーでもあります。
     クラスには、構造体のように複数の値を格納できる仕組みがありますが、それだけではありません。まあ、クラスの機能には構造体のような役割も含まれると考えていただければ取りあえずはOKなのではないでしょうか。
     では、クラスの機能のうち構造体が持っていないものは何でしょうか? それは今までも何度か触れてきたように「処理の仕組み」ということになります。
     以上をまとめて言いますと、クラスには複数の値を格納できる上に「処理の仕組みを組み込むことができる」ということになります。
     では、クラスが処理機能を持つことでどんな意味が生まれてくるのでしょう?
     これは前にも発した疑問ですが、今度は別の切り口で答えてみましょう。クラスが処理機能を持つと、処理の特化性が高まるのです。つまり、処理を特定の状況やものに対して限定的に使うことができるようになるのです。
     ちょっと説明しましょう。
     コンピュータというのは、すべてを数に置き換えて処理するため、プログラムを作る側は、それぞれの数に個々に意味を持たせます。例えば、

    int person;
    int amount;

    というような変数宣言が、簡単な会計ソフトの一部だと考えてください。
     personという変数は客の人数を表し、amountはその客の支払った金額を表すとした場合、personもamountもプログラムの中ではintという全く同じ型であるため、プログラマがきちんと認識して使い分けてやらなければなりません。
     金額を入れるべきところに間違えて人数を入れてしまっても、コンパイラはミスに気付くことができないので、計算結果は予想外のものになってしまうでしょう。

     具体的で単純な例をお見せします。
     以下は、例によってIntTypeとFloatTypeですが、今度はそれぞれがTwice()という保持する値を倍にして返す機能を持ったとします。

    IntType a(5);
    FloatType b(5);
    
    int x = a.Twice();
    int y = b.Twice();

     出力部分までは記述していませんが、こんな感じで、xにはaの、yにはbのそれぞれが2倍にされた値が入ることになります。言うまでもなく、両方とも10が入ります。
     では、今度は逆で、値を半分にして返す処理です。

    (上の続き)

    float f = a.Half();
    float g = b.Half();

     今度はそれぞれの値が半分になったものが、fとgに入るわけですが、ここでのポイントは、処理結果をいずれもfloatの変数で受けていることからも分かるように、浮動小数演算をさせたいということです。
     で、ここでは期待通り結果はいずれも2.5となります。まあ、私が勝手に想定した言語上の話なので当たり前なのですが(笑)。

    ところが、同様の処理を以下のようにCで書いた場合、結果は意図通りになりません。

    int a = 5;
    float b = 5;
    
    float f = a / 2;
    float g = b / 2;

     こっちのプログラムでは、fは2、gは2.5となってしまいます。
     もちろん、割る数を2ではなく2.0にしてやるとか、aをfloatにキャストしてやるとかすれば正しい答えが求められますが、ここではそのような気を使わず、「全く同じ形で」使えることを重要視しています。aがintなのかfloatなのかを常に意識しておかなくても、結果が正しく得られるということのメリットを考えてみてください。
     「そんな小さなこと」、と思われるかもしれません。「そのくらい面倒がらずに気を配ればよいではないか」と。しかし、このような分かりやすい例ではそのように思えることも、ある程度の規模を持ってきたプログラムになると状況は変わります。単なる注意・不注意とかいう次元ではなく、生産性に直接関わってくることもあるのです。
     この辺もオブジェクト指向を使う動機の一つです。まあ、この程度の例では今ひとつピント来ないかもしれませんが。

    〈注記〉言語によっては、クラスという言葉を型とほぼ同じ意味で使うものもあります。例えば記事本文中でも出てきたAppleScriptの場合、クラスという言葉を主に型の識別に使います。また、クラス自体が処理機能を持つことはありません。ただ、この辺は言語の設計思想とか考え方の領域に属することなので、見方によっては「クラスが処理機能を持つ」と見れないこともないのかもしれませんが。

    ニュース・解説

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

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

    【開発環境】

    9/12のイベントにおいて、Apple社から新しいiPodとiTunes 7が発表されました。筆者が一番注目したのは、iTunes Storeにおいて(Musicが外れた)iPod用ゲームのダウンロード販売が開始されたことです。現在はApple社のみがゲームを提供していますが、他のコンテンツ同様、将来的にはサードパーティでもゲームを提供できるのではないかと推測しています(でなきゃズルイ)。それには、iPod用アプリケーションを開発するための環境がオープンにならなくてはいけません。

    もし、iPod用の開発環境(iPod SDKか?)が登場すれば、ゲームだけでなく、iPodを様々な方面に活用するためのアプリケーションを独自開発することも可能となります。現在、筆者は歯科医用データベースを開発しているのですが、検査データ入力の端末としてiPodを使うことが可能になれば、実に「美しい世界」を構築できるはずです。近々、Apple社からiPod用の開発環境が登場する日が来るのを神様にお祈りしたいと思います(笑) 頼みますよ!>御大将

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

    前回から9月15日の期間中、Apple社のGuidesサイトには新規ドキュメントが大多数登録されました。Referenceサイトの方も同様です。ただし、どちらもマイナーな変更のみのものが大部分を占めています。まったくの初版と内容が大きく変更されたドキュメントは、新型iMacに関するハードウェア仕様書と、それに関係する「Developer Note」の更新、そして「Speech Synthesis Programming Guide」のみです。また、デベロッパー向け読み物も2つ登録されています。

    「Speech Synthesis Programming Guide」(初版)(PDFあり)
    「iMac Developer Note」(初版)
    「RAM Expansion Developer Note」
    「Video Developer Note」
    「AirPort Developer Note」
    「Audio Developer Note」
    「Bluetooth Developer Note」
    「Ethernet Developer Note」
    「FireWire Developer Note」
    「PCI Developer Note」
    「RAM Expansion Developer Note」
    「Video Developer Note」
    「Universal Serial Bus Developer Note」

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

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

    「Enabling Accessibility in Your Cocoa Application」(読み物)

    http://developer.apple.com/ue/accessibility/accessibilityincocoa.html

    「Zimbra on Mac OS X: An “Elegant” Solution with Sync Services」(読み物)

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

    前回から9月15日の期間中、新規テクニカルノートはひとつだけ登録されました。また、新規テクニカルQ&Aの方は3つ登録されています。

    TN2163「Tagging Handle and Pointer Data References in QuickTime」

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

    QA1461「Disabling and Enabling an NSTextView」(初版)
    QA1442「How to Observe All NSNotifications」(初版)
    QA1462「Programmatically Performing an Open Directory Search」(初版)

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

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

    前回から9月15日の期間中、Apple社のSample Codeサイトには新しいサンプルソースコードがひとつも登録されませんでした。最近ちょっと停滞気味…。技術者達は何か他の事で忙しいのでしょうか?

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

    【デベロップメント SDK】

    前回から9月15日の期間中、Apple社のSDKサイトには新しいSDKがひとつも登録されませんでした。

    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=モサ伝]第220号

    2006-09-12
     

    目次

    • MOSA理事コラム          第7回   小林 正明
    • 「「Wonderful Server Life」   第18回  田畑 英和
    • 小池邦人の「Carbon API 徒然草」
    • SqueakではじめるSmalltalk入門  第69回  鷲見 正人
    • ニュース・解説               木下 誠

    MOSA理事コラム  第7回  「Macと書籍と私」
               小林 正明  株式会社毎日コミュニケーションズ

    今朝は両のふくらはぎが攣ってしまい、泣きながら目覚めました。開けっ放しの窓から入ってくる涼しい秋風さんのお陰です。季節の変わり目。皆様もお身体をご自愛ください。

    さて、世の中は早くも年末商戦に向け準備が進んでいる状況です。アップルさんもまた然り。おそらく本コラムの配信日には、米アップルPRが「期待してくれてよい」と太鼓判を押すだけのことはある何かが発表になっていることでしょう。それがなんなのかは今現在まったくわかりませんが、そう言われたらもうただただページを空けてお待ち申し上げるほかありません。ありがとうアップルさん!

    前置きはこのぐらいにして申し遅れましたがわたくし、Macプラットフォームの月刊誌『Mac Fan(マックファン)』で編集をしております小林正明と申します。コバヤシマサアキ。正しく明るい子に育てと両親が名付けてくれました。ちなみに姉はキヨミです。清く美しく。名は体を表わすと言いますが、子は思うにままならないものです。

    すみません、本題行きます。

    Macの知識とスキルに関しては自信を持ってNOといえるほど低レベルな私ゆえ、モサ会員の皆様を前にしてプログラミングに関する能書きを垂れることはできません。なので今回は「Macと書籍と私」をテーマに話を進めたいと思います。

    私の雑誌編集歴は今年で丸8年。その間、他社を渡り歩いたわけでも、他誌を渡り歩いたわけでもなく、幸か不幸かずっとMac Fanに携わってきました。その間、何冊かのムックや雑誌を並行した経験はあれど、書籍の編集経験は一度もなし。人間、未経験なことに対する欲求は何歳になってもあるものです。10月から弊社の来期がスタートしますが、来期こそは是非ともその経験をしたい。そして、どうせやるなら初打席初ホームラン! みたいな夢もあったりするわけです。ちなみに弊社の今期ベストセラーは『おいでよ!どうぶつの森』攻略本。そろそろ60万部に届く勢いです。えー、まあそれは無理として、今期、180点ほどの書籍が刊行された中で、コンピュータ関連でのベストセラーは『30日でできる OS自作入門』の●万4000部。これを越せるであろうテーマ選びが目標です。

    そんな折、なんの因果か私の手元に一冊の翻訳本話が舞い込んできました。Mac OS Xに関するかなりディープでしかも開発者のバイブルにもなりうるであろう書籍です。残念ながら書名は大人の事情で明かせませんが、とりあえず来月の湘南セミナーに持っていこうと思います。厚さが10センチほどあるので翻訳には一年がかりになりそうですが、ご興味のある方はこっそり「どんな本?」と私に声をかけてください。お見せします。ご意見頂戴できますと幸いです。「翻訳したい」もよし「コレは売れないよ」と耳打ちしてくれるもよしです。丸坊主にヒゲ面でメガネの風貌。イケメンと言われたことは、不本意ながらありません。

    ビバ!ベストセラー、アミーゴ!Macintosh!

    【プロフィール】
    小林正明(こばやしまさあき)
    1968年生まれ。2003年8月よりMac Fan編集長。川崎溝ノ口近辺で真剣に「良い土地を安く」探しています。現金はほとんどありません。

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

      〜DNS編〜

     前回から「サーバ管理」を使ってDNSサービスを設定する方法を解説していますが、今回はゾーンの設定について解説します。今回は以下のような架空のドメインを使って実際の設定の流れをみていきたいと思います。

    ・解説用の架空ドメイン
      ドメイン:example.com
    ・DNSサーバの名前とIPアドレス
      名前:server.example.com
      IPアドレス:192.168.0.1

    ◇ゾーンの設定
     前回解説しましたように、DNSのゾーンを編集するには「サーバ管理」からサーバに接続し、「DNS」>「設定」>「ゾーン」の順でクリックしてゾーンの編集画面を表示します。
     初期状態ではゾーンは存在しませんので、まずはゾーンを新規に追加します。「ゾーン」画面の左下の「+」ボタンをクリックすると新規にゾーンを作成することができます。「+」をクリックするとゾーンの編集画面が表示されますので、ここでは次のようにパラメータを入力します。

    ・ゾーンの設定パラメータ
    ゾーン名:example.com.
    サーバ名:server
    サーバのIPアドレス:192.168.0.1
    ・ゾーンの編集画面
    http://homepage.mac.com/htabata/MXS10.3/img/DNS/DNS_04.png

     「ゾーン名」はドメインの名前を入力しますがここでは最後に「.」を付けて入力します。DNSの名前空間はゾーンのツリー階層で構成されていますが、最後の「.」により「com」がトップレベルのドメインとして認識されます。
     「サーバ名」はDNSサーバ(つまり今設定を行っているサーバ)のホスト名を入力します。初期設定の解説で、MacOS X ServerはDNSのホスト名をDNSサーバを参照することにより動的に設定すると説明しました。ですので、ここでホスト名を手入力するのは矛盾しているようにも思えます。しかし自分自身をDNSサーバとして参照するようにすればよいわけです。つまり、自分自身のサーバ上で稼働しているDNSサービスを利用してホスト名を動的に設定するのです。「サーバのIPアドレス」では、サーバマシンに割り当てたIPアドレスを指定します。ここで指定したIPアドレスが「サーバ名」と対応付けられます。
     設定パラメータではそのほかに、「管理者のメールアドレス」や「ゾーンの有効期間」を設定します。DNSサーバはほかのサーバの情報をキャッシュする仕組みを備えていますが、「ゾーンの有効期間」でキャッシュにデータが存在する期間を指定することができます。
     ゾーンの追加を完了させるには最後に右下の「保存」ボタンをクリックします。追加したゾーンの情報は/var/named/にゾーンデータファイルとして保存されます。今回の例ですと次のようなゾーンデータファイルが保存されます。

    ・正引き用のゾーンデータファイル
    /var/named/example.com.zone
    ・逆引き用のゾーンデータファイル
    /var/named/db.192.168.0

     ちなみにMac OS X Serverが提供するDNSサービスにはBINDを使用しています。BINDとはBerkeley Internet Name Domainの略で、その名のとおりバークレーでBSDのために開発されたDNSの実装です。このBINDはもっとも普及しているDNSの実装であり、ゾーンデータファイルはBINDによって参照されます。Mac OS X Serverの場合「サーバ管理」を使えばゾーンデータファイルを直接編集することなくDNSの管理ができるようになっています。
     逆に、BINDの知識があればゾーンデータファイルを直接参照することにより、「サーバ管理」がどのようにパラメータを管理しているかも分かるということになります。またBINDは/etc/named.confを設定ファイルとして参照します。この設定ファイルにはDNSのゾーンに関する情報などが書き込まれています。

    ゾーンの編集画面は「一般」と「コンピュータ」の2つに分かれています。「一般」ではさきほど説明したゾーンの編集を行います。
     DNSサーバはゾーン単位で複数のコンピュータのホスト名とIPアドレスの対応関係を管理します。「コンピュータ」画面では、ゾーン内で管理しているコンピュータの一覧を確認できます。ゾーンを追加した直後ではDNSサーバのみが登録された状態になります。このコンピュータの一覧画面では各コンピュータのホスト名とIPアドレスが表示されます。

    ・ゾーン内のコンピュータ一覧
    http://homepage.mac.com/htabata/MXS10.3/img/DNS/DNS_05.png

     さて、これで1台(サーバ自身)のコンピュータのみを登録したDNSサーバの設定が完了しました。あとは「サーバ管理」のツールバーから「サービスを開始」をクリックすると、DNSサービスを開始することができます。つまり、ネットワークを経由してほかのマシンからの名前解決のリクエストを受け付ける事ができるようになったわけです。
     自分自身をDNSサーバとして参照する場合には、ネットワークのDNS設定を確認し(自分自身をDNSサーバとして設定しているか)、ここで一度サーバを再起動します。そして再起動後に「ターミナル」を使って、ホスト名がDNSを参照することにより動的に設定されたことを確認します。ホスト名の確認を行うには”hostname”コマンドを使用します。今回の例ですと以下のような出力結果になればOKです。

    ・hostnameコマンドの使用例
    % hostname
    server.example.com

     さて、今回はDNSのゾーンを設定する方法を解説しました。次回はゾーン内にコンピュータを追加する方法を解説いたします。

    つづく

    小池邦人のCarbon API 徒然草(2006/09/08)

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

    自作アプリケーションのメイン処理の中心として活躍していたAPIが突然消えてしまったら、デベロッパーは途方にくれてしまいます。そうした事態を避けるために、Apple社は何年かかけて少しずつ代用APIを準備してきました。今回は、そうした代用APIを取り上げ調査してみたいと思います。

    その規模がちょうど良いので、まずは「Drag Manager」という割と渋めの箇所から攻めてみることにしましょう(笑)。Drag Mangerは、あらゆる種類のオブジェクト(ファイル情報、アイコン、画像など)のドラッグ&ドロップの仕組みを提供しているマネージャです。Finderでアイコンをドラッグして別の場所へドロップする場合なども、Drag ManagerのAPIが利用されています。随分と昔から存在しているAPI群ですが、関連ヘッダファイルのDrag.hを調べてみると、DEPRECATED指定されているAPIはたったひとつだけです。

    この事から、Drag ManagerはMac OS X 10.4以降でも生き残るようなのですが、今ひとつ最新のCarbon Eventの仕組みとマッチしていない感じもあります。また、ファイル情報をドラッグ&ドロップで渡す場合に、必ずFSSpec構造体を使う仕組みとなっており、未だにFSRefに対応していません。この様に、生き残る事自体に対して色々と疑問点は残りますが、これもシステムの進化の「都合」のひとつなのでしょうか(笑)。

    Drag Managerで、唯一DEPRECATED指定を受けたAPIは、以下のSetDragImage()です。通常Mac OS Xでは、画像データをドラッグする時に「半透明の画像」が表示されますが、それを作成するためのAPIです。

    OSErr SetDragImage(
      DragRef          inDrag,
      PixMapHandle     inImagePixMap,
      RgnHandle        inImageRgn,
      Point            inImageOffsetPt,
      DragImageFlags   inImageFlags );
    


    APIに渡す引数の中に、QuickDrawで使っていたPixMapHandleやRgnHandleがあるので、まあDEPRECATEDとなっても仕方がないでしょう。これの代用APIとして、Mac OS X 10.2から追加されたのがSetDragImageWithCGImage()です。画像データとして、PixMapHandleの代わりにCoreGraphicsで用いるCGImageRefが利用されています。

    OSStatus SetDragImageWithCGImage(
      DragRef          inDrag,
      CGImageRef       inCGImage,
      const HIPoint *  inImageOffsetPt,
      DragImageFlags   inImageFlags );

    ちなみに、ImageWellコントロールに貼り付けたPicture画像をPixMapHandleに変換してからSetDragImage()に渡すルーチンは、以下のようになります。

    short createImageMyDrag( WindowRef window,DragReference dref,ControlRef chd,
                                                    RgnHandle rgn,GWorldPtr *gptr )
    {
        Rect             srt,drt,frt;
        short            chk,err=1;
        PicHandle        pict=NULL;
        GWorldPtr        cptr;
        GDHandle         ghd;
        PixMapHandle     phd;
        Point            pt1;
    
        GetGWorld( &cptr,&ghd );
        SetPortWindowPort( window );
        if( IsControlActive( chd ) )      // ImageWellコントロールはアクティブか?
        {
            GetControlBounds( chd,&drt ); // コントロールの矩形枠を得る
            pt1.h=drt.left;               // ドラッグ開始座標の設定
            pt1.v=drt.top;
            LocalToGlobal( &pt1 );        // 矩形枠の左上をグローバル座標へ変換
            if( ! getMyControlWellPict( chd,&pict ) )  // 表示画像のPicHandleを得る
            {
                OffsetRect( &drt,-drt.left,-drt.top );
                getPictureBounds( pict,&srt );         // PICT画像のフレーム枠
                OffsetRect( &srt,-srt.left,-srt.top );
                fitRect( 1,&drt,&srt,&frt );           // 矩形枠調整用の自作ルーチン
                if( ! NewGWorld( gptr,32,&drt,NULL,NULL,0 ) ) // GWorldを作成
                {
                    phd=GetGWorldPixMap( *gptr ); // GWorldのPixMapHandleを得る
                    SetGWorld( *gptr,NULL );      // 描画対象をGWorldに
                    LockPixels( phd );            // PixMapHandleをロック
                    EraseRect( &drt );            // 白色でペイントする
                    DrawPicture( pict,&frt );     // PICT画像を描画する
                    UnlockPixels( phd );          // PixMapHandleをアンロック
                    SetGWorld( cptr,ghd );
                    RectRgn( rgn,&drt );          // GWorld矩形枠のRegionを作成
                    err=SetDragImage( dref,phd,rgn,pt1,kDragDarkTranslucency );
                }                                 // ドラッグ用半透明画像として登録
            }
        }
        return( err );
    }
    
    SetDragImage()にはPicHandleを直接渡すことはできませんので、NewGWorld()でオフスクリーン(GWorld)を作成し、そこにPicture画像を描画することで、PixMapHandleを得ています。GWorldPtrとRgnHandleはドラッグ終了後に削除する必要がありますので、引数で受け取るようになっています。上記ルーチンをSetDragImageWithCGImage()を用いる方法に書き直すと、以下のように簡単になります。
    
    short makeDragCGImage( WindowRef window,DragReference dref,ControlRef chd,
                                                                    Point pt )
    {
        CGImageRef   image=NULL;
        short        err=1;
        HIPoint      hpt;
        Rect         drt;
    
        if( IsControlActive( chd ) )      // ImageWellコントロールはアクティブか?
        {
            GetControlBounds( chd,&drt ); // コントロールの矩形枠を得る
            hpt.x=(float)drt.left-pt.h;   // クリック位置を矩形枠相対で渡す
            hpt.y=(float)drt.top-pt.v;
    
            if( ! getMyControlWellCGImage( chd,&image ) )  // 画像のCGImageRefを得る
               err=SetDragImageWithCGImage(dref,image,&hpt,kDragDarkTranslucency);
        }
        return( err );
    }
    
    GetImageWellContentInfo() APIを用いれば、ImageWellコントロールから画像データを得ることが可能です。引数で渡すControlButtonContentInfo構造体のControlContentTypeの設定内容により、得られる画像データとしてPicHandleやCGImageRefなどを選択することができます。当然、これらの画像データは、先んじてその形式でImageWellコントロールに付加されている必要があります。そちらの作業には、SetImageWellContentInfo() APIを用います。
    
    struct ControlButtonContentInfo {
      ControlContentType  contentType;
      union {
              SInt16              resID;
              CIconHandle         cIconHandle;
              Handle              iconSuite;
              IconRef             iconRef;
              PicHandle           picture;
              Handle              ICONHandle;
              CGImageRef          imageRef;
            } u;
    };
    
    GetImageWellContentInfo()とこの構造体を用い、ImageWellコントロールからPicHandleを得るためのgetMyControlWellPict()ルーチンは以下の様になります。
    
    short getMyControlWellPict( ControlRef chd,PicHandle *pict )
    {
        ControlButtonContentInfo    info;
    
        *pict=info.u.picture=NULL;
        info.contentType=kControlContentPictHandle;  // 画像タイプはPicHandle
        if( ! GetImageWellContentInfo( chd,&info ) )
        {
            if( info.contentType==kControlContentPictHandle )
                *pict=info.u.picture;
        }
        if( *pict )
            return( noErr );
        return( 1 );
    
    }
    
    同様に、CGImageRefを得るgetMyControlWellCGImage()ルーチンは以下の通りです。
    
    short getMyControlWellCGImage( ControlRef chd,CGImageRef *image )
    {
        ControlButtonContentInfo    info;
    
        *image=info.u.imageRef=NULL;
        info.contentType=kControlContentCGImageRef;  // 画像タイプはCGImageRef
        if( ! GetImageWellContentInfo( chd,&info ) )
        {
            if( info.contentType==kControlContentCGImageRef )
                *image=info.u.imageRef;
        }
        if( *image )
            return( noErr );
        return( 1 );
    
    }
    


    ところで、ヘッダファイルのControls.hでは、ControlButtonContentInfo構造体のメンバの一部の使用(pictureやiconSuiteなど)を「推奨しない」と言っていません。つまり、ImageWellコントロールへのPicHandleの出し入れは、QuickDrawが消えてもそのまま残るのでしょうか? この辺の方針が明確でないのが若干困りものですね。また、Drag Managerでは、SetDragImageWithCGImage()同様に、Mac OS X 10.2から3つ、10.3からは2つのAPIが追加されています。こうした最新APIを利用する場合には、アプリケーションのターゲットとなるOSバージョンが幾つなのかについても、ちゃんと気にとめておく必要があります。注意しましょう!

    今回はDrag Managerについて代用APIを調査してみましたが、今回の例題と同じような状況はCarbon Frameworkの広範囲に及んでいます。次回も代用APIの調査を継続してみたいと思います。

    つづく

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

    本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。

    前回、ウインドウメニューに独自のメニュー項目を追加しているワークスペースを解析して、どのようにしてそれを実現しているのかを調べました。具体的には、#addModelItemsToWindowMenu:というメソッドの起動を介して、パラメータとして渡されるメニューモーフ(a MenuMorph)にメニュー項目を追加するメッセージを送る…という手続きをとります。実際に、作成中のGUIビルダでも同じことを試して検証してみましょう。

    ▼GuiBuilderクラスに#addModelItemsToWindowMenu:を追加
    まず、クラス「GuiBuilder」をブラウズしているブラウザをアクティブにします。他のウインドウに埋もれて見つけにくいときは、デスクトップをshiftキーを押しながらクリックしてウインドウ一覧メニューをポップアップさせてそこから探すか、新しいブラウザを開きます(GuiBuilderとどこかに入力してcmd + Bか、新しいブラウザを開いてクラスカテゴリペインからcmd + FでGuiBuilderを検索)。

    アクティブにしたブラウザで、クラスGuiBuilderが選択されていることをきちんと確認してから、メソッドカテゴリペインの黄ボタンメニューから「new category…」→「new…」を選択し、Workspaceに倣ってカテゴリ「menu commands」を新しく作ります。引き続き、コードペインに次のように入力(あるいは、このメールからコピー&ペーストして)後、accept(cmd + S)すればコンパイル完了です。

    addModelItemsToWindowMenu: aMenu
       aMenu addLine.
       aMenu add: 'inspect model' target: self action: #inspect.
       aMenu add: 'inspect window' target: aMenu defaultTarget action: #inspect
    


    [fig.A]メソッド#addModelItemsToWindowMenu:のコンパイル

    メソッド定義が無事完了したら、GUIビルダウインドウのウインドウメニューをポップアップしてみてください。新しくGuiBuilderに定義した、この#addModelItemsToWindowMenu:がうまく機能していれば、「inspect model」「inspect window」という二つのメニュー項目が追加されているはずです。

    [fig.B]追加された区切り線と二つの項目の確認

    追加された新しいメニュー項目を選択すると、上のメニュー項目の定義どおり、モデル(self)、あるいは、GUI ビルダウインドウ(a SystemWindow)にinspectが送信され、それぞれのインスペクタが起動します。なお、メニュー項目の追加は動的に行なわれる(つまり、メニューは、呼び出しごとに新しく作られる)ため、GUIビルダのウインドウを作り直す必要はありません。

    同じ方法で、GUIウィジェットを追加したり、削除するためのメニュー項目を設けてやれば、GUIビルダを機能させることができそうです。

    ▼ウインドウメニューにモデルが独自の項目を追加する仕組み
    なるほど、#addModelItemsToWindowMenu:に追加したいメニュー項目についての記述をすれば、そのとおりになるのは分かった。しかし、システムウインドウが、いつ、どのようなタイミングでこのメソッドを起動するのかについても知りたい…という勉強熱心な方のために、それを調べる方法についてざっと補足します。

    もはや、だいぶ慣れてきていただいているところとは思いますが、システムについて生じた疑問は、システム自身に尋ねて答えを得る…というのが、Smalltalkでの鉄則です。今回は、ウインドウメニューをポップアップするときクリックするボタンに、そのカラクリを聞いてみることにいたしましょう。

    まず、ウインドウメニューボタンをコマンドクリックの繰り返し(あるいは、shift+コマンドクリック)でモーフとして選択し、ハローを表示させます。

    [fig.C]ウインドウメニューボタンモーフの選択

    次に、右手上から二番目のデバッグハローをshiftキーを押しながらクリックしてインスペクタを呼び出してください。

    [fig.D]ウインドウメニューボタンモーフのインスペクタ

    インスタンス変数「actionSelector」に、このボタンをクリックしたときに送信されるメッセージに含まれるセレクタ、つまり、起動するメソッド名が関連づけられています。この場合、#offerWindowMenuです。次に、「offerWindowMenu」の部分をダブルクリックで選択して、browse it(cmd +B)か、implementors of it(cmd + m)します。これで、ボタンを押したときの振る舞いを記述したメソッドの定義をブラウズできます。その内容は次のようなものです。

    SystemWindow >> offerWindowMenu
       | aMenu |
       aMenu := self buildWindowMenu.
       model ifNotNil:
          [model addModelItemsToWindowMenu: aMenu].
       aMenu popUpEvent: self currentEvent in: self world
    


    まずデフォルトのメニューを作り、モデルが指定されていれば(nilでなければ)それにメニュー項目の追加作業を委譲(くだんの#addModelItemsToWindowMenu:を起動)し、最後に、そうして出来上がったメニューをポップアップしている様子が見て取れますね。さらに、関連メソッドであるSystemWindow >> #buildWindowMenuをブラウズすることで、デフォルトのメニュー項目がどのように作られているのかについても観察できるはずです。メニュー項目の日本語化の方法を知ることができますので、ぜひ、チャレンジしてみてください。

    次回は、システムウインドウにGUIウィジェットを追加する具体的な方法を考えます。

    バックナンバー:

    ニュース・解説

     今週の解説担当:木下 誠

    ———————————————————————-
    Cocoaアプリケーションをアクセシビリティ対応にする
    ———————————————————————-

    Cocoaアプリケーションでのアクセシビリティ対応を説明したドキュメント、「Enabling Accessibility in Your Cocoa Application」が公開されました。

    Cocoaでは、NSAccessibilityプロトコルと、NSObjectの非形式プロトコルに、アクセシビリティのためのメソッドが定義されています。カスタムコントロールでも、これらが持つメソッドを実装することで、アクセシビリティ対応となります。

    開発作業では、つい後回しにされがちな分野ですが、ぜひ対応すべき項目であることを、開発者の方々は心に留めておきましょう。

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

    ———————————————————————-
    新iMac発表およびDeveloper Note公開
    ———————————————————————-

    新しいiMac (September 2006)が発表されましたね。注目は、Intel Core 2 Duoプロセッサの搭載と、さらに画面が大きくなった24-inchモデルの追加です。

    早速、「iMac Developer Note」も公開されました。これを見ると、17から20-inchモデルと、24-inchモデルでは、結構差があることに気づきます。24-inchは、単に画面が大きいだけではなく、iMacの中の上位モデルと見るべきでしょう。

    また、これに合わせて、「RAM Expansion Developer Note」も更新されています。こちらでは、今回のモデルを、「iMac with SuperDriver」と「iMac with Combo Drive」に分けており、前者の最大メモリサイズは3 GB、後者は 2 GBとなっています。

    iMac Developer Note
    http://developer.apple.com/documentation/HardwareDrivers/Conceptual/iMac_0609_SuperDrive/index.html

    RAM Expansion Developer Note
    http://developer.apple.com/documentation/HardwareDrivers/Conceptual/HWTech_RAM/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.

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

    2006-09-05

    目次

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

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

    ■  〜DNS編〜

     今後はディレクトリサービスを中心に解説を行っていく予定ですが、まずはディレクトリサービスを正常に動作させるために必要な、DNSサービスについて解説します。DNSを利用することによりhttp://server.example.comのような名前を使ってInternet上でサーバを公開できます。このとき名前を管理するためのInternet上でアクセス可能なDNSサーバが必要になりますが、ディレクトリサービスを稼働させるために、LAN上でのみ使用するような限定的なDNSサーバを構築することもできます。

    ◇DNSとは?
     さて、そもそもDNSとはなんなのでしょうか? まずは基本的なところから解説していきましょう。例えば、MOSAのWebサイトにアクセスするときには次のようなURLを指定します。

    ・MOSA WebサイトのURL
    http://www.mosa.gr.jp

     このときURLで指定した”www.mosa.gr.jp”という名前ですが、コンピュータ同士で通信をするときには名前を使って通信するわけではなく、IPアドレスを使って通信先を指定します。ですが、IPアドレスのような数字の羅列では人間が扱いにくいので、IPアドレスに対応させる形で名前を使用できるようになっています。つまりIPアドレスと名前の対応関係をどこかで管理する必要がでてくるわけですが、この対応関係を管理する仕組みがDNSなのです。
     では、”www.mosa.gr.jp”に対応するIPアドレスを実際に調べてみましょう。Mac OS X上でDNSの対応関係を調べるには「ネットワークユーティリティ」が使えます。このツールは「/アプリケーション/ユーティリティ」にインストールされています。「ネットワークユーティリティ」を起動して「Lookup」画面で対応するIPアドレスを調べたい名前を入力します。すると以下のような結果が帰ってきます。

    ・Lookupの結果(一部抜粋)
    ;; ANSWER SECTION:
    www.mosa.gr.jp.          86400     IN   A    211.9.201.59

     この検索結果から”www.mosa.gr.jp”に対応するIPアドレスは”211.9.201.59″ということが分かります。このように名前で問い合わせて、対応するIPアドレスを解決してくれるのがDNSサーバの役割になります。WebブラウザにURLを入力してWebサーバにアクセスするときには、このDNSの仕組みを利用して内部で自動的に名前をIPアドレスに変換しています。
     名前からIPアドレスを解決することを「正引き」とよんでいますが、逆にIPアドレスから名前を解決することもできまして、こちらのことを「逆引き」とよんでいます。

    ◇「サーバ管理」の起動
     では、DNSをMac OS X Server上で稼働させる方法を解説します。DNSサービスを設定するには「サーバ管理」を使用します。このツールは「/アプリケーション/ツール」にインストールされていますし、Mac OS X Serverであれば最初からDockに入っています。
     「サーバ管理」を起動しますと、まず接続先を入力するシートが表示されます。ここでは接続先のサーバのアドレスと、管理権限をもったサーバ上のユーザのユーザ名とパスワードを入力します。アドレスの指定はなるべくDNSで管理している名前(例:server.example.com)を入力するのがよいのですが、そもそもこれから設定するDNSサーバで名前を管理するのでまだDNSに登録されていないといった場合には、とりあえず”server.local”のような形式のローカルホスト名やIPアドレスを入力して接続することもできます。
     このような「サーバ管理」からサーバに接続するという操作は、サーバ機上で直接「サーバ管理」を起動した場合でも必要になります。ネットワーク上の別マシンから接続した場合にはリモートでの管理が可能になります。

    ・「サーバ管理」で接続先を指定
    http://homepage.mac.com/htabata/MXS10.3/img/ServerAdmin/Admin_01.png

    ◇DNSの設定
     「サーバ管理」でサーバに接続したら、次に左側の「コンピュータとサービス」リストから「DNS」を選択します。「概要」ではDNSサービスの動作状況を確認できます。

    ・「DNS」の「概要」
    http://homepage.mac.com/htabata/MXS10.3/img/DNS/DNS_01.png

     DNSの設定を行うには画面の下に並んでいるボタンから右端の「設定」をクリックします。するとまず「一般」が表示されます。ここではDNSサービスの基本的な設定ができますが、もし検証などの目的でInternetに接続できない環境でサーバを使用している場合には「再帰」のチェックを外しておきます。
     「再帰」のチェックが入った状態ですと、DNSサーバは自分自身で解決できなかった問い合わせをInternet上の別のDNSサーバに問い合わせにいきます。ですので、Internetに接続できない環境では「再帰」にチェックがかかっていますとタイムアウト待ちでシステムの動作が遅くなる場合があります。
     DNSでは名前とIPアドレスの対応関係を、ゾーンという単位で管理します。ゾーンの設定を行うには、DNSの設定画面で「ゾーン」をクリックしますが、ゾーンの設定につきましては次回解説したいと思います。

    ・「DNS」>「設定」>「一般」
    http://homepage.mac.com/htabata/MXS10.3/img/DNS/DNS_02.png
    ・「DNS」>「設定」>「ゾーン」
    http://homepage.mac.com/htabata/MXS10.3/img/DNS/DNS_03.png

     DNSの仕組みにつきましては今回、最小限の基本的な部分しか解説しませんでしたが、より詳しい情報につきましてはDNSの解説書などを参照することをお勧めします。

    ・DNSの定番解説書
    「DNS & BIND 第4版」
    http://www.oreilly.co.jp/books/4873110742/

    つづく

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

     前回の続き。マウスカーソルの形を変える話の最終回である。
     こないだから作っているテストプログラム……オレは作っているがみなさんはどうですか。たぶん作ってみてるヤツの方が少ないとは思うけどこういうのはいわゆるひとつのお約束だからみなさんも作っているとして人生を続ける、ご了承されたい。プログラムでは、手前にある(つうか後から描いてるだけだが)水色で塗られた矩形の上に来るとマウスカーソルが人さし指1本を立てた形(pointingHandCursor)に変わり、そのままドラッグするとこの矩形を動かせた。
     この、ドラッグしている間だけカーソルを変えたい、というのが今回の話である。いやみなさんの中にはオレはそんな面倒くさいことをしたくない、というヒトも少なくないとは思うが、そこはそれ、気は心というか人生至る所青山ありなので(自分でも言ってる意味が判らないが)、そうする方法を覚えておくのも悪くないよと。

     ちょっと整理すると今までの「マウスカーソルの変更」はなんつうか「待ち伏せ型」であった。あらかじめ「この線から入ったらこれに変わるからね」という設定をしておき、「ほら近づいてきた近づいてきた、もうすぐ変わるよ変わるよ、ほら変わったぁ」とやってたわけね。
     これに対して今度は能動的、というかこっちから打って出るというか「変わる」ぢゃなくて「変える」。例えばカーソルをゲンコツの形(closedHandCursor)に変更するときには以下のようにすればいい。

    [[NSCursor closedHandCursor] set];

    こんだけである。テストプログラムではドラッグが始まったときこれに変わるのはpointingHandCursorに決まっているので、ドラッグが始まったときにこれを呼び、終わったら

    [[NSCursor pointingHandCursor] set];

    を呼べばそれでいい。

     が、みなさんご存知の通り世の中はテストプログラムのようではない。もし黄色で塗ってる矩形(この上に来るとopenHandCursorに変わることになってる)もドラッグしたくなったとしたら、「今ドラッグしてるのは黄色の方だったから、えっと……おおそうぢゃopenHandCursorに戻すんだった」とかやらねばならない。Photoshopとかのようにオリジナルのカーソル・シェイプがたくさんあったりするとこういう処理は幾何級数的に煩雑になってしまう。
     そこで、NSCursor には実に便利なしかけが用意されている。ヒト呼んで(別に呼ばないか)push と pop 。すげぇ便利、マウスボタンが押されてドラッグを開始するとき、ただclosedHandCursorをセットするだけではなく、それまでのシェイプを push しておく。

    [[NSCursor currentCursor] push];
    [[NSCursor closedHandCursor] set];

    で、マウスボタンがリリースされドラッグが終わったら、popすれば元通り。

    [NSCursor pop];

    これさえあれば、元がどんなカーソル・シェイプだったかをプログラムで管理する必要はない。知ってれば簡単、知らないとすげぇ苦労を強いられる仕事の典型だよね、こういうの。

    PS. 結局テストプログラムを作らなかったあなたのために、オレが作ったヤツをMOSAのサーバにアップしてもらうので、以下のURLからダウンロードをどうぞ。

    (2006_09_01)

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

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

    〜オブジェクト<3>〜

     こんにちは、高橋真人です。
     早速ですが、訂正です。前回のコード例の2番目で、変数の名前を2つともaにしてしまいました。混乱してしまった方、ごめんなさい。
     そこで、訂正の意味も含め改めて「オブジェクト指向の流儀」で書くことを想定した架空の言語のコード例を見てください。

    IntType a(3);
    IntType b(5);   // ここ。前回は変数名がaになってしまっていた
    
    a.add(b);
    a.print();

     見ていただいたところで、早速話を先に進めます。(前回)最初に見ていただいた「普通の」Cのコードと、いま書いたオブジェクト指向のコードですが、加算処理の部分で、特に違いが際立っています。

    a += b;
    
    と
    
    a.add(b);
    


    の違いは、単に書き方だけのように見えるかもしれませんが、ここには大きな意味の違いがあります。
     前者では、Cの略記法として+=という演算子を使ってはいるものの、これは

    a = a + b;

    と書いたのと同じです。実際、aにbの値を加算する場合に、こういう書き方しかできない言語はたくさんあります。
     それに対して後者は、加算処理はaというオブジェクトに委ねています。
     前回、「aというオブジェクトが持つ機能」という表現を使いましたが、ここではそれを利用しているわけです。

     Cの書き方では、数値の加算処理が「双方の変数とは別のところで行われて」います。それに対しオブジェクトに委ねている方では、加算処理は「オブジェクトの内部で」行われています。
     この「オブジェクトの内部」という表現に余りとらわれないようにしてください。コンピュータのコードは、どんな言語を使おうが、どんな技術を使おうが、最終的にCPUで実行される段階ではすべてがマシン語になっています。マシン語のレベルにおいては、構造化手法だとかオブジェクト指向だとかはほとんど関係のない状態になってしまっていますので、そういう方向でいくら追求していっても、オブジェクト指向などの本質が見えてくるわけではないのです。ですから、余りにも本質の追求にとらわれ過ぎると、却って本質を見失うことにもなり兼ねないのです。
     そもそも、オブジェクト指向とは「コードを書く上での考え方」の一つなのですから、たとえそれが実体に合っていようがなかろうが、「オブジェクト指向に合った動作のイメージ」を自分の中に作り上げることが大切です。

    ところで、このように「処理をオブジェクトの中で行う」ことに果たしてどんなメリットがあるのでしょうか?
     もちろんメリットはたくさんありますが、今回は「処理の詳細を隠してしまえること」という点に注目してみましょう。

     以下の2つのコード例を見てください。

    〈コード例A〉
    int x = 9;
    int y = 5;
    
    x /= y;         // x = x / y; と同じ
    printf("%d", x);
    
    〈コード例B〉
    float x = 9;
    float y = 5;
    
    x /= y;         // x = x / y; と同じ
    printf("%f", x);
    


     これまたCの入門段階の極めて単純なプログラムですが、今度は割り算です。出力結果がどうなるかもお分かりですね?
     これらのコードの違いで気を付ける必要のあるのは、割り算の部分と出力の部分です。特に、割り算の部分で注目しなければならないのは、「両者では別の処理が行われている」ということです。
     表面上同じ「割り算」に見える式ですが、処理の中身は異なります。プログラミング経験のない人にとって例Aの割り算はちょっと意外なものです。もちろんCを学ばれた方にはおなじみですね? 例Aは整数同士の演算、その名も「整数演算」なので、演算処理後のxの値は1となります。ちなみに例Bは「浮動小数演算」で、xの処理後の値は1.8です。
     それでは、どのようにして複数の演算処理(整数演算と浮動小数演算)のうちの一つが、「同一の/という演算子」によって選択されるのかの仕組みを考えてみましょう。
     少し考えてみればお分かりと思いますが、大して複雑な仕組みがあるわけではありません。Cのコンパイラはコードを解析する際に/という演算子を見つけると、前後の値の型を見て「どんな演算をするのか」を判別しているのです。(演算子の前後の値の型が異なる場合には、一定の決まりに従って型が統一されてから、演算が選ばれます)

    もっとも、世の中はそんなに単純なことばかりではないので、上記のようなシンプルなコードだけで済むことはまれです。xやyの宣言(つまり型指定)が、演算処理のずっと手前にあった場合、目で見ただけで「どの演算処理が行われるのか」を瞬時に判断するのは困難な場合もあります。また、皆さんの中にはprintf()のフォーマット指定で、つい%fの代わりに%dと書いてしまって予想外の結果に戸惑った経験のある方もおいでではないでしょうか?
     まあ、「そのように書いた自分が悪い」と言って、ちまちまコードを直すとか、はたまたハンガリアン記法などといった、変数名に型情報を持たせるような「規則」で縛るなどというアプローチもありなのかもしれませんが、本音としては、「xはfloatなんだから、コンパイラが自動で判断して処理してくれればいいのに」なんて思ったりするんじゃないでしょうか?
     オブジェクト指向技術は、こういうケースにも解決策をもたらします。例によってでっち上げのオブジェクト指向言語で上記の処理を書くと、以下のような感じになります。

    〈コード例A'〉
    IntType x(9);
    IntType y(5);
    
    x.divideBy(y);
    x.print();
    
    〈コード例B'〉
    FloatType x(9);
    FloatType y(5);
    
    x.divideBy(y);
    x.print();
    


     最初の変数定義の部分が違う(そもそもここが違わなければ、変数自体が「私は誰?」となってしまいますから)だけで、あとは全く同じコードになっています。処理の詳細を隠してしまうことで、内部では別々の処理が行われているにもかかわらず、呼び出す側のコードでは全くその違いを「意識する必要がない」のです。このように、「必要のないところで頭に負担がかからない」のもオブジェクト指向を使う一つのメリットです。
     ところで、誤解のないようにというか、ぬか喜びをしてもらいたくないので言っておきますが、上記のdivideBy()やprint()の処理内容に関しては、当然「自分で実装」しなければなりません。コンパイラが「自動で生成してくれるわけではない」ので、くれぐれも誤解のないようにお願いします。

    ニュース・解説

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

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

    【開発環境】

    インテル社より、Mac版「インテル(R)スレッディング・ビルディング・ブロック (インテル(R)TBB) 1.0 」が発表されました(Windows版とLinux版もあり)。パッケージの内容は、一般的なアルゴリズムとデータ構造を並列化して提供するC++ ラインタイム・ライブラリーです。つい最近発表されたインテルの最新CPU「Core 2 Duo」の能力を十二分に引き出したいと考えている開発者にとっては、頼もしい助っ人になると思います。詳しくは販売元のエクセルソフト株式会社のウェブサイトを参照してみてください。

    「インテル(R)スレッディング・ビルディング・ブロック (インテル(R)TBB) 1.0」

    http://www.xlsoft.com/jp/products/intel/threading/tbb/index.html

    多分、上記の発表に合わせてだと思いますが、大阪においてインテル(R) ソフトウエア・カレッジ主催セミナーが開催されます。コースは「マルチコア プロセッサー対応アプリケーション開発」となっています。興味ある方は参加されてみてはいかがでしょうか?

    http://www.xlsoft.com/jp/products/intel/college/index.html?b=t5

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

    前回から9月1日の期間中、Apple社のGuidesサイトには新規ドキュメントが2つ登録されましたが、Referenceのサイトには新規登録はありませんでした。Mac Proが登場したことによる、ハードウエア関連「Developer Note」の更新です。それにしても、Mac Pro用のRAMは高価ですね! 油断すると(しなくても)MacBookが購入できてしまう(涙)。また、デベロッパ向け読み物もひとつだけ新規登録されています。

    「RAM Expansion Developer Note」
    「Video Developer Note」

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

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

    「Zimbra on Mac OS X: An “Elegant” Solution with Sync Services」(読み物)

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

    前回から9月1日の期間中、新規テクニカルノートはひとつだけ登録されましたが、新規テクニカルQ&Aの方はひとつも登録されませんでした。「TN2163」は、Xcode 2.4が登場したことに対する内容の更新です。

    TN2163「Building Universal I/O Kit Drivers」(Xcode2.4用アップデート)

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

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

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

    前回から9月1日の期間中、Apple社のSample Codeサイトには新しいサンプルソースコードがひとつも登録されませんでした。

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

    【デベロップメント SDK】

    前回から9月1日の期間中、Apple社のSDKサイトには新しいSDKがひとつも登録されませんでした。

    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.