MOSA Developer News[MOSADeN=モサ伝]第180号
2005-10-18
目次
- 「WebObjects Dev Report」 第26回 田畑 英和
- 小池邦人の「Carbon API 徒然草」
- SqueakではじめるSmalltalk入門 第49回 鷲見 正人
- ニュース・解説 木下 誠
「WebObjects Dev Report」 第26回 田畑 英和
この回が掲載される週にはいよいよMOSA湘南ミーティングが開催されます。今年も例年どおり初台のアップルコンピュータセミナールームに集合して、その後湘南国際村センターへの移動となります。私は数年前から毎年参加させていただいて、毎年懲りずに(笑)WebObjectsのセッションを担当しておりますが、今年もWebObjects関連のセッションを担当することになっています。
今年はこの連載をとおして紹介していますビジネスマッチングシステムについて、システムのプロトタイプ版をもとにWebObjectsで開発するシステムの実体をご紹介したいと考えております。
開発状況といたしましてはまだ細かなエラー処理などが作り込まれていない状態なのですが、これまでご紹介してきたEOFの継承を用いたモデルの作成ですとか、Reusable Componentを用いたコンポーネント作成など、WebObjectsならではのテクニックを実際に用いています。まもなくソースコード一式も公開できると思いますので、湘南ミーティングに参加されない方々にも実際にご覧になっていただくことができるかと思います。
さて、今回は話題を少しかえましてサーバ構築についてお話しておきたいと思います。
サーバのプラットフォーム
まずは運用をおこなうプラットフォームですが、Mac OS X Serverを用意すればそこにWebObjectsの運用環境も含まれていますので、これがもっともお手軽な方法かと思います。以前のMac OS X ServerではWebObjectsの運用環境を別途インストールする必要がありましたが、10.3や10.4では最初からOSのインストールディスクにWebObjectsの運用環境も含まれていますので、特に意識することなくインストールをおこなうことができます。
Mac OS X Serverですが、10クライアント版(52,000円)とUnlimitedクライアント版(98,000円)の2つが入手可能です。どちらを使えばよいかですが、10クライアント版での制限はファイル共有に関する制限になりますので、WebサーバやWebObjectsの運用環境として使用するにはいっさい制限がありません。ですので10クライアント版を利用するのがもっとも経済的です。実はWebObjectsのパッケージを購入するとちょうど10クライアント版とUnlimited版の間ぐらいの価格(76,440円)ですので、運用環境のみを準備するのであれば10クライアント版のMac OS X Serverがもっとも安価な方法となります。
WebObjects
現状のWebObjectsはどのバージョンを使えばよいのかがちょっと複雑です。まず最新版は5.3なのですが、まだ本格的にリリースされているとは言えない状態です。5.3の開発環境なのですが、WebObjectsの開発環境がXcode2.1からは標準で含まれるようになりました。つまりWebObjectsの開発環境を用意するために別途パッケージを購入する必要がないわけです。
Xcode2.1/2.2はADC会員でないと入手できないという制約はあるのですが、それよりも完成度がまだ高くないため、これからWebObjectsを始める方がいきなり5.3から始めるのは危険かもしれません。1つ前のバージョンの5.2はまだパッケージ版が販売されていますので、有償にはなりますがこちらを使うという方法もあります。ちなみに5.2を用いる場合はPantherでは5.2.3が最新版となり、Tiger上で利用するには5.2.4にUpdateする必要があります。
サーバ機
サーバのハードウェアをどうするかですが、Mac OS X Serverを使うのであれば必然的にMacということになります。サーバ機として使うにはやはりサーバ向けのXserveの利用を検討してみましょう。XserveであればMac OS X Serverもバンドル(モデルによって10クライアント版かUnlimited版かは異なります)されていますので、別途OSを購入する手間が省けます。
Xserveの価格はAppleStore(Online)の標準構成で、346,290円からとなっており、Mac OS X Serverの価格分を考慮したとしてもPower Macを購入するよりは割高になってしまいますが、1Uの筐体ですのでラックに収納する場合には最適です。ただし逆にラックがないような環境で利用する場合には、くれぐれも設置にご注意ください。
というわけでお勧めの環境としてはXserve + Mac OS X Serverということになります。総合的に考えるとこの組み合わせがもっともお手軽ではないでしょうか。それでは湘南ミーティングでお会いしましょう。
小池邦人のCarbon API 徒然草(2005/10/14)
画像ファイルをウィンドウに表示する(その3)
今回は、openViwerWindow()で実行されているcreateMyWindow()ルーチンの解説が中心となります。ウィンドウ作成に必要な様々な情報をcreateMyWindow()に渡すことで、nibファイル経由でなくともウィンドウを作成することができます。
以下が、実際に画像表示用ウィンドウを作成しているcreateMyWindow()ルーチンです。
short createMyWindow( Str255 title,OSType wid,WindowClass wcls,
WindowAttributes watt,Rect *brt,FSSpec *fsc,WindowRef *wptr )
{
short ret=1;
Rect wrt;
setupMyWindowBounds( wid,brt,&wrt ); // ウィンドウの表示枠を得る
if( ! CreateNewWindow( wcls,watt,&wrt,wptr ) ) // ウィンドウの作成
{
SetWindowIdealUserState( *wptr,&wrt ); // UserState矩形枠をセット
if( ret=setupMyWindow( *wptr,title,wid,fsc ) ) // プロパティのセット
DisposeWindow( *wptr ); // エラーであれば削除する
}
return( ret );
}
最初の引数はウィンドウタイトルで、ここには画像ファイルの名称が渡されます。続いてウィンドウの識別子としてOSTypeの’VIEW’を渡します。画像ウィンドウのWindowClassはドキュメントウィンドウです。WindowAttributesには、標準アトリビュートに、「ライブリサイズ利用」「スタンダードハンドラ利用」「コンポジティングモード利用」の3つのアトリビュートが追加されて渡されます。WindowClassとWindowAttributesの具体的な設定は、以下の通りです。
wcls=kDocumentWindowClass;
watt=kWindowStandardDocumentAttributes|kWindowLiveResizeAttribute|
kWindowStandardHandlerAttribute|kWindowCompositingAttribute;
次のRectには、imageFileToImage()で得た画像データの矩形枠が代入されます。これにより、ウィンドウ表示時の初期サイズ(幅と高さと位置)が決定されます。次のFSSpecには、表示するる画像ファイルの保存場所が渡されます。この情報は、タイトルバーに表示されるプロキシアイコンの作成に利用されます。そして、ウィンドウが問題なく作成されると、ルーチンは最後の引数にそのWindowRefを返してきます。
最初に実行されているsetupMyWindowBounds()ルーチンは、画像データの矩形枠から実際のウィンドウサイズを計算しています。ウィンドウの初期サイズをメインモニター内に収めるように調整し、複数ウィンドウをオープンした場合には、見やすくするために、その表示位置を前より少しずらします。今回は、一度のオープンで16ピクセルずらし、5度目のオープンで最初の位置に戻るように処理されています。こうして得られたウィンドウの初期サイズと表示位置は、SetWindowIdealUserState()に渡され、ズーム処理のディフォルト矩形枠(UserState)として利用されます。
void setupMyWindowBounds( OSType wid,Rect *brt,Rect *wrt )
{
static long w2_ct=0; // オフセット位置を決めるためのstatic変数
Rect grt;
short dd;
dd=(w2_ct++%5)*16; // XY方向へ16ピクセルずらすためのオフセット値の計算
switch( wid )
{
case 'VIEW': // 画像表示用ウィンドウの識別子
*wrt=*brt;
wrt->right+=15; // 縦スクロールバーの幅だけ拡大
wrt->bottom+=15; // 横スクロールバーの幅だけ拡大
OffsetRect( wrt,16+dd,48+dd ); // モニター原点より移動
GetRegionBounds( GetGrayRgn(),&grt ); // モニター矩形枠を得る
InsetRect( &grt,16,16 ); // 上下左右16ピクセル縮小
SectRect( wrt,&grt,wrt ); // モニター枠内に収まるように縮小
break;
default:
*wrt=*brt;
break;
}
}
次に呼ばれているsetupMyWindow()ルーチンでは、ウィンドウのプライベートな初期化を行います。nibファイルからメインウィンドウ(CatalogWindow)を作成する時にも説明しましたが、この処理では、ウィンドウに必要なプライベートなメモリ領域(WInfo構造体)をウィンドウのプロパティとして登録し、WindowRef経由でいつでも参照できるようにします。
SetWindowProxyFSSpec()は、ウィンドウタイトルの左側にドキュメントのプロキシアイコンを表示します。実際のプロパティ登録では、WInfo構造体はシステム内部の格納場所に「複製」されますので、自分自身で確保しておいたポインタ(iptr)は不要となります。最後にDisposePtr()で解放することを忘れないでください。
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 );
}
WInfo構造体はsetWInfo()ルーチンでウィンドウ自体に添付します。この時に利用するのが、Window ManagerのSetWindowProperty() APIです。また、指定ウィンドウのWInfo構造体を得るのには、getWInfo()ルーチンを用います。こちらは、GetWindowProperty() APIを利用します。
#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 );
}
short getWInfo( WindowRef window,WInfoPtr woptr )
{
short ret=1;
if( IsValidWindowPtr( window ) ) // WindowRefが正常ならプロパティを得る
ret=GetWindowProperty( window,MY_SIG,MY_TAG,sizeof( WInfo ),NULL,woptr );
return( ret );
}
最後に、WInfo構造体のw_prefに親ウィンドウのWindowRefを代入するsetWParent()ルーチンを紹介しておきます。画像表示ウィンドウでは、WInfo構造体のメンバーのうち、このw_prefしか利用しません。
short setWParent( WindowRef window,WindowRef wptr )
{
WInfo winf;
if( ! getWInfo( window,&winf ) ) // WInfo構造体をプロパティから読み込む
{
winf.w_pref=wptr; // 親ウィンドウのWindowRefをセットする
setWInfo( window,&winf ); // WInfo構造体をプロパティとして保存
return( noErr );
}
return( 1 );
}
次回は、setupViwerWindow()ルーチンとsetupViwerWindowEvent()ルーチンを解説したいと思います。この両ルーチンでの処理内容が、Mac OS Xのバージョンによって大きく変わることも紹介いたします。
つづく
SqueakではじめるSmalltalk入門 第49回 鷲見正人
本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、手を加えたメソッドのバージョン履歴などを蓄積するのに使われる「チェンジファイル」を取りあげます。
▼バージョン管理の復習
Smalltalkシステムでは、すでに定義済みのメソッドにブラウザ上で修正を加えてコンパイル(accept。cmd-S)すると、バージョン情報が更新され、あとからその履歴を「バージョンブラウザ」で一覧したり、任意のバージョンの内容を、ひとつ前のバージョンとの差分情報(追加は赤文字、削除は青字の取消線)と併せて閲覧できます。
[fig.A]バージョンブラウザの起動
http://squab.no-ip.com:8080/mosaren/uploads/49a.png
[fig.B]バージョンブラウザ
http://squab.no-ip.com:8080/mosaren/uploads/49b.png
バージョン情報には、メソッドのソースコードの他に、改変を行なったユーザーのイニシャル(…に限らず、短めのニックネームなど。Utilities setAuthorInitialsで確認および変更可)と、いつ改変が行なわれたのかといった情報も含まれます。また、「revert」ボタンで、指定したバージョンに巻き戻すことも可能です。
さて、このバージョン情報。いったい、どこにどのようにして管理されているのでしょうか。
▼システム改変のログ「チェンジファイル」
Smalltalkシステムには、クラスやメソッドの新規、あるいは、再定義の際に、そのとき使われたソースコードおよび付随情報を自動的に記録していく機構があります。このチェンジ管理機構がシステム改変情報を書き出すのに使われるのが「チェンジファイル」(.changes)と呼ばれるテキストファイルです。すでにご存じのように、このチェンジファイルは、同名の仮想イメージファイル(.image)と常にペアで用いるよう定められているものです。
オブジェクトメモリ(Smalltalkシステムでオブジェクトを管理したり機能させるための仮想デバイス)の内容をダンプした仮想イメージファイルと異なり、チェンジファイルは、少し大きめ(十数メガバイト程度)のファイルを開く能力を持つテキストエディタを使えば、その中身を容易に確認できます。チェンジファイルの最後のほうを見ると、見覚えのある作業が記録されているはずです。(なお、実際にテキストエディタで開いて見るときは、内容を書き換えて保存してしまわないように注意してください。)
冒頭のメソッドのバージョン管理には、じつは、このシステム改変履歴から注目するメソッドに関連する情報を抜き出して再構成したものが使われています。
▼チェンジファイルのブラウザ(Recent changes)
わざわざ“外の世界”のテキストエディタのようなソフトに頼らなくてもよいように、Smalltalkシステムの中からこのチェンジファイルの中身を閲覧する手段も、当然ですが、もちろん用意されています。
デスクトップメニューの「変更…」(英語メニューではchanges…)を選んだときに現われるサブメニューから「最近記録された変更…」(英語メニューでは「recently logged changes…」)を選びます。項目の選択と同時にポップアップが現われますが、これには、システムの保存もしくは終了(Squeak VMの強制終了ではなくて、デスクトップメニューなどから終了操作による終了)操作の履歴が列挙されます。
[fig.C]システムの保存および終了の履歴のポップアップ
http://squab.no-ip.com:8080/mosaren/uploads/49c.png
ポップアップから適当な項目を選ぶと、対応するピリオド間(Squeakシステムが動作している間)に記録されたログが解析され、それらをリストにして上のリストペインに表示します。リストには、クラス、メソッドへのすべての改変と履歴に加えて、do it(あるいはprint it)されたコードなども含まれます。リストの項目をクリックすると、下のペインに詳細が表示されます。
[fig.D]Recent changesブラウザ
http://squab.no-ip.com:8080/mosaren/uploads/49d.png
なお、ごくまれにログ解析を失敗することもあるので、そうした事態に備え、「最近のログファイル…」(英語メニューでは「recent log file…」)というメニュー項目も用意されています。これは、ピリオドを選択するためのポップアップが現われるところまでは「最近記録された変更…」と同じですが、チェンジファイルの内容は解析されずに、生データ(ファイルアウトの形式)のままファイルリストに表示します。
▼Recent chagnesの活用 — 強制終了時のリカバリ
新しいクラスやメソッドをシステムに追加しながら開発を行なっているとき、それらの動作テスト中にシステムが異常終了してしまうことは、Smalltalkシステムでのプログラミングに限らずとも、よくあることです。言うまでもなく動作テストを行なう前には、仮想イメージを保存するか、すでに定義済みのクラスやメソッドをファイルアウトして不測の事態に備えておくべきです。が、必要なときに限って、うっかりして大切なバックアップを怠ってしまっていることも、これまた、よくあることです。
そんなとき、逐次、チェンジファイルに自動的に蓄積されているクラスやメソッドの改変履歴は大いに役立ちます。万一、トラブルが発生してシステムの強制終了を余儀なくされても、それまでの作業のほとんどすべてを、Recent changesを使うことで取り戻すことができるからです(取り戻したい定義を選択して上のリストペインの黄ボタンメニューから「fileIn selections」)。なお、こうしたリカバリ作業をするときに目障りなdo itコードや古いバージョンの履歴は、あらかじめ作業履歴リストから排除可能です。
[fig.E]do itコードや古いバージョンのリストからの排除
http://squab.no-ip.com:8080/mosaren/uploads/49e.png
バックナンバー:
http://squab.no-ip.com:8080/mosaren/
ニュース・解説
今週の解説担当:木下 誠
———————————————————————-
Xcodeのプロジェクトを紹介するドキュメント
———————————————————————-
Xcodeのプロジェクトの設定方法を紹介したドキュメント、「Understanding Xcode Projects」が公開されています。Xcodeの機能のうち、特にプロジェクトやターゲットに焦点をあてて、紹介されています。
Xcodeは、正直なところ、パッと見ただけではあまり機能が充実していないように思いますが、実はビルドの設定等はかなり充実してきています。gccに対するコンパイルオプションの設定とその切り替え、ビルドのフェーズ毎でのファイルのコピー、指定したスクリプトの実行、ターゲット間やプロジェクト間での依存関係の設定、等、必要な機能は一通り出そろってきています。
ただ、インタフェースが分かりづらく、マニュアルを熟読しないと発見できないのが残念です。この辺りのアクセスしやすさに、改善が欲しいところです。
Understanding Xcode Projects
http://developer.apple.com/tools/xcode/xcodeprojects.html
———————————————————————-
.Mac SDK 1.2が公開
———————————————————————-
.Mac SDKが、1.2にバージョンアップしています。Universal Binaryへの対応が行われました。.Mac SDKを使うと、アプリケーションから.Macへの接続や、.Mac上のファイル操作等が行えます。
7月に.Mac SDK 2.0のDeveloper Previewが公開されていますが、こちらはまだアップデートされていないようです。
.Mac 1.2 SDK
http://developer.apple.com/sdk/
———————————————————————-
Windows + Visual BasicのQuickTimサンプル
———————————————————————-
QuickTime 7を利用した、ムービーを再生するサンプルが公開されています。こちらは、珍しく、Windows 2000とVisual Basicを使ったサンプルになっています。
Windows用のQuickTimeは、COMでラップされているので、Interface Builder +Cocoa並みの手軽さで扱うことができます。ただ、用意されている機能以上のことをやろうとすると、とたんに大変になるのですが。
MoviePlayer
http://developer.apple.com/samplecode/MoviePlayer/MoviePlayer.html
MOSAからのお知らせと編集後記は割愛します
Apple、Mac OSは米国アップルコンピュータ社の登録商標です。またそのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。
このメールの再配信、および掲載された記事の無断転載を禁じます。
特定非営利活動法人MOSA
Copyright (C)2005 MOSA. All rights reserved.