MOSA Multi-OS Software Artists

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

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

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

2006-3-22

目次

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

「WebObjects Dev Report」  第44回  田畑 英和

 前回はWebObjectsアプリケーションのインストールについて解説しました。今回はいよいよインストールしたアプリケーションの運用を開始する方法について解説いたします。

◇Monitor
 WebObjectsの運用環境では「Monitor」というアプリケーションを使って各種設定を行います。この「Monitor」はそれ自身がWebObjectsで開発されており、Web上で操作が可能になっています。まず「Monitor」の起動方法ですが、「ターミナル」上で次の起動スクリプトを実行します。

・「Monitor」の起動
% cd /System/Library/WebObjects/JavaApplications/JavaMonitor.woa/
% ./JavaMonitor

 開発環境ではWebObjectsアプリケーションを起動しますと自動的にWebブラウザが最初の画面にアクセスしますが、運用環境ではただアプリケーションが起動するだけです。「Monitor」を起動した「ターミナル」上にはアプリケーションのURLが表示されますので、Webブラウザを使って手動でアクセスします。

・「Monitor」の設定
 「Monitor」を起動しますとまずApplicationの一覧画面が表示されます。本格的な設定を始める前にまずは「Monitor」の設定を行いましょう。
 「Preferences」タブをクリックしてパスワードを設定します。ここでパスワードを設定しておけば、「Monitor」の起動時にパスワードの入力を求められるようになります。
 次に「Hosts」タブをクリックして、WebObjectsサーバのホスト名もしくはIPアドレスを入力します。ホストの登録に成功するとAvailableにYESと表示されるはずです。

・アプリケーションの登録
 アプリケーションの登録は大きくわけて次のような手順になります。

1. アプリケーションの追加
2. アプリケーションの設定
3. インスタンスの追加

 まずアプリケーションの追加ですが、「Applications」タブをクリックします。そして追加したいアプリケ−ションの名前を入力して「Add Application」ボタンをクリックします。ここで入力するアプリケーションの名前は管理しやすいようにプロジェクト名と同じ名前を使うのがよいでしょう。

次にアプリケーションの設定ですが、最低限起動スクリプトのパスを入力します。起動スクリプトのパスはプラットフォームごとに異なるパスを入力できるようになっています。Mac OS X Serverで運用を行う場合は、「MacOSX」のところにパスを入力します。
 パスの入力は直接起動スクリプトのフルパスを入力してもかまいませんし、Path Wizard機能を使ってWebブラウザでサーバ上のファイル階層をブラウズして起動スクリプトのパスを指定することもできます。
 起動スクリプトはMac/Unix用のものとWindows用のものが自動生成されていますので、間違って選択しないように気をつけてください。
 パスの入力が終われば右側の「Push」ボタンをクリックします。このボタンをクリックしておかないとパスの設定は反映されません。

 アプリケーションの設定の次は、いよいよ最後のインスタンスの追加です。まず画面右上の「Detail View」ボタンをクリックしてインスタンスの詳細画面に移動します。そして追加したいインスタンスの数を入力し、インスタンスを稼働させるホストを選択します。WebObjectsの運用環境は標準で負荷分散に対応していますので、複数のインスタンスを同時に起動することができます。また、複数のサーバ上でアプリケーションを起動することもできますので、インスタンスを追加するには実行するホストを選択します。あらかじめ「Hosts」画面で設定しておいたホストが自動的にリストアップされますので、あとは適切なホストを選択するだけです。
 初めてアプリケーションを運用する場合は、いきなり複数のインスタンスを追加せずに、まずは1つのインスタンスだけを追加して正しく起動できるかどうかを確認するのがよいでしょう。

・アプリケーションの起動
 インスタンスを追加すれば、自動的にアプリケーションが起動します。これはデフォルトの状態でAuto Recover機能がONになっているからです。
 アプリケーションの起動が完了するとStatusの表示がONに変わります。もしStatusがONにならなければ、どこかの設定に問題があるか、あるいはそもそもアプリケーションに問題があります。こういったときにはアプリケーションを「ターミナル」上で直接起動するなどして原因を確認してください。
 アプリケーションを起動すると、インスタンスの詳細画面にアプリケーションのトップ画面にアクセスするためのハイパーリンクが表示されますので、このハイパーリンクをクリックすればすぐにアプリケーションにアクセスできるようになります。

小池邦人のCarbon API 徒然草(2006/03/17)

〜 アプリケーションのUniversal Binary化(その5) 〜

今回は、PowerPCとx86 CPUのエンディアンの違いによる影響を、実際のソースコードを調べながら検証していきたいと思います。まずは、エンディアンの違いで影響が出るだろうと思われる点を具体的にピックアップしてみます。

・整数フォーマットが反転する(2bytes,4bytes,8bytes整数)
・浮動小数点フォーマットが反転する(4bytes,8bytes浮動小数点)
・ネットワークで流れるデータはビッグエンディアンで固定されている
・Excelファイルフォーマットはリトルエンディアンで固定されている
・Photoshop画像フォーマットはビッグエンディアンで固定されている
・Quartz 2Dのビットマップ画像はbitmapInfoパラメータで調整される
・TIFF,Exif,Dicomファイルフォーマットは両方が存在 (ヘッダのMMとII表記で区別)
・Font関連リソース(FOND、NFNT、sfnt など)はビッグエンディアン
・OSTypeをストリングとして扱う場合にはエンディアンを考慮する必要がある
・UnicodeはBOMがなければビッグエンディアンとして認識される
・関数を利用してビットテストを実行すると結果が異なる場合がある
・一般リソースデータの入出力はResource Managerがエンディアンを考慮する
・カスタムリソースデータの場合にはエンディアンが考慮されない
・カスタムアップルイベント&ペーストボードデータはビッグエンディアンのまま

まず最初に、エンディアンの違いを考慮すべき典型的な例として、整数フォーマットの反転に対処する例を見てみます。アプリケーションの内部処理で整数を利用している時には何も問題はないですが、固定エンディアンフォーマットで整数や浮動小数点をファイルに保存し、それを別エンディアン環境で読み込み利用しようとした時に問題が生じます。例えば、ビッグエンディアンフォーマット(PowerPC)で保存された初期設定ファイルをリトルエンディアン環境(x86)のHDへ複製してそのまま利用しようとした時などです。

今回の初期設定ファイルは以下の構造体を使い、short整数を128個保存することにします。ファイルのネイティブフォーマットはビッグエンディアン(PowerPC)とします。

typedef struct  {
                    short    p_para[128]; //  初期設定保存用の整数配列

                } Pref,*PrefPtr,**PrefHandle;

最初のgetPrefFSSpec()ルーチンは、ライブラリフォルダ内にあるPreferencesフォルダを探し、そのFSSpecを返します。今回はGetIndString()により、STR#リソースから初期設定ファイル名を得ています。ここではエンディアンの問題は存在しません。


short getPrefFSSpec( FSSpec *fsc,short nb )
{
    short    vref;
    Str255   name;
    long     id;

    GetIndString( name,128,nb );  // STR#リソースから初期設定ファイル名を得る
    if( ! FindFolder( kOnSystemDisk,kPreferencesFolderType,kCreateFolder,
                                                            &vref,&id ) )
    {
        FSMakeFSSpec( vref,id,name,fsc ); // PreferencesフォルダのFSSpecを得る
        return( 0 );
    }
    return( 1 );
}

続いて、初期設定の構造体データをファイルから読み込むreadPreferences()ルーチンです。もし初期設定ファイルが無ければ、それを作成してから初期化したデータを書き込みます。よってx86用の実行コードでは、この書き込み処理の直前に、Pref構造体に含まれている整数を反転させる必要があります。それを行っているのがflipPreferences()ルーチンです。ここで注意することは、オリジナルの初期設定構造体(sys_Pref)の整数値を反転させてしまうと、その後の内部処理が正常に行われなくなることです。よって、ここではsys_Prefをtempへ複製し、それを反転させてから書き込むようにしています。

Pref    sys_Pref;  // 外部変数としてPref構造体を確保する(内部処理で用いる)

short readPreferences(void)
{
    short    fref,ret=1;
    Pref     temp;
    FSSpec   fsc;
    long     len;

    if( ! getPrefFSSpec( &fsc,1 ) ) // 初期設定ファイルのFSSpecを得る
    {
        len=sizeof( Pref );
        if( ! FSpOpenDF( &fsc,fsRdPerm,&fref ) ) // ファイルオープン
        {
            ret=FSRead( fref,&len,&sys_Pref );   // ファイルを読み込む
            flipPreferences( &sys_Pref );        // 整数のエンディアンを反転
            FSClose( fref );                     // ファイルを閉じる
        }
        else // 初期設定ファイルが存在しなければ初期化をしてから作成する
        {
           initPreferences(  &sys_Pref ); // Pref構造体の初期化自作ルーチン
            if( ! FSpCreate( &fsc,'mosa','pref',smSystemScript ) )
                                           // 初期設定ファイルを作成する
            {
                if( ! FSpOpenDF( &fsc,fsWrPerm,&fref ) ) // ファイルオープン
                {
                    BlockMoveData( &sys_Pref,&temp,len ); // tempへ複製する
                    flipPreferences( &temp );       // 整数のエンディアンを反転
                    ret=FSWrite( fref,&len,&temp ); // ファイルを書き出す
                    FSClose( fref );                // ファイルを閉じる
                }
            }
        }
    }
    return( ret );
}


次は、初期設定ファイルを保存(書き出し)するwritePreferences()ルーチンです。処理内容は,readPreferences()の初期設定ファイル新規作成の箇所とほとんど同じです。

short writePreferences(void)
{
    short    fref,ret=1;
    Pref     temp;
    FSSpec   fsc;
    long     len;

    if( ! getPrefFSSpec( &fsc,1 ) )         // 初期設定ファイルのFSSpecを得る
    {
        if( ! FSpOpenDF( &fsc,fsWrPerm,&fref ) )  // 初期設定ファイルオープン
        {
            len=sizeof( Pref );                   // Pref構造体のサイズを得る
            BlockMoveData( &sys_Pref,&temp,len ); // sys_Prefをtempへ複製する
            flipPreferences( &temp );             // 整数のエンディアンを反転
            ret=FSWrite( fref,&len,&temp );       // ファイルを書き出す
            FSClose( fref );                      // ファイルを閉じる
        }
    }
    return( ret );
}


以下は、すべての整数配列のエンディアンを反転させるflipPreferences()ルーチンです。2bytes整数の反転にはEndian16_Swap() APIを用いています。このソースをUniversal Binaryとしてコンパイルした場合、#if__LITTLE_ENDIAN__と#endifで挟まれた部分は、PowerPC用の実行ファイルとしてはコンパイルされませんので、PowerPC環境で実行した時には、何も処理しないで素通りすることになります。

void flipPreferences(PrefPtr pptr)
{
    #if __LITTLE_ENDIAN__   // x86用コンパイルの時だけコードが発生する

    long    i;

    for( i=0;i<128;i++ )    // 配列個数分だけループさせる
        pptr->p_para[i]=Endian16_Swap( pptr->p_para[i] ); // エンディアンを反転

    #endif
}


初期設定ファイルは、エンディアンの影響を受けないテキストファイルやXMLファイルで保存すべきでしょう(CFPreference APIなどを使う)。しかし、古いアプリケーションに関しては今更手遅れです(笑)。初期設定ファイルが、単体マシンでしか利用されないのなら今回説明した処理は不必要なのですが、Macintoshには「移行アシスタント」という便利なツールがあるおかげで、現在利用している初期設定ファイルも別マシンでそのまま使われる可能性があります。ですから、CPUの種類が異なるマシン環境であると認識したら、初期設定ファイルを再構築する処理か、ファイル読み書きの出入り口で整数や浮動小数点のエンディアンをひっくり返す処理が必要となるわけです。

次回は、Macintosh独自のデータ保存方法「リソース」についてエンディアンの影響を調べてみましょう。例題としてQuickDrawで利用してきたPicture(PICT)構造体を取り上げたいと思います。

つづく

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

 本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。前回に引き続き、簡単なスクリプトで作成したポップアップメニューの機能を果たすモーフを用いて、これをSmalltalkならではのツールを用いて解析し、その仕組みをより細部にわたって観察してみましょう。

 念のため、スクリプトを再掲します。

| menu |
menu := MenuMorph new.
menu defaultTarget: 1.
menu add: 'default (one)' action: #inspect.
menu addLine.
menu add: 'two'   target: 2 selector: #inspect.
menu add: 'three' target: 3 selector: #inspect.
menu add: 'four'  target: 4 selector: #inspect.
menu addLine.
menu
   add: 'open workspace'
   target: Workspace
   selector: #openLabel:
   argument: 'My New Workspace'.
menu invokeModal


 CocoaのApplication Kitでメニューを作る手続きととてもよく似ていますね。このスクリプトをワークスペースなどにペーストした後、全体を選択してdo it(cmd + D)することで、次図のようなポップアップメニューを機能させることができます。

[fig.A]スクリプトで作られたポップアップメニュー

 こうして作られたメニューも他のGUIウィジェット同様にモーフで構成され、主にコマンドキーを用いたモーフとしての操作も受け付けます。たとえば、コマンドクリック(コマンドキーを押しながらクリック)でモーフとして選択したり、そのままドラッグして移動させることができます。

[fig.B]モーフとして選択されたポップアップメニュー

 ハローのうち、右端の上から2番目にあるグレイのボタンは「デバッグハロー」と呼ばれ、クリックすると、選択しているモーフに関する「デバッグメニュー」をポップアップします。デバッグメニューには、選択したモーフの内部的な情報にアクセスするのに便利なメニュー項目が用意されています。

[fig.C]デバッグハローとデバッグメニュー

 このうち「モーフの検査」というメニュー項目を選択することで、選択したモーフ(今の場合、自作のポップアップメニュー)のインスペクタを開くことができます。

すべてのモーフはsubmorphsというインスタンス変数を持ち、これに自分に属するサブモーフを束縛しています。今開いたインスペクタの左上のリストペインでsubmorphsという欄をクリックすると、先のスクリプトで#add:action:などを介して定義したメニュー項目モーフ(a MenuItemMorph)がその数だけ登録されていることを確認できます。

[fig.D]自作ポップアップメニューのsubmorphs

 また、ownerというインスタンス変数には、逆に自分がサブモーフとして属しているモーフが束縛されています。今はnilになっていますが、これはデバッグメニューを開いたときに観察対象のメニューモーフが画面から消えてしまっているからです。デバッグハローをshiftキーを押しながらクリックすることで、メニューを介さずに直接インスペクタを開くショートカットを使えば、観察したいメニューを消さずにインスペクタを同時に開くことが出来るので、この方法で再度ownerを見てみましょう。

[fig.E]ポップアップメニューのownerの確認

 すると先ほどのnilの代わりに本来のa PasteUpMorph(n) [world](nは適当な数値)が束縛されていることが分かります。PasteUpMorphとは、デスクトップを表現するのに用いられているモーフの属するクラスです。また、ここでnはオブジェクトにhashというメッセージを送ったときに得られるオブジェクト固有の数値(原則として…)で、オブジェクトの同等性の判断に使われます。

では引き続き、デスクトップをコマンドクリックしてモーフとして選択した後、右側に現れたデバッグハローをshiftクリックすることで、デスクトップのインスペクタを呼び出してみてください。インスペクタとのタイトルバー、あるいはselfを選択して右側のペインに表示される内容と、先ほどのポップアップメニューのownerの値は一致しているはずです。

つまり、ポップアップメニューは、メニュー項目をサブモーフとして追加して組み立てられたあと、デスクトップにサブモーフとして追加されることで、我々の前に現れたわけです。非常にシンプルで、わかりやすい動作モデルですね。

実装からも同様のことを確認することが可能です。スクリプト中のinvokeModalを選択してbrowse it(cmd + B)でブラウザを開き「implementors」ボタンを使って、#invokeModal: →#invokeModalAt:in:allowKeyboard: → #popUpAt:forHand:in:allowKeyboard:とたどってゆくと、そこでデスクトップを束縛したaWorldに対してメッセージ「addMorphFront: self」を送信していることがわかります。

バックナンバー:

ニュース・解説

 今週の解説担当:木下 誠

———————————————————————-
QuickBooksの開発事例
———————————————————————-

ADCでは、時折Mac向けソフトウェアの開発事例を紹介していますが、今回は
IntuitのQuickBooksが取り上げられています。これはSOHO向けの簿記ソフト
ウェアのようです。

QuickBooksの開発行程の中から、CarbonからCocoaへの移行、Tigerの機能や.
Macとの統合、が述べられています。この辺りが、Appleがソフトウェアベンダ
にプッシュしていきたいところなのでしょう。

Tiger機能の活用としては、Web Kitの利用、iCalとの統合、Address Bookとの
同期などが挙げられています。これらはPantherまでに出揃っていた気もしま
すが。

Intuit Enhances QuickBooks for Mac: New Tiger Features and .Mac Integration
http://developer.apple.com/business/macmarket/quickbooks.html

———————————————————————-
Cocoaに関する新規ドキュメントが多数公開
———————————————————————-

先週の小池さんの記事にもありましたが、Cocoaに関するドキュメントが、多数新規に公開されています。以下のものがあります。

- Cocoa Drawing Guide
- Cocoa Fundamentals Guide
- Cocoa Scripting Guide
- Document-Based Applications Overview
- Scroll View Programming Guide for Cocoa
- View Programming Guide for Cocoa

これらのドキュメントは、単なるリファレンスではなく、実際のアプリケーションでの利用に則した形で解説しています。また、いままで分散されていた情報が一つにまとめられていたり、サンプルソースコードのコメントからしか伺い知る事ができなかった情報があったりと、非常に有益な形になっています。

Cocoaのプログラミングに慣れている方も、一度目を通す事をお勧めします。きっと、新しい事に気づく事があると思います。

簡単に、個人的に興味を惹かれたトピックを並べてみました。

【Cocoa Drawing Guide: Advanced Drawing Techniques】

Cocoaで描画する際の、テクニックを集めたものです。パスに影を付ける、グラデーションを使う、フルスクリーンで描画する、アニメーションを行う、描画を最適化する、といった項目が取り上げられています。

http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaDrawingGuide/AdvancedDrawing/chapter_9_section_1.html

【Cocoa Drawing Guide: Incorporating Other Drawing Technologies】

CocoaのNSViewで、Cocoa以外の描画のためのフレームワークを利用する方法を解説しています。Quartz、OpenGL、QuickTime、Quartz Composerが含まれます。

http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaDrawingGuide/QuartzOpenGL/chapter_10_section_1.html

【Cocoa Fundamentals Guide: Cocoa Design Patterns】

Cocoaのクラスを、デザインパターンの文脈から解説しています。Cocoaの様々なクラスが、デザインパターンで言うところのどのパターンに当てはまるかを分類しています。

http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaDesignPatterns/chapter_5_section_1.html

【Document-Based Applications Overview: Message Flow in the Document
Architecture】

ドキュメント・ベース・アプリケーションでの、処理の流れを解説しています。ドキュメント・ベース・アプリケーションでは、NSDocumentController、NSDocument、NSWindowControllerといったクラスが使われますが、この3つのクラスの間で、どのようにメッセージがやりとりされているのか、フローチャートで表しています。新規ドキュメントの作成、ドキュメントのオープン、ドキュメントの保存、が詳しく解説されています。

http://developer.apple.com/documentation/Cocoa/Conceptual/Documents/Articles/ObjectInteractions.html

【Scroll View Programming Guide for Cocoa: Synchronizing Scroll
Views】

スクロールビューを実現する、NSScrollViewのサンプルを紹介しています。ここでは、2つのスクロールビューがあったとき、これらを同期させるサンプルが取り上げられています。

http://developer.apple.com/documentation/Cocoa/Conceptual/NSScrollViewGuide/Articles/SynchroScroll.html

———————————————————————-
Cocoaのサンプル
———————————————————————-

Cocoaに関するサンプルが、2つ公開されています。

まず、Web Kitで、新しいプロトコルをサポートするためのサンプルです。NSURLProtocolのサブクラスを作る事になります。このサンプルでは、メモリにあるJPEGイメージを表示するプロトコルを例として作成しています。

SpecialPictureProtocol
http://developer.apple.com/samplecode/SpecialPictureProtocol/SpecialPictureProtocol.html

もう1つは、NSViewでドラッグ・アンド・ドロップを行うためのサンプルです。

DragItemAround
http://developer.apple.com/samplecode/DragItemAround/DragItemAround.html

———————————————————————-
ColorSyncとIntel Mac
———————————————————————-

ColorSyncとIntel Macに関するQAが公開されています。ColorSyncでビットマップを得るAPIを使ったとき、バイトスワップをする必要があるかどうか、を解説しています。Universal Binary化では、このようにAPI毎の対処が求められていくのでしょう。

QA1464 ColorSync Color Matching on Intel-based Macs
http://developer.apple.com/qa/qa2006/qa1464.html

 

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

 

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