MOSA Multi-OS Software Artists

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

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

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

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

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

    2004-09-28

    目次

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

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、数多く存在するメソッドやクラスを把握しやすくする工夫である「カテゴリ」についてです。

    前回、クラス「String」に定義された「#withCRs」という名前のメソッド、つまりString >> #withCRsをブラウズしてみました。この時、withCRsを選ぶのに使ったブラウザ上段の右端にあるペインには大量のメソッド名(セレクタ)がリストアップされていたのに気付かれたと思います。

    String selectors asSortedArray ” => Stringに定義されているメソッドたち”

     その数はなんと200個弱あります。

    String selectors size ” => 181 ”

     これは相当極端な例ですが、クラスによっては1000個を越える場合もあります。

    | dictionary |
    dictionary _ Dictionary new.
    Smalltalk allBehaviorsDo: [:class |
      dictionary at: (class selectors size) put: class].
    ^dictionary associationAt: (dictionary keysSortedSafely last)
      " => 1090->Morph "

     GUIフレームワークの中核を担うMorphのようなクラスはかなり特殊と言えそうですが、平均でも数十個のメソッドを単純にアルファベット順に並べたリストから、名前の分かっているメソッドの実装を調べるだけならともかく、注目したオブジェクトに欲している機能を探す(つまり辞書やリファレンスマニュアルで言うところの“逆引き”のような)作業はかなり骨の折れるものになりそうです。

    そんなときに役立つのが、ブラウザ上段の右から2番目にあるリストです。これは「プロトコル」とか「メソッドカテゴリ」と呼ばれているペインで、各メソッドが定義時に分類されたカテゴリごとに共通するメソッドだけをすぐ右手のメソッドペインに表示する…という機構を提供します。たとえば、Stringなら、「accessing」というメソッドカテゴリを選択することで、その要素である文字などにアクセスする手段を提供するメソッドだけを選んで一覧できます。

    [fig.A]accessingカテゴリに分類されているメソッドのみを呼び出したところ
    http://squab.no-ip.com:8080/mosaren/uploads/12a.png

     ちなみに、もとのように、全メソッドの一覧に戻すにはメソッドカテゴリペインで「– all –」を選びます。クラスペインでStringを2度クリックして解除・再選択しても同じです。

    実は、メソッドはその定義時に(#’as yet unclassified’、つまり“未分類”という名のカテゴリを含め)必ず何らかのカテゴリに属すよう定められています。新たに作成したメソッドをどういったカテゴリに分類するかは開発者のセンスにゆだねられていますが、それほど的外れでなければ、システム内で慣例的に使われているカテゴリに分類することが推奨されます。システム内でポピュラーなカテゴリについて興味があれば、次のようなスクリプトでその一覧を得ることが可能です。システム内のクラスがメソッドの分類に使用している全カテゴリを抽出してカウント、その中から15個以上のクラスで使われているものを降順で列挙します。

    | bag |
    bag _ Bag new.
    Smalltalk allClassesDo: [:class |
      bag addAll: class organization categories].
    ActiveWorld findATranscript: ActiveHand.
    bag sortedCounts do: [:association |
      association key > 14 ifTrue: [Transcript cr; show: association]]

     なお、現在のブラウザはカテゴリを限らないメソッド一覧表示の状態時(クラスを選択してすぐ、あるいは「– all –」カテゴリ選択時)に、特定のメソッドをブラウズしても、それが属するカテゴリをメソッドカテゴリペイン内に探してくれません。もし選択したメソッドのカテゴリを知りたいときは、ブラウザ中段のボタン群のひとつ「browse」をクリックして別のブラウザを起動することで確認できます。

    数が多いということでは、クラスも事情は同じです。Smalltalkシステムを構成するオブジェクトは、通常のOSが分担するサービスを担当するものから、基本的なデータ構造を定義したもの、GUIフレームワークやアプリケーションの要素となるもの、ユーザー定義のデータ構造やアプリケーションの構成要素に至るまで、幅広く存在します。それらを網羅するクラスもまた、当然、多くなります。Smalltalkシステムを単なる言語処理系としてしか考えられず、VMベースの独立した(ちょっと変わった仕組みで動く)コンピュータ環境と捉える習慣に馴染まない人には、このクラス数の多さはSmalltalkという“言語処理系”の明らかな欠点として認識される傾向にあるようです。

    メソッド同様、クラスも、その定義時に特定のカテゴリに分類することが義務づけられています。ブラウザの上段、左端のペインは、このクラスカテゴリの一覧を表示するためのものです。クラスカテゴリ名は、メソッドのカテゴリと同様に、各クラス(あるいはそのインスタンスが)システム内でどのような役割りを期待されているのか、あるいはそれらがどういった位置づけにあるのかを知るのに、よい手がかりになるでしょう。一般にクラスカテゴリ名は、「大分類-小分類」というルールで付けられています。

    ここでいったんブラウザの説明は終えて、次回は、システムブラウザと同様にSmalltalkシステムに欠かすことができないツールである「インスペクタ」を紹介します。

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

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

    ドキュメントウィンドウの基本ルーチン(後半)

    今回は、メインウィンドウ(CatalogWindow)を操作するために用意した6つの基本ルーチンの残り半分を解説します。ウィンドウを閉じる処理を受けもつcloseCatalogWindow()、ウィンドウ自身と使用メモリ領域を解放するdisposeCatalogWindow()、ウィンドウの状態をメンテナンスするmainteCatalogWindow()の3つのルーチンです。

    まずは、ウィンドウを閉じる処理を受けもつcloseCatalogWindow()からです。このルーチンは、ユーザがファイルメニューから「閉じる」を選んだ時か、もしくは、ウィンドウタイトルの左端にあるクローズボックスをクリックした時に実行されます。もし、アプリケーションのウィンドウが保存すべきドキュメントを管理していなければ、何も気にせずDisposeWindow()を呼んでウィンドウを閉じて(削除)してしまっても大丈夫です。しかし、CatalogWindowはドキュメントを管理していますので、閉じる前にその内容を保存するかどうかをユーザに尋ねる必要があります。

    ドキュメントに対し何らかの編集を実行した場合には(画像ファイルの追加登録など)Window Manager APIであるSetWindowModified()に1を代入し、「ドキュメントが編集されたぞ!」という「印」をウィンドウに付けてやります。ドキュメントが編集され、その内容がまだHDに保存されていないと言う印は、クローズボックス内の「黒丸」表示で確認することができます。この「編集&未保存」の状態は、同じくWindow Manager APIであるIsWindowModified()で調べることができます。以下が、そうした手順をすべて組み込んだcloseCatalogWindow()ルーチンです。

    short closeCatalogWindow( WindowRef window,short quit )
    {
        short    chk,ret=0;
    
        if( IsWindowModified( window ) ) // ドキュメントに何らかの変更があったか?
        {
            chk=navMySaveAlert( window,quit ); // 保存を行うか尋ねるアラートを表示
            if( chk==1 )
                ret=saveCatalogFile( window ); // 「保存」ボタン(ドキュメント保存)
            else if( chk==2 )                  // 「キャンセル」ボタン(処理中止)
                ret=1;
        }                                      // 「保存しない」ボタンが押された時
        if( ret==0 )                           // もしくは正常に保処理が終了した時
            disposeCatalogWindow( window );    // ウィンドウを閉じてメモリの解放
        return( ret );
    }
    


    IsWindowModified()がTRUEを返した場合、そのウィンドウは「編集&未保存」状態なので、閉じる前にnavMySaveAlert()を呼んで「保存」「キャンセル」「保存しない」の3つのボタンが配置されたアラートをオープンします。navMySaveAlert()が返した値(chk)を調べることで、ユーザが「保存」「キャンセル」「保存しない」ボタンのうちどれを押したのかを判断します。「保存」ボタン(chk=1)を押していれば、saveCatalogFile()で保存処理を実行した後にウィンドウを閉じます。「保存しない」ボタン(chk=3)が押されていれば何もせずにウィンドウを閉じます。また「キャンセル」ボタン(chk=2)が押された場合には、「ウィンドウを閉じる処理」自体を中止します。

    次はdisposeCatalogWindow()です。このルーチンは、closeCatalogWindow()から呼ばれ、CatalogWindowで使用されている様々なメモリ領域を解放してからウィンドウ自身も削除します。本サンプルアプリには、ブラウザに登録されているファイルをダブルクリックすることで、その画像を別ウィンドウに表示する機能があります。ですから、メインウィンドウ(CatalogWindow)を閉じる場合には、先んじて、そこから派生して表示されている画像ウィンドウも閉じる必要があるわけです。そこで、collectMyChildWindow()を使い、メインウィンドウから派生した「画像ウィンドウ」のWindowRefをすべて集めます。それをループ内でdisposeMyWindow()に渡し、すべての画像ウィンドウを閉じてしまいます。サンプルアプリに画像に対しての編集機能はありませんので、画像ウィンドウについては保存処理を行う必要はありません。

    void disposeCatalogWindow( WindowRef window )
    {
        WindowRef        wptr[MAX_BUF];
        unsigned long    i,ct;
        ControlRef        chd;
    
        collectMyChildWindow( window,wptr,&ct );  // メインウィンドウに属している
        for( i=0;i<ct;i++ )                       // 子ウィンドウを集めて閉じる
            disposeMyWindow( wptr[i] );
        getMyControlRef( window,PICT_ID,&chd );   // ImageWellのControlRefを得る
        disposeMyControlWellPict( chd );          // 表示していたPictureを削除
        disposeObject( window );                  // ドキュメントオブジェクトを削除
        disposeMyWindow( window );                // ウィンドウ自身を削除
    }
    

    disposeMyControlWellPict()とdisposeObject()で解放しているメモリ領域は、画像表示に用いているPicture画像(PICT)とドキュメント本体です。ウィンドウに共通の汎用メモリ領域とウィンドウ自身を削除する処理は、disposeMyWindow()が担当しています。ところで、筆者のウェブサイトにアップロードされているサンプルプロジェクト内のソースコードでは、PICT_IDの箇所がBROW_IDと記述されています。これはバグでして(笑)、このままだとメモリ中にPicture画像が残ったまま放置されます。メモリリークという悪い見本ですので修正しておいてください(申し訳ないです)。

    最後は、ウィンドウ状態をメンテナンスしているmainteCatalogWindow()ルーチンです。メンテナンスの内容は3点です。まずは、「登録数」表示(ブラウザに登録されたファイル数)の更新、続いて選択されたデータの画像、ファイル名、縦横サイズの表示更新、最後にウィンドウに配置されている「削除」「起動」「表示」の3つのボタンの使用可、不可(ハイライト表示)の切り替えです。ユーザが何らかのブラウザ操作(ドキュメント編集も含む)を行うことで、この3つのメンテナンス項目が発生するわけです。

    void mainteCatalogWindow( WindowRef window )
    {
        unsigned long    i,ct,nb,item[MAX_FILE];
        ObjectPtr        optr;
        ControlRef        chd;
    
        getMyControlRef( window,1000,&chd );    // StaticTextのControlRefを得る
        getWObjCount( window,&ct );             // 登録ファイル数を得る
        setMyControlValue( chd,ct );            // 登録ファイル数を表示する
        DrawOneControl( chd );                  // StaticTextコントロールを描画する
    
        getMyControlRef( window,BROW_ID,&chd ); // DataBrowserのControlRefを得る
        getSelectedDataBrowser( chd,item,&ct ); // ataBrowserの選択データ数を得る
        if( ct )                                // 選択データが存在すれば...
        {
            nb=item[ct-1]-1;
            getWObject( window,nb,&optr );        // 最初の選択データを得て
            drawImageFile( window,&optr->o_fsc ); // その画像をImageWellへ表示する
        }
        else
            eraseImageFile( window );             // 選択データがなければ消去する
    
        for( i=3;i<=5;i++ )
        {                                         // 削除、起動、表示ボタンの
            getMyControlRef( window,i,&chd );     // ControlRefを得る
            if( ct )                              // 選択データがあれば....
                ActivateControl( chd );           // コントロールを利用可に
            else                                  // なければ...
                DeactivateControl( chd );         // 利用不可に切り替える
        }
    }
    


    ファイル登録数はgetWObjCount()で得ることができます。また、ブラウザで選択されているデータ数はgetSelectedDataBrowser()で得ることができます。この両方の数値を調べることで、ウィンドウの表示内容を色々と切り替える(メンテナンスする)ことが可能となります。例えば、ブラウザでファイルが選択されていなければ、「削除」「起動」「表示」といったボタンは使用できない(押しても意味無し)わけですから、すべてハイライト表示にしておくのが正しいユーザインターフェースと(マナー)です。こうした気配りを忘れると、使えないはずの機能をユーザに実行されてしまい、思わぬバグの原因を作ることがあります。くれぐれも注意致しましょう。

    次回からは、メインウィンドウを操作するために用意した6つの基本ルーチンの中で使われている自作ルーチンについて解説して行きます。まずはnewCatalogWindow()ルーチンで使われているcreateMyNibWindow()やsetupCatalogWindow()などと、その関連ルーチンを調べてみることにします。

    つづく

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

     前回の原稿を執筆しているときはちょうどPowerBookが故障してしまい修理に出していましたが、修理のほうは数日で終了してなんとか戻ってきました。HDDとロジックボードが交換されて戻ってきたのですが、今度は液晶ディスプレイの表示が乱れる症状に悩まされています。今回の修理との因果関係は不明ですが、また修理に出すとなると数日間使えなくなってしまいますので、時間に余裕ができるまでしばらく我慢して使い続けようかと思います。もっとも余裕ができるかどうかは疑問ですが。

    さて今回は書籍の紹介をおこないたいと思います。最近新しいWebObjectsの解説書が出版されました。洋書ですがAmazonなどで注文することができます。私が購入したときは到着までしばらく時間がかかってしまいましたので、これから購入される方は早めに注文することをおすすめします。

    タイトル:「Practical WebObjects」
    著者:Charles Hill, Sacha Mallais
    ページ数:363
    価格:$49.99
    http://www.amazon.co.jp/exec/obidos/ASIN/1590592964

     内容のほうですが、「Practical WebObjects」というだけあって実用的な内容になっており、中級者〜上級者のデベロッパー向きです。といいますのもいきなり最初の章からWO標準のProject Builder/Xcodeではなくて、Javaの世界ではすっかりおなじみになった開発環境Eclipseでの開発方法から話が始まっています。ですのでこれからWOの開発をスタートする人には少しハードルが高いかもしれませんし、内容的にも初心者向けの入門書ではありません。

    話が少し横道にそれますが、Windows上でのProject Builderはすっかりアップデートが止まっていますので、今となっては開発環境としてかなり貧弱な状態にあります。そんなこともありWindows上で開発をおこなう場合、Eclipseが利用できるということはデベロッパーにとって大きな助けとなることでしょう。
     とはいいましてもEclipse単体では標準的なJavaの開発はできても、WO固有なプロジェクト形式の面倒まではみてくれません。そこで実際にはEclipse上でのWOの開発を支援するために開発されたEclipse用Plug-inの"WOLips"や、ビルド用のAntスクリプトの"WOProject"を組み合わせて開発をおこなうことになります。
     こういったEclipse上での開発に関する情報や、開発を支援する他のツールに関する情報などもこの「Practical WebObjects」では紹介されていますのでより開発効率を高めるための情報源としてこの書籍を利用するのもよいのではないでしょうか。

    ちなみに"WOLips"や"WOProject"はObjectStyleのWebサイトで配布されていますが、Javaで実装されたORマッパーの"Cayenne"をご存知の方はObjectStyleの名前を聞いたことがあるのではないでしょうか。"Cayenne"もObjectStyleのWebサイト上でリリースがおこなわれています。

    ・WOProject/WOLips
    http://www.objectstyle.org/woproject/
    ・Cayenne
    http://www.objectstyle.org/cayenne/

     さて、本題に戻りまして「Practical WebObjects」のその他の内容ですが、EOF関連からJ2EEネタまで幅広く取り上げられており、認証、バリデーション、ローカリゼーションについて解説した章もあります。これらはただテクニックが紹介されているだけではなく、背景となる基礎技術なども合わせて解説されていますので(例えばローカリゼーションならエンコーディングの解説)開発のスキルアップをおこなうにはちょうどよいかと思います。
     また巻末のAppendixでは、本文中で紹介されている各種ソフトウェアのインストールやセットアップ方法が解説されています。

    WebObjectsで開発を始める場合よく情報量が少ないといった意見を聞きますが、洋書にまで幅を広げればそれなりに出揃ってきたように思います。Appleが提供しているドキュメントもVer 5のリリース以降新たに改訂されたものが公開されていますし、すべてではないですが日本語訳も出ています。
     たしかに雑誌などでWebObjectsの記事をみかけることは残念ながらめったにないですが今回紹介した書籍やAppleのドキュメントなどリソースは色々ありますので、こういったものを開発に役立てていただければと思います。もちろんこのメールマガジンもよろしくお願いします!!

    ・WebObjectsドキュメント(英文)
    http://developer.apple.com/documentation/WebObjects/WebObjects.html
    ・日本語のリソース
    http://www.apple.com/jp/webobjects/wo_docs_j.html
    http://www.apple.com/jp/webobjects/techinfo/index.html

    ニュース・解説

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

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃USB関連開発についてのQ&A集が公開
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Technical Q&AにUSB関連開発のQ&A集が掲載されている。関連文書へのリンクなどがまとまっているので、USBに絡むソフトウエアの開発をする前に目を通しておくと良いだろう。開発ツールなどの情報に加えて、アプリケーションでUSBデバイスを使う方法と、カーネルレベルでのUSBドライバの開発方法などのテーマで、要点がまとめられている。

    Technical Q&A: Common QA and Roadmap for USB Software Development on
    Mac OS X
    http://developer.apple.com/qa/qa2004/qa1370.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃Open Directoryのプラグインを作成する
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Open Directoryのプラグインを作成する方法の文書が公開されており、サンプルプログラムも含む詳しい内容のものだ。Open DirectoryはMac OS Xに組み込まれたディレクトリアクセスのためのAPIであり、複数のプロトコルに対応しているのが特徴である。LDAP、NetInfo、Active Directoryといった代表的なプロトコルにはシステムが対応しているが、その他のプロトコルでディレクトリサービスを利用する場合にはプラグインが必要になる。プラグインを作る事自体は特殊な作業かもしれないが、Open Directoryへの知識を得るためにこうした情報を参照することは役に立つだろう。また、アプリケーションからOpen Directoryのプラグインへのアクセス方法なども紹介されている。

    Writing Open Directory Plug-in
    http://developer.apple.com/networking/opendirectory.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃Java 1.4.2 Update 2では日本語テキストの問題も改良
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Java 1.4.2 Update 2がリリースされた。8月にリリースされたUpdate 1と同様、Java2 Standard EditionのVer.1.4.2_05であり、Java VMについては同一バージョンである。改良点はMac OS Xに絡む部分だけとなっている。SafariでのJavaアプレットの動作の改良に加えて、ダブルバイト文字の入力が遅くなる問題が改良されており、日本語での利用が改善されている模様だ。

    Java 1.4.2 Update 2 Release Notes
    http://developer.apple.com/releasenotes/Java/Java142RNUpdate2/index.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃Mac OS XでX11のsshフォワーディングをできるようにする方法
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    X11のsshによるフォワーディングをできるようにする方法が解説されている。文書では、Mac OS Xは既定値ではセキュリティ的な理由でフォワーディングをオフにしていると説明している。/etc/sshd_configというファイルを修正すればよく、コマンドで行う方法を解説している。

    Technical Q&A: Enabling X11 Forwarding
    http://developer.apple.com/qa/qa2004/qa1383.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃QuickTime関連の文書が公開
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Technical Q&AにQuickTime関連の文書がいくつか公開されている。概要を紹介しよう。

    Technical Q&A: Adjusting the movie brightness
    http://developer.apple.com/qa/qa2004/qa1382.html
    ムービー再生時に明るさを調節できるようにするにはQuickTimeのフィルタの
    機能を利用すれば良い。

    Technical Q&A: Adding a movie reference to a movie
    http://developer.apple.com/qa/qa2004/qa1376.html
    あるムービーから別のムービーを参照する簡単な方法として、InsertMovieSegmentというAPIを使う方法が紹介されている。

    Technical Q&A: Movies - Saving movie playback hints
    http://developer.apple.com/qa/qa2004/qa1366.html
    ムービーに高品質のヒント情報とともに保存する方法が説明されている。APIとしてはSetMoviePlayHintsだけでなく、他にいくつかのAPIを呼び出す必要がある。

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

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

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

    2004-09-21

    目次

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

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、前回起動したシステムブラウザでクラスに定義されたメソッドのブラウズを行ないます。

     システムブラウザは、上段4つ下段ひとつの計5つのペインから構成されています。

    [fig.A]Stringをブラウズする準備が整ったシステムブラウザ
    http://squab.no-ip.com:8080/mosaren/uploads/11a.png

     慣れるまでの当面のあいだ、とりあえず注目しておけばよいペインは、上段の左から偶数番目(2番目と4番目)のペインと下段のペインです。上段左から2番目のペインは、ご覧いただいているように、ブラウズしているクラス、そのものズバリです。4番目のペインにはそのクラスのインスタンスが応答できるメッセージに使用できるセレクタ、すなわちメソッド名が列挙されています。この4番目のペインの項目をクリックすると、下のペインに選択したメソッドのコードが表示されます。

    たとえば、4番目のペインを一番下までスクロールして「withCRs」を探してクリックして選択してみてください。すると下のペイン(コードペインとも言う)にはメソッド「String >> #withCRs」のソースコードが現われます。

    [fig.B]String >> #withCRsのソースコードを呼び出したところ
    http://squab.no-ip.com:8080/mosaren/uploads/11b.png

     Squeakシステムにはリファレンスマニュアルのようなものは用意されていません。知りたいことは、原則としてすべて、このシステムブラウザを通じて入手することになります。事実、私たちは今、StringのインスタンスがwithCRsというメッセージを受け取ることができること、また、StringのインスタンスはwithCRsというメッセージを受けることによって、自身に含まれるバックスラッシュ(?。メールでは¥と表示されます)を改行文字に置き換えるメソッドを起動すること、そのメソッドはどのように実装されているか、を目前のブラウザから得ることができます。実際に文字列オブジェクト(Stringのインスタンス。a String)にメッセージ「withCRs」を送信し、その振る舞いを確認してみましょう。

    'Smalltalk-80¥Squeak¥VisualWorks' withCRs
      " => Smalltalk-80
           Squeak
           VisualWorks "

     print it (cmd-P)すると、先にブラウザから得た情報通り、自身の$?を改行に置き換えた文字列を返してきます。余談ですが、このメソッドはポップアップメニューを作るときによく使われます。

    (CustomMenu labels: ‘Smalltalk-80?Squeak¥VisualWorks’ withCRs) startUp

     Smalltalkでは文字列リテラルに改行を含むことができるので、上のコードは次のものと同じです。メニュー項目が数個なら、#withCRsを使うことで、コードの見栄えが多少良くなる、という程度の効果はありそうですね。

    (CustomMenu labels: 'Smalltalk-80
    Squeak
    VisualWorks' withCRs) startUp

     さて話を戻しましょう。String >> #withCRsのソースコード中で、selfはこのメソッドを起動したオブジェクト(メッセージの受け手。レシーバ)を束縛する偽変数(代入できない変数)、#ifTrue:ifFalse:はすでにご存じのとおり条件分岐をメッセージ送信で行なうためのもの、Character crはクラスCharacterにcrを送信しておそらく改行文字を返値として得ていると予想できると想定して、残りのcollect: [:c | ...]というメッセージ送信により何を期待しているかだけが分からなかったと仮定しましょう。これをブラウザに備え付けのサービスを使って調べるには次のような手順を踏みます。

    ブラウザ上下段のペインに挟まれるように並んでいるボタン群のうち「implementors」とラベルされたボタンをクリックします。すると、このメソッドのセレクタと、メソッドのソースコードの中で送信されているメッセージに用いられているセレクタをすべて含んだメニューがポップアップするので、その中から「collect:」を選びます。すると、#collect:を定義しているクラスとその実装を呼び出すための一覧を含んだウインドウが現われます。話を簡単にするため、ここでは上段のペインに示されたリストから「SequenceableCollection collect: {enumerating}」をクリックして選択してみてください。

    [fig.C]SequenceableCollection >> #collect:のソースコード
    http://squab.no-ip.com:8080/mosaren/uploads/11c.png

     実はStringのインスタンスは、メッセージ「collect: aBlock」を受けて、このSequenceableCollection >> #collect:を起動します(この仕組みは、スーパークラス/サブクラスへの言及のときに説明します)。このメソッドのコメント、あるいはコードから、各要素(文字列の場合は先頭からの各文字)を、aBlockとして与えられたブロック(無名関数)を評価した結果の返値で置き換えた新しい文字列を返すメソッドであることを読みとることができるでしょう。こうして、元のString >> #withCRsに戻って、レシーバである文字列を頭からスキャンし、$?なら改行文字に、それ以外はその文字のまま置き換えた新しい文字列を返す作業をしていることが理解できる…というわけです。

    かなり乱暴な説明でしたが、Squeakシステムでは「すべての情報をシステムブラウザを通じて入手する」ということが意味するところと、リファレンスマニュアルが用意されていない理由がちょっとだけお分かりいただけたと思います。さらにここで注意したいのは、Smalltalkにおいてはメソッドもまたオブジェクトであり、そのソースコード、コード中で送信されるメッセージに用いられるセレクタの一覧などの情報も、メソッド“本人”に問い合わせることで入手可能だということです。つまり、豊富で便利なサービスを提供しているかのように見えるブラウザはあくまで、クラスやメソッドといったオブジェクト達が本来持ち合わせている能力を引き出すためにGUIを提供する仲介者に過ぎないのです。実際、メソッドにメッセージ送ることで、今、得られたような情報は簡単に入手できます。

    (String >> #withCRs) messages
    ” => 使用されているセレクタ一覧 ”
    (String >> #withCRs) getSourceFromFile
    ” => メソッドのソースコード ”

     次回は、メソッドやクラスを整理するための「カテゴリ」についてです。

    註:
     Squeakを含むSmalltalkシステムでは一般に、“$”は文字(a Character。文字列やシンボルの要素)の、“#”はシンボル(a Symbol。等価なら同一性が保証される特殊な文字列)のリテラル式の先頭に用いられます。
     これを模して通常の文章でも、いちいち「文字列(Character)クラスのインスタンスの“?”」など書きたくないときに、それと等価なオブジェクトを生成するリテラル表記「$?」をそれに代えて用いることがよくあるので慣れておいてください。ちなみに、セレクタを#ifTrue:ifFalse:のように表記するのは、その実体がシンボルであることに由来します。
     また“#”は、シンボルリテラルとは別に「#(‘this’ #is $a 10)」というふうに、要素(ただしリテラルに限る)をスペースで区切って列挙し括弧で括ったものの先頭に付すことで、指定した要素を持つ配列の生成するときにも使用します。

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

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

     どこの世界にも揚げ足を取るのがトクイなヒトはいるもんで、前回の原稿中「解説している暇はないが、実はC++にはもう一個『仮想クラス』というのもあって、日夜初心者の足を引っ張っている」と書いたら、「では是非、次回ゆっくりその『仮想クラス』について解説をしてください」というメールが届いた。
     実を言うと「暇がない」というのはウソ、というか方便であり、ほんまはその気がなかったのだが、そう言われてしまっては引っ込みがつかない。なんとかやっつけてみようと思うが、前回までのケモノとトリとコーモリの話ほどすっきりとは行かない。多少強引というか、ムリっぽい喩えも使わなければならんと思うのでまずご了解を願っておく。ちうか、これにすっきりハマる喩えを思いつかないコトこそが、私がこれの説明をあんまりしたくない理由の第一なんだよね。

    まずここに「ラジカセ」というクラスがある、としよう。このクラスは「ラジオ」と「カセットテープレコーダ」という2つのクラスから派生している。つまり多重継承しているわけね、ここまでは問題ないでしょ。
     ところが、共に「ラジカセ」に継承されている2つのクラスをみると、「ラジオ」も「カセットテープレコーダ」も、同じ「音響機器」というクラスのサブクラスなんである。リストにすると:

    class audioDevice {
      public double volume;
      ...
    }
    
    class radio : public audioDevice {
      ...
    }
    
    class cassetteTapeRecorder : public audioDevice {
      ...
    }
    
    class radioCassette : public radio, public cassetteTapeRecorder {
      ...
    }
    


     こうなる。で、上の例のようにそもそもの基本クラス「音響機器」に音量(volume)というインスタンス変数があったとすると、「ラジカセ」というクラスのインスタンスにそいつの値を要求したら、「ラジオ」、「カセットテープレコーダ」の、どっちの音量が報告されるんだろ? 困っちゃうでしょ?
     こういう問題を解決するためにC++の考案者たちがひねくり出したのが「仮想クラス」、いや正確には「仮想基本クラス」(virtual base class)という概念で、上の定義を:

    class radio : public virtual audioDevice {
      ...
    }
    
    class cassetteTapeRecorder : public virtual audioDevice {
      ...
    }
    
    class radioCassette : public radio, public cassetteTapeRecorder {
      ...
    }
    


     こんな風に書くと「ラジオ」と「カセットテープレコーダ」はこの「仮想基本クラス」ということになり、「ラジカセ」はこの2つから「仮想派生」した、クラスということになる。用語はなんだか分かりにくいが、早い話こう書いておけば「ラジカセ」のインスタンスはその内部に「音響機器」を1個しか持たないので、混乱が起きないつう話である。

    前にも書いたが、オレの個人的見解は「そもそも多重継承なんてものを認めるからこんな分かりにくいモンをひねくりださなければならなくなったんだ」というモンである。が、現実にC++を使って仕事をする立場になれば(まぁたたびたびなるんだが)いくらそれが正論であっても何の役にも立たない。正論がプログラムを書くわけではないので、次回からしばらく、この「仮想継承」の分かりにくい部分についての話をしていく。しょうがないから(笑)。
    (2004_09_16)

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

    UNIXとしてのMac OS X

    〜CGIを試す(2)〜

     こんにちは、高橋真人です。さて皆さん、お待たせしました。ひょっとしたらXcodeの編集ウインドウを開いたままで二週間お待ちいただいた方もおいでかもしれませんね。早速コードを書いていきましょう。
     それでは、Xcodeの編集ウインドウに以下のコードを入力してください。

    #!/usr/bin/perl
    
    print "Content-type: text/html¥n¥n";
    
    $time = localtime;
    
    print <<EOT;
    <HTML>
        <HEAD>
            <TITLE>MOSA</TITLE>
        </HEAD>
        <BODY>
            $time
        </BODY>
    </HTML>
    EOT


     今回は、HTMLおよびPerlを解説するのが目的ではないので、CGIのスクリプトは極めて単純なものになってますが、これでも正真正銘のHTMLを吐き出すCGIスクリプトです。簡単に説明しましょう。
     先頭の1行目はUNIXのスクリプトの場合によく登場するもので、この場合はPerlインタープリタの場所を示しています(詳しくは、また機会を改めて説明します)。
     次に出てくるprint文は、HTTPにおけるヘッダを出力します。ちなみに、WebブラウザでHTMLのソースを表示することができますが、そこで表示される内容はHTTPにおけるボディの部分です。HTTPにおけるヘッダは、サーバーからクライアントに対して伝えられる情報を格納している部分ですから、ブラウザ自体は内部的にこの情報を処理します。よって、ユーザーがこの部分を見ることはまずありません。
     もちろん、ここのprint文で出力した以外にもWebサーバーによってさらにいくつかの情報が付加されるのですが、この辺も機会を改めて解説します。
     いずれにせよ、HTTPにおけるヘッダとボディ、HTMLにおけるヘッダとボディは混乱しやすいとは思いますが、別物ですので注意してください。

     次は、このスクリプトで唯一「動的な処理」らしい部分です。$timeという変数にローカル時刻を文字列として代入しています。
     以下、HTMLの本文を出力していますが、ここでは「ヒアドキュメント」というやり方を使ってHTMLのコードの可読性を上げています。一見ただのプレーンのテキストですが、中に$timeという変数が使われていて、この部分がCGIとして動作する場合に、実際には変数の中身に格納されている文字列に置き換えて出力されます。
     ちなみに、この部分をヒアドキュメントの方法を使わずに書くと以下のようになります。

    print "<HTML>¥n<HEAD><TITLE>MOSA</TITLE></HEAD>¥n<BODY>$time</BODY>¥n</HTML>¥n";

     かなり見にくくなるので、インデント付けのタブはすべて外し、改行も大幅に削っていますが、それでもやっぱり見にくいですよね? このように、ヒアドキュメントの手法は、実際の出力結果と極めて似た状態でソースが書けるので、このような場合に重宝します。
     Perlというのは奥の深い言語で、たとえば今回のようなケースでも出力部分にいきなり関数(localtime)を埋め込むなんてこともできたりするのですが、それは高度なワザに属するので割愛します。
     さて、スクリプトができたので早速実行してみたいところですが、その前に一つだけ忘れてはならない大切なステップがあります。これを忘れてCGIがうまく動かないというケースが極めて多いので、次回はそこのところから説明します。

    ニュース・解説

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

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

    【開発環境】

    アップルストア銀座店で新型のiMac G5が展示が開始されたので、さっそく実物を見てきました。残念ながら20インチモニター搭載機はまだ置いてありませんでしたが、17インチモニターの方は自由に触ることができるマシンが数台展示されていました。さっそく、モニター(というか今回は本体なのだが)の首振り具合を試してみました。上下は非常にスムーズです。加えて、本体を支えている台の裏に貼られたパッドのおかげで、左右の振りも結構いけます。まあ、本体を置くテーブルの表面がある程度滑らかでないとダメなのでしょうが、Apple社はうまい仕組みを考えたものです。本体に耳を当てて騒音を確認してみましたが非常に静寂です。デザインや本体の薄さ、加えてアプリケーションの処理スピードも文句なく、旧型のiMacや古いG4タワー型からの買い換えを考えているユーザにとっては、非常に魅力的な製品が登場したのではないでしょうか(笑)。

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

    前回から9月17日の期間中、Apple社のDocumentationサイトには新規ドキュメントがひとつだけ登録されました。新型iMac G5の仕様ドキュメントです。加えて、デベロッパ向け読み物としての解説もひとつ登録されています。

    「iMac G5 Developer Note」(PDFあり)

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

    「Writing Open Directory Plug-Ins」(読み物)

    http://developer.apple.com/networking/opendirectory.html

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

    TN2123「CrashReporter」

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

    QA1376「Adding a movie reference to a movie」
    QA1382「Adjusting the movie brightness」
    QA1366「Movies – Saving movie playback hints」
    QA1371「Avoiding Pauses When Looping Audio files with QuickTime」
    QA1369「Setting the ColorSync profile for a NSBitmapImageRep object」

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

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

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

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

    【デベロップメント SDK】

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

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

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

    2004-09-14

    目次

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

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、システムブラウザを起動して、注目するクラスをブラウズするところまで行ないます。

     システムブラウザの起動のしかたには、大きく分けて2つの方法があります。ブラウズしたいクラスの名がすでに明らかなときは、適当な場所にクラス名をタイプして入力し、選択(あるいは、classなどのメッセージによりブラウズしたいクラスを得る式をprint it (cmd-P))してからbrowse it (cmd-B)します。すると、指定したクラスを選択した状態(ブラウズできる状態)で、システムブラウザが起動します。

     ためしに、文字列「’squeak’」のクラスがなんであるかが分からない状態で、そのクラスをブラウズしたい局面を想定し、その手順を示してみましょう。まず、興味の対象となるオブジェクトに対して「class」というメッセージを送信し、そのクラスを得ます。評価にはdo itではなく、評価の結果(返値)が式の直後に挿入されるprint itを用います。

    [fig.A]‘string’ classのprint it
    http://squab.no-ip.com:8080/mosaren/uploads/10a.png

     print itは黄ボタンのクリック(ワンボタンマウスならoption-クリック、2ボタンなら右ボタンクリック、ホイールを含めた3ボタンなら中ボタンクリック)で現われるメニュー「黄ボタンメニュー」の項目にも見つけることができます。

    [fig.B]黄ボタンメニューを使ってprint it
    http://squab.no-ip.com:8080/mosaren/uploads/10b.png

     黄ボタンメニューの呼び出しには、アクティブな(文字列を現在、編集中の)ペインのスクロールバーの上にある「黄ボタンメニューボタン」を使うことも可能です。この方法は、ワンボタンマウスやタブレットなどを使用しているときに特に便利です。

    [fig.C]スクロールバーの上にある黄ボタンメニューボタン
    http://squab.no-ip.com:8080/mosaren/uploads/10c.png

     こうして’squeak’のクラスがStringだと分かったところで、改めて、Stringが選択状態にあることを確認し、browse it (cmd-B)します。browse itは、黄ボタンメニューにはありませんが、「シフト黄ボタンメニュー」と呼ばれる黄ボタンメニューの“裏”メニューに見つけることができます。シフト黄ボタンメニューを呼び出すには、黄ボタンメニューを呼び出すアクションの際にキーボードのshiftキーを押しておくか、いったん黄ボタンメニューをポップアップさせ、そこでmore…項目を選択します。…が、面倒なのでbrowse itにはcmd-Bというキーボードショートカットを覚えて使うほうがよいでしょう。Macと異なりSqueakシステムでは、メニューはあくまでメッセージ送信(式の評価)やキーボードショートカット操作を補助する二次的なもの…と考えておくのがよさそうです。

    [fig.D]シフト黄ボタンメニューのbrowse it
    http://squab.no-ip.com:8080/mosaren/uploads/10d.png

     すると、画面にはStringをブラウズする準備が整ったシステムブラウザが現われます。

    [fig.E]Stringをブラウズする準備が整ったシステムブラウザ
    http://squab.no-ip.com:8080/mosaren/uploads/10e.png

     ブラウズしたいクラスがStringだと分かっているなら、単に「String」とだけタイプして(行を改めていないなら選択し)browse itするだけでOKです。ただしこの場合、クラス名は正確にタイプする必要があります。OrderedCollectionのように長いクラス名ですべてを正確にタイプするのがおっくうな場合は、特徴的な最初の数文字、たとえば「Ord」くらいまでタイプした後に、cmd-Qを何度かタイプすると補完できます。なお、このcmd-Qによる補完は、クラス名だけでなくセレクタ(メソッド名)の入力時にも重宝するので、是非、覚えておきたいキーコンビネーションのひとつです。

    クラス名がうろ覚えのときなどは、いったんシステムブラウザを開いて、そこで提供されているサービスを使うほうが良いこともあります。ブラウザの起動はデスクトップニューから「open…」を選択し、ポップアップしたメニューから「browser」を選択しても行なえます。なお、この操作は、

    Browser openBrowser

    という式のdo it (cmd-D)とも等価です。

     ブラウザが開いたら、左上のペインの黄ボタンメニューから「find class…」を選ぶか、同ペイン内にマウスポインタを移動してからcmd-Fとタイプします。すると入力欄(fill in the blank)が現われるので、探したいクラスの名前の一部を正確にタイプします。先ほど紹介したcmd-Qによる補完と異なり、このときは大文字小文字の区別は不要で、また検索のキーとして入力する文字列片もクラス名の先頭の文字からにこだわる必要はありません。たとえば、OrderedCollecitonなら、edcolleなどとしても探せます。検索キーから一意にクラスを決められないときは、候補一覧を示したメニューがポップアップするので、そこから改めて選択して指定します。

    各ペインの表示内容についてはざっと見たり、適当に項目をクリックして選択した際の動きである程度予想がつくと思いますし、詳しくは次回以降に取り上げることにします。ここでは前回のクラスとメタクラスの話に絡めて、上段左から2番目のペインの下に「?」を挟んで存在する「instance」と「class」というスイッチについてちょっとだけ説明を加えておくことにしましょう。

     これらは、ブラウズ対象をクラスとするかメタクラスとするかの切り換えスイッチです。instanceを選ぶとクラス(例ではString)、classを選ぶとメタクラス(同、String class)のブラウズモードに切り替わります。言い換えると、instanceスイッチを選んだ状態では、選択しているクラスの“インスタンス”の振る舞いをブラウズしている状態、classスイッチを選んだ状態では、選択している“クラス”自身の振るまいをブラウズしている状態を示します。

    [fig.F]classスイッチが押され、String classをブラウズしている状態
    http://squab.no-ip.com:8080/mosaren/uploads/10f.png

     図で示したStringの場合、上段右端のペインには、instanceスイッチなら、Stringのインスタンスである’squeak’や’3′などの文字列がメッセージを受けて起動できるメソッドの名前(セレクタ)を、classスイッチならString自身がメッセージを受けて起動できるメソッドの名前が列挙されている状態になります。それぞれのスイッチが選ばれたときのメソッドリストから適当なメソッド(String >> #*、String class >> #cr)を選んで、StringのインスタンスとStringがどちらのメッセージを受け付けるかどうか試してみましょう。

    ’3′ * 4 ” 文字列の先頭から数値を読みとり計算を行なう => 12″
    String * 4 ” String class のインスタンスは #* を知らないのでエラー”
    ‘squeak’ cr ” String のインスタンスは #cr を知らないのでエラー”
    String cr ” => 改行文字のみからなる文字列 ”

     スイッチに対応した正しい組み合わせのみ応答できているのがお分かりいただけると思います。エラー時に表示される赤いウインドウは、気にせずそのまま閉じてしまってください。0.1や1.23などが属するクラス「Float」などについても、似たような「お遊び」は可能なので是非試してみてください。

     次回は、クラスに定義されたメソッドのブラウズについて解説します。

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

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

    ドキュメントウィンドウの基本ルーチン(前半)

    前回は、イベントハンドラルーチンのウィンドウへの実装方法を解説しました。今回は、メインウィンドウ(CatalogWindow)をオープンするためのnewCatalogWindow()ルーチンへと話を進めます。本サンプルアプリケーションのメインウィンドウは、Nibファイル(main.nib)内に雛形として用意されています。オブジェクト名はCatalogWindowです。

    CatalogWindowには、ファイルを一覧表示するためのDataBrowserコントロールと、画像を表示するためのImageWellコントロール、それから幾つかの機能を実行するためのButtonコントロールが配置されています。メインウィンドウとしてのCatalogWindowの役割は、DataBrowserに画像ファイルを登録し、その一覧から選択されているファイルの画像内容をImageWell(PICTを表示可能)に表示することです。DataBrowserに保持されている画像ファイルの一覧(オブジェクトリスト)は、ファイルへの書き出し(セーブ)と読み込み(ロード)が可能です。つまり、このファイルがサンプルアプリケーションの「ドキュメント」と言うことになります。ドキュメントを表示するCatalogWindowを作成するためにどのようなルーチン(OOPで言うところのCatalogWindowクラスのメソッド)が用意されているのか? さっそく見てみることにしましょう。

    筆者の場合、ドキュメントを取り扱うウィンドウを操作する必要が生じた時には、まずは以下の6つの基本ルーチンを用意します。最初に、それぞれのルーチンの機能内容を簡単に確認してみます。

    short newCatalogWindow( WindowRef *wptr );

    仮のタイトル(名称未定義…など)を付けた新規のCatalogWindowをオープンします。

    short openCatalogWindow( FSSpec *fsc,WindowRef *wptr );

    渡されたFSSpec構造体(ファイル保存場所が保持されている)で指示されたドキュメントファイルを読み込み、その内容を表示したCatalogWindowをオープンします。

    void setupCatalogWindow( WindowRef window );

    CatalogWindowを利用可能にするための初期化を行います。CatalogWindowのためのイベントハンドラルーチンの実装や、配置されたコントロールの初期設定などです。

    short closeCatalogWindow( WindowRef window,short quit );

    CatalogWindowを閉じる処理を実行します。ウィンドウの内容に更新があった場合にはファイルとして保存するかどうかを尋ねるアラートを表示します。

    void disposeCatalogWindow( WindowRef window );

    CatalogWindowで使用しているメモリ領域をすべて解放してからウィンドウ自身も削除します。

    void mainteCatalogWindow( WindowRef window );

    CatalogWindowの状態をメンテナンスします。例えばファイル一覧で選択されてい物があるかどうかを調べ、特定のボタンの使用可や不可を切り替えます。

    最初にnewCatalogWindow()ルーチンを見てみます。新規ウィンドウの仮タイトル(名称未定義)は、ID=128のSTR#リソースの3番目に格納されています。ルーチンでは、そのすぐ後ろに識別番号(c_ct)を追加し、最終的な仮タイトルとします(名称未定 1、名称未定 2…となる)。c_ctはstatic変数なので、newCatalogWindow()が呼ばれるたびにインクリメントされ、前回とは異なるタイトルを作成するのに貢献します。createMyNibWindow()がNibファイルから実際にウィンドウを作成しているルーチンです。このルーチンについては別の機会に詳しく解説します。CatalogWindowが問題なく作成できたら(この時点では表示はされていない)setupCatalogWindow()で初期化を行い、mainteCatalogWindow()でウィンドウ状態をメンテナンスした後に、TransitionWindow()でウィンドウをオープン(表示)します。ウィンドウをオープンするAPIとしては、TransitionWindow()の代わりにShowWindow()を使用してもかまいません。

    short newCatalogWindow( WindowRef *wptr )
    {
        Str255        title,str;
        static long   c_ct=1;        // 識別番号は一回呼ばれるごとにひとつ繰り上がる
        short         ret=1;
    
        GetIndString( title,128,3 ); // 仮タイトルをリソースから抽出
        NumToString( c_ct++,str );   // 仮タイトルの最後に識別番号を付加
        catString( str,title );
        if( ! createMyNibWindow( " pCatalogWindow",title,'CATA',NULL,wptr ) )
        {                                 // Nibファイルよりウィンドウを作成
            setupCatalogWindow( *wptr );  // ウィンドウの初期化を行う
            mainteCatalogWindow( *wptr ); // ウィンドウ状態のメンテナンス(調整)
            TransitionWindow( *wptr,kWindowZoomTransitionEffect,
                                           kWindowShowTransitionAction,NULL );
            ret=0;                      // ウィンドウのオープン
        }
        return( ret );
    }
    


    次は、ドキュメントファイルを読み込み、その内容をCatalogWindowに表示するためのopenCatalogWindow()ルーチンです。ウィンドウのタイトルには読み込んだファイルの名称が使われますので、システム側で作り出す必要はありません。ドキュメントファイルの保存場所は、引数として渡されるFSSpec構造体で判断します。newCatalogWindow()と大きく異なる点は、loadObjectFile()でドキュメントファイルを読み込んでいる箇所と、そのオブジェクトリストをaddItemDataBrowser()でDataBrowserへ登録している箇所です。

    short openCatalogWindow( FSSpec *fsc,WindowRef *wptr )
    {
        short    ret=1;
    
        if( ! createMyNibWindow( " pCatalogWindow",fsc->name,'CATA',fsc,wptr ) )
        {                                       // Nibファイルよりウィンドウを作成
            if( ! loadObjectFile( *wptr,fsc ) ) // ドキュメントファイルを読み込む
            {
                setupCatalogWindow( *wptr );   // ウィンドウの初期化を行う
                addItemDataBrowser( *wptr );   // DataBrowserにファイルリストを追加
                mainteCatalogWindow( *wptr );  // ウィンドウ状態のメンテナンス
                TransitionWindow( *wptr,kWindowZoomTransitionEffect,
                                            kWindowShowTransitionAction,NULL );
                ret=0;                         // ウィンドウのオープン
            }
            else
                disposeCatalogWindow( *wptr ); // ファイル読み込みに失敗した場合は
        }                                      // 作成したウィンドウを削除する
        return( ret );
    }
    


    続いて、CatalogWindowの初期化を行っているsetupCatalogWindow()ルーチンです。ここでは、「ウィンドウへのイベントハンドラルーチンの実装」と「DataBrowserコントロールの初期化」という2つの仕事を実行しています。

    void setupCatalogWindow( WindowRef window )
    {
        setupCatalogWindowEvent( window ); // イベントハンドラルーチンの実装
        setupDataBrowser( window );        // DataBrowserコントロールの初期化
    }
    


    どのようなアプリケーションでも、ドキュメントを表示するためのメインウィンドウの仕組みは、だいたい同じだと予想されます。よって、最初に用意する関連ルーチンについても、今回とほぼ同じと考えてよいでしょう。次回は、CatalogWindowに箇所する6つのルーチンのうち残り半分について解説します。

    つづく

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

     いつもこの連載の原稿を執筆していますPowerBookが壊れてしまいました。このところヒンジの破損、電源の接触不良などトラブル続きだったのですが、今度はHDDがいかれてしまい、現在修理中です。
     このところProject WONDERの話題が続いていましたが、今回はPowerBookが壊れてしまったこともあり、開発環境を別マシンに移行するにはどうすればよいかということを解説したいと思います。

    転ばぬ先のバックアップ

     環境を移行するにはまずはバックアップができている必要があります。もっとも移行元のマシンに問題がなければそのまま移行してしまえばよいのですが、やはり日頃からバックアップをとっておくことは重要でしょう。具体的には以下のものをバックアップしておく必要があります。

    ・プロジェクトフォルダ
    ・カスタムフレームワーク
    ・データベース
    ・WebServer Resourcesなど

     まずプロジェクトフォルダですが、おそらくこれがもっとも重要なデータになるでしょう。CVSなどでソースコードを管理していればよいのですが、ローカルにファイルを置いているのであればこれを移行する必要があります。
     このとき、プロジェクトフォルダ内に”build”フォルダが存在すれば、移行前に削除してしまいましょう。この”build”フォルダにはビルド時に生成されたファイルが存在しますので、移行先で再ビルドすれば再び作成されます。
     また異なった環境で再ビルドする場合、”build”フォルダが存在するとビルドに失敗する場合がありますし、”build”フォルダが残ったままですと容量も大きくなりますので、バックアップ前や移行前に削除してしまってかまいません。ソースコードが消えてしまうときほど精神的ショックが大きい(特に納期前など)ことはありませんので、しっかりと管理しましょう。

     次にフレームワークですが、プロジェクトでWebObjects標準以外のフレームワークを用いている場合、移行先のマシンでもあらかじめフレームワークをインストールしておく必要があります。フレームワークがセットアップできていないとプロジェクトのビルドができなくなります。
     フレームワークのインストール先は”/Library/Frameworks”ですがフレームワーク内にWebServer Resourcesが存在する場合は、スプリットインストールをおこない、Webサーバ上にそれらのファイルをインストールしておく必要があります。フレームワーク内のWebServer Resourcesのインストール先は次のパスになります。

    /Library/WebServer/Documents/WebObjects/Frameworks

     3番目のデータベースですが、データベースの移行方法は使用しているデータベースソフトによって異なります。データベースによっては定期的にバックアップを自動作成する機能もありますが、一般的には移行時に手動でデータのバックアップを作成して、移行先のマシンに移し替える必要があるでしょう。
     もちろんモデルファイルがあれば、そこからデータベースを新たに作成し直すこともできますが、それでは空のデータベースができるだけですので、通常はそこにマスターデータなどをリストアする必要があるでしょう。あるいは、データベースの初期データを自動的にリストアする環境を別途用意しておいてもよいでしょう。

     最後にWebServer Resourcesですが、画像ファイルなどをプロジェクト内で管理している場合はよいのですが、プロジェクト内でファイルを管理せずに、Webサーバ上で直接ファイルを監理している場合には別途移行をする必要があります。プロジェクトを移行しただけではアプリケーションを起動してもページ上の画像が抜け落ちてしまいますので注意が必要です。

     カスタムのフレームワークを使用していない場合や、Webサーバ上でファイルを管理していない場合は最後の2つは省略できます。またその他にもなにか連携をとるアプリケーションやjarファイルが別途必要な場合などはそれらのファイルも移行をおこなう必要があります。

    環境のお引っ越し

     環境を移行するにはまず移行先のマシンでWebObjectsのDeveloper環境を整えておく必要があります。WebObjectsのインストール方法はバージョンによって多少異なってきますが、現行の最新バージョン(5.2.3)の環境を整える手順はやや複雑です。具体的には以下のTILに解説がありますので、こちらを参照していただければと思います。

    http://til.info.apple.co.jp/techinfo/107873

     何度もアップデートをインストールする必要がありますので、インストールには少し時間がかかるでしょう。

    WebObjects Developerがインストールできましたら次にデータベースソフトをインストールし、データをリストアします。データベースにOpenBaseを使用しているのであれば、WebObjects Developerのインストール時に同時にインストールされますが、WebObjectsに付属するバージョンは少し古いバージョンですので、最新版にアップデートする必要があるでしょう。

    データベースのリストアが終われば、WebServer Resourcesやフレームワークをインストールして移行は完了となります。別途なにかアプリケーションやjarファイルなどを使用している場合には必要に応じて環境を再構築してください。

     以上が環境を移行する手順になります。データベースのリストアやフレームワークのインストールはどちらが先でもかまわないのですが、移行を忘れてしまいますと、プロジェクトのビルドやアプリケーションの起動に失敗しますのでくれぐれも忘れないようにしてください。
     PowerBookが故障したこともあって今回はやや強引な内容になってしまいましたが、皆さんくれぐれも環境のバックアップはおこたらないようにしましょう。次回の連載までにPowerBookが復活していればよいのですが…

    ニュース・解説

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

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃テクニカル・ピット、WebObjectsセミナーを改訂
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    テクニカル・ピットが従来から行っているWebObjectsのトレーニングをリニューアルする。2004年9月27,28日に「WebObjects初級」、2004年9月29,30日に「WebObjects中級」が実施される。初級はJavaの知識が前提となり、データベース利用の話題が中心だ。中級は実務的なテーマでのアプリケーション開発が講習される。場所は東京都中央区勝どきにあるシステム情報セミナールーム、初級が42,000円、中級が52,500円だが、両方の受講は84,000円となっている。

    テクニカル・ピット:WebObjects 5.2セミナー
    http://www.techpit.co.jp/WO/wo-ocean-semi.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃CrashReporterのログの見方などを解説した文書が公開
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    CrashReporterについての技術文書が公開された。Mac OS Xでアプリケーションなどがハングしたとき、ダイアログボックスが表示され、レポートをアップルに送信できる。この仕組みと、ダイアログボックスやログファイルに残るレポートの参照方法などが記載されている。実行バイナリレベルでのさまざまな情報が得られるので、デバッグ時には有効な場合も多いだろう。

    Technical Notes: CrashReporter
    http://developer.apple.com/technotes/tn2004/tn2123.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃繰り返しムービーの音切れを防ぐ方法
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    QuickTimeムービーを繰り返し再生するときに、オーディオが一瞬途切れる問題についての解決策がTechnical Q&Aに掲載された。既知の問題であるが、オーディオトラックを繰り返し参照するテンポラリなムービーを作る事で、回避できるとしている。テンポラリなムービーは何百と参照を作っておくがそれでもサイズ自体はさほどではないと解説されており、サンプルコードも掲載されている。

    Technical Q&A: Avoiding Pauses When Looping Audio files with QuickTime
    http://developer.apple.com/qa/qa2004/qa1371.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃NSBitmapImageRepでColorSyncプロファイルを適用
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Techinical Q&Aで、Cocoaの画像処理クラスであるNSBitmapImageRepにColorSyncのプロファイルを適用する方法が掲載されている。プロパティとして設定が可能と解説されており、サンプルコードも掲載されている。

    Technical Q&A: Setting the ColorSync profile for a NSBitmapImageRep object
    http://developer.apple.com/qa/qa2004/qa1369.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃クロスプラットフォームに対応したC++フレームワーク
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    C++によるクロスプラットフォームのフレームワークCLPAT IIがリリースされた。従来からCPLATとしてリリースされていたが、全体的に見直しされてCPLAT IIとなった。Mac OS XおよびMac OS 9、Windows向けのアプリケーションが生成できる。Linuxに対しても限定はあるがビルド可能としている。価格は$50で、ソースおよび各種の開発ツール向けのプログジェクトが付属する。

    KSOFT
    http://www.ksoft.net

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃FileMaker Pro 7で独自にWebサイトを構築するサーバ
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    MACWEB.COMは、FileMaker Pro 7でカスタムWeb公開を可能にするサーバアプリケーションiApp Serverを公開した。現在、機能の一部が組み込まれていないβ版が公開されているが、$495で販売をする予定だ。なお、FileMaker Pro 7はライセンス上、5つ以上のIPからの接続を許可していないため、iApp Serverでもその制限に従って一定時間ごとに接続をチェックする。アプリケーション自体は、iappという拡張子のファイルにHTMLで記述するが、dataタグでデータベースからのレコードを取得して、ループなどをタグで記述し、フィールドを[ ] で記述するといったタグ言語形式である。FileMaker 7シリーズでは、カスタムWeb開発はServer 7 Advancedが必要になりXMLでの開発が必要になるが、iApp ServerはカスタムWeb開発のもう1つの選択肢になるだろう。

    iApp Server 1.0b1 for FileMaker
    www.macweb.com/lists/

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

    2004-09-07

    目次

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

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、クラスを用いたSmalltalkプログラミングには欠かすことができないシステムブラウザの解説に先立ち、Smalltalkシステムにおいて「すべてがオブジェクトである」ことの意味をちょっと考えてみたいと思います。

    システムブラウザ(System Browser)は、Smalltalkシステムにおける標準的なアプリケーションのひとつで、オブジェクトの定義の閲覧や編集をサポートするためのソフトです。ここでいう「オブジェクトの定義」は端的には「クラス」のことを示します。オブジェクトはどのクラスに属するかによって、どんなメッセージを受けることができるのか、いくつの状態(インスタンス変数)を内部に持つことができるのか…が決まります。

    Smalltalkシステムでは、オブジェクトは必ず何かしらのクラスに属します。それをはっきりと意識させるためにオブジェクトのことを「インスタンス」という言葉を使って言い表すこともあります。インスタンスは英語で「実例」を意味する単語です。同じクラスに属するインスタンスは、原則として同じメッセージに対してまったく同じ振る舞いをします。また、よく知られるようにSmalltalkシステムは、データとプログラムを区別するようなことはせずに、オブジェクトのみでコンピュータシステムを成り立たせています。そこではクラスもオブジェクトであり、その振る舞いを定める何かしらのクラスのインスタンス、として扱われます。このクラスのクラスのことを「メタクラス」と呼び、「クラス名 class」というように表記します。

    クラスStringのクラス => String class
    クラスArrayのクラス => Array class
    クラスDictoinaryのクラス => Dictionary class
    クラスIntegerのクラス => Integer class
    クラスFloatのクラス => Float class

     ところで「class」はオブジェクトに送信することにより、そのオブジェクトが属するクラスをその返値として得ることができるメッセージでもあります。たとえば、「’squeak’ class」を評価すると、’squeak’が属するクラス「String」(文字列)を得ることが可能です。では、この式の返値にさらにメッセージ「class」を送ると何が返ってくるでしょうか? 「’squeak’ class」の返値である「String」に「class」を送信することになるので、クラスのクラスであるメタクラス「String class」が返ってきます。

    (‘squeak’ class) class ” => String class ”

     ここで括弧は、最初に評価される式「’squeak’ class」の返値へのメッセージ送信を明示的にするためのものなので本来は不要です。

    ‘squeak’ class class ” => String class ”

     また、これは、

    String class

    としても、同じことです。すでにお気づきのように、先にご紹介した「クラス名 class」というメタクラスの表記そのものですね。「クラス名 class」という表記は、特定のクラスのクラスを表わすだけでなく、対応するクラスの名前を介して、それを得るためのメッセージ式にもなっている、というわけです。

    余談ですが、クラスとメタクラスの関係は、通常のインスタンスとそのクラスの関係(一対多)と違って例外なく一対一で、クラスは対応するメタクラスの唯一のインスタンス(シングルトン)になっています。

    (String) allInstances size ” => 40845 ”
    “Stringのインスタンスは数あれど…”
    (String class) allInstances size ” => 1 ”
    “String classのインスタンスはただひとつ! もちろんそれは…”
    (String class) someInstance ” => String ”
    “クラス「String」です。”

     さて。Smalltalkシステムではメタクラスもまたオブジェクト、つまり何かしらのクラスのインスタンスでなければならないはずです。これが何かも調べておきましょう。

    (String class) class ” => Metaclass ”

     メタクラスのクラスは「Metaclass」という名前のクラスでした。実は、すべてのメタクラスはMetaclassのインスタンスになっています。

    (Dictionary class) class ” => Metaclass ”
    (Integer class) class ” => Metaclass ”
    (Float class) class ” => Metaclass ”

     メタメタクラスと呼ぶべき「Metaclass」ですが、当然これもオブジェクトで、“ある”クラスに属しています。そう。それは、クラスとメタクラスのときと同様に、「Metaclass class」です。ただ、こうしてクラス、メタクラス、メタメタクラス、メタメタメタクラス…と続くと「いつまで続くのか…」と不安になられたかたもおられるかもしれませんね。でも、その心配には及びません。すでに申し上げたように、Metaclassは「すべてのメタクラスのクラス」なので、「Metaclass class」のクラスでもあります。

    ((String class) class) class ” => Metaclass class ”
    (Metaclass class) class ” => Metaclass ”

     MetaclassはMetaclass classのインスタンスであり、同時にまたクラスでもある…というのはちょっと不思議でズルをしているような感じもしますが、このカラクリにより少なくともメタメタメタ…と無限にメタなクラスが必要になる事態には陥らずに済んでいるので良しとしましょう。

    このような仕組みは、いたずらにコトを複雑にするだけで無意味なものに見えるかもしれません。しかし、こうした“工夫”により、「Smalltalkシステムを構成するものは、すべてオブジェクトである」、「オブジェクトは必ず何らかのクラスに属する」という二つの単純な原則が貫かれていることが大切なのです。この原則のおかげで我々は、システム内で興味を持った“対象”が何であれ、それは例外なくオブジェクトであり、その素性や振る舞いを知りたければ(変えたければ)、属するクラスに当たればよい…、というスタイルに徹することが可能になります。そして、この「クラスを介して、オブジェクトを知り、変え、必要なら新たに設計する」作業を強力にサポートするアプリケーションのひとつが「システムブラウザ」というわけです。

    次回は、システムブラウザの起動と指定したクラスのブラウズについてです。

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

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

     再び承前。前回はC++を使いながら「トリとケモノを多重継承せずにコーモリに空を飛ばす」方法について解説した。暑さで忘れているといけないので(正直に言おう、オレは忘れたので前回の原稿を読み返しながら書いている)復習すると、C++には抽象的な「能力」のようなものを独立して扱うための「抽象クラス」というもんがあり、これを使って「飛べる」というクラスを創出、これをケモノとともにコーモリに多重継承させればいいという話であった。ここまではよろしいか。
     ここでオレとしては話を前々回の「オレは多重継承が嫌いだ」というところまで戻したいのだが、C++では多重継承という機構を温存するために抽象クラスといういわば「クラスの鬼っ子」を作った。解説している暇はないが、実はC++にはもう一個「仮想クラス」というのもあって、日夜初心者の足を引っ張っている。
     これらの存在はひとえに、あの多重継承という機構でもって世界の成り立ちを全て網羅しようとしたからである。つまり「飛べる」というような抽象概念と「ケモノ」のような具象概念を同じ土俵にあげてハッケヨイノコッタさせてしまうから分かりにくいのだ、とオレは思うのね。

    Objective-CにはC++における「抽象クラス」、いやさ「機能的概念」を記述するための「プロトコル」という機構がある。ちと分かりにくいかも知れないが、早い話「こいつは飛ぶ」という属性をクラスとは独立して記述できるのだ。あるオブジェクトが「飛ぶ」ことができるということは「飛ぶ」というメソッドを持っているということである。Objective-C的な言葉遣いに改めれば「飛べ」というメッセージに応えられるということで、それをこんな風に定義する。

    @protocol ItCanFly
    fly;
    @end

     あるクラスがこのプロトコルに従う(すなわち「飛ぶ」)ためには以下のような宣言をし、このプロトコルが要求している「fly」というメソッドを定義すればいい。

    @interface Eagle : Bird  {
      /* ... */
    }
    /* methods of Eagle... */
    /* and method for the protocol */
    fly;
    @end

     とし、fly の中身には「羽ばたく」とか「滑空する」など、具体的に「いかにして飛ぶのか」を書けば良い。鳥であっても飛ばないペンギンはこのプロトコルをサポートしないだろうし、前回観たように正しくAnimalのサブクラスであるコーモリは以下のように「飛ぶ」ことになる。

    @interface Bat : Animal  {
      /* ... */
    }
    /* methods of Bat... */
    /* and method for the protocol */
    fly;
    @end

     最後に一個だけ、オレはObjective-Cのこのアプローチの方がスッキリしていて好きなんだが、当然ながらC++でプログラムを書かなければならない仕事もあり、そういう場合には抽象クラスと多重継承を使う。嫌だから使わないでは仕事にならないからね。ただC++を使う時は、コーモリをトリのサブクラスにはしないように気をつける。で、できればそんな気を使わなくても良い方がいいな、と思うわけ。
     こんな風に言えばニュアンスが通じるだろうか。C++の多重継承は自動車みたいなもので走行禁止の路肩を走ってしまいがちなのだ。Objective-Cのプロトコルは電車のようにレールの上だけを気兼ねなく走れるように出来ている。いや、オレは路肩も走れる方が自由でいい、とおっしゃるヒトもいるかと思うが、やっぱり路肩走行はホカのヒトに迷惑なんだよ。

    PS.最後に一個、前回原稿中「ミミズとおけらは飛ばない」と書いたら、「おけらは飛ぶ」という驚愕の事実を伝えてくれたヒトが複数いた。なるほどなぁ、飛ぶんだったのか。……そういうわけで、次はミミズである。ミミズが飛ぶ証拠をオレは待ってるぜ(ちがうだろ)。
    (2004_09_01)

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

    UNIXとしてのMac OS X

    〜CGIを試す(1)〜

     こんにちは、高橋真人です。さて、予告の通り今回から小ワザをいくつか紹介しますが、最初はCGIをテーマに取り上げます。
     Mac OS Xから標準でApacheが備わり、「何と、Apacheをクリック一発で起動できるんだぜ!」なんてこともMacの自慢のタネになったりしますが(笑)、実際にそれをやって、「ほら、立ち上がっただろ?」というだけではさすがに空しいですよね。
     まあ、AirMac経由で他のマシンから接続してWebブラウザでファイルをダウンロードするなどというのもそれはそれで実用的(MacからWindowsにファイルを持っていくのに、結構お手軽な方法ですよね)だとは思いますが、どうせ自慢をするならば派手に行きたいものです。CGIを動かすことが派手なのかどうかはこの際問わないことにしてください(笑)。
     もちろん、これから説明するワザを使って他人を驚かせるのも一興ではあるかもしれませんが、手近なところにこれだけの、見かけ倒しではない正真正銘のUNIX環境があるのですから、この恵まれた環境を生かさないのはもったいない。
     最近は、仕事でもプライベートでもWeb絡みのニーズが高まってきているので、ちょっとWeb絡みの仕事を受注すると「簡単なものでいいからさぁ、CGIも作れないかなぁ」なんて要求がつきものだったりします。
     データベースとリンクして云々などと、そんなレベルの話ならばまた全く別ですが、このように「ついで」で頼まれるCGIの場合、ほとんどが与えられたサーバー環境での動作が前提となることが多いので、ここはやはりApache+Perlという、CGIの黄金コンビというか、いちばんオーソドックスなパターンでやるのがベストでしょう。
     万が一、そのパターンすら使えないWebサーバーがあるとすれば、それは何らかの制約でそもそもCGIを動作させることが認められていないということなので、その場合はクライアントに「CGIが動かせない環境では無理ですね」とお答えするしかありません。
     もちろん、この黄金コンビは最初からMac OS Xには装備されていますから、CGIのテスト環境を立ち上げるなどということは、Macが1台あればそれで充分なのです。当然、これからCGIを覚えたいという人にとっても、極めて標準的なCGI動作環境がMac上ですぐに用意できるので、とても好都合です。

     一般に、Webサーバー上でCGIを動かすためには、いくつかの準備が必要になります。最近ではLinuxなどでもパッケージでインストールができるので、最初から必要な設定が完了しているというケースも多いでしょうが、最悪の場合Apacheのインストールから始まって、Apacheの設定ファイルを編集し(これが意外と大変)、見よう見まねで本のサンプルのPerlスクリプトを打ち込んでみるがエラーが出てうまく動いてくれない。こんなときにはどうしますか?
     理屈が分かっている人ならば、ものの数分で解決できることでも、UNIXの文化に慣れていない方にとっては、乗り越えなければならない壁が多いというか、そもそも目の前の何が問題なのかという切り分けすらできないというケースが多いのではないでしょうか。
     そんなわけで、多少は理屈の説明なども行いつつ、ステップ・バイ・ステップで、あなたにもすぐにCGI環境を構築できる「小ワザ」を伝授いたします。

     では、早速やってみましょう。
     まずは、CGIのスクリプトファイルを作ります。Mac OS XにインストールされているApacheの場合、CGIのスクリプトファイルの収まる場所は、

    /Library/WebServer/CGI-Executables/

    になります。ファイルの作り方はいろいろあります。私はviを使うのが好みですが、ちょっと初めての人には敷居が高いので、今回はXcodeを使うことにしましょう。もちろん、開発環境をインストールしていない場合には他の適当なテキストエディタでも問題ありません。
     XcodeでFileメニューからNew File…を選び、ファイルの種類はEmpty File in Projectを選びます。次のダイアログで、ファイル名を決めます。ここでの名前が実際にはCGIの名前となります。CGIには通常拡張子を付けないケースが多いようですが、.plという拡張子を付けることによってXcodeがPerlの文法を理解してシンタックスカラーリングをやってくれますから、とりあえずmosa_cgi.plとしておきましょう。必要ならあとでリネームしても構いません。
     Locationのところには/Library/WebServer/CGI-Executables/と入れておいてください。まあ、適当なところに保存しておいて、あとから手で上記のディレクトリに移動してもOKです。
     ちなみに、今回の作業を行うためには管理者の権限が必要です。ご自分のマシンで作業している限り、通常は管理者権限を持っているはず(確認方法は後ほど)ですが、そうでない場合は、新規に管理者権限を持ったアカウントを作ってそこで作業してください。
     次回は、実際にスクリプトを書く手順を説明いたします。

    ニュース・解説

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

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

    【開発環境】

    フランスのパリで開催されているApple expo 2004において待望のiMac G5が発表されました。噂されていた通りCPUとしてG5を搭載し、液晶ディスプレーの後ろ側に本体部品すべてを詰め込むデザインとなっています。注目すべきは、後ろの足を取り外して代わりにVESA規格アームを取り付けるための「The iMac G5 VESA Mount Adapter kit」が販売されることです(噂では10月からで価格は$29)。ショースペースや展示スペース、美術館や博物館、それから医療現場や教育現場など、パソコンの本体が不必要(というか邪魔になっている)導入先では、設置方法のバリエーションが大幅に増えて喜ばれるのではないでしょうか? 来年のサンフランシスコ Expoでは、色々とユニークな「足の周辺機器」が登場することを望みたいと思います。iPodのケースのように(笑)!

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

    前回から9月3日の期間中、Apple社のDocumentationサイトには新規ドキュメントが55も登録されました。カテゴリー的にはCocoa関連のドキュメントが多いようです。加えて、デベロッパ向け読み物として2つの解説も登録されています。大量に登録されたドキュメントのほとんどは、既存ドキュメントの内容変更版となっています。「Mach-O Runtime Reference」「Objective-C Runtime Reference」「Pasteboard Manager Reference」の3つだけが、まったく新規のドキュメントです。そのうち「Pasteboard Manager Reference」は、久しぶりのCarbon関連新規ドキュメントです(笑)。

    「Apple Human Interface Guidelines」(PDFあり)
    「Application Kit Reference for Java」(PDFあり)
    「Basic Event Handling」
    「Browsers」
    「Bundles」
    「Cocoa Bindings」
    「Cocoa Objects」
    「Communicating With Objects」
    「Core Foundation Reference」
    「Data Formatting」
    「Developing Cocoa Applications Using Bindings: A Tutorial」(PDFあり)
    「Disc Recording API Reference for C」
    「Disc Recording API Reference for Objective-C」
    「Displaying Data in a Data Browser」(PDFあり)
    「Document-Based Applications」
    「Event-Driven XML Parsing」
    「Font Handling」(PDFあり)
    「Font Panel」(PDFあり)
    「Foundation Reference for Java」(PDFあり)
    「Foundation Reference for Objective-C」(PDFあり)
    「I/O Kit Fundamentals」(PDFあり)
    「Java 1.4 Development for Mac OS X」(PDFあり)
    「Kernel Programming」(PDFあり)
    「Key-Value Coding」
    「Key-Value Observing」
    「Locales」
    「Low-Level File Management」
    「Mac OS X Development Tools Overview」(PDFあり)
    「The Mac OS X File System」
    「Mac OS X Man Pages」
    「Mach-O Runtime Architecture」(PDFあり)
    「Mach-O Runtime Reference」(PDFあり)
    「Memory Management」
    「Multiple User Environments」
    「The Objective-C Programming Language」(PDFあり)
    「Objective-C Runtime Reference」(PDFあり)
    「Outline Views」
    「Pasteboard Manager Reference」(PDFあり)
    「Plug-ins」
    「Porting to Mac OS X from Windows Win32 API」
    「Porting UNIX/Linux Applications to Mac OS X」(PDFあり)
    「Preferences」
    「Quartz 2D Reference」
    「Rendezvous Network Services」
    「Runtime Configuration」
    「Secure Transport Reference」(PDFあり)
    「Supporting Printing in Your Carbon Application」(PDFあり)
    「Table Views」
    「Toolbars」
    「URL Loading System」
    「Value Transformers」
    「Windows and Panels」
    「Working With Bluetooth Devices」(PDFあり)
    「Writing PCI Drivers」(PDFあり)
    「Jar Bundler」(PDFあり)

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

    「Cocoa and AppleScript: From Top to Bottom」(読み物)

    http://developer.apple.com/cocoa/applescriptforapps.html

    「Developing Cross-Platform UNIX Applications from Mac OS X」(読み物)

    http://developer.apple.com/unix/crossplatform.html

    前回から9月3日の期間中、新規のテクニカルノートがひとつ、テクニカルQ&Aが5つ登録されました。

    TN2091「Device input using the HAL Output Audio Unit」

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

    QA1362「Right- and Control-Drags on Mac OS X」
    QA1359「Installing smart card reader drivers」
    QA1368「Combinations of cupsColorSpace, cupsColorOrder and cupsBitsPerColor values supported by Mac OS X」
    QA1365「Sequence Grabber – Video capture with multiple IIDC cameras」
    QA1363「Unsolicited About Boxes」

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

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

    前回から9月3日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードがひとつだけ登録されました。AltiVecを利用したFFT(高速フーリエ変換)ルーチンのサンプルです。

    「dist_fft」(AltiVec関連)

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

    【デベロップメント SDK】

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

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

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

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