MOSA Multi-OS Software Artists

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

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

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

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

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

    2006-11-28

    目次

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

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

    ■  〜Xserve編〜

     前回チラリとご紹介した新型Xserveですが、ようやく出荷が始まったようですので、今回は予定を変更して新型Xserveについてレポートしたいと思います。
     まずこれまでの経緯ですが、今年の8月に開催されたWWDCでPower Mac G5の後継機となるIntel Xeonプロセッサを搭載したMac Proが発表になりました。Mac Proはすぐに発売開始となりましたが、同じ日に発表された新型XserveはWWDCの時点では10月発売開始予定とアナウンスされていました。
     10月発売予定と聞いてしばらく間隔があるので「ヤバイかも」と思ったのは私だけではないと思いますが(笑)、まず新型Xserveの発表後にそれまで販売されていたXserve G5の在庫が徐々になくなっていきました。つまりXserveが欲しくても入手しづらい期間ができてしまったということです。これはサーバ機にとってはちょっと致命的な問題ですね。システムの稼働スケジュールを調整したり、場合によってはアップル製以外のサーバ機を検討しなくてはならなくなります。
     特にMac OS X Serverではオープンソース系のソフトが全面的に採用されていますから、手間と時間さえかければ同様のサービスはほかのプラットフォームでも実現できてしまうわけです。そこに品がないということになれば、いくらコストパフォーマンスや使い勝手がよかったとしても時間的な問題により採用計画からは外さねばならないケースも出てしまいます。
     発売が予定されていた10月になってからですが、いっこうに発売が開始される気配がなく、10月下旬になってからようやく注文が受け付けられ、11月も下旬にさしかかろうとしたときにようやく出荷が開始されました。
     さいわいオンラインのApple Storeを見てみますと出荷予定日は「24時間以内」となっておりますので、供給体制は整っていることが期待できますが、Xserveは過去にもモデルチェンジの時期に入手できない空白時期が発生していたので今後は2度とこういったことはやめていただきたいものです。

    なんだかネガティブな話題から始まってしまいましたが、新しくモデルチェンジしたXserveのスペックについてみていきたいと思います。
     まずこれまでは3種類の基本構成が用意されていましたが、モデルチェンジに伴い基本構成は1種類になりました。基本構成が1種類なのはMac Proも同様ですね。またCPUもMac Proと同様のIntel Xeonプロセッサが搭載されています。具体的な基本のシステム構成と価格は次のとおりです。

    ・基本システム構成:
     CPU:2.0GHz 64ビットデュアルコアIntel Xeonプロセッサ×2基
     メモリ:1GBメモリ(667MHz DDR2 Fully Buffered DIMM、ECC機能付き)
     HDD:80GB 7200-rpm 3Gbps シリアルATA ハードディスクドライブ×1基
     グラフィックカード:ATI Radeon X1300(64MBビデオメモリ搭載)
     OS:Mac OS X Server 10.4 Unlimitedクライアント版
     価格:379,800円

     これまでのXserve G5から大きく変わったところはやはりCPUがPowerPC G5からIntel Xeonプロセッサになったことです。クロックも最大で3.0GHzまでカスタマイズ可能になっており、パフォーマンスの向上が見込めます。アップルが公開している資料によれば最大約5倍のパフォーマンス向上が見込めます。
     最近は性能をアピールするのにワットあたりのパフォーマンスが評価されていますが、ちなみに新型Xserveの消費電力は650Wとなっています。

    ・パフォーマンスについて
    http://www.apple.com/jp/xserve/intelxeon.html

     筐体はいままでどおりの19インチラックにおさまる1Uの筐体ですが、奥行きが5cmほど長くなり76.2cmになっています。コンパクトなラックをすでに使用しているケースではラックにおさまるかを事前に確認する必要があります。
     またこれまではグラフィックカードは拡張スロットに追加するか、あるいはグラフィックカードなしのヘッドレスな状態で運用する仕様でしたが、新型のXserveでは標準でグラフィックカードが内蔵されています。拡張スロットを使わずにオンボードで用意されていますので、グラフィックコントローラを使用したとしても、拡張スロットが2基使用可能な状態になります。
     ネットワークはギガビットEthernetがこれもオンボードで2基搭載されています。

    基本構成は1種類だけですが、Apple Store(Online)上では様々なカスタマイズが可能ですので、どのようなカスタマイズが可能かをみていきましょう。

    □CPU
     標準では2.0GHzのデュアルコアIntel Xeonが2基搭載されています。つまりクアッドコア構成になっています。クロックは標準構成も含め以下の3通りから選択可能です。()内は構成を変更したときのApple Store差額です。

     2.00GHz x2
     2.66GHz x2(プラス102,060円)
     3.00GHz x2(プラス229,950円)

    □メモリ
     8基のDIMMスロットが用意されています。標準構成では512MBが2枚ですが、最大で4GBを8枚搭載できますので32GBまでメモリを増設することができます。ただし32GB増設するには2,986,200円の追加費用が必要になりますので、よっぽど大量のメモリを必要とするケースでしか32GBの構成はかえって費用効果が悪いでしょう。これだけの価格があれば標準構成のXserveがもう何台か購入できてしまいますから。
     なおメモリを増設するにはバンド幅を活用するために4枚構成もしくは8枚構成での追加が選択可能になっています。

    □HDD
     標準構成でHDDは1基のみですが、追加で最大3基までHDDを搭載できます。ディスクのタイプはSerial ATA(7,200rpm)と、より高いパフォーマンスが実現できるSAS(15,000rpm)のどちらかを選択できます。それぞれのタイプで選択可能なディスク容量は以下のとおりです。標準の80GBで足りない場合はSASタイプのものを選択するか、Serial ATAで500GBに変更することになります。

     Serial ATA(7,200rpm):80GB/500GB
     SAS(15,000rpm) 73GB/300GB

     Xserve G5ではハードウェアのRAIDコントローラを拡張スロットに追加できましたが、新型XserveではハードウェアのRAIDコントローラが用意されていませんので(内部のレイアウトも変更になっています)、RAIDを使用する場合はソフトウェアRAIDにするか、Xserve RAIDなどの外付けのRAIDストレージを別途用意する必要があります。

    □光学式ドライブ
     最大24倍速のComboドライブ(標準)か、最大8倍速の2層式に対応したSuper Driveが選択できます。

    □内蔵グラフィック
     ミニDVI出力端子付きのグラフィックカードがあらかじめ内蔵されており、23inchのCinema Displayまで対応しています。内蔵グラフィックカードをなしにして価格をおさえることもできますが、差額は6,300円しか違いませんのでそのままつけておいたほうが便利でしょう。

    □拡張スロット
     PCI Expressの拡張スロットが2基用意されており、グラフィックカードが内蔵になったことから、2基とも活用することができます。拡張スロットにはギガビットEthernetカード、SCSIカード、Fiber Channelカードなどが選択できます。
     2基ある拡張スロットはそれぞれ細かな仕様が異なりますので、拡張スロットを利用する場合には事前に仕様をしっかりと確認しておきましょう。

    □電源オプション
     新型Xserveでは電源ユニットを2基搭載できるようになりました。標準で電源ユニットは1基だけですが、オプションで2基目の電源ユニットを追加できます。電源ユニットはホットスワップに対応していますので、電源ユニットを2基使用している場合には本体の電源を入れたままで片方の電源ユニットを交換することができます。システムの停止時間を極力短くしたい場合には検討すべきオプションになります。

    □ラックマウントキット
     今回のモデルチェンジでラックへのマウントキットは「角穴タイプ」と「ねじ穴タイプ」の2種類から選択するようになりました。これは購入時にどちらかを選択する必要がありますので、事前にラックを確認して適切な方を選択しましょう。

    □Apple Care
     以上がApple Storeで選択可能な主なオプションですが、他にもApple Storeの保守契約があります。予備のパーツをあらかじめ取り寄せておく「AppleCare Service Parts Kit for Xserve」や、電話/E-mailによるサポートおよび出張修理サービスがうけられる「AppleCare Premium Service and Support Plan」が提供されています。それぞれの具体的なサービス内容は次のURLを参照してください。

    http://www.apple.com/jp/support/products/partskits.html
    http://www.apple.com/jp/support/products/premium.html

     出荷の遅れという問題はありましたが、これでようやくすべての製品がIntel対応したことになります。1年前はまだすべての製品がPower PCだったことを考えるとこれはすごいことですね。
     さて、次回は前回の続きでネットワークホームの設定方法について解説したいと思います。

    つづく

    小池邦人のCarbon API 徒然草

    ● Carbon API 徒然草(2006/11/24)

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

    アプリケーションを多国語対応にする場合、Shift-JISコードで表記できない文字列を用意する必要が出てきます。そこで登場するのがユニコードです。今回はユニコードを操作するAPIについて、その特徴や活用方法などを解説したいと思います。

    まずはソースコード内で頻繁に使うユニコードデータの保存用構造体を決めます。つまりPascalストリングスならStr255、Cストリングスなら前回紹介したCStr255構造体に相当するものです。独自に定義してもよいのですが、筆者はFile ManagerのAPIで利用されているHFSUniStr255構造体を用いています。この構造体はFiles.hヘッダーファイルで定義されています。

    struct HFSUniStr255 {
    UInt16 length; // ユニコード文字列の長さ
    UniChar unicode[255]; // ユニコード文字列データ
    };

    構造体で利用されているUniCharは別の場所でUInt16として定義されています。ここに記載されているUInt16はunsigned shortの事です。つまり1文字のデータが2バイトということになります。また、長さは65535文字まで設定できますが、UniCharの配列が255しか確保されていませんので、文字列長のオーバーフローには注意が必要です。この構造体のサイズ(sizeof(HFSUniStr255))は512バイトとなります。今回も、CStr255を定義した場合と同様に、以下のように格納文字長だけが異なる構造体(HFSUniStr63、HFSUniStr31、HFSUniStr15など)をいくつか用意しておくと便利です。

    typedef struct  {
                        UInt16   length;
                        UniChar  unicode[63];  // 63文字まで格納可能
                    } HFSUniStr63;
    
    typedef struct  {
                        UInt16   length;
                        UniChar  unicode[31];  // 31文字まで格納可能
                    } HFSUniStr31;
    
    typedef struct  {
                        UInt16   length;
                        UniChar  unicode[15];  // 15文字まで格納可能
                    } HFSUniStr15;

    HFSUniStr255にユニコード文字列を格納し、各種APIや自作ルーチンに渡す場合に注意することがあります。HFSUniStr255のワードデータはPowerPC環境ではビッグエンディアンで、X86環境ではリトルエンディアンで保存されています。よって、この構造体を一度外部ファイルへ書き出し、異なるエンディアン環境のユニバーサル・アプリケーションで読み込む場合には、エンディアンをひっくり返す必要があります。もしアプリケーションのネイティブ・ファイルフォーマットをビッグエンディアン(PowerPC)とするならば、x86環境で読み込んだ場合には、以下のようなスワップルーチンを通すことになります。

    void flipHFSUniStr255( lHFSUniStr255 *ustr )
    {
        long    i;
    
        ustr->length=Endian16_Swap( ustr->length );  //  文字列長をスワップ
        for( i=0;ilength;i++ )                //  文字データをスワップ
               ustr->unicode[i]=Endian16_Swap( ustr->unicode[i] );
    }
    


    文字の処理中に、ユニコード文字列をCFStringRefに変換したり、CFStringRefをユニコード文字列に変換したりする作業が発生した場合には、以下の2つのFile Manager APIを用いると便利です。ユニコードからCFStringRefを得るにはFSCreateStringFromHFSUniStr()を…

    CFStringRef FSCreateStringFromHFSUniStr( CFAllocatorRef alloc,
                                                const HFSUniStr255 *uniStr);

    逆に、CFStringRefからユニコードを得るにはFSGetHFSUniStrFromString()を使います。

    OSStatus FSGetHFSUniStrFromString( CFStringRef theString,
                                                       HFSUniStr255 *uniStr);

    また、これらのAPIと同じ働きを持つルーチンをCore FoundationのAPIを利用し作成すると、以下のような感じになります。cfToUnicodeString()がCFStringRefからユニコード文字列への変換、unicodeToCFString()がユニコード文字列からCFStringRefへの変換を行います。

    SErr cfToUnicodeString( CFStringRef cfstr,HFSUniStr255 *ustr )
    {
        short        err=1;
        CFRange        range;
    
        if( ustr->length=CFStringGetLength( cfstr ) )   // 文字列の長さを得る
        {
            if( ustr->length > 255 )                    // 255文字以上はカット
                ustr->length=255;
            range=CFRangeMake( 0,ustr->length );
            CFStringGetCharacters( cfstr,range,ustr->unicode );  // 文字列変換
            err=noErr;
        }
        return( err );
    }
    
    OSErr unicodeToCFString( HFSUniStr255 *ustr,CFStringRef *cfstr )
    {
        short    err=1;
    
        if( *cfstr=CFStringCreateWithCharacters( NULL,ustr->unicode,ustr->length ) )
            err=noErr;
        return( err );
    }

    さて、話をアプリケーションの多国語対応に戻しましょう。Core Foundationには、ユニコード文字列を外部ファイルから読み込み自作アプリケーションで利用するのに最適なAPIが用意されています。以下のCFCopyLocalizedString()です。このAPIはCFBundle.hヘッダーファイルに定義されています。

    CFStringRef CFCopyLocalizedString( CFStringRef key,const char *comment );

    CFCopyLocalizedString()を利用するには、先んじて、アプリケーションで使うユニコード文字列を列記した「Localizable.strings」というファイルを、アプリケーションパッケージの「Resouces」フォルダ内の各言語対応フォルダに入れておく必要があります。例えば、英語用であれば「English.lproj」、日本語用ならば「Japanese.lproj」フォルダ内です。Finderの情報ウィンドウに各国語でバージョン番号等を表示させるために用意する「InfoPlist.strings」ファイルと同じ仕組みです。このAPIが、CFString.hではなくCFBundle.hに定義されているのは、利用形態が「パッケージ」の仕組みに深く関わっているのが理由です。

    各国語用のLocalizable.stringsファイルは、Xcodeプロジェクトのファイル一覧に登録しておくことにより、リンク時にアプリケーションパッケージ内の適切なフォルダに格納されます。まず最初のサンプルとして、Apple社から提供されている「iPhoto」の日本語用Localizable.stringsを調べてみることにします。このファイルには恐ろしく大量の文字列が列記されていますが、最初の数行を見てみると…

    AppName = "iPhoto";
    VersionFormat = "%1$@ (%2$@)";          // for example, "4.0d8 (150)"
    AboutFormat = "バージョン %2$@";        // AppName VersionFormat
    MediaBrowser = "Aperture ライブラリを表示...";
    


    となっています。最初の1行は、CFCopyLocalizedString()の最初の引数にキーワードとしてAppNameを渡せば、”iPhoto”というユニコード文字列がCFStringRefとして返ってくることを意味しています。ちなみに、2番目の引数は翻訳用コメントを記載しておく場所であり処理自体には何も意味を持ちません。キーワード側もCFStringRefである必要がありますので、以下のように記載すれば目的は達成されます。

    CFStringRef    cfstr;
    HFSUniStr255   ustr;
    
    cfstr=CFCopyLocalizedString( CFSTR( "AppName" ),"" );
    FSGetHFSUniStrFromString( cfstr,&ustr );

    同様に、4行目のキーワードのMediaBrowserを渡せば、日本語ユニコード文字列として”Aperture ライブラリを表示…”が返ってくるわけです。

    cfstr=CFCopyLocalizedString( CFSTR( "MediaBrowser" ),"" );

    今回取り上げたLocalizable.stringsサンプルの2行目には、返す文字列の中に「%1$@」といった表記があります。これは、どんな意味を持つのでしょうか?
     次回は、さらに詳しくLocalizable.stringsの表記の仕組みを解説したいと思います。

    つづく

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

    本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、製作中の簡易GUIビルダにおいて、扱うことができるウィジェットの種類を増やす拡張を施す際、メソッド定義のコピーをせずともそれができる仕組みを考えます。

    テキストフィールドをウインドウに追加するためのメソッドは次のようなものでした。

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

    前回は、ボタンを追加するためのメソッド「#addButton:to:」を、この#addFieldTo:の必要な部分を書き換えることで定義したのでしたね。しかし、新しいウィジェットを扱えるようにするたびに、似たようなメソッドの複製が増えてゆくことは避けるべきです。

    そこで、どんなウィジェットでも利用できる汎用のウィジェット追加用メソッドがどんなものであればよいのかを考えます。この新しいメソッドは、ウィジェットの種類を#fieldや#buttonなどといったシンボル(widgetSym)で与えることにして、「add: widgetSym to: window」というメッセージで起動できるメソッド「#add:to:」であると想定します。#addFieldTo:と#addButtonTo:の共通部分を抽出して、#add:to:の定義は(まだ完全ではありませんが…)次ように書くことが可能です。

    add: widgetSym to: window
       | widget relFrame |
       widget ":= この部分をどう書くか? ".
       relFrame := (Rectangle fromUser
          scaleFrom: window layoutBounds
          to: (0 asPoint extent: 1e3 asPoint)) scaleBy: 1.0e-3.
       window addMorph: widget frame: relFrame
    


    ちなみに、この擬似的なメソッド定義はもちろん動作はしませんし、コンパイル時に警告も出ますが、コンパイル(accespt (cmd + S))それ自体は通るので、コピー&ペーストで登録作業を済ませてしまってかまいません。こうした良い意味で“ルーズ”なところはSmalltalkもObjective-Cとよく似ていますね。

    さて。問題は、この疑似コードの一行目の「この部分を…」でwidgetSymで指定したシンボル(#field、#button)からウィジェットそのものを作って返すような式を書くことです。

    まず、ウィジェットを表わすシンボルと同名で、起動すると、それぞれの名前が示すウィジェットを作成して返してくるメソッドを定義しましょう。次の二つのメソッドを別々にシステムブラウザにコピー&ペースト後、accept (cmd+ S)してください。

    field
       ^ PluggableTextMorph
          on: self
          text: nil
          accept: nil
          readSelection: nil
          menu: nil
    
    button
       ^ (PluggableButtonMorph
          on: self
          getState: nil
          action: nil) label: 'button'; yourself
    


    これらのメソッドは通常、「self field」とか「self button」というメッセージ式を記述して起動します。しかし、メッセージを動的に送信するためのメソッド「#perform:」を用いることで、次のような記述も可能です。

    s

    elf perform: #field
    self perform: #button

    パラメータ部分を変数widgetSymにすれば、次のよう書き直せます。

    self perform: widgetSym

    冒頭の#add:to:の問題の箇所をこの式で“穴埋め”しましょう。

    add: widgetSym to: window
       | widget relFrame |
       widget := self perform: widgetSym.
       relFrame := (Rectangle fromUser
          scaleFrom: window layoutBounds
          to: (0 asPoint extent: 1e3 asPoint)) scaleBy: 1.0e-3.
       window addMorph: widget frame: relFrame
    


    実際に、システムブラウザの#add:to:も、このように書き換えてから、あらためてaccept (cmd + S)してください。

    仕上げに#addModelItemsToWindowMenu:も、これまでの#addFieldTo:や#addButtonTo:の代わりに、新しく定義した#add:to:を使ったものに書き換えましょう。パラメータがこれまでのwindowから、widgetSym、windowの二つに増えたので#add:target:selector:argumet:の代わりに、#add:target:selector:argumentList:を用います。

    addModelItemsToWindowMenu: aMenu
       | window |
       window := aMenu defaultTarget.
       aMenu addLine.
       aMenu
          add: 'add field'
          target: self
          selector: #add:to:
          argumentList: {#field. window}.
       aMenu
          add: 'add button'
          target: self
          selector: #add:to:
          argumentList: {#button. window}.
       aMenu addLine.
       aMenu add: 'delete' target: self selector: #removeWidgetFrom: argument: window
    


    #addField:to:、#addButtonTo:はもはや無用ですので、削除してしまってかまいません。メソッドの削除は、右上のペインで削除したいメソッドを選択した状態で黄ボタンメニューから「remove method」を選択します。

    [fig.A]不要となったメソッドの削除操作

    この仕組みにより、ウィジェットの登録の手続きは#add:to:に集約できたので、懸案だったメソッドの複製をして同じようなコードを分散させる心配もなくなりました。

    次回はさらに一歩踏み込んで、Smalltalkの強力な動的性とリフレクション機能を最大限に活用し、ウィジェットの種類を増やすときにウィジェット生成のメソッドを登録するだけで済ませることができる(つまり、新たなウィジェット用のメニュー項目の追加も自動的に行なわれる…)ようなカラクリに挑戦してみましょう。

    バックナンバー:

    ニュース・解説

     今週の解説担当:木下 誠

    ———————————————————————-
    QAが4つ追加
    ———————————————————————-

    先週は、アメリカがThanks Ginvingであったこともあり、めぼしいニュースやドキュメントの追加はほとんどありませんでした。

    そんな中、QAがいくつか追加されていたので、それを紹介しましょう。

    まず、テンポラリファイルを作成して、それをすぐ削除するためにFSDeleteObjectを呼ぶと、ときたまそれが失敗する問題について。これは、ファイルを作成するとSpotlightのインデックス化や、ウィルス対策ソフトが発動するために起こります。それをさけるには、Spotlightのインデックス化が起こらないフォルダ(たとえば/tmp)に、テンポラリファイルを作るようにします。

    QA1497: FSDeleteObject fails with fBsyErr, sometimes
    http://developer.apple.com/qa/qa2006/qa1497.html

    次に、Securityフレームワークが返すエラーコードについて。このフレームワークのエラーコードは、OSStatusエラーのもの、UNIXスタイルのエラーコードのもの、Common Security Services Manager (CSSM)で定義されているもの、に分類されます。

    QA1499: Security Framework Error Codes
    http://developer.apple.com/qa/qa2006/qa1499.html

    3つめは、Core AudioのAudioConverterが提供する、StdAudioダイアログについて。kQTSCAudioPropertyID_CodecSpecificSettingsArrayプロパティが何を意味しているかを解説しています。

    QA1390: Standard Audio – The CodesSpecifiecSettingsArray and MagicCookie properties
    http://developer.apple.com/qa/qa2006/qa1390.html

    最後は、Web KitプラグインをSafariで動かすときに、それをデバッグする方法について。プラグインのプロジェクトで、カスタム実行ファイルをSafariにしてやります。これは、Web Kitプラグインに限らず、プラグインスタイルのソフトウェアの開発に応用できそうですね。

    QA1500: Debugging a Web Kit Plug-in in Xcode
    http://developer.apple.com/qa/qa2006/qa1500.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=モサ伝]第229号

    2006-11-21 

    目次

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

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

      〜AFP編〜

     Intel CPU(Xeon)を搭載したXserveが11月中旬から出荷開始とアナウンスされていますが、予定どおりですとそろそろモノが出てくる頃ですね。新Xserveについては本連載でもいずれ取り上げてみたいと思います。今回はAFPの解説の続きで「ワークグループマネージャ」を用いた共有ポイントの設定について解説します。

    ◇共有ポイント
     ファイルサービスを使ってネットワーク上でフォルダを公開するには、共有ポイントの設定を行います。Mac OS X Serverは初期状態ですでに以下の共有ポイントが有効になっています。

    ・デフォルトで有効になっている共有ポイント

     /Groups
        /Shared Items/Public
        /Users

     Finder上では「Groups」は「グループ」、「Users」は「ユーザ」と表示されますが、「ワークグループマネージャ」上で共有ポイントを設定するときは英語での表記になります。ですので共有ポイントを設定するときには英語でのフォルダ名を意識する必要がでてきます。
     デフォルトで有効になっている各共有ポイントはAFP/SMB/FTPでのアクセスが有効になっています。ですのでそれぞれのサービスを開始すればすぐにクライアントからアクセス可能な状態になります。前回は「サーバ管理」を使ってAFPサービスを設定する方法について解説しましたが、AFPサービスを開始するだけで、3つの共有ポイントに対してクライアントからのAFPによるアクセスが可能になるということです。

    設定済みの共有ポイントの確認方法ですが、「ワークグループマネージャ」からサーバに接続し、ツールバーの「共有」をクリックして画面左上の「共有ポイント」ボタンをクリックします。すると設定済みの共有ポイントの一覧が表示されます。
     一覧にはフォルダ名しか表示されませんが、共有ポイントの上でマウスカーソルを重ねてしばらく待つとフルパス(英語表記です)も表示されます。

    ・「共有ポイント」の一覧
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_01.png

    ◇共有ポイントとの追加
     共有ポイントを追加する方法はAFP/SMB/FTP/NFSそれぞれのプロトコルで共通です。言い換えれば、まずどのフォルダを共有ポイントとして公開するかを設定し、その後にプロトコルごとの設定を行います。
     公開する共有ポイントを選択するにはまず「共有ポイント」ボタンの右側にある「すべて」ボタンをクリックします。するとサーバ上のボリュームの一覧が左端のカラムに表示され、ここからサーバ上の任意のフォルダをブラウズすることができます。共有ポイントとして公開するフォルダを選択したら、画面右側の「一般」画面で「この項目と内容を共有する」を有効にし、右下の「保存」ボタンをクリックします。

    ・「すべて」の一覧
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_02.png

     追加した共有ポイントは「共有ポイント」の一覧にも追加され、この時点でAFP/SMB/FTPによるアクセスが可能になります。もちろんそれぞれのサービスが開始されていないと実際にはアクセスできませんが、サービスが開始されていれば共有ポイントとして追加したフォルダが3つのプロトコルで即アクセス可能になります。
     新しくフォルダを作成してから共有ポイントを設定するには、画面左下のボタンでサーバ上にフォルダを新規作成することができます。

    ◇アクセス権の設定
     ファイルサービスを運用するには、適切なアクセス権の設定が必要になります。アクセス権が適切に設定されていませんと、アクセスを許可したいユーザからのアクセスができなくなったり、あるいはアクセスを許可したくないユーザがアクセスできてしまったりします。
     アクセス権を設定するにはまずアクセス権を設定したいフォルダを画面左側の一覧から選択し、つぎに画面右側の「アクセス」画面からアクセス権の設定を行います。

    ・アクセス権の設定
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_03.png

     Mac OS X Server v10.4はファイルシステムのアクセス権としてPOSIXのアクセス権とACLのアクセス権の2つをサポートしています。「アクセス」画面の上半分ではPOSIXのアクセス権の設定を、下半分ではACLのアクセス権の設定を行います。
     ACLのアクセス権はボリューム単位で有効/無効を設定できますが、POSIXのアクセス権はいつでもすべてのフォルダ/ファイルに対して設定できます。
     POSIXのアクセス権では「オーナー」および「グループ」を1つずつ割り当て、それぞれについてのアクセス権を設定します。あらかじめ割り当てられているオーナーでもなく、かつグループのメンバーでもないユーザがアクセスした場合には「全員」に設定した「アクセス権」が適用されます。アクセス権の設定は直接サーバ上でFinderを使って行うこともできます。

    ◇プロトコルの設定
     共有ポイントはプロトコルごとの設定も可能です。設定可能な項目はプロトコルによって異なりますが、AFPの場合はゲストアクセスやデフォルトのアクセス権の設定ができます。
     ゲストアクセスですが、共有ポイントを追加した時点で、共有ポイントに対するAFP/SMB/FTPの各プロトコルでのゲストアクセスが自動的に有効になります。ですのでゲストアクセスを許可したくない場合には、プロトコルごとにゲストアクセスを無効する必要があります。ただし、ゲストアクセスは各サービスごとの設定も必要になるため「サーバ管理」と「ワークグループマネージャ」の両方でゲストアクセスを有効にしないと実際にはゲストアクセスはできません。
     またゲストアクセスだけでなく、共有そのものを有効にするかどうかも各プロトコルごとに設定できます。例えばAFPのみで公開する共有ポイントを作成したり、AFPとSMBで公開する共有ポイントを作成できます。

    デフォルトのアクセス権では、ファイルサーバ上に作成した新規ファイルおよびフォルダに対して割り当てるアクセス権を設定します。設定には次の2種類があります。

    ・標準POSIXビヘイビアを使用
      常に以下のアクセス権で固定
       -> オーナー:読み出し/書き込み  グループ、全員:読み出し専用
    ・上位のアクセス権を継承する
      親フォルダのアクセス権を継承

     また、「カスタムAFP名」を設定すればサーバ上の実際のフォルダ名とは異なる名前でクライアントに共有ポイントを表示することができます。

    ・AFPの設定
    http://homepage.mac.com/htabata/MXS10.3/img/WGM_Sharing/WGM_AFP_01.png

     今回は「ワークグループマネージャ」での共有ポイントの設定について解説しました。これでAFPによるファイルサービスを構築することができます。それでは次回はいよいよネットワークホームの設定方法について解説したいと思います。

    つづく

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

     さて前回は,Finderからファイルのアイコンをドラッグ&ドロップされたとき,Pasteboardにどんなタイプが入ってくるかを見たわけだが,それを確認するものとして使った以下のメソッド

    - (unsigned)draggingEntered: (id ) sender{
         int            t;
         NSPasteboard*  pb = [sender draggingPasteboard];
         NSLog(@"pb types count = %d", [[pb types] count]);
         for( t = 0; t < [[pb types] count]; t++){
              NSLog(@"type [%d] = %@", t, [[pb types] objectAtIndex:t]);
         }
         return [super draggingEntered:sender];
    }
    


    についていささか説明を忘れていた。なんか話のスジが通らないと思ったヒトはごめんなさい。このメソッドは

    @interface MyTextView : NSTextView {
     ....
    }
    ...
    @end

    のメソッドとして書かれているので,最後の「super」はつまりNSTextViewである。そうでないとNSViewがデフォルトでこれらのドラッグに反応することになってしまう。説明不足でありました。申し訳ない。

    で,本題。ファインダは以前我々が処理(ってコンソールに名前を出力しただけだが)した「NSFilenamesPboardType」の他に「Apple URL pasteboard type」というのを送ってきていた。これはたぶん,NSPasteboard.h に定義のある「NSURLPboardType」だろうと思われるが,その中身はどうなっているのだろうか。performDragOperation: を以下のように書き換えて確認してみよう。

    - (BOOL) performDragOperation: (id ) sender {
         [NSApp activateIgnoringOtherApps:YES];
         NSPasteboard*  pb = [sender draggingPasteboard];
         NSArray*       uList = [pb propertyListForType: NSURLPboardType];
         int            index;
         for(index = 0; index < [uList count]; index++){
              NSLog(@"Dragged File #%d is %@",
                   index,  [uList objectAtIndex:index] );
         }
         return YES;
    }
    


     どうせ実験しないと思うので書いてしまうが,これはちょっとまずい結果になる。NSFilenamesPboardType の場合と同じく,propertyListForType: の戻り値は確かに NSArray なのだが(定義ではこれは「(id)」なのでなんらかのオブジェクトであればエラーにはならない),例えばこの原稿を含む「PN101」「PN102」「PN103」という3個のファイルをドロップした結果は以下のようになる。

    Dragged File #0 is file://localhost/Volumes/hirofujimoto/Documents/MonkeyBiz/mosa/NightTalk/PN101.txt
    Dragged File #1 is
    


    変でしょ? 3個ドロップしてもURLは1個,NSArrayのカウントは2個で,2個目は空っぽ。いろいろ試したけど複数ファイルをドラッグしてもNSURLPboardTypeのPasteboardにはそのうちの一つのURLだけが入るらしい。これ,同じことで悩むヒトのいないように書いておく(つうか,誰かドラッグ&ドロップで複数ファイルのURLをゲットできる方法知ってたら教えてくだされ)。

    次回からは,自分のViewからドラッグを始めるには……という話。MOSAのBBSで質問のあったNSTableの上でセルの順番を変える,というのもやります。お楽しみに。
    (2006_11_16)

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

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

    【オフトピック】
    〜リファレンスについて〜

     こんにちは、高橋真人です。
     今回は、ちょっと今までのテーマを外れたお話をします。C++言語における「リファレンス」という技術についてのお話です。
     C++を学ぶつもりも、関心もない方はパスしてくださって構いませんが、このテーマに触れるタイミングとしては今が適切なので、あえて寄り道をすることにしました。

    int a;
    int *ap = &a;
    


     これは、ポインタです。リファレンスはポインタと似た概念のため、構文も似通っています。例えば以下のような具合です。

    int b;
    int &br = b;

     リファレンスは変数の前にアンパサンド(&)を付けることで表されます。この定義により、変数brは変数bと結び付けられます。
     これだけだと、ポインタとの違いは単なる構文だけのように思えます。しかし、リファレンスというのは「特定の変数と結びつけられるもの」であって、ポインタのように「指す」わけではないのです。
     例えばポインタの場合、以下のように指す対象を替えることができます。

    int c;
    ap = &c;

     こうすることで、apはもはやaを指さず、cを指すようになりますね。ところが、リファレンスはそれができません。つまり、

    br = c;

     という書き方をすることができないのです。
     一体、これはどういうことなのでしょうか?
     実はリファレンスは、「別名」と呼ばれることがあります。Macユーザーに分かりやすく言うと「エイリアス」です。プログラマから見たAliasRecordではなく、あくまでFinderで作るエイリアスのことです。
     Macでは、あるファイルのエイリアスを作ると、それは存在する限り元のファイルと似たように振る舞います。また、原則的にはエイリアスが他のファイルを指すように変えることはできないわけです(方法がないわけではないものの)。
     もちろん、エイリアスを消去したからと言って、元のファイルが消えることもありません。
     C++におけるリファレンスは極めてこの状況と似ています。「何のファイルとも結びつけられていないエイリアス」というものがないのと同じように、リファレンスは「単独で定義ができません」。つまり、

    int &d;

    というようなコードはエラーとなります。
     では、ここで前回の連載で出てきたコードを以下に再掲します。

    void
    IntType::add(IntType it)
    {
         number += it.number;
    }
    


     C++のコードとして見た場合、このコードには無駄があると言えます。理由を一言で言えば「IntTypeのオブジェクトを値渡ししているから」ということです。Cではご存知のように構造体を値渡しすると、すべてのメンバがコピーされることになっていますが、このことはC++におけるクラス構造の場合も同様です。
     値渡しの問題点については、Cの入門レベルの事項になりますから説明は省略しますが、この問題点を避けるため、Cでは通常ポインタを使って構造体を受け渡します。このポインタを使う方法もC++で使わないということはありません。と言いますか、頻繁に使われます。
     ところがポインタの場合、一つ問題があります。というのは、いわゆるヌルポインタ、つまりポインタである限り、それが「何も指していない」可能性があるわけです。よって、多くの場合ポインタがヌルでないことを確認するコードが必要となるのは皆さんもご経験済みのことでしょう。
     ところが、リファレンスを使うとそれは不要です。そもそもリファレンスは「必ず何らかのオブジェクトと結び付いている」ものなので、何も指していないリファレンスというもの自体があり得ないのです。
     上記のような関数の引数としてリファレンスが使われる場合、関数呼び出しのタイミングで渡されたオブジェクトがリファレンスに結びつけられ、リファレンスの生存期間、つまり関数がリターンするまでの間はずっとそのオブジェクトと結び付いたままになるわけです。
     参考までに、上記の関数をリファレンスを使って書き換えたものをお見せしますがたった一点、引数のitの前に&が付いただけのことで、あとは一切違いはありません。(“通常の”C++プログラムでは、IntTypeの前にconstを追加しますが、複雑になるので省略します)

    void
    IntType::add(IntType &it)
    {
         number += it.number;
    }
    


     ポインタと違って、「指している」わけではなく、そのまま元のオブジェクトと同じに振る舞えるため、逆参照(デリファレンスとか参照外し)などということも不要です。
     見た目の違いはそれだけであるにも関わらず、関数に渡されるのはあくまで「参照値」、つまりポインタのような最低限のデータなので、コピーのオーバーヘッドも最少限に抑えられるわけです。

     今回のお話はここまでです。リファレンスの使い方を説明し尽くしたとはとても言えませんが、今の段階でリファレンスというものの存在を知っておいていただく目的はほぼ達成したと思いますので、今回はこの程度にしておきます。

    ニュース・解説

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

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

    【開発環境】

    インテル社からクアッドコアのCPUがいくつか発表されました。色々なサイトでその評価が開始されていますが、このうちすぐにでもMacintoshに関係がありそうなのが「Xeon 5300」シリーズです。現在のMacProが搭載しているデュアルコアを今回の新型CPUで置き換えれば、全体で8コアの超強力なマシンが誕生します。どうも、この載せ換え自体は割と簡単のようで、以下のサイトでは、CPUを載せ替えたMacProによるベンチマークなども掲載しています。

    http://reviews.cnet.com/4531-10921_7-6663792.html?tag=blog

    コア数が倍になっていますが、CPU価格や消費電力も倍になっているわけではなさそうですので、8コアマシンの発表と同時に、このCPUをひとつだけ(4コア...つまり現状と同じ)搭載した廉価なMacProの登場も期待したいところです。処理内容によっては、それでも十分にメリットを得られる人は沢山いると思いますので(笑)。

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

    前回から11月17日の期間中、Apple社のGuidesとReferenceサイトにはドキュメントが多数登録されました。ただし、ほとんどのドキュメントはその内容のマイナーチェンジとなっています。初版は新型MacBookのハードウェア仕様書である「MacBook Developer Note」だけです。リリースノートの改訂版はXcode 2.4.1の発表に合わせたものだと思うのですが、題名だけを見ると、なんだか一世代前の内容のような気もします? また、デベロッパー向け読み物が2つ登録されています。「An Open Door to the Pharmaceutical Industry」の方は、前号の木下さんの記事も参照してみてください。

    「MacBook Developer Note」(初版)
    「17-inch iMac for Education Developer Note」
    「AirPort Developer Note」
    「Audio Developer Note」
    「Bluetooth Developer Note」
    「Ethernet Developer Note」
    「FireWire Developer Note」
    「PCI Developer Note」
    「RAM Expansion Developer Note」
    「Universal Serial Bus Developer Note」
    「Video Developer Note」
    「Shell Scripting Primer」(PDFあり)
    「Application File Management」(PDFあり)

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

    リリースノート

    「Developer Documentation Release Notes for Xcode 2.3」
    「Compiler Tools Release Notes」

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

    「Leopard Technology Series for Developers: Leopard Developer Tools Overview」(読み物)

    http://developer.apple.com/leopard/overview/tools.html

    「OpenEye and Mac OS X: An Open Door to the Pharmaceutical Industry」(読み物)

    http://developer.apple.com/business/macmarket/openeye.htm

    前回から11月17日の期間中、新規テクニカルノートが4つ登録されました。また、新規テクニカルQ&Aの方は7つ登録されました。TN2085は、Mac OS X 10.4.8からサポートされているマルチスレッド対応OpenGLフレームワークについて解説しています。この仕組みが利用できる環境かどうかのチェック方法なども載っています。OpenGLコマンド発生処理の方を完全に別スレッドにすれば(制御は難しくなりますが)処理速度をかなり上げることが可能です。QA125については、MOSA BBSの方でも話題に取り上げて内容について詳しく解説していますので参考にしてください。基本的にはシステム側で発生しているバグに対する一時的な処方箋だと思われます(涙)。QA1372は、特定アプリケーションがCarbonなのかCocoaなのかを判断する方法ですが、そのアプリケーションがRosetta上で動いているかそうでないかを判断する方法は、以下のページに記載されています。

    http://developer.apple.com/jp/documentation/MacOSX/Conceptual/universal_binary/universal_binary_exec_a/chapter_7_section_7.html#//apple_ref/doc/uid/TP40002217-CH210-BAJEBJJF

    TN1392「Building Universal I/O Kit Drivers」
    TN2156「Thermal considerations for Mac Pro FB-DIMMs」(初版)
    TN2085「Enabling multi-threaded execution of the OpenGL framework」(初版)
    TN2115「Playing a sound file using the Default Output Audio Unit 」(初版)

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

    QA1470「Compression Sequence APIs - codecErr returned when compressing with H.264」(初版)
    QA1473「NSProgressIndicator animation and redraw」(初版)
    QA1489「Standard Audio - Setting output ASBD returns badFormatErr」(初版)
    QA1392「Why am I getting a bdNamErr when trying to use a file I just located?」(初版)
    QA1472「Debugging NSTableView's "Action Invocation" binding」(初版)
    QA1256「Why is my application crashing in QuickDraw when I'm not using it?」(初版)
    QA1372「How can I identify the runtime environment, Carbon or Cocoa,
    of the current application?」(初版)

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

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

    前回から11月17日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが6つ登録されました。このうち「SimpleCarbonAppleScript」はCarbon用のAppleScript関連のサンプルなんですが、なぜだかCocoa APIを利用しています(笑)。最近は、みんなそんな感じ...。「EmptyFS」「MFSLives」「ALittleArrowsShowcase」については、前号の木下さんの記事を参考にしてみてください。

    「SimpleCarbonAppleScript」(AppleScript関連)(初版)
    「EmptyFS」(File VFS plug-in関連)(初版)
    「ALittleArrowsShowcase」(Carbon関連)(初版)
    「MFSLives」(FileVFS plug-in関連)(初版)
    「QTExtractAndConvertToAIFF」(QuickTime&Cocoa関連)(初版)
    「QTExtractAndConvert- ToMovieFile 」(QuickTime&Cocoa関連)(初版)

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

    【デベロップメント SDK】

    前回から11月17日の期間中、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=モサ伝]第228号

    2006-11-14

    目次

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

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

    ・  〜AFP編〜

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

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

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

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

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

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

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

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

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

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

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

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

    つづく

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

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

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

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

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

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

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

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

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

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

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

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

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

    OSErr getIndCString( short id,short nb,char *cstr )
    {
        short     i,ct,len,*ss;
        short     err=1;
        Handle    hd;
        Ptr       pp;
    
        *cstr=0;
        if( hd=GetResource( 'STR#',id  ) ) // STR#リソースからデータを得る
        {
            HLock( hd );                   // データはHandleとして変える
            ss=(short *)*hd;
            ct=*ss;                        // 最初の2バイト(short)が文字列の個数
    
            #if __LITTLE_ENDIAN__
            ct=Endian16_Swap( ct );        // x86環境ではワードスワップが必要
            #endif
    
            if( ct >=nb )                  // 指定番号がない場合はエラー
            {
                pp=*hd;
                pp+=2;
                for( i=1;i<=ct;i++ )
                {
                    len=*pp++;
                    if( i==nb )            // 指定番号の文字列を引数へコピー
                    {
                        BlockMoveData( pp,cstr,len );
                        *(cstr+len)=0;
                        err=noErr;
                        break;
                    }
                    else
                        pp+=len;
                }
            }
            ReleaseResource( hd );       // 得られたHandleを解放する
        }
        return( err );
    }
    


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

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

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

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

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

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

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


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

    つづく

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

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

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

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


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

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

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

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

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

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


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

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

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

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

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


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

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

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

    バックナンバー:

    ニュース・解説

     今週の解説担当:木下 誠

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

     

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

     

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

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

    2006-11-07  

    目次

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

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

     前回は「ディレクトリアクセス」を使用してクライアントコンピュータからOpenDirectoryのサーバに接続する方法を解説しました。今回は接続の確認方法について説明します。

    ◇接続の確認
     アドレスの入力ミスなどで接続に失敗することも考えられますが、そもそも前回解説した方法で「ディレクトリアクセス」を使って設定しますと、接続に失敗した時点でエラーメッセージが表示されます。
     こういった場合には入力したアドレスを確認したり、ネットワーク接続に問題がないかどうかを確認することになります。
     設定が終わったあとの確認方法ですが、まずサーバに接続ができていても設定によっては2つの状態がありえることを覚えておいてください。具体的には次の2つの状態です。

    ・サーバに接続できているが、ネットワークユーザの認証ができない
    ・サーバに接続できていて、ネットワークユーザの認証もできる

     クライアントコンピュータ上でネットワークユーザを使用するには後者の状態でないといけないわけですが、ネットワークユーザの認証ができているかどうかは次の方法で簡単に確認できます。

    ◇ネットワークユーザの認証の確認方法

    1)「ターミナル」を起動します。

    「ターミナル」は「/アプリケーション/ユーティリティ/」にインストールされています。

    2)loginコマンドでネットワークユーザとして認証します。

    % login [user]

     例えば「example」というユーザ名のネットワークユーザで認証ができるかどうかを確認する場合、以下のようになります。

    【実行例】
    % login example
    Password:
    No home directory 99!
    Logging in with home = "/".
    Welcome to Darwin!

     loginコマンドの引数でユーザ名を指定します。するとパスワードの入力が求められますので、exampleユーザのパスワードを入力します。ここでは入力したパスワードが画面上に表示されませんので、打ち間違いのないように注意してください。
     ホームの設定が行われていない場合には3行目のようなエラーメッセージが表示されますが、最後に「Welcome to Darwin!」と表示されればユーザ認証が成功したことを確認できます。
     認証に成功するとexampleユーザとしてログインしたことになりますが、ログアウトするにはlogoutコマンドを入力します。また「Ctrl + D」と入力するだけでもログアウトできます。

    ◇認証に失敗した場合
     入力したユーザ名やパスワードが正しくない場合には次のようなメッセージが表示されます。またloginプロンプトも表示されますので、引き続きユーザ名を入力してユーザ認証が実行できます。

    ・認証に失敗したときの表示

    Login incorrect
    login:

     正しいパスワードを入力しても認証に失敗する場合には、念のために「ワークグループマネージャ」でパスワードを再設定してみてください。それでも認証に失敗する場合には、ユーザ名の入力が間違えているかあるいは「ディレクトリアクセス」の設定に問題があることが考えられます。
     ネットワークユーザの認証を行うには「ディレクトリアクセス」の「認証」設定画に、ネットワークユーザを登録したOpen Directoryのサーバが追加されている必要があります。

    ・「認証」設定画面
    http://homepage.mac.com/htabata/MXS10.3/img/DA/DA_07.png

     「ディレクトリアクセス」の設定に問題がなく、入力したユーザ名にも問題ない場は、Open Directoryのサーバへの接続に問題があることが考えられますので、ネットワーク接続の確認を行ってみてください。あるいは別のクライアントコンピュータから確認を行ってみるのもよいでしょう。

    ネットワークユーザとしてユーザ認証ができるかどうかを確認するには、ログイン画面からいきなりログインを試してみてもよいのですが、現時点ではまだホームの設定を行っていないため、今回は「ターミナル」上から確認する方法を解説しました。
     一度にあれもこれもと設定をしてしまいますと、問題が発生したときに原因の究明に手間取ってしまいますので、設定と確認を繰り返しながら作業を進めていくとスムーズにサーバ構築ができるようになります。
    つづく

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

     読んでいるみなさんには関係ないがこれを書いているオレの本日は何を隠そう文化の日である。いや別にだからどうだってこたないんですけどね、こうやって世間様がお休みの日に仕事をしていると、その昔成田のホテルで行われたNeXT Developer’s Campで講師をやっていたランディ(ラストネームは忘れた)がメッセージパッシングについて説明しているとき「ボス、ボス、ボクはこんなに一所懸命働いているんですよぉ」とジェスチャーたっぷりに叫んだのを思い出す。あいつ、元気かなぁ。

     閑話休題。前回まで我々は、ビューオブジェクトを「ドラッグ&ドロップに反応できる」ようにするために必要なメソッドのインプリメントを行ってきた。が、ちょっと何か足りないような気がしませんでした? まぁ何も気がつかないヒトの人生もそのまま続いてはいくわけなんだけど、つまり前々回、オレが示した draggingEntered:の例ではNSFilenamesPboardType にしか応えないという態度だったが、他のにも応えたいときにはどうするのか、つうかそもそもそのNSXXXXXXPboardTypeつうのは何種類、どんなもんがあるのか……。

     まず、NSFilenamesPboardTypeの仲間はXcodeで開いたソースファイル上でこの文字列を選び、コマンド+ダブルクリックをすれば「NSPastebord.h」というのが開いてそこに定義されている。ものぐさな読者のため(そして行数稼ぎのため)に書き写すと、

    APPKIT_EXTERN NSString *NSStringPboardType;
    APPKIT_EXTERN NSString *NSFilenamesPboardType;
    APPKIT_EXTERN NSString *NSPostScriptPboardType;
    APPKIT_EXTERN NSString *NSTIFFPboardType;
    APPKIT_EXTERN NSString *NSRTFPboardType;
    APPKIT_EXTERN NSString *NSTabularTextPboardType;
    APPKIT_EXTERN NSString *NSFontPboardType;
    APPKIT_EXTERN NSString *NSRulerPboardType;
    APPKIT_EXTERN NSString *NSFileContentsPboardType;
    APPKIT_EXTERN NSString *NSColorPboardType;
    APPKIT_EXTERN NSString *NSRTFDPboardType;
    APPKIT_EXTERN NSString *NSHTMLPboardType;
    APPKIT_EXTERN NSString *NSPICTPboardType;
    APPKIT_EXTERN NSString *NSURLPboardType;
    APPKIT_EXTERN NSString *NSPDFPboardType;
    APPKIT_EXTERN NSString *NSVCardPboardType ;
    APPKIT_EXTERN NSString *NSFilesPromisePboardType ;
    APPKIT_EXTERN NSString *NSInkTextPboardType ;

    ざっとこんなもんである(一部注釈とかは省いた)。これらの中身の詳しい解説はドキュメントを読んでもらうことにして、知っておいて欲しいのは、多くのアプリケーションがこれらのうちの一つではなく、複数のタイプをPastebordに入れてドラッグ&ドロップを始めるということである。確認するために以下のようなメソッドを書いてみた。

    - (unsigned)draggingEntered: (id ) sender{
         int            t;
         NSPasteboard*  pb = [sender draggingPasteboard];
         NSLog(@"pb types count = %d", [[pb types] count]);
         for( t = 0; t < [[pb types] count]; t++){
              NSLog(@"type [%d] = %@",
                        t, [[pb types] objectAtIndex:t]);
         }
         return [super draggingEntered:sender];
    }
    


    このビューにFinderからファイルをひとつ、ドラッグしてみると……

    pb types count = 8
    type [0] = CorePasteboardFlavorType 0x6675726C
    type [1] = NSFilenamesPboardType
    type [2] = Apple URL pasteboard type
    type [3] = CorePasteboardFlavorType 0xC46C6E6B
    type [4] = CorePasteboardFlavorType 0x73646C74
    type [5] = CorePasteboardFlavorType 0x626E6368
    type [6] = CorePasteboardFlavorType 0xC4706431
    type [7] = CorePasteboardFlavorType 0xC4697475
    


    という結果。どう見ても内部で使ってるらしい「CorePasteboardFlavorType」は置くとしても、前回我々が「処理」した「NSFilenamesPboardType」の他に「Apple URL pasteboard type」というのをFinderは送ってきているわけだ。次回はこの「Apple URL pasteboard type」をもうちょっと追求していこう。
    (2006_11_03)

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

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

    〜クラス<4>〜

     こんにちは、高橋真人です。
     さて前回の最後でも触れましたように、今まで解説してきたクラスの実装定義では、最初に提示したコードは動作しません。
     「だったら、何で最初から動くコードを出さないんだ」といぶかられる向きもあるでしょうが、そこはひとえに説明を複雑にしないためということでご理解いただければ幸いです。
     そこで今回は、今まさに問題となっている部分をどうするかについて解説します。問題となっているのは以下の部分です。IntTypeのケースで説明しますが、この部分に関してはFloatTypeも同様のやり方で処理できます。

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

     この実装ですと、プログラムの以下の部分が動きません(正確にはコンパイルできない)。プログラム全体は連載の97回の冒頭をごらんください。

    a.add(b);

     どうしてコンパイルができないのかと言いますと、add()に与えている引数であるbがaと同じIntTypeのオブジェクトだからです。ここでadd()が要求しているのは、ただのint(*注1)ですので、IntTypeのオブジェクトを与えると、型の不整合ということでコンパイルエラーとなるわけです。

     そこで対応策ですが、以下のようなものが考えられます。

    void
    IntType::add(IntType it)
    {
         number += it.number;
    }
    


     +=演算子の右辺にあるit.numberというのは、引数として渡されている側のオブジェクトの側のメンバ変数numberを表します。前にも少し触れましたが、メンバ関数の定義では、そのクラスのスコープが有効です。よって、特に修飾をしないでこのクラスの関数や変数を使用した場合、それは実際にその関数を起動しているオブジェクトの関数や変数を意味します。
     今回のケースでは、引数に与えられるオブジェクトも同じIntTypeであるため、単にnumberと、クラス変数を修飾せずに使ってしまうと、これは関数を起動している側の変数を表してしまうため、it.と、所有するオブジェクトを明示して記述してやるわけです。
     さて、number += it.numberという式で、オブジェクトの所有するnumberに別のオブジェクトのnumberが加算されますが、これらはintの変数同士ですから、問題なく演算処理できます。
     ところで、今紹介した関数はaddという名前を持っていますが、これは以前定義してあった、intを引数としたadd()を置き換えるものではなく、add()の新たなバージョンです。C言語の場合、同じ名前の関数を複数作ることはできませんが、C++などのオブジェクト指向言語の多くでは可能となっています。

     このように「名前は同じだが、引数の数や型が異なる関数を定義できること」を「オーバーロード機能」と呼びます。(いずれ登場する「オーバーライド」とは似ていますが別のものであるということにご注意ください。)
     引数の型や数が異なる同名の関数を用意しておくことによって、コンパイラがその場で適切な関数を選んでくれるわけです。もしこのオーバーロードの仕組みがないと、add_int()、add_IntType()、add_float()などと、引数の型が何であるのかをいちいち意識しながら関数の呼び出しをしなければならなくなるわけです。
     「そんな手間ぐらい、大したことはない」と思われるかもしれませんが、「手間のあるところ、バグの入り込む余地あり」というわけで、かけなくてよい手間はかけないに越したことはありません。
     もっとも、一つの関数名で複数のバリエーションに対応することができるのは、あくまで「呼び出しの記述」に限った話であって、それぞれの型に合わせた計算処理は当然、一つずつ書いていく必要があるわけです。実は、この辺をもっとラクにしてくれる仕組みをもった言語も世の中にはあるのですが、それはここのテーマからは逸脱してしまうので、今回は触れません。

    さて、以上ご紹介したようなadd()の別バージョンを追加するという方法の他に、C++では、関数を追加しないで対処するやり方も可能です。具体的には「変換関数」とか「変換演算子」というものを用意します。例えばIntTypeオブジェクトが式や関数の引数などに使われているとき、状況(*注2)がIntTypeではなくintを要求する場合に、IntTypeがintとして振る舞うようにすることができるのです。
     ちょっと具体例を挙げないと分かりにくいかもしれませんが、C++での変換関数の実装は少し分かりにくい部類に属する技法と判断し、ここでは申し訳ありませんが割愛させていただくことにします。

    注1:このように、クラス定義をしないで言語にもともと用意されている型をプリミティブタイプなんて呼んだりします。要は、基本型ってことです。
    注2:こういうとき、「コンテキスト」という表現をよく使います。例えば、「intを要求するコンテキストでIntTypeのオブジェクトが使われている場合」などといった感じに使います。

    ニュース・解説

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

    ・ Carbon ドキュメント & サンプル & SDK ナビゲーション(2006/11/03)

    【開発環境】

    前号で木下さんも紹介されていましたが、Apple社のDeveloperサイトに「Leopard Dev Center」サイトが新設されたのに合わせ、一般の人でも読むことのできるドキュメントとして「Leopard Technology Series for Developers」が登録されました。このドキュメントですが、Leopardに関する技術内容が、今までの説明より若干詳しく紹介されてます。

    この記載の中で、筆者が一番「まいったなぁ!」と思うのは、QuickTimeのC APIが64bit版Carbonに含まれないことです。代わりに「QT Kit」(Cocoa API)を使えとは言っていますが、そうなると、結局その部分のソースコードは大幅な書き換えが必要です(仕事が増える)。また、CとObjective-Cソースコードの混在を嫌う人もいるでしょう。

    ところで「QuickTime for Windows」の64bit版は存在しているのでしょうか?あるとするなら、そのC APIは直接使えるのでしょうか? Cocoa for Windowsが存在しない現状では、QuickTimeにアクセスしているコード部分をMac版とWindows版で共通モジュールにしたいと考えている(もうしている)デベロッパーも窮地に追い込まれてしまいます。

    例えば以下のサイトに、いくつかのアプリケーションを64bit版に変更した時の32bit版との比較ベンチマークが載っています。

    http://www.geekpatrol.ca/blog/160/

    これを見て、処理速度が結構上がるのに驚きました。レジスタ数が増えることや、doubleの浮動小数点が1レジスタ内で処理できることなどが、処理速度向上に影響しているのでしょうか? この結果からすると、64bitアドレッシング(4Gbyte以上のメモリ領域アクセス)以外にも大きなメリットが得られることになり、すぐにでも自作アプリケーションの64bit化を実行してみたくなります。そんな場合でも、64bit版のQuickTimeのC APIが使えないという制限は大きな頭痛の種となります(筆者の場合)。

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

    前回から11月3日の期間中、Apple社のGuidesサイトには新規ドキュメントが12登録され、Referenceのサイトの方には新規ドキュメントがひとつだけ登録されました。新型MacBook Proのハード仕様書の登録に合わせて、各種「Developer Note」が更新されています。また、Aperture 1.5の発表に合わせて「Aperture SDK Overview」と「Aperture Reference」が登録されました。加えて、デベロッパー向け読み物も3つ登録されています

    「15-inch MacBook Pro Developer Note」(初版)
    「17-inch MacBook Pro Developer Note」(初版)
    「AirPort Developer Note」
    「Audio Developer Note」
    「Bluetooth Developer Note」
    「Ethernet Developer Note」
    「FireWire Developer Note」
    「PCI Developer Note」
    「RAM Expansion Developer Note」
    「Universal Serial Bus Developer Note」
    「Video Developer Note」
    「Aperture SDK Overview」(初版)(PDFあり)

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

    「Aperture Reference」(初版)

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

    「Working with the WebKit Nightly Builds」(読み物)

    http://developer.apple.com/opensource/internet/nightlywebkit.html

    「Leopard Technology Series for Developers: Overview」(読み物)

    http://developer.apple.com/leopard/overview/index.html

    「Adding Accessibility to Custom Views in Cocoa」(読み物)

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

    前回から11月3日の期間中、新規テクニカルノートは2つ登録されました。新規テクニカルQ&Aの方も2つ登録されています。「The Font Panel for Carbon API」は、なんと4年ぶりのリニューアルですね(笑)。QA1393については、前号の木下さんの記事も参考にしてみてください。

    TN2166「Secrets of the GPT」(初版)
    TN2058「The Font Panel for Carbon API」

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

    QA1484「How to add a folder to the contents of a package」(初版)
    QA1393「Using static versions of existing dynamic libraries」(初版)

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

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

    前回から11月3日の期間中、Apple社のSample Codeサイトには、サンプルソースコードが8つ登録されました。

    「NSFontAttributeExplorer」(Cocoa関連)(初版)
    「TremoloUnit」(Core Audio関連)(初版)
    「SimplePlayThru」(Core Audio関連)
    「FinalCutPro_AppleEvents」(FinalCutPro関連)(初版)
    「AppleJavaExtensions」(Java関連)
    「OSXAdapter」(Java関連)
    「SeeMyFriends」(SyncService関連)
    「CFFTPSample」(Network関連)

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

    【デベロップメント SDK】

    前回から11月3日の期間中、Apple社のSDKサイトには最新SDKがひとつだけ登録されました。FireWire SDKの最新版である「FireWire SDK 23 for Mac OS X」です。またToolsサイトには「Xcode 2.4.1」が登録されています。どちらもダウンロードするのためには、ADCのメンバーである必要があります。

    「Xcode 2.4.1」

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

    「FireWire SDK 23 for Mac OS X」

    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.