MOSA Multi-OS Software Artists

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

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

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

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

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

    2004-10-26

    目次

    • SqueakではじめるSmalltalk入門  第16回  鷲見 正人
    • 小池邦人の「Carbon API 徒然草」
    • 「Behind the WebObjects」    第30回  田畑 英和
    • ニュース・解説

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、前回作成したBankAccountクラスにメソッドを追加してゆきます。

    作業状態を凍結した仮想イメージを使ってシステムを起動します。ちょうどインスペクトした状態にあるa BankAccountに、無駄とは承知でbalance: 1000という“彼”の知らないメッセージを送って反応を見てみることにします。インスペクタのワークスペース(下のペイン)で、

    self balance: 1000

    とタイプして入力し、do it (cmd-D)してみてください。

    [fig.A]とりあえずメッセージを送ってみる
    http://squab.no-ip.com:8080/mosaren/uploads/16a.png

     まず、コンパイラがスペルミスを犯していないかとお節介を焼いてくれます。

    [fig.B]コンパイラが起動するスペルチェッカ
    http://squab.no-ip.com:8080/mosaren/uploads/16b.png

     いや、そんなことはない、という意思表示を込めて、項目の先頭にあるbalance:を選択しましょう。コンパイルは通りますが、実際のメッセージ送信の結果、a BankAccountは#balance:というセレクタからなるメッセージを受け付けられないとノーティファイア(ピンクの横長のウインドウ)を出します。

    [fig.C]メッセージに応答できないことを示すノーティファイア
    http://squab.no-ip.com:8080/mosaren/uploads/16c.png

     では、a BankAccountが、このメッセージを理解できるようにBankAccountクラスに改めて#balance:メソッドを定義することにします。ブラウザをクリックしてアクティベートし、メッセージカテゴリペイン(上段右から2番目)のno messagesをクリックして選択します。すると、コードペインにメソッド記述のためのテンプレートが現われます。マウスポインタをコードペインに移動するとテンプレートは選択されていることが分かるので、キーボードのdeleteキーを使って消してしまってください。

    [fig.D]メソッド記述のためのテンプレート
    http://squab.no-ip.com:8080/mosaren/uploads/16d.png

     うまく消えたら(消えないときは、マウスポインタの位置を確認してください。コードペインの区画を指していますか?)次のコードをタイプしてシフト黄ボタンメニュー(コードペインをshift + optionクリック、あるいは、黄ボタンメニューからmore…)からpretty printを選択してフォーマットを整えた後、accept (cmd-S)します。

    balance: x
    balance _ x

    [fig.E]シフト黄ボタンメニューのpretty print
    http://squab.no-ip.com:8080/mosaren/uploads/16e.png

     1行目の太字になっている行は「メッセージパターン」と呼ばれるもので、セレクタ(メソッド名)と、メッセージ送信時に添えられたパラメータ(引数)を束縛するための「パラメータ変数」の宣言文を兼ねます。コード本体は2行目以降(この場合、2行目のみ)です。インスタンス変数balanceに、パラメータ引数xの値を代入する簡単なコードであることは、一目でお分かりいただけると思います。

     acceptと同時にあなたのイニシャルを要求するfill in the blankが現われることがあります。これは、メソッドごとに誰が作成/改変したかを記録する際に使われます(システムに加えられた改変履歴情報の扱いについては追って解説する予定です)。

    適当なイニシャルを入力してacceptすると、ただちにコンパイルが行なわれます。無事、コンパイルが通ると、入力時にあったコードペイン周辺の赤枠が消えます。これで、a BankAccountはbalance: 1000というメッセージを受信できるようになりました。インスペクタのワークスペースで改めて、次式をdo it (cmd-D)してみましょう。インスペクタでbalanceが選択されていれば、その値がnilから1000に変更されるのを確認できるはずです。

    [fig.F]インスタンス変数balanceの値が変化したところ
    http://squab.no-ip.com:8080/mosaren/uploads/16f.png

     さらに続けて、インスタンス変数balanceの値を取り出すメッセージに応答できるように#balanceメソッドを追加します。Smalltalkでは、たとえオブジェクトがbalanceというインスタンス変数を持っていても、改めてアクセス専用のメソッドを定義しないかぎり(インスペクタなどの特殊な手段を除けば)通常の方法で、同インスタンス変数にはアクセスできません。

    手順はおおむね、#balance:のときと同じです。ブラウザの上段右端のペイン(メソッドのリスト)に追加され、現在選択状態にあるbalance:をクリックして選択を解除します。すると、balance:の定義前のように、メソッド記述用のテンプレートがコードペインに現われます。マウスカーソルをコードペインの枠内に移動し、選択状態のテンプレートを削除して次のコードを入力し、pretty printでフォーマットを整えた後、accept (cmd-S)してください。

    balance
    ^ balance

     メソッド#balanceを起動するメッセージbalanceは、単項メッセージなので、セレクタ(メソッド名)、メッセージパターンはいずれも同じ「balance」です。当然、メッセージにパラメータは伴わないので、パラメータ変数の宣言も必要ありません。コードは、メソッドの返値を明示的にするための記号である“^”(ハット)にインスタンス変数であるbalanceを続けます。1行目のbalance(メッセージパターン、あるいはセレクタ)と2行目のbalance(インスタンス変数)は字面は同じですが別のものを表わしていることに注意してください。

    acceptと同時にコンパイルが行なわれ、メソッドリストペインにbalanceが追加されると、その直後からインスペクタでインスペクト中のa BankAccountもメッセージ「balance」に応答できるようになります。

    self balance “=> 1000 ”

     ところで、今回定義した#balance:や#balanceのように、同名のインスタンス変数にアクセスするためのメソッドは「アクセッサ」と呼ばれ、Smalltalkではaccessingというカテゴリに分類する習わしになっています。そこで、メソッドカテゴリペインの黄ボタンメニューからrename…を選択し、fill in the blankでaccessingと入力してaccept (cmd-S)しておくことにいたしましょう。

    [fig.G]as yet unclassifiedカテゴリをrename…
    http://squab.no-ip.com:8080/mosaren/uploads/16g.png

    [fig.H]accessingカテゴリに収った2つのアクセッサ
    http://squab.no-ip.com:8080/mosaren/uploads/16h.png

     次回も、BankAccountへのメソッド追加を続けます。

    サポートページ:
    http://squab.no-ip.com:8080/mosaren/

    小池邦人の「Carbon API 徒然草」(2004/10/22)

    nibファイルからウィンドウを呼び込む

    今回から、メインウィンドウ(CatalogWindow)を操作するための基本ルーチンで使われている自作ルーチンについて順次解説して行きたいと思います。まず最初に、前々回に登場したnewCatalogWindow()ルーチンで使われているcreateMyNibWindow()と、その関連ルーチンの解説からスタートします。

    createMyNibWindow()は、nibファイルに登録されているウィンドウオブジェクト(メインウィンドウの雛形)を抽出し適切な初期化を実行します。引数で渡される最初のnameはウィンドウオブジェクトの名称、次のtitleはウィンドウのタイトルです。3つ目の引数のwidには、ウィンドウの種類を認識できるようにするための「識別子」を代入します。メインウィンドウの識別子は’CATA’です。4つ目の引数の*fscは、そのウィンドウに対応したドキュメントファイルの保存場所(FSSpec構造体)を参照するために渡します。ただし、newCatalogWindow()から呼ばれた時には対応するドキュメントは存在しませんので、ここにはNULL(ゼロ)が代入されてきます。ウィンドウが正しく作成されれば、作成されたウィンドウのWindowRefが最後の引数の*wptrに返ります。

    short createMyNibWindow( Str255 name,Str255 title,OSType wid,FSSpec *fsc,
                                                                 WindowRef *wptr )
    {
        short        ret=1;
        CFStringRef  cref;
        IBNibRef     nref;
    
        if( ! CreateNibReference( CFSTR( "main" ),&nref ) ) // nibファイルを開く
        {
            if( cref=CFStringCreateWithPascalString( NULL,name, // オブジェクト名を
                                CFStringGetSystemEncoding() ) ) // CFStringへ変換
            {
                if( ! CreateWindowFromNib( nref,cref,wptr ) )   //ウィンドウを抽出
                {
                    if( ret=setupMyWindow( *wptr,title,wid,fsc ) ) // 初期化する
                        DisposeWindow( *wptr );                    // 失敗したら削除
                    else
                        moveMyWindowBounds( *wptr );               // 表示位置決定
                }
                CFRelease( cref );        // オブジェクト名のCFStringを解放
            }
            DisposeNibReference( nref );  // nibファイルのIBNibRefを解放
        }
        return( ret );
    
    }
    


    オープンするnibファイルの名称は”main.nib”であり、CreateNibReference()へは拡張子部分を外してから代入します。これでmain.nibファイルへのアクセスが可能となりました。メインウィンドウのオブジェクト名は”CatalogWindow”です。これをCFStringへと変換してからCreateWindowFromNib()へ渡せば、出来上がったウィンドウのWindowRefが返ります。実際のウィンドウ作成のための操作はたったこれだけです。ここまでの処理に問題がなければ、setupMyWindow()でウィンドウの初期化を行なった後、moveMyWindowBounds()でウィンドウの表示位置を決定します。

    ウィンドウの初期化で重要な処理は、メインウィンドウに必要なプライベートなメモリ領域(WInfo構造体)をウィンドウのプロパティとして登録し、WindowRef経由でいつでも参照できるようにしておくことです(ウィンドウにくっつけておくこと)。この登録にはWindow ManagerのSetWindowProperty()というAPIを使います。以下が、本アプリで用意したWInfo構造体の内容です。w_prefメンバは画像表示用のビューアウィンドウの方で利用することになりますので別の機会に解説いたします。続くw_optrメンバとw_countメンバには、カタログに登録されているファイル情報(Object構造体のアドレス)とその個数を保存します。ウィンドウ操作に必要なパラメータが増えたら、この構造体に順次メンバを追加していけば良いことになります。

    #define    MAX_FILE  1000      // カタログに登録できる最大ファイル数
    
    typedef struct {
                        WindowRef       w_pref;           // 親ウィンドウのWindowRef
                        unsigned long   w_count;          // ObjectPtrの個数
                        ObjectPtr       w_optr[MAX_FILE]; // ObjectPtrのリスト
    
                    }   WInfo,*WInfoPtr,**WInfoHandle;

    以下のsetupMyWindow()ルーチンで、WInfo構造体をウィンドウのプロパティとして登録します。SetWindowProxyFSSpec()は、対応ドキュメントファイルがある場合のみ実行され、ウィンドウタイトルの左側にドキュメントのプロキシアイコンを表示します。実際のプロパティ登録では、WInfo構造体はシステム内部の格納場所に「複製」されますので、自分自身で確保しておいたポインタ(iptr)は不要となります。最後にDisposePtr()で解放することを忘れないでください。

    SetWindowProperty()には、そのプロパティの種類を後から判断できるようにシグネイチャとタイプを渡します。つまり何種類もの構造体をプロパティとして登録しておくことも可能なわけです。今回のプロパティ識別には、アプリケーション本体のシグネイチャとドキュメントのファイルタイプを代用しています。こうして保存したプロパティの内容は、GetWindowProperty() APIでいつでも引き出す(読み込む)事が可能です。

    short setupMyWindow( WindowRef window,Str255 title,OSType wid,FSSpec *fsc )
    {
        short       ret=1;
        WInfoPtr    iptr;
    
        if( iptr=(WInfoPtr)NewPtrClear( sizeof( WInfo ) ) ) // WInfo構造体用メモリ確保
        {
            SetWTitle( window,title );      // ウィンドウのタイトルを設定
            SetWRefCon( window,wid );       // ウィンドウの識別子を設定
            if( fsc )
                SetWindowProxyFSSpec( window,fsc ); //ファイル保存場所を格納
            SetWindowModified( window,0 );  // 未編集ウィンドウの印を付ける
            ret=setWInfo( window,iptr );    // WInfo構造体をプロパティとして保存
            DisposePtr( (Ptr)iptr );        // WInfo構造体用に確保したメモリを解放
        }
        return( ret );
    }
    
    #define    MY_SIG    'MosA'    // アプリケーションのシグネイチャを代用
    #define    MY_DOC    'MosD'    // ドキュメントのファイルタイプを代用
    
    short setWInfo( WindowRef window,WInfoPtr woptr )
    {
        short    ret=1;
    
        if( IsValidWindowPtr( window ) ) // WindowRefが正常ならプロパティをセット
            ret=SetWindowProperty( window,MY_SIG,MY_TAG,sizeof( WInfo ),woptr );
        return( ret );
    }
    


    続いて、オープンするウィンドウの表示位置をmoveMyWindowBounds()で調整します。メインウィンドウは、スクリーン中心の上方(Alert位置)に表示されるよう、nibファイル側で設定されています。今回は表示回数に応じ、その位置を少し(16ピクセル)右下へ移動させるように工夫してみます。
    getWindowContentBounds()でウィンドウ枠のグローバル座標を得て、それにオフセット値をプラスした値をMoveWindow()に渡すことで移動を実現します。本アプリでは、nibファイルから作成するウィンドウは1種類のみですが、別の種類のウィンドウも対応させたい場合には、ケース文で識別子による分岐を実行し、その内部に別の処理を記述すれば良いことになります。

    void moveMyWindowBounds( WindowRef window )
    {
        static long  w1_ct=0; // ウィンドウ表示位置のオフセット値カウンター
        Rect         grt;
        short        dd;
    
        if( ! FrontWindow() ) // フロントウィンドウが無ければオフセットを初期化
            w1_ct=0;
        dd=(w1_ct++%5)*16;    // オフセット値は5回繰り返すと元に戻る
        switch( GetWRefCon( window ) ) // ウィンドウの識別子をチェック
        {
            case 'CATA': // カタログウィンドウの場合
    
                getWindowContentBounds( window,&grt ); // ウィンドウの現矩形枠を得る
                MoveWindow( window,grt.left+dd,grt.top+dd,0 ); //オフセット分ずらす
                break;
        }
    }
    
    void getWindowContentBounds( WindowRef window,Rect *wrt )
    {
        RgnHandle    rgn;
    
        rgn=NewRgn();
        GetWindowRegion( window,kWindowContentRgn,rgn ); // ウィンドウのContentRgn
        GetRegionBounds( rgn,wrt );                      // その矩形枠を得る
        DisposeRgn( rgn );
    }
    


    最後に、createMyNibWindow()で得られたWindowRefをTransitionWindow()かShowWindow()に渡せばメインウィンドウがスクリーンの指定位置にオープンします。ちなみに、この表示作業はnewCatalogWindow()やopenCatalogWindow()側で行います。

    次回は、newCatalogWindow()で使われているsetupCatalogWindow()と、その関連ルーチンを調べてみることにします。メインウィンドウに実装するイベントハンドラの解説が中心で、アバウトダイアログで解説した内容の応用編となります。

    つづく

    「Behind the WebObjects」  第30回  田畑 英和

     今回は「WOUnitTest」解説の続きです。前回はWOUnitTestのセットアップ方法と基本的な使い方をご紹介しましたが、その続編としてテストケースの作成方法について説明いたします。

    テストの概要

     WOUnitTestでは、テスト用のコード(テストケース)を使って目的のコードをテストします。つまりテスト対象のコード(クラス)が提供するAPIを用いたプログラミングをおこない、実際にプログラムを実行して動作をテストするわけですが、これはWOUnitTestのベースとなっているJUnitでのテスト方法と同じです。実際にプログラムを実行させてテストするわけですから、テストケースと同じ使い方をするのであれば、正常に動作することが期待できるわけです。そのためにはまずテストケースを作成しなくてはなりませんが、さっそく簡単な例を用いて作成方法を紹介していきます。

    テスト仕様

     例えばクラス”Sample”に実装された以下のようなメソッドをテストするとします。このメソッドは2つの文字列(ユーザ名とパスワード)を引数で指定し、ログイン認証をおこなうメソッドとします。単純な例とするために登録済みのユーザは1人だけとします。

    ・テスト対象のメソッド
    /**
    * ログイン認証、大文字小文字を区別する
    * @param name ユーザ名
    * @param password パスワード
    * @return 認証結果
    */
    public static boolean login(String name, String password)

    ・登録済みのユーザ
    name = admin
    password = wo

     この場合nameが”admin”、passwordが”wo”の場合のみtrueが返ればよいことになりますし、逆にそれ以外のパターンではfalseが返る必要があります。つまり、正常な入力がおこなわれた場合に認証がおこなわれることをテストするだけでなく、不正な入力がおこなわれたときには認証がおこなわれないこともテストする必要があります。
     ですのでテストデータとしては、正常な場合と不正な場合をそれぞれ用意する必要があります。この場合、正常な場合は登録済みのユーザということになりますので、あとは不正なデータを用意すればよいことになります。例えば次のようなテストデータを用意したとします。

    ・テストデータ(name/password)
      正常なパターン:admin/wo
      不正なパターン:wo/admin, admin/admin, Admin/wo

     このようなテストデータを用いて実際にlogin()メソッドでログイン認証をおこなうテストケースを作成し、正常なパターンではtrueが、不正なパターンではfalseが返ればこのメソッドが正しく動作することがテストできたことになります。

    テストケースの作成

    (1)フレームワークの追加
     まずフレームワーク”WOUnitTest.framework”をプロジェクトに追加してください。このフレームワークのインストール方法については前回解説しました。フレームワークを追加することにより、アプリケーションにUnitTestの機能が追加されます。

    (2)テストケースの作成
     次にテストケースのクラスを作成します。テストケースクラスはWOUnitTestが提供するWOUTTestCaseを親クラスとして指定し、クラス名は”TestCase”あるいは”Test”でおわるように命名してください。ここでは”SampleTestCase”とします。
     テストケースを簡単に作成できるよう、WOUnitTestのインストール時にテストケースのテンプレートもインストールされています。Xcodeで新規ファイル作成時にWebObjectsグループから「WOUTTestCase class」が選択できるようになっていますので、こちらを利用すると自動的にWOUnitTestを親クラスとするテストケースクラスが生成されます。
     自動生成されたクラスには前処理用のsetUp()、後処理用のtearDown()、空のテストメソッドtest()などがあらかじめ用意されています。

     クラスが作成できたら、今度はテスト用のメソッドを追加します。このときメソッド名は”test”で始まるようにしてください。今回は”testLogin()”とします。例えば次のようなテストケースクラスを作成します。

    ・テストケースクラスサンプル

    public class SampleTestCase extends WOUTTestCase {
         public void testLogin() {
              assertTrue(Sample.login("admin", "wo"));
              assertFalse(Sample.login("wo", "admin"));
              assertFalse(Sample.login("admin", "admin"));
              assertFalse(Sample.login("Admin", "wo"));
         }
    }
    


    ※assertTrue/assertFalse
      それぞれ引数にtrue/falseが指定されたかを評価するJUnitのメソッド

    (3)テストケースの実行
     テストケースが作成できたら、アプリケーションをビルド&実行してください。login()の実装については省略しますが、ログイン認証をおこなう適切なコードが実装されているものとします。アプリケーションが起動したら以下のURLにアクセスしてください。このURLのページはDirectActionを利用することによりWOUnitTestが提供しています。

    ・WOUnitTestのURL
    /cgi-bin/WebObjects/[application name].woa/wa/ut

     ここまでくれば後の手順は前回説明したWOUnitTestTestと同様です。ただし今回はテストケースのクラスは1つしか用意していませんので画面左側のTest Case一覧には”SampleTestCase”のみが表示されているはずです。
     あとは「Run All」をクリックすればSampleTestCaseのtestLoginが自動的に実行されます。もしテストに失敗した場合はlogin()メソッドの実装にバグがあるということですので、テストが成功するようにlogin()を修正する必要があります。

    まとめ

     今回はテストケースの作成方法を紹介することが目的でしたので、単純な例を示しましたが、実際のテストはさらに複雑になるでしょう。login()の仕様もpasswordがnullの場合は認証を許可しないといった仕様も考えられますし、仕様が複雑になればその分テストパターンも増えるでしょう。さらにテスト対象のクラス/メソッドも一般には複数ありますから、それらに対応するテストケースも必要になっていきます。
     効果的なテストケースの書き方などはテスティングに関する文献を参照してみてください。Web上でも様々な情報が得られるでしょう。
     ところでSampleTestCaseはWOUTTestCaseを親クラスに指定しましたが、実はまだWOUTTestCase固有の機能を使ったテストケースではありませんでした。
     WOUTTestCaseはJUnitをベースにしていますが、今回はまだJUnitの機能を利用しているだけです。WOUTTestCaseではカスタムEOをテストするのに便利な機能が用意されていますので次回はそちらを紹介したいと思います。

    ニュース・解説

    今週の解説担当:新居雅行

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃Core Dataの概要が公開、さらに開発者にはTigerプレビュー版をリリース
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ADCのページに次期Mac OS Xとなる「Tiger」についての「Developer Overview」というページが追加された。併せて、「Tiger Early Start Kit for Developers」についても告知された。2005年前半リリース予定のMac OS X v10.4“Tiger”に向けて、開発者が対応アプリケーションなどを開発しやすくするため、情報公開を早めたと言えるだろう。

    Tigerについては、2004年6月末のWWDC 2004である程度公開され、WWDC 2004では内容はまだ機密ながら、開発者に対して新機能のさまざまな情報が公開されている。その後、Sneak Previewとして、機能や画面が公開されていたが、たとえばiChatでのビデオ会議などといったエンドユーザ向けの訴求点が中心ではあった。「Developer Overview」のページでは、開発者がフォーカスしたいポイントがまとめられている点で興味深いと言えるだろう。なお、Dashboardなどの新しい素材に関するものや、Spotlightのように既存アプリケーションなどにも影響のある側面などいろいろとあるが、従来になかった情報として、Core Dataについての解説がある。

    Core Dataの解説部分を要約すると次のようなことだ。PantherではCocoa Bindingsが組み込まれて、GUIのコンポーネントとモデルのバインドが可能になっている。TigerではCore Dataが搭載されて、自動的なUndo/Redo、ユーザインタフェースコンポーネントと同期のさらに強化、データの一貫性保持、読み書きスピードの高速化などが達成される。Core Dataに基づき、開発者がターゲットとしているデータオブジェクトの記述を行えば、データのメモリ内部あるいはハードディスク内部でのメンテナンスといった面倒な仕事は多くの部分がCore Dataがまかなってくれる。開発者はアプリケーションの機能を組み込むことに集中できる。つまり、Core Dataはモデル駆動型のオブジェクトのグラフ化および永続化を行うフレームワークである。また、ストレージモデルとしては、XMLファイル、バイナリファイル、そしてSQLiteを利用できる。

    「Tiger Early Start Kit for Developers」は単独で発売されるのではなく、ADCのSelect以上のメンバに対して配布される。つまり、未公開ソフトウエアの試用や評価のためのシードプログラムに含まれる。まだADC会員ではない人は入会をすればいいわけだが、既存のSelect以上の会員に対しても配布されるようだ。TigerとXcode 2.0のプレリリース版はもちろん、最新版のドキュメントや、WWDC 2004でのTiger関連セッションの様子を収めたDVDも含まれる。また、Appleのサポートエンジニアによるサポートや、ハードウエアのディスカウントということも項目として上がっているが、これはSelectメンバの条項によるものと思われる。サイトではこのStart Kitはすでに入手可能となっている。次期OSのTigerのリリースに向けて、早期にアプリケーションの対応を促し、さらには開発者をより多く引き込むという意図があると考えられる。

    Mac OS X v10.4 Tiger: Developer Overview
    http://developer.apple.com/macosx/tiger/index.html

    Tiger Early Start Kit for Developers
    http://developer.apple.com/macosx/tiger/tigerkit.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃QuickTimeでのスレッドセーフに開発するための知識
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Technical Notesに、QuickTimeでのスレッドセーフなプログラムを作成するための知識が公開された。Mac OS X v10.3になって、QuickTimeのAPIがスレッドセーフとなったが、それまではスレッドセーフでなかった。バックエンドで何かするということはあまりないために表面化はしなかったが、今後はマルチタスク環境で、他のプロセスとの共存をより意識する必要があるだろう。なお、スレッドセーフにはなっても、同一のメモリ上のQuickTimeオブジェクトを複数のスレッドからのアクセスはできなくなっている。ソースコードの例を示すなどかなり長いリストになっているが、Mac OS X環境でQuickTimeを利用している開発者は一読しておく必要があるだろう。

    Technical Notes: Thread-safe programming in QuickTime
    http://developer.apple.com/technotes/tn/tn2125.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃NSViewで拡大縮小率を得る方法
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Technical Q&Aに、CocoaのNSViewにおいて、現在の拡大率などの値を取り出す方法が紹介されている。NSViewではスケールを設定するメソッドがあるが、これらを利用し、さらにObjective-Cのカテゴリを利用してNSViewを拡張し、拡張したメソッドを通じて拡大や縮小を行うことで、後から拡大縮小率を簡単に得られるようにするという方法がソース付きで紹介されている。

    Technical Q&A:Finding an NSViews current magnification
    http://developer.apple.com/qa/qa2004/qa1346.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃VRAMサイズを求める方法
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    VRAMのサイズを求める方法がTechnical Q&Aに公開された。Core GraphicsとIOKitを使う方法がある。ソースコードが掲載されているので、そのまま使えるだろう。

    Technical Q&A:How do I determine how much VRAM is available on my video card?
    http://developer.apple.com/qa/qa2004/qa1168.html

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

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

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

    2004-10-19

    目次

    • 湘南ミーティングへのお誘い     その2  高橋 政明
    • SqueakではじめるSmalltalk入門   第15回  鷲見 正人
    • 藤本裕之のプログラミング夜話 #55
    • 高橋真人の「プログラミング指南」  第54回
    • ニュース・解説

    湘南ミーティングへのお誘い    その2 高橋 政明

    「第11回 Macintosh Software Meeting in 湘南2004(通称:湘南ミーティング)」のセッション内容についてご紹介します。(一部に筆者の、セッション参加者としての個人的な、希望を含んでいるかも知れません〔^_^;〕)セッションの概要と講師プロフィールそれに時間帯は
    http://www.mosa.gr.jp/topics/msm2004session.html
    を参照してください。

    アップルセッション

    初台のオペラシティ内でアップルコンピュータ社スタッフによるセッションを予定しています。内容はまだ決まっていません。ADC会員向け(秘守義務の対象)の本格的技術セッションになるはずです、期待しましょう。

    キーノートセッション

    テクノロジーライター大谷さんのキーノートセッションです。毎年驚きに満ちた新鮮な切り口と話題で、我々開発者のモチベーションを確実に高めてくれます。技術者で良かった、そしてMacの開発に関わっていて良かったと感じさせてくれること請け合いです。絶対に聞き逃せませんよ!

    Introduction:Xcode使いのためのCVS入門

    私高橋担当の深夜セッションです。昨年の湘南ミーティングにて金内さんのセッション「バージョン管理システムCVSとの暮らし方」に参加された方もいらっしゃると思います。私もその一人でしたが、恥ずかしながらその後もCVSを実務に使うところまで至っていませんでした。そこでCVS利用に踏み切れなかった方のためのセッションを企画しました。パーティ後のセッションなので講師の私も酔っぱらっている可能性があるため、そのような場合でも配布資料を読めばわかるよう準備を進めております。既にソースコード管理を使いこなしている方も顔を出してください。気楽に意見交換のできる深夜ならではのセッションにしたいと思います。

    Modern-1:AppleScriptで駆動可能なCocoaアプリを作る

    モサ伝に「プログラミング夜話」を連載していただいている藤本さんのセッションです。AppleScriptで制御可能なCocoaアプリを作成する手順を具体的に解説してくださるそうです。Tigerでも依然重要なテクノロジーの一つであるAppleScriptに、Cocoaアプリも対応しましょう。

    Advanced-1:Behind the WebObjects Live!!

    モサ伝に「Behind the WebObjects」を連載していただいている田畑さんのライブセッションです。文字中心のメールマガジン記事では伝えきれない部分を、テストなど実務に不可欠な技法までたっぷり語っていただきます。WebObjectsの情報不足を嘆いている方にも満喫いただける熱のこもったセッションになるはずです。

    Core-1:Mac OS X環境におけるOpenGL

    モサ伝に「Carbon API 徒然草」を連載していただいている小池さんのセッションです。今年はMac OS Xでますます重要な位置を占めるOpenGLの3D表示の仕組みとその利用法を解説してくれます。3D表示のパワーを利用しソフトをより魅力的なものにしましょう。(このセッションはC-2と連携するそうです)

    M-2:Javaゲームプログラミング

    「Javaゲームプログラミング アルゴリズムとフレームワーク」の著者である長久さんのセッションです。音声や動画の応用は今やゲームだけに留まりません。Mac OS Xでクロス開発する場合にも役立つでことしょう。

    A-2:Web Kit プログラミング解説と、その実例としてのシイラプロジェクト紹介

    「HAPPY Macintosh Developing TIME!」webと書籍でCocoa開発情報を提供してくださっているの木下さんによるセッション【たぶん本邦初!】です。Web Kitの利用から内部構造までの解説に加え、その応用ブラウザであるシイラとシイラプロジェクトについてオープンソースの観点からもお話していただける、盛りだくさんのセッションです。

    C-2:HID Managerを使ったゲームコントローラの活用と実装

    昨年の湘南セミナーをきっかけにWristSyncでWRISTOMOをMac OS Xに接続した中野さんによるセッションです。
    USBのHID(Human Interface Device)をMac OS Xのアプリケーションで応用する方法を解説していただきます。C-1セッションと関連がありますので両方聴講される事をおすすめします。

    M-3:軟派のためのプログラミング環境「AppleScript」解説 最新動向と可能性の限界に迫る!

    先日のMOSAメンバーズカフェで超絶技巧の一部をご披露いただいた長野谷さんのセッションです。AppleScriptの可能性と応用をいろいろな角度から解説するとともに、後半はリクエストをその場でプログラミングするパフォーマンスをご披露してくださるそうです。

    A-3:Mac OS X Server 10.3

    Mac OS X Server 10.3 をテーマに佐藤さんのセッションです。実務経験豊富な佐藤さんが、X Serverの特徴やアドバンテージそして運用の胆まで熱く語ってくれるでしょう。

    C-3:PowerPlant X 入門〜CoreFoundation から、Cocoa との融合まで〜

    モサ伝で「プログラミング指南」を連載していただいている高橋真人さんのセッションです。Mac用市販ソフトと業務用ソフトで大きなシェアを持つフレームワークPowerPlant、その次世代であるPowerPlant X について貴重な解説【これも本邦初?】です。今回は日本語の情報が少ないCoreFoundationやCocoaとの融合なども具体的にご紹介いただけるそうです。

     webや書籍で著名な講師はもちろん、参加者もMac開発ではおなじみの皆さんが毎年集まります。パーティや朝食・昼食時はもちろん、セッションの合間や移動のバス車内でもいろいろな出会いがあるはずです。

    AppleScriptからX Serverまで、Tigerを待ち受けるこの時期にふさわしい幅広く充実したセッションが揃いました。金曜の午後から土曜日の夕方のスケジュールで地方からも参加しやすいと思います。まだ申し込まれていない皆さん、今年も湘南ミーティングはスキルアップと出会いの場です! どうぞ参加してください。
    http://www.mosa.gr.jp/topics/msm2004-kokuchi.html

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回からしばらく、オブジェクト指向プログラミングにおける、“Hello World!”的存在とも言える「銀行口座」の例に取り組んでみましょう。

    銀行口座(bank account)と言っても、出納と残高管理だけの財布のような簡単なオブジェクトを想定します。このオブジェクトはBankAccountというクラスのインスタンス(a BankAccount)で、残高(balance)というただひとつのインスタンス変数を持ちます。このインスタンス変数balanceと同名の、balance: x、balanceというメッセージで、残高の設定と内容の呼び出しが可能です。また、出納はそれぞれ、withdraw: x、deposit: x(xは任意の金額)というメッセージを送信することで行ない、払い戻しの際、残高は負にならないことにします。

    このa BankAccountとのメッセージのやりとりを想像すると、こんな具合になるでしょうか。

    | account |
    World findATranscript: nil.             "transcriptを開く"
    account _ BankAccount new.              "a BankAccount作成"
    account balance: 1000.                  "1000円預金"
    Transcript cr; show: account balance.   "残高照会 => 1000 "
    account withdraw: 600.                  "600円払戻"
    Transcript cr; show: account balance.   "残高照会 => 600 "
    account deposit: 60.                    "60円預入"
    Transcript cr; show: account balance.   "残高照会 => 660 "
    account withdraw: 700.                  "700円払戻"
    Transcript cr; show: account balance.   "残高照会 => 0 "

     ではまず、クラスを定義します。作業場を整えるために、デスクトップを新調します。左下のNavigatorと書かれたタブをクリックして、NEWボタンをクリックします。小さなウインドウが現われたら、中央付近をクリックして中に入ります。新しいデスクトップが現われたら、デスクトップメニューからopen… → workspaceでワークスペースを開き、そこで、

    (FileStream fileNamed: ‘BankAccount.txt’) edit

    などとタイプした後、do it (cmd-D)して作業用のテキストファイルエディタを開いておきます。ここにタイプした内容はaccept (cmd-S) → overwrite that fileでBankAccount.txtというファイルに保存できます。

    机上の整理が付いたら、あらためて、デスクトップメニューからopen… →browser でブラウザを開きます。まず、これから作るクラスを分類するための新しい、カテゴリを設けましょう。クラスカテゴリペイン(左上のペイン)で黄ボタンクリック(ワンボタンマウスならoption-クリック、2ボタンなら右、ホイール付きを含め3ボタンなら中ボタンをクリック)して、黄ボタンメニューを出し、add item…を選びます。

    [fig.A]クラスカテゴリペインの黄ボタンメニュー
    http://squab.no-ip.com:8080/mosaren/uploads/15a.png

     入力ボックス(fill in the blank)が現われるので、Category-MosaDenなどとしてaccept (cmd-S)します。するとクラスカテゴリペインに追加したカテゴリが現われ(確認するにはスクロールする必要があります)、また、コードペイン(下のペイン)にはクラスを新規作成するためのテンプレートが現われます。

    Object subclass: #NameOfSubclass
      instanceVariableNames: ''
      classVariableNames: ''
      poolDictionaries: ''
      category: 'Category-MosaDen'

    [fig.B]追加されたクラスカテゴリと新規クラス作成用のテンプレート
    http://squab.no-ip.com:8080/mosaren/uploads/15b.png

     subclass: の直後、#NameOfSubclassと書かれた場所を、#BankAccountと書き換えます。テキスト編集の作法はMacのそれとよく似ているので問題はないはずです。ダブルクリック【註】で「NameOfSubclass」を選択状態にして「BankAccount」とタイプして入力するのがよいでしょう。続けて、instanceVariableNames: に続くシングルクオートの中にキャレットを移動し、インスタンス変数である「balance」とタイプします。スペルを確認したら、accept (cmd-S)して決定します。

    【註】まるでダブルクリックで単語が選択されているように見えますが、実は、Squeakシステムは、Macと異なり、ダブルクリックによる単語の選択という概念がありません。NameOfSubclass内のキャレットを(移動させないようにして)クリックする、という操作によりテキストが選択されています。なお、クリックするキャレットが置かれた位置により、単語選択、括弧/引用符内文字列選択、段落選択、全文選択と振る舞いが変わるのが特徴です。

    Object subclass: #BankAccount
      instanceVariableNames: 'balance'
      classVariableNames: ''
      poolDictionaries: ''
      category: 'Category-MosaDen'

     実はこのテンプレート、Objectというクラスへのメッセージ送信式になっています。余計な改行を省くと、subclass: #BankAccount instanceVariableNames: ‘balance’ classVariableNames: ” poolDictionaries: ” category: ‘Category-MosaDen’という5つのパラメータ(引数)を持つ長〜いメッセージであることが分かります。Objectクラスに対して、BankAccountという名前の、balanceというインスタンス変数を持つクラスを、自らのサブクラスとしてCategory-MosaDenというカテゴリに作りなさい(すでにある場合は再定義しなさい)…と言っているわけです。3番目と4番目のパラメータ(クラス変数とプール辞書)は大域変数を宣言するためのものですが、普段は使わないので当面は無視してかまいません。

    とりあえずBankAccountというクラスを作ることができましたので、そのインスタンスを作ってインスペクトしてみましょう。インスタンスを作るにはクラスにnewというメッセージを送信します。次の式を適当な場所に入力後、選択してinspect it (cmd-I)してください。

    BankAccount new

    [fig.C]インスペクトされたBankAccountのインスタンス
    http://squab.no-ip.com:8080/mosaren/uploads/15c.png

     インスペクタ左側のリストには、balanceというインスタンス変数が確認できるはずです。クリックすると、nilが束縛されていることが分かります。Smalltalkでは、未定義の変数には常にnilが束縛されています。このことを頭の片隅に置いておいてください。

    ここでいったん、作業状態を凍結しておきます。デスクトップメニューからsave as new versionを選び、スナップショットをとっておきましょう。次回の作業の続きは、今作成した仮想イメージファイル「Squeak3.6-nnnn-full.1.image」を仮想マシンにドロップインして起動するシステムを使ってください。次回はメソッドを定義します。

    サポートページ:
    http://squab.no-ip.com:8080/mosaren/

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

     前回に続いて仮想基本クラスの問題をもう一個取り上げる。こういう話が退屈だったヒトはこれを最後にして次回からまた別のネタをやるので勘弁してください。前回の初期化問題をやってこれやっとかないといかにも中途半端なのでね。
     まず、もはやすっかりお馴染みになったラジオとカセットテープレコーダに登場してもらう。これらはともに音響機器というクラスを仮想基本クラスとしている。覚えてますか? で、下の例ではこれらに現在のボリウムを返す関数をちょっとイビツな形でインプリメントしてる。ちょっと注意して見て欲しい。

    class audioDevice {
      public:
          virtual double reportVolume() { return 1.0; }
    }
    
    class radio : public audioDevice {
      public:
          double reportVolume() { return 3.5; }
    }
    
    class cassetteTapeRecorder : public audioDevice {
    }
    
    class radioCassette : public radio, public cassetteTapeRecorder {
    }
    


     知ってると思うが音響機器のクラスにある頭に「virtual」のついた関数定義を「仮想関数」という。そのココロは「オブジェクトの型によって呼び出す関数が決定される」ってんで、つまりはこの「virtual」がない場合、下のような関数にラジオのインスタンスを渡すと、

    double  currentVolume(audioDevice* device){
          return device->reportVolume();
    }
    
    int  main() {
          radio        skySenser5600;
          printf("volume = %1.1f¥n", currentVolume(&skySenser5600));
    }
    


     これの出力が「volume = 1.0」になってしまうつうこと。
     でもそれが本題ではないのだ。上のラジカセのように、ラジオとカセットテープレコーダを多重継承し、その2つのクラスがそれぞれ音響機器という共通のクラスを仮想継承していて、しかも片方、ラジオの方にしかreportVolume()という関数の定義がないとき……なんか息継ぎが必要なくらい限定された状況のようだが、この場合に以下のような呼び出しをするとどうなるか、なんだよ旦那。

    int  main() {
          radioCassette    Macbb;
          printf("volume of radio = %1.1f¥n",
                  currentVolume((radio*)&Macbb));
          printf("volume of casetteTapeRacorder= %1.1f¥n",
                  currentVolume((cassetteTapeRecorder*)&Macbb));
    }
    


     これ、両方の呼び出しとも3.5になる。つまり、ある仮想基本クラスの仮想関数を呼び出す時、そのクラスに関数定義がないと、仮想基本クラスより先に、共にその仮想基本クラスを仮想継承しているクラスの関数定義が探索される、のである。こう書くとややこしいが、つまりカセットテープレコーダのreportVolume()を呼ぼうとしてなかった場合、仮想基本クラスのそれより前に、ラジオにその関数が定義されているかどうか見に行き、もしされていればそれを呼び出す、ということである。
     この複雑さも一重に多重継承という機構が生んだ歪みのひとつだとオレなんかは思うんだが、こういう分かりにくさを気持ちいいと思う人も世の中にはいるわけで、だからオレはこれらを「悪い」とは言わない。ただ「嫌い」なだけである。……つうことで次回はずっと散文的かつ形而上的に「好き/嫌い」と「良い/悪い」の問題について与太話を書きたいと思う。

    *文中のラジオおよびカセットテープレコーダの機種名として使用したのはどれも筆者がかつて所有していた懐かしい機種である。そう言えば使っているオーディオの機種名なんて気にしなくなってずいぶん経つなぁ。
    (2004_10_13)

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

    UNIXとしてのMac OS X

    〜CGIを試す(4)〜

     こんにちは、高橋真人です。
    さて、いよいよまとめです。ようやくCGIを動作させるところになりました。
    ところで、前回の最後にご紹介したスクリプトの単独での実行ですが、うまく行きましたでしょうか? 今回のスクリプトで使っている「ヒアドキュメント」という方法の場合、末尾のEOTの後に必ず改行を入れておかないとエラーになりますので注意してください。
    それでは、残りの作業をやってみましょう。とは言ってもほとんどやることは残っていません。
    まずは、システム環境設定の「共有」の中からサービスパネルを選択してください。リストの中に「パーソナルWeb共有」というのがありますので、この項目の左側のチェックボックスがONになった状態にしてください。(既にチェックが付いている場合はそのままです)
    実は、これだけでApacheは起動します。試しにアクティビティモニタ(Mac OS X 10.2以前はプロセスモニタ)で見てみるとちゃんとApacheのプロセスが動いていることが確認できるはずです。
    ここで実際にプロセスを調べてみた人は「あれ? Apacheなんてプロセスは起動してないぞ」と思われたかもしれません。面白いことに、Apacheの実行ファイル名はApacheではないのです。httpdというのが実行ファイルの名前になります。
    Webサーバーの準備が完了したので、早速CGIを試してみましょう。Webブラウザを立ち上げて、以下のURLを開いてください。
    http://localhost/cgi-bin/mosa_cgi.pl

     どうでしょうか? 無事に時刻の表示が出ましたか? リロードするとちゃんと時刻は更新されますか?
     あいにくうまく動かなかった方は、過去の記事を参考にしながら以下の点をもう一度確認してみてください。

    ・パーミッションの設定は正しくされているか
    ・スクリプトの末尾に改行を入れてあるか
    ・改行コードはLFになっているか

     特に最後の点に関しては、Xcode以外のエディタを使った人は要注意です。Mac OS Xではテキストファイルの改行コードのデフォルトが2種類存在します。Cocoa系のXcode、ProjectBuilder、TextEditなどを使った場合や、UNIX系のviやemacsなどを使った場合、改行コードは通常LFになりますが、Carbon系のエディタの場合にはデフォルトが従来のMac OSと同様のCRである可能性もあります。また、ひょっとしたら、あなたのエディタの設定がWindows環境に合わせるためにCR+LFになっているケースもあるかもしれません。

    さて、以上でスタンドアローンのMacを使ってCGI環境を構築する方法の説明は終わりです。連載4回分も費やして説明してきましたけれども、通して作業すればものの5分もあれば十分でしょう。ただ、もちろんこれはほんの入り口にしかすぎませんので、これを機会にもっと詳しくやってみようと思われる方は、今回の説明をより深く突っ込んで解説された以下の文献をあたられるとよいでしょう。

    参考文献:
    CGIプログラミング 第2版
    http://www.oreilly.co.jp/BOOK/cgi2/

    初めてのPerl 第3版
    http://www.oreilly.co.jp/BOOK/lperl3/

    プログラミングPerl
    第3版 VOLUME 1
    http://www.oreilly.co.jp/BOOK/pperl3v1/

    プログラミングPerl
    第3版 VOLUME 2
    http://www.oreilly.co.jp/BOOK/pperl3v2/

    Mac OS X ターミナルコマンド ポケットリファレンス
    http://www.gihyo.co.jp/books/syoseki.php/4-7741-1393-X

    Linuxコマンドパーフェクトリファレンス
    http://www.pearsoned.co.jp/washo/operate/wa_ope10-j.html

    ニュース・解説

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

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

    【開発環境】

    インターネットのMac関連サイトで、「Tiger(Mac OS X 10.4)の発売日は2005年3月31日である」と言う噂が流れています。噂の火元は、Amazon.comサイトでMac OS X 10.4の予約受付が開始されており、その案内に発売日時が明記されていたという事実からだそうです。しかし、デベロッパサイドからすれば、WWDC2004のプレビュー版配布以来 Tigerに関わる動向は「静」のままですし、ほんとうにそんなに早い時期に販売開始が可能なのか大いに疑問が残ります。まあ、静かな動向とは裏腹に開発が予想以上に進んでいるという別の「噂」もありますので(笑)、来年度の早期発売に期待しても良いのかもしれませんね。

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

    前回から10月15日の期間中、Apple社のDocumentationサイトには新規ドキュメントが10登録されました。「iSight Programming Guide」のみが新しいドキュメントで、それ以外はマイナーな改訂となっています。この「iSight Programming Guide」の内容については、前回の新居さんの記事を参照してください。

    「Apple Human Interface Guidelines」(PDFあり)
    「Color Management Overview」(PDFあり)
    「Disc Recording C Reference」
    「Enterprise JavaBeans」(PDFあり)
    「I/O Kit Fundamentals」(PDFあり)
    「iSight Programming Guide」(PDFあり)
    「Java 1.4 Info.plist Java Dictionary Keys」(PDFあり)
    「Java 1.4 System Properties」(PDFあり)
    「Java 1.4 Virtual Machine Options」(PDFあり)
    「Web Kit Reference for Objective-C」

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

    前回から10月15日の期間中、新規のテクニカルノートが2つ、テクニカルQ&Aが13登録されました。「Thread-safe programming in QuickTime」は、プリントアウトすると25ページにもなる力作です。QuickTime APIをThread-safeで利用するためのテクニックがサンプルソース付きで紹介されていますが、Mac OS XでQuickTime APIの能力を十二分に発揮させるには、引き続きQuickTime自身の大幅な改良が必要なのかもしれません。 テクニカルQ&Aは久しぶりの大量登録ですが、いくつかはバグの尻ぬぐい的な解説です。ちなみに「Using the latest Mac OS X headers in my CFM project with CodeWarrior」は、苦労したプログラマには泣ける内容となっています(笑)。QA1350とQA1375とQA1380の内容については、前回の記事で新居さんが解説されています。

    TN2125「Thread-safe programming in QuickTime」
    TN2110「Identifying Java on Mac OS X」

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

    QA1384「Enabling the Navigation Services default behavior in its dialogs」
    QA1346「Finding an NSView’s current magnification」
    QA1161「Fixing the Layout Binding of the Tab control User Panes」
    QA1162「Managing custom drawing code in a compositing world」
    QA1265「Sharing Browser Cookies With Java Applets」
    QA1158「glFlush() vs. glFinish()」
    QA1168「How do I determine how much VRAM is available on my video card?」
    QA1379「Using the latest Mac OS X headers in my CFM project with CodeWarrior」
    QA1380「Clickable Static Text Item」
    QA1385「NSTimers and Rendering Loops」
    QA1375「SetFontInfoForSelection incorrect prototype」
    QA1167「Using Interface Builder’s NSOpenGLView or Custom View objects for an OpenGL application」
    QA1350「Storing file references in CFPreferences」

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

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

    前回から10月15日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが4つ登録されました。「MLTE_CustomScrolling」のみが新しいサンプルで、それ以外は今まで存在していたバージョンの改良版です。

    「MLTE_CustomScrolling」(MLTE関連)
    「PMPrinterTest」(Print関連)
    「SimpleVideoOut」(QuickTime関連)
    「CFNetworkHTTPDownload」(Network関連)

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

    【デベロップメント SDK】

    前回から10月15日の期間中、Apple社のSDKサイトには「Bluetooth SDK 1.5.1」がひとつだけ登録されました。Mac OS X 10.3に対応したBluetooth SDKの最新版です。

    「Bluetooth SDK 1.5.1」

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

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

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

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

    2004-10-12

    目次

    • 湘南ミーティングへのお誘い    その1  戸上 尚子
    • SqueakではじめるSmalltalk入門  第14回  鷲見 正人
    • 「Behind the WebObjects」    第29回  田畑 英和
    • ニュース・解説

    湘南ミーティングへのお誘い    その1 戸上 尚子

     今年も秋の恒例イベント「第11回 Macintosh Software Meeting in 湘南2004(通称:湘南ミーティング)」の参加募集が開始となりました。
     昨年に引き続き、事務局からこのイベントについてご紹介させていただきます。

    幕開けはアップルセッション!

     二日間にわたるイベントの幕開けは、初日の午後1時から。東京新宿区にあるアップルコンピュータ社で、夕方までの約3時間、「アップルセッション」を行ないます。このセッションは、同社スタッフから直に開発技術情報が得られるとても貴重なセッションです。

    今年も湘南の夜は熱い!

     湘南ミーティング初日のお楽しみといえば、夜の懇親パーティーと「オールナイトセッション」です。去年の懇親パーティー「お楽しみ抽選会」では、「宇都宮のぎょうざセット」や、「カラオケ盛り上げセット」のようなおもしろ景品がいくつかありました。今年はどんなサプライズ景品が出るでしょう?どうぞご期待ください。(おもしろ景品のご提供は大歓迎です。ご協力いただける方は、事務局までご連絡ください。)
     そして、抽選会後の「オールナイトセッション キーノート」では、今年もMOSA理事の大谷和利さんが趣向を凝らして、楽しく刺激に満ちたセッションを披露してくれるはずです。こちらもお楽しみに。
     それから今年はもう一つ、モサ伝編集長の高橋政明さんによる「Introductionセッション」もお見逃し無く! 従来からアンケートに多く寄せられていたXcode関連のセッションを企画しました。

    知られざる湘南会場の魅力!

     皆さんにご宿泊いただく「湘南国際村センター」には、床暖房つきの温水プール、ジャクジーなどのリラクゼーション施設があるのをご存知ですか? ここは宿泊者であれば、無料で利用可能です。二日めの朝、少し早く起きてセッション前にひと泳ぎ、なんていうのもいいかもしれませんよ。ご希望の方は水着をお忘れなく。
    http://www.shonan-village.co.jp/sisetu_index.html
     そしてこの時期は、晴れていればとても美しい富士山を眺める事が出来ます。是非会場周辺も散歩してみてください。

    二日目のセッションについて

     二日目はModern、Advanced、Coreの3トラックで各3つのセッションを予定しています。(気づきましたか? 前日のIntroductionセッションから頭文字を取っていくと「I MAC(iMac)」となるんですよ。)
     セッションの受講方法は、トラックには関係なく、自分が受けたいセッションに自由に参加出来ます。例えば、午前中のセッションはM-1のセッションを受け、お昼を挟んで午後最初のセッションはC-2、最後にA-3を受けて終わり、という風にです。二日めのセッションについては、次号の高橋編集長の記事でご紹介の予定です。

    学生プログラマの参加を歓迎します!

     今年は学生向けにお得な学生参加料金を設定しました。1泊3食、バス代、パーティー費用、セッション受講費込みで9,000円〜13,000円(申込種別によって料金が異なります。)でご参加いただけます。

    イベント概要、料金のご案内

    http://www.mosa.gr.jp/topics/msm2004-kokuchi.html

     今年も既に多くの方からお申込をいただいています。初参加でなかなか勇気が出なくて、なんていう方もいらっしゃるかもしれませんが、刺激に満ちた二日間で必ず「何か」を得られるはずです。是非、今年こそは参加をしてみてください。
     ご不明な点は、遠慮なく事務局までお問い合せください。皆さまのご参加をお待ちしています!!!

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、通常は許されない直接的な操作をインスペクタを介してオブジェクトに加えてみたり、システムブラウザで定義を変えてしまい、そのとき、オブジェクトがどのように振る舞うのかをインスペクタで観察してみましょう。

     前回おさらいで、(3/4)のインスペクタを起動してください。次の式、

    (3/4) inspect

    をdo it (cmd-D)するか、3/4部分を選択してinpect it (cmd-I)します。

    [fig.A](3/4)のインスペクト結果
    http://squab.no-ip.com:8080/mosaren/uploads/14a.png

     まず、分母(denominator)を4から5に変えてみます。まず、denominatorを左ペインで選択し、右手のペインに4が現われることを確認します。

    [fig.B]denominatorの現在値
    http://squab.no-ip.com:8080/mosaren/uploads/14b.png

     4を選択して、5とタイプして置き換え、accept (cmd-S)します。acceptは右側のペインの黄ボタンメニューにもあります。

    [fig.C]denominatorを5に変えてaccept
    http://squab.no-ip.com:8080/mosaren/uploads/14c.png

     selfをクリックして選択し、(3/4)が(3/5)に変化したことを確認します。タイトルは動的に更新されないので、食い違っていますね。

    [fig.D]selfで(3/5)になったことを確認
    http://squab.no-ip.com:8080/mosaren/uploads/14d.png

     下のワークスペースでself + (1/5)をprint it (cmd-P)してみましょう。結果は、(4/5)になり、最初(3/4)だったオブジェクトが今は(3/5)として振る舞っているのを確認できるはずです。

    self + (1/5) “=> (4/5) ”

    [fig.E]self + (1/5)のprint it
    http://squab.no-ip.com:8080/mosaren/uploads/14e.png

     整数に限らず、3.0などの浮動小数点少数(a Float)や、’squeak’といった文字列(a String)さえ束縛可能なので、(3.0/5)だとか(‘squeak’/5)といったあり得ない分数ができてしまいます。このようなインスペクタを介した、インスタンス変数への本来想定されないオブジェクトの束縛は、オブジェクトに対する紛れもない悪意ある“破壊”行為であり、以後の正常な振る舞いは期待できなくなるので注意してください。

    Smalltalkのオブジェクトの振る舞いを知るために、さらに危険な行為も試してみましょう。(3/4)、いや、かつて(3/4)だったオブジェクトのインスペクタの、右側のペインにあるselfをクリックして選択し、browse it (cmd-B)してください。すると、このオブジェクトが属するクラスを選択した状態でシステムブラウザが起動します。

    クラスを選択した直後、システムブラウザは下のペイン(コードペイン。通常は選択したメソッドのコードが表示される)に、クラスの定義内容が呼び出されます。

    Number subclass: #Fraction
      instanceVariableNames: 'numerator denominator '
      classVariableNames: ''
      poolDictionaries: ''
      category: 'Kernel-Numbers'

     細かなことは後回しにして、ここはとりあえず、二行目の「instanceVariableNames:」に続く文字列リテラル(’ ‘で括られている)の中を眺めてください。スペースで区切って列挙されているのが、a Fractionが持つインスタンス変数の一覧です。ブラウズ中のクラスがFractionなら、numeratorとdenominatorを見つけられるでしょう。では、ここに、tempという文字列を追加しaccept (cmd-S)してみてください。

    [fig.F]Fractionのインスタンスへのインスタンス変数tempの追加
    http://squab.no-ip.com:8080/mosaren/uploads/14f.png

     コンパイルが行なわれ、Fractionの定義が更新されます。このとき、かつて(3/4)だったインスペクト中のオブジェクトのインスペクタの中身(左側のペインのインスタンス変数のリスト)には、tempが追加されるはずです。

    [fig.G]かつて(3/4)だったオブジェクトに追加されたtemp
    http://squab.no-ip.com:8080/mosaren/uploads/14g.png

     以上のように、Smalltalkでは、クラス定義の変更を随時行なうことができ、変更の結果は、それ以降生じるインスタンスはもちろん、システム内に既存の全インスタンスにも即座に反映されます。基本クラスに手を加えるという、いささか常軌を逸した例ではありましたが、こうしたクラス定義変更に伴うオブジェクトの動的な振る舞いを観察する際にも、インスペクタはその威力を発揮してくれることはお分かりいただけたと思います。

    なお、このままシステムを保存してしまうと次回Squeakシステム起動時にも今回の変更が反映されて、面倒なことになりかねないので、終了の際にはsaveはせず、quit → Noか、OS Xの用意したメニューからQuit do not saveを選ぶようにしてください。

    インスペクタの機能の紹介を兼ねて、Squeak システムにおけるオブジェクトの驚くべき柔軟性を垣間見ていただいたところで、次回から、このインスペクタとブラウザを使った非常に小規模なクラスプログラミングの手順を紹介したいと思います。

    サポートページ:
    http://squab.no-ip.com:8080/mosaren/

    「Behind the WebObjects」  第29回  田畑 英和

     MOSA会員の方はすでにご存知かとおもいますが、今年も湘南ミーティングが開催され、昨年に引き続きWebObjectsのセッションを担当させていただくことになりました。当日は「Behind the WebObjects Live!!」と題しまして連載ではご紹介しきれなかったWebObjectsの活用法をご紹介する予定です。開発効率を向上させたいとお考えの方、WebObjectsでどのようなことができるのか興味のある方はぜひご参加ください。

    テスティング

     さて、今回はテスティングについて取り上げてみたいと思います。テストと言いましても様々なテストがありますが、今回はいわゆるユニットテストについて取り上げてみたいと思います。テストファーストやテスト駆動開発(TDD)といった手法が注目されていますが、テスト作業を標準化/自動化することによりプログラムの品質を保証しながら開発を進めていくことが可能になります。

    JUnit

     テスト作業を支援するために各プログラミング言語用のテスティングフレームワークというものが開発されていますが、Javaの世界ではJUnitが広く普及しています。JUnitでのテストの手順を簡単に説明しますと、次のような流れになります。ちなみにテストファーストでは先にテストコードを記述して、そのテストにパスするようにプログラム本体の実装をおこなうことになっています。

    ・テスト作業の流れ
     1. テスト用のコード(テストケース)を作成
     2. テスト用コードを実行
     3. テスト結果を確認、失敗した部分を修正し再テスト

     JUnitではテストケース作成用の親クラス、実行結果を評価するための機能、テスト結果を集計する機能などが標準で提供されているため、手軽にテストを実施することができます。またGUI上でテストを実行し、テスト結果を確認することもできます。
     このようなテスティングフレームワークを用いると手軽にテストを実施できます。また、ソースコードの改良をおこなった場合にも再びテストを実施することで、新たなバグが発生していないかを確認でき、プログラムの品質が保たれていることを確認しつつ開発ができます。

    WOUnitTest

     このJUnitを用いてWebObjectsのテストをおこなってもよいのですが、今回はJUnitをベースにしてWebObjectsアプリケーションのテスト用に開発されたフレームワーク「WOUnitTest」についてご紹介したいと思います。
     WOUnitTestを用いれば、プロジェクトにフレームワークを追加しテスト用のクラスを作成するだけで、テストが実行できるようになります。フレームワークがテストを実行するための機能を提供するため、アプリケーション上で直接テストの実行およびテスト結果の確認ができるようになります。

    WOUnitTestのセットアップ

     まずSourceForgeで運営されているWOUnitTestのページからWOUnitTestのプロジェクトをダウンロードしてください。最新版は2004/03/23のrelease 7になっています。SourceForgeのサイトではWOUnitTestのスクリーンショットなども公開されています。

    ・WOUnitTestダウンロード
    http://wounittest.sourceforge.net/

    ・WOUnitTest r7の開発環境
    WebObjects 5.2.3, Xcode 1.1.1, JUnit 3.8.1

     WOUnitTestはJUnitをベースに開発されていますが、WOUnitTestにJUnitは含まれていませんので、まずはJUnitを別途セットアップしておく必要があります。JUnitのサイトからJUnit 3.8.1をダウンロードし、JUnit本体のjunit.jarをインストールします。

    ・JUnit
    http://junit.org/

    ・JUnit 3.8.1ダウンロード
    http://prdownloads.sourceforge.net/junit/junit3.8.1.zip?download

    ・インストール先(junit.jar)
    /Library/Java/Extensions/

     次にWOUnitTestのインストールですが、バイナリーでの配布はおこなわれていませんので、ビルド&インストールをおこなう必要があります。Xcodeを用いた場合ビルドスタイル”Deployment”でインストールすることができます。
     コマンドラインからインストールする場合はターミナル上で次のコマンドを実行してください。このコマンドはWOUnitTestのプロジェクトフォルダに移動して実行する必要があります。インストールを実行するとフレームワークとテストケースクラスのテンプレートが作成されますが、インストール先のパスに書き込み権限がない場合はsudoを用いてインストールコマンドを実行してください。

    ・インストールコマンド
    xcodebuild -target WOUnitTest -buildstyle Deployment install

    ・インストール先
    /Library/Frameworks/WOUnitTest.framework
    /Library/Application Support/Apple/Developer Tools/File Templates/
    WebObjects/WOUTTestCase class.pbfiletemplate

    WOUnitTestの使い方

     WOUnitTestの実行方法ですが、WOUnitTestにはサンプルのWOUnitTestTestが付属していますので、まずはこちらで動作確認をおこなってください。このサンプルには複数のテストケースが実装済みの状態になっています。また”wout”という名前のデータベースを使用するようになっており、サンプルプロジェクトにはOpenBase用に設定されたモデルファイルが含まれていますので、データベースを作成してからテストを実行するようにしてください。
     サンプルプロジェクトをビルドして実行すると1つだけリンク(Unit Tests)をもったページが表示されますので、このリンクからテスト用のページに移動します。テスト用のページではプロジェクトに存在するテストケース用のクラスが一覧表示され、「Run All」で一括実行するか、「Run Selected」で任意のテストケースのみを実行することができます。
     テスト実行中は進捗状況を表示するバーが表示され、テストが完了するとテスト結果が表示されます。テスト結果としては実行時間、実行したテスト数、テストに失敗した数などが表示されます。サンプルではわざと失敗するようなテストも含まれています。

    さて今回はWOUnitTestのセットアップから使い方までを紹介しました。次回はテストケースクラスの作成方法などを紹介したいと思います。テスティングフレームワークを導入すれば効率よくテストが実行できますので、ぜひ開発に取り入れていただいて、プログラムの品質向上に役立てていただければと思います。

    ニュース・解説

    今週の解説担当:新居雅行

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃iSightの開発者向け情報が公開
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Appleが販売しているFireWireビデオカメラのiSightについての文書が掲載されている。ハードウエアの詳細なスペックが示されており、たとえば、画像の解像度やコマ数などの動作モードが詳しく説明されている。iShghtをコントロールするようなニーズがある場合には参考になるだろうが、カメラや音声部分の性能がどの程度なのかということの目安にもなるだろう。また、アイリスの状態に応じてアプリケーションが反応するような仕組みを作りたいような場合には、手がかりとなる文書だ。

    iSight Programming Guide
    http://developer.apple.com/documentation/Hardware/Conceptual/iSightProgGuide/index.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃フォントパネルの変更結果が通知されないバグ
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    SetFontInfoForSelectionというAPIを使い、フォントパネルの選択結果を通知できるはずだが、ヘッダファイルの間違いで動作が正しくないことがTechnical Q&Aで公開されている。ヘッダのプロトタイプ定義を書き換える必要があり、書き換える方法が記載されている。

    Technical Q&A: SetFontInfoForSelection incorrect prototype
    http://developer.apple.com/qa/qa2004/qa1375.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃スタティックテキストをクリック応答させる
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    スタティックテキストをクリックして何かの処理をさせる方法についての文書が掲載されている。スタティックテキストのコンポーネントに対してクリック時のイベントを与えることでそうしたことは可能であることが説明されているが、スタティックなテキストに機能を与えることは本来はUser Interface Guidelineではよくないこととして定義されている。サンプルコードをみる限りは、処理内容としてはCarbon Eventを使ったものである。

    Technical Q&A: Clickable Static Text Item
    http://developer.apple.com/qa/qa2004/qa1380.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃Preferencesにファイルへの参照を記録する
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Technical Q&Aで、ファイル参照をPreferencesフォルダのファイルに保存するための方法が掲載されている。アプリケーション内の設定として、参照したファイルがどれかを記録したい場合がある。そのときは、Aliasのハンドルを取得し、CFDataを作成して、CFPreferencesSetAppValueないしはCFPreferencesAppSynchronizeを使ってPreferencesに入れる。ファイル参照を保存する方法と、保存結果からファイル参照に戻す方法を、サンプルプログラムで紹介している。

    Technical Q&A: Storing file references in CFPreferences
    http://developer.apple.com/qa/qa2004/qa1350.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃FileMakerのデータベース解析ツールがVer.7に対応
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Wave in Motionは、FileMaker Pro 7に対応したデータベース解析ツールの「Analyzer 4.0」をリリースした。参照先がないなどの問題点を指摘したり、スクリプトのトレースなど、Developer版にはないようなさまざまな開発支援機能を提供する。価格は$399で、デモ版も用意されている。従来のFileMaker Pro 6までに対応したAnalyzer 3.6も併売する。

    Analyzer 4.0
    http://www.wmotion.com/analyzer.html

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

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

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

    2004-10-05

    目次

    • SqueakではじめるSmalltalk入門   第13回  鷲見正人
    • 藤本裕之のプログラミング夜話 #54
    • 高橋真人の「プログラミング指南」  第53回
    • ニュース・解説

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、生きたオブジェクトをそのまま観察できる「インスペクタ」を解説します。

    Smalltalkシステムは、すべてがオブジェクトで構成されており、オブジェクトは必ず何らかのクラスに属しています。他方でクラスは、オブジェクトの設計図と言うべき存在で、そのクラスに属するオブジェクト(インスタンス)が内部にいくつのメモリ(インスタンス変数)を持ち、どんなメッセージに応答でき(セレクタ、メソッド名、あるいはメッセージパターン)、そのときどんな振る舞いをするか(メソッド)を定義するのに用いられます。

    この“オブジェクトの定義”を閲覧するためのツールが「システムブラウザ」として存在するならば、そのインスタンスとして実在するオブジェクトの内部状態、すなわち、インスタンス変数にどんなオブジェクを束縛しているのかを観察できる道具も、当然、欲しくなります。そのためのツールが「インスペクタ」です。

    あるオブジェクトを観察するためのインスペクタを起動するには、観察したいオブジェクトを評価後に生じる(返値として持つ)式を選択した状態で、inspect itを意味するcmd-I(コマンドキーを押しながら“I”キー)をタイプします。たとえば、分数(クラスFractionのインスタンス、a Fraction)である(3/4)をインスペクトしたければ、それを生じさせるための式である、

    3 / 4

    をタイプして選択したのち、inspect it (cmd-I)します。inspect itは黄ボタンメニューにもあるので、マウスを手にしているときは、黄ボタンクリック(ワンボタンマウスならoption-クリック、2ボタンなら右クリック、ホイールボタンを含めた3ボタンなら中ボタンクリック)でポップアップするメニューから選択するのもよいでしょう。

    [fig.A]黄ボタンメニューのinspect it
    http://squab.no-ip.com:8080/mosaren/uploads/13a.png

     インスペクトしたいオブジェクトに対してinspectというメッセージを送っても同じことができます。つまり、

    (3/4) inspect

    をdo it (cmd-D)してもよい、ということです。インスペクタは少々小振りなウインドウの姿で画面の適当な場所に現われます。

    [fig.B]クラスFractionのインスタンス(3/4)のインスペクタ
    http://squab.no-ip.com:8080/mosaren/uploads/13b.png

     インスペクタは呼び出された直後から、インスペクトしているオブジェクトに関するいくつかの情報を我々に呈示してくれています。タイトルバーにはオブジェクトが属しているクラス名を、左上のペインにはself、all inst varsという全オブジェクトに共通の項目に続いて、インスタンス変数の一覧を表示しています。(3/4)はFractionクラスに属し、numerator(分子)、denominator(分母)という2つのインスタンス変数を持っている…といった具合です。

    続いて、左上のペインの項目をクリックしてそのときのインスペクタの動きを確認しましょう。選択と同時に(all inst varsを除き)、指定したそれぞれの変数や擬変数(self【註】)に束縛されているオブジェクトを右側のペインに呼び出すことができるはずです。all inst vars項目だけはちょっと変わっていて、全インスタンス変数とそれに束縛されているオブジェクトの一覧になります。

    【註】Smalltalkでは、束縛されているオブジェクトを参照することはできても、代入(すなわち、任意のオブジェクトを束縛しなおすことが)できない変数を“擬変数”と呼びます。self、super、thisContext、nil、true、falseの6つがこれに当たります。前三者は、用いられる文脈によって参照できるオブジェクトは変化します。後三者はそれぞれ、UndefinedObject、True、Falseの唯一のインスタンスを常に束縛しています。

    [fig.C](3/4)のインスペクタで、左ペインの各項目を選択したときの様子
    http://squab.no-ip.com:8080/mosaren/uploads/13c.png

     なお、下のペインには特に機能は割り振られていません。書き捨てのメモ帳として利用します。ただ、インスペクト中のオブジェクトと名前空間を共有しているので、selfで自身を参照したり、インスタンス変数を直接使った式を書いて評価することが可能です。

    self * denominator = numerator “=> true”

    [fig.D]下のペインではselfやインスタンス変数を直接使用した式を評価できる
    http://squab.no-ip.com:8080/mosaren/uploads/13d.png

     インスペクタは、インスタンス変数にどんなオブジェクトが束縛されているかを観察するだけでなく、束縛するオブジェクトを変えてしまうことも可能です。次回は、インスペクタとブラウザを使って、Smalltalkオブジェクトの動的側面を観察してみましょう。
    サポートページ:
    http://squab.no-ip.com:8080/mosaren/

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

     承前。さて、前回我々は音響機器というクラスを基本クラスに持つ2つのクラス、ラジオとカセットテープレコーダを定義し、この2つを多重継承するクラス、ラジカセを完成し、その内部に音響機器のインスタンスが複数できてしまうという不都合を解決するために仮想基本クラスという概念を導入した。すなわち、

    class audioDevice {
      public double volume;
      ...  (ア)
    }
    
    class radio : public virtual audioDevice {
      ...  (イ)
    }
    
    class cassetteTapeRecorder : public virtual audioDevice {
      ...  (ウ)
    }
    
    class radioCassette : public radio, public cassetteTapeRecorder {
      ...  (エ)
    }
    


     こうなったわけである。ここまではよろしいか。ここで、音響機器のクラスのコンストラクタに引数を渡して、音量の初期値を指定できるようにしてみたい。上の(ア)の部分に以下のようなコンストラクタを足す。

     (ア)audioDevice(double initialVolume) { volume = initialVolume; }

     これに問題はないよね。でも、もしラジオとカセットテープレコーダのクラスのそれぞれ(イ)(ウ)の部分にこんなコンストラクタが書かれてたらvolumeはどうなる?

     (イ)radio():audioDevice(7.0){}
     (ウ)cassetteTapeRecorder():audioDevice(0.0){}

     ラジオの初期音量は7.0、カセットテープレコーダのは0.0、ラジカセは中を取って3.5……とはいかないので、つまりこれは矛盾しており困ってしまうのである。
     この矛盾を解消するため、C++では仮想基本クラスは末端の派生クラスから直接初期化することになっている。つか正確には、最後に派生したクラス以外のクラスのコンストラクタに対して仮想基本クラスの初期化が指定されていても無視されるのね。つまりこの場合なら、最後に派生したクラスであるラジカセのコンストラクタが、(エ)の部分にいかのように定義されていれば問題はなくなる。

     (エ)radioCassette():audioDevice(3.5) {}

     いや、確かになくなるんだけどさ、……どうですかあなた、こんなの解りやすいと思いますか?
     オレが言っても信じないかも知れないが、ちまたに溢れるC++入門書のこの部分の説明は、上でオレがした説明の10倍は抽象的で5倍はわけわかんないのだ(もちろんオレの主観だけど)。数冊立ち読みしたら、なかには説明してない本まであったから、入門書を書いてるヤツにも分かってないヤツがいるのかしらん(笑)。
     とにかく、こんなもんが必要になる仕組みだからオレは多重継承が嫌いなの。そろそろ分かってもらえて来ただろうか(笑)。
    (2004_09_28)

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

    UNIXとしてのMac OS X

    〜CGIを試す(3)〜

     こんにちは、高橋真人です。
     さて、いよいよ最後の仕上げに入ります。前回作成したスクリプトファイルはただのテキストファイルですから、それを実行できるように変更する必要があります。
     UNIXではすべてのファイルがテキストファイルであると聞いたことはないでしょうか? 通常のUNIXにはMacのようなタイプ・クリエータという概念はなく、拡張子もファイルの種類を拘束したりはしません。従って、ファイルの性質は最終的にはファイルの中身によって決まるということなのですが、UNIXの場合ファイルの中身とは別にいくつかの属性値があります。その中のひとつがこれから説明する、読み書き制限を表すパーミッションというものです。
     早速試してみましょう。Terminalを立ち上げ、まずは前回作ったファイルの格納されているディレクトリに移動しましょう。(以下、プロンプトは省略します。当然、末尾でリターンも打ってください)

    cd /Library/WebServer/CGI-Executables/

     次にカレントディレクトリのファイルのリストを表示します。

    ls -l

     ”-l” というオプションは詳細表示の指定を意味します。表示内容はこんな感じになります。

    total 8
    -rw-r–r– 1 mosa admin 168 3 Sep 21:52 mosa_cgi.pl

     末尾がファイル名なのはお分かりですね。先頭から順に見ていきましょう。
     先頭の -rw-r–r– という部分ですが、ここには10文字分の領域があります。最初の1文字は普通のファイルの時には – となり、ディレクトリ(フォルダ)の場合には d となります。
     続く9文字は3文字ごとに組みになっていて、それぞれ所有ユーザー、所有グループ、それ以外のユーザーのそのファイルに対する制限(パーミッション)を表します。パーミッションの3文字は順に読み、書き、実行の各権限となっています。各文字は許可か不許可かのフラグを表していて、不許可の時には -ですが、許可の場合は、読みか書きか実行かで表示が異なっていて、それぞれr、w、x となります。
     言葉の説明では少し分かりにくいと思うので、実例をいくつか示しましょう。

    -rwxrw—-
     この場合、所有ユーザーは読み書き実行のすべてが可能。所有グループ(に属するユーザー)は読み書きが可能。その他のユーザーには何も許可されていない。

    -r–r–r–
     この場合は、すべてのユーザーに対して、読むことだけが許可されている。

    -rwxrwx–x
     すべてのユーザーが実行可能。読み書きは所有ユーザーと所有グループだけに許されている。

     だいたいお分かりいただけたでしょうか? さて、表示の残りの項目ですが、パーミッションの次から順に、ファイルの所有ユーザー名、所有グループ名、ファイルサイズ(バイト単位)、修正日付、ファイル名です。 
     以上の説明で、今回のファイルは所有ユーザーはmosa、所有グループはadmin、サイズは168バイトということが分かります(残りの項目は省略)。
     今回、CGIとして動作するファイルは実体的にはperlが読み込んで動作させるただのテキストファイルですが、CGIが起動される際、このファイルは実行ファイルのように扱われます(MS-DOSの経験がある方はバッチファイルを思い浮かべてもらえば分かるでしょう)。
     テキストファイルをコマンドとして扱った時に、それがあたかも実行ファイルであるかのように振る舞うためのトリックが、前回少し触れたスクリプト冒頭の #!/usr/bin/perl という部分です。
     ではファイルの実行権限を許可してみましょう。そのためにはchmodというコマンドを使います。

    chmod 755 mosa_cgi.pl

     上記のコマンド実行後に再び、ls -l と打つと、以下のように表示されます。

    total 8
    -rwxr-xr-x 1 mosa admin 168 3 Sep 21:52 mosa_cgi.pl

     さて、いよいよCGI、というところで行数が既にオーバーしているので続きは次回としますが、このままではあんまりなので、スクリプトファイルが実行ファイルになったことを確認してみましょう。Terminalから

    ./mosa_cgi.pl

    と打ってリターンしてみてください。
     HTMLのソースが表示されたでしょうか? 時刻もちゃんと表示されているはずです。

    ニュース・解説

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

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

    【開発環境】

    Freescale Semiconductor社(Motorolaの半導体担当子会社)がデュアルコア仕様のPowerPC「MPC8641D」を発表しました。以下の関連サイトには、仕様を簡単に解説したPDFドキュメントも登録されています。

    http://www.freescale.com/webapp/sps/site/overview.jsp?code=DRPPCDUALCORE

    このCPUにはメモリーコントローラーやI/Oコントローラーも搭載されているようで、さすがにパッケージサイズは大きいのですが、消費電力や発熱はどうなんでしょうか? 我々の一番の興味は、やはり「このCPUはPowerBookに搭載可能のか?」と言うことでしょう。G5を搭載するよりも消費電力や発熱対策が現実的であるならば、PowerBookで手っ取り早くプロ用アプリケーションのパフォーマンスを引き出すのには、こちらのCPUを搭載する方が良いのかもしれません。とにかく、Macintoshデベロッパーが目を離せないCPUが、またひとつ登場したことになり嬉しいかぎりです。

    Apple社からは「Java 1.4.2 Update 2」が発表されました。Mac OS X 10.3へはソフトウェア・アップデートからインストール可能です。先週の新居さんの記事では日本語テキストの問題も改良されているそうなので、Java開発者にとっては朗報です。また同時に、それに関連したリリースノートも登録されています。

    「Java 1.4.2 Update 2」

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

    「Java 1.4.2 Update 2 Release Notes」(PDFあり)

    http://developer.apple.com/releasenotes/Java/Java142RNUpdate2/index.html

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

    前回から10月1日の期間中、Apple社のDocumentationサイトには新規ドキュメントがひとつも登録されませんでした。その代わり、デベロッパ向け読み物としての解説が2つ登録されています。

    「Using Open Source Tools to Filter Email on Mac OS X Server」(読み物)

    http://developer.apple.com/server/virusfiltering.html

    「RIACS and Mac OS X: A Critical Edge for NASA 3D Rendering」(読み物)

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

    前回から10月1日の期間中、新規のテクニカルノートがひとつ、テクニカルQ&Aが3つ登録されました。QA1370とQA1383の内容に関しては、前回の新居さんの記事を参考にしてみてください。

    TN2126「FireWire for Mac OS 9: An Overview」

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

    QA1294「GetDIBFromPict fails with QuickTime “Minimum” installation」
    QA1383「Enabling X11 Forwarding」
    QA1370「Common QA and Roadmap for USB Software Development on Mac OS X」

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

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

    前回から10月1日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードはひとつも登録されませんでした。少々停滞気味ですね(笑)。

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

    【デベロップメント SDK】

    前回から10月1日の期間中、Apple社のSDKサイトには新しいSDKはひとつも登録されませんでしたが、デベロッパー関連のツールとしては「Audio Units Validation Tool v1.1.1」が以下のサイトに登録されています。

    「Audio Units Validation Tool v1.1.1」

    http://developer.apple.com/softwarelicensing/agreements/audio.html

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

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