2005-05-17
目次
「WebObjects Dev Report」 第6回 田畑 英和
前回は予定を変更してTiger関連のレポートをおこないましたが、前々回にご紹介しましたEclipse上でのWebObjectsの開発方法の続きを解説したいと思います。
Eclipse上でWebObjectsの開発を支援するプラグイン「WOLips」をインストールすると、まずWebObjects用のパースペクティブが利用できるようになります。Eclipseでは作業内容に応じて画面構成を切り替えられるようになっていますが、この画面構成のことをパースペクティブと呼んでいます。例えばJavaプログラミング用のパースペクティブやデバッグ用のパースペクティブなどがあらかじめ用意されており、必要に応じてパースペクティブを切り替えながら開発をおこなっていくことになります。
WOLips用のパースペクティブに切り替えるには、次のメニューを選択してください。
・WOLipsパースペクティブ
「Window」->「Open Perspective」->「Other…」から「WOLips」を選択
次に「File」->「New」->「Projects…」メニューから(またはツールバーから)プロジェクトを作成することができます。WOLipsではWebObjects用のプロジェクトとして以下のものが用意されており、プロジェクト名を入力すれば簡単にプロジェクトを新規作成できるようになっています。
・プロジェクトタイプ
- WOApplication
- WOFramework
- D2WApplication
- Jar Project
WOApplicationタイプのプロジェクトを新規に作成すると以下のソースコードが自動的に作成されます。ちょうどXcode上でプロジェクトを新規に作成したのと同じようになります。さらにXcode用のプロジェクトファイルも自動生成されますので、必要に応じてXcode上での作業をおこなうこともできます。
・自動作成されるファイル
- Applicaiton.java
- DirectAction.java
- Main.java(およびMain.wo)
- Session.java
WOLipsではプロジェクトの作成だけではなくWOComponentの作成なども可能です。こちらもプロジェクトの作成と同様にコンポーネント名を指定するだけでWOComponentを新規に作成することができます。
ですが、WOLips上でJavaプログラミングはできても、*.woの編集はできません(ソースを直接編集するという方法はありますが)。そこで*.woの編集に関しては別途WebObjects Builderを併用して開発を進めていくのがよいでしょう。
しかし、Mac OS X上で開発をおこなっている場合ここで1つ問題があります。Eclipse上からWebObjects Builderを起動することはできるのですが、この場合ちょうどXcodeでプロジェクトを開いていない状態で、Finder上から直接*.woファイルを開いたときと同じになります。つまりWebObjects Builderの下半分のオブジェクトブラウザになにも表示されない状態になってしまいます。これではバインドやWebObjects Builder上でのKeyやActionの追加ができません。
そこでEclipse上で開発をおこなう場合でも別途Xcodeでプロジェクトを開いた状態(さきほど解説しましたようにWOLipsがXcode用のプロジェクトファイルも自動生成してくれます)で作業をおこなうのがよいでしょう。
Eclipseではコードを編集すると自動的にコンパイルをかけてくれますので、コンパイルが成功していれば、Eclipse上からアプリケーションを実行できるようになります。またWOLipsではWebObjectsアプリケーションの実行に関するパラメータの指定をおこなうこともできます。
以上簡単ではありますが、Eclipse + WOLipsでのWebObjectsの開発について解説しました。より詳しい情報に関してはWOLipsをリリースしていますObject StyleのWebサイトを参照するか、EclipseのHelpからWOLipsのドキュメントを参照してください。
・ObjectStyle Webサイト
http://www.objectstyle.org/woproject/
・WOLips User Guide
「Help」->「Help Contents」メニューから「WOLips User Guide」を参照
さて、開発環境を整えるにはまだソースコード管理ですとかテスティングの準備などもあるわけですが、機会があればまた取り上げるとして、今後は実際にプロジェクトの開発をおこなっていく過程をレポートしていきたいと思います。
プロジェクトを開発するといいましてもWebObjectsのプロジェクトは、ソースコード、WOComponent、モデル、各種リソースファイル、など様々な要素から構成されています。またフレームワークを活用することによりプロジェクトを分割したり、プロジェクト間で再利用可能なコンポーネントを共有することもできます。
どのようなスタイルで開発を始めていくかはプロジェクトの方針にもよるでしょうし、開発チームの構成によっては平行して開発を進めていく場合も考えられますが、本連載ではまず大まかな方針と最初の目標を決めて開発を進めていきたいと思います。
小池邦人の「Carbon API 徒然草」(2005/05/13)
今回は、ドラッグ&ドロップとは直接関係ありませんが、reciveCatalogWindow()の中から呼ばれている自作ルーチンについて解説します。Recive処理の最終目的を達成させるための一例として参考にしてみてください。
以下が、前回紹介したreciveCatalogWindow()から呼ばれているaddImageFile()ルーチンです。このルーチンは、データブラウザにドロップされたアイコンがQuickTimeで表示可能な「画像ファイル」の場合にのみ実行されます(前回のケース1)。
#define MAX_FILE 1000 // データブラウザに登録できる最大ファイル数
short addImageFile( WindowRef window,unsigned long ct,OSType type[],
FSSpec fsc[] )
{
short ret=1;
ObjectPtr optr;
unsigned long i,nn;
myCursor( 4 ); // カーソルを時計表示に変える
getWObjCount( window,&nn ); // 現在登録されているファイル数を得ておく
for( i=0;i<ct;i++ ) // 引数で渡された個数分ループを実行
{
if( nn++==MAX_FILE ) // 最大登録数は1000ファイル
{
doErrAlert( 4 ); // これ以上ファイルを登録できないとエラー表示
break; // 処理を抜ける
}
else
{
if( ! newObject( window,type[i],&fsc[i],&optr ) ) // ファイル登録
ret=0;
}
}
if( ret==0 )
mainteAddImageFile( window ); // ボタンやブラウザにメンテナンスを行う
myCursor( 0 ); // カーソルを矢印表示に戻す
return( ret );
}
画像ファイルのデータブラウザへの登録処理は非常に簡単です。newObject()ルーチンに対象ファイルのファイルタイプとFSSpecを渡し、ドロップされたアイコンの個数分だけObject構造体を確保します。登録後のボタン表示の変更(メンテナンス)や、データブラウザの一覧表示の更新などについては、以下のmainteAddImageFile()が担当しています。この中で実行されているaddItemDataBrowser()とmainteCatalogWindow()の2つのルーチンについては既に解説済みですので、そちらを再度参照してみてください。
void mainteAddImageFile( WindowRef window )
{
SetWindowModified( window,1 ); // 何らかの編集が実行されたことを記録
addItemDataBrowser( window ); // データブラウザの一覧表示を更新
mainteCatalogWindow( window ); // ウィンドウ上のボタン表示を更新
}
次は、同じくreciveCatalogWindow()から呼ばれているaddImageFolder()ルーチンです。このルーチンは、データブラウザにドロップされたアイコンが「フォルダ」の場合にのみ実行されます(前回のケース3)。
short addImageFolder( WindowRef window,FSSpec *fsc )
{
short ret=1;
OSType type;
ObjectPtr optr;
short nb=1;
CInfoPBRec crec;
Str255 name;
FSSpec fsc1;
unsigned long ct;
fsc1=*fsc;
myCursor( 4 ); // カーソルを時計表示に変える
getWObjCount( window,&ct ); // 現在登録されているファイル数を得ておく
while( 1 )
{
crec.hFileInfo.ioCompletion=0L;
crec.hFileInfo.ioNamePtr=(StringPtr)name; // ファイル名が返る
crec.hFileInfo.ioVRefNum=fsc->vRefNum; // ボリュームリファレンス番号
crec.hFileInfo.ioFVersNum=0;
crec.hFileInfo.ioFDirIndex=nb++; // インデックスを順次増やす
crec.dirInfo.ioDrDirID=fsc->parID; // ディレクトリID
if( PBGetCatInfo( &crec,0 ) ) // フォルダ内のカタログから項目を得る
break; // 個数を超えたらループから抜ける
if( (crec.hFileInfo.ioFlAttrib&0x10)==0 &&
(crec.hFileInfo.ioFlFndrInfo.fdFlags&fInvisible)==0 )
// フォルダと不可視ファイルは登録対象から除外する
{
type=crec.hFileInfo.ioFlFndrInfo.fdType;
navCheckImportExtention( name,&type ); // 拡張子チェック
if( ! navImportCheckTypeList( type ) ) // 登録可能画像ファイルか?
{
if( ct++==MAX_FILE ) // 最大登録数は1000ファイル
{
doErrAlert( 4 ); // これ以上登録できないとエラー表示
break; // 処理を抜ける
}
copyString( name,fsc1.name ); // FSSpecのファイル名を差し替える
if( ! newObject( window,type,&fsc1,&optr ) ) // ファイル登録
ret=0;
else
break;
}
}
}
if( ret==0 )
mainteAddImageFile( window ); // ボタンやブラウザにメンテナンスを行う
myCursor( 0 ); // カーソルを矢印表示に戻す
return( ret );
}
フォルダアイコンがブラウザへドロップされた場合には、そのフォルダに含まれているすべての画像ファイルを登録することになります。そのため、先んじて対象フォルダ内に保存されているファイルのカタログリスト(一覧)が必要となります。こうしたファイル(当然フォルダも含まれる)の一覧を得るには、File Managerに属するPBGetCatInfo()を利用します。まず最初に、CInfoPBRec構造体に対象フォルダのボリュームリファレンス番号(fsc->vRefNum)、ディレクトリID(fsc->parID)、加えてリスト内のインデックス番号を(1から始まるので注意)を代入しておきます。続いて、そのCInfoPBRec構造体をPBGetCatInfo()に渡して実行すれば、指定インデックス番号のファイル(もしくはフォルダ)の名称を得ることができます。
渡したインデックス番号がリストの個数より多い場合には、PBGetCatInfo()はエラーを返しますので、処理ループから抜けて作業を終了します。また、登録対象にはならないフォルダや不可視ファイルについては、先んじてカタログのアトリビュート(ioFlAttri)やファインダフラグ(fdFlags)をチェックして登録対象から除外しておきます。ちなみに不可視ファイルとしては、フォルダアイコンなどが含まれます。続いて、Navigation Serviceの解説時に紹介したnavCheckImportExtention()とnavImportCheckTypeList()を使い、QuickTimeで表示できる画像ファイルかどうかを調べてから、対象となるファイルのみをnewObject()で登録します。この時のファイル名は、crec.hFileInfo.ioNamePtrに代入しておいたパスカルストリングス(name)に返されますので、それを参照します。
最後は、データブラウザにドロップされたアイコンが「ドキュメント」の場合にのみ実行されるloadObjectFile()ルーチンです(前回のケース2)。
short loadObjectFile( WindowRef window,FSSpec *fsc )
{
long len1,len2,i,nn;
short fref,ret=1;
ObjectPtr optr;
Object obj;
getWObjCount( window,&nn ); // 現在登録されているファイル数を得ておく
len1=sizeof( Object ); // Object構造体のサイズ
len2=sizeof( unsigned long ); // unsigned long変数のサイズ
if( ! FSpOpenDF( fsc,fsRdPerm,&fref ) ) // ドキュメントファイルをオープン
{
if( ! FSRead( fref,&len2,&ct ) ) // 登録個数を読み込む
{
for( i=0;i<ct;i++ ) // 個数分だけループを実行する
{
if( FSRead( fref,&len1,&obj ) ) // Object構造体を読み込む
break;
else
{
if( nn++==MAX_FILE ) // 最大登録数は1000ファイル
{
doErrAlert( 4 ); // これ以上登録できないとエラー表示
break; // 処理を抜ける
}
if( ! newObject( window,obj.o_type,&obj.o_fsc,&optr ) )
ret=0; // データブラウザにファイル登録
}
}
}
FSClose( fref ); // ドキュメントファイルをクローズ
}
return( ret );
}
loadObjectFile()ルーチンでは、ドキュメントファイルから個数分のファイル登録情報(Object構造体)を読み込み、その内容を順次newObject()で登録して行きます。指定ドキュメントファイルに幾つのファイル情報が含まれているのかは、ファイルの先頭に保存されている個数(unsigned long値)を読み込むことで判断することが可能です。
次回は、ドラッグ&ドロップにおけるSend処理を紹介します。ウィンドウ上のオブジェクト(画像やテキスト)をドラッグし、相手(もしくは自分自身)に渡す(ドロップする)方法を解説したいと思います。
つづく
SqueakではじめるSmalltalk入門 第39回 鷲見正人
本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、つい先頃、メジャーバージョンアップしてリリースされた日本語版Squeakを取りあげます。
この連載で紹介し使用してきた“公式版”と呼ばれるSqueak(現在のバージョン3.7)でもまだ、日本語をはじめとする、いわゆるマルチバイト文字列を扱うことができません【註】。しかし、これまでご紹介してきたとおりSqueakシステムは通常のOSと異なり限りなくオープンで、かつ、ほとんどすべてがSmalltalk言語で記述されている均一なシステムであるため、自由な改変が比較的容易な柔軟な作りになっています。したがって日本語化を含む多言語化についても必要とあらば、エンドユーザーレベルでの機能追加も可能で、実際、Squeakシステムの多国語化は1999年から、当時まだ、東京工業大学の学生だった大島芳樹氏の手により、Squeak 2.3をベースにして始まりました。
http://www.akademia.co.jp/Smalltalk/SML/archives/SRA.archives/1999-April/003457.html
Squeak 2.4への対応後、開発は途中休止しますが、それまでVisualWorksで仕事をしてこられたベテランSmalltalkerの阿部和広氏にいったん引き継がれ、Squeak 2.7から再び動くようになります。
http://www.akademia.co.jp/Smalltalk/SML/archives/SRA.archives/2000-July/004313.html
当初は多国化を扱うための最小限の機能を提供するにとどまり、また、公式版の仮想イメージに差分情報を読み込ませるインストール作業が必要でした。そこで、Smalltalkシステムの作法に馴染みのない人への便宜をはかるために、一連の、簡単ではありますが知らない人には難しく思われる作業を済ませた、インストール済みの仮想イメージが用意されました。これを「SqueakNihongo」という名称で配布するようになったのが“日本語版Sqeuak”で、その最新版が、今年の三月に公開された「SqueakNihongo7」です。
http://www.smalltalk.jp/pipermail/squeak-ja/2005-March/002389.html
http://d.hatena.ne.jp/squeaker/20050321#p2
ひとつ前のバージョンであるSqueakNihongo6.1までのリリース経緯については、阿部氏の「日本語版Sqeuakを使おう」ページの<日本語版Squeakの歴史>を参照ください。
http://squeak.hp.infoseek.co.jp/nihongo.htm
さて、SqueakNihongo7ですが、先の大島氏のSqueak-jaメーリングリストでのアナウンスにもあるように、現在、次の場所で入手可能です。
http://squeakland.jp/developer/
OS Xの場合「Squeakバーチャルマシン」は、Squeak 3.8.6Beta6.app.sitをダウンロードし、必要ならStuffIt Expanderなどを用いて“解凍”します。「ソースファイル」はSqueakV3.sources.zipをダウンドローしても構いませんが、この連載で使用中のSqueak 3.7フォルダにあるSqueakV3.sourcesをコピーしても使えます。もちろん、肝心の「開発者版Squeakイメージファイルとチェンジファイル」のSqueakNihongo7.zipも忘れずダウンロードしましょう。SqueakNihongo7.zipは、解凍されるとフォルダが作られるはずなので、ここにすでに入手済みのバーチャルマシンとソースファイルを入れれば作業用のフォルダが出来上がります。
[fig.A]SqueakNihongo7作業用フォルダの中身
http://squab.no-ip.com:8080/mosaren/uploads/39a.png
仮想イメージである「SqueakNihongo7.image」をバーチャルマシン「Squeak 3.8.6Beta6.app」にドロップインすれば“日本語版”のSqueakシステムを起動できます。なお、Finder上では、仮想イメージファイルはバーチャルマシンの文書ファイルとして扱われますので、関連づけさえきちんとできていれば仮想イメージのダブルクリックで起動することも可能です。ただ、複数のバージョンのSqueakバーチャルマシンが同時に存在し使い分けているときは、どの仮想イメージをどのバーチャルマシンで起動するかを明示的にするためにドロップインのほうが安全で確実だと思います。
[fig.B]SqueakNihongo7起動後の画面
http://squab.no-ip.com:8080/mosaren/uploads/39b.png
SqueakNihongo7では、メニュー項目やヘルプメッセージのたぐい、eToysのフレーズなどが日本語化されています。ただ、すべての項目が日本語化されているわけではないことに注意してください。また、残念ながら現状では、Macでの日本語変換時のインライン入力には未対応です。
[fig.B]日本語化されたデスクトップメニュー
http://squab.no-ip.com:8080/mosaren/uploads/39c.png
次回は、このSqueakNihongo7を用いて、Smalltalk言語で日本語をどのように扱えるようになっているのかを確認してみましょう。
註:次の公式リリースである3.8より、SqueakNihongoで培われた多国語化機構が採用されるようです。
バックナンバー:
http://squab.no-ip.com:8080/mosaren/
ニュース・解説
今週の解説担当:木下 誠
———————————————————————-
Tiger用開発ドキュメントが多数公開
———————————————————————-
ついに、Mac OS X 10.4 “Tiger”が発表されましたね。それに伴い、ADC(Apple Developer Connection)でも、Tigerに関する開発ドキュメントが多数公開されています。もうすでに、目を通している方も多くおられるでしょう。
ドキュメントの入り口は、ADCの”Reference Library”になります。また、開発環境をインストールすると同時にドキュメントも入れられますが、TigerでバージョンアップしたXcode 2.0では、ドキュメントの自動更新機能が付いています。この機能を使うことで、つねにドキュメントを最新のものと同期させておけるでしょう。
Reference Library
http://developer.apple.com/referencelibrary/
———————————————————————-
FxPlug SDK for Motionが公開
———————————————————————-
Motion 2.0のリリースに合わせて、FxPlug SDK for Motionが公開されました。これは、GPUによるアクセラレーションを利用できる、フィルタやジェネレータといったプラグインを作成するためのSDKです。最初のホストアプリケーションは、Motion 2.0になります。ドキュメントを見る限り、Motion専用ではない、といったニュアンスを受けますが、他にホストアプリケーションが現れるかどうかは不明です。
現在、FxPlugのためのセッションが2つ(”FxPlug Overview”、”FxPlug in Depth”)、WWDCで行われるということが発表されています。
また、Final Cut Proのための、XML DTDも公開されています。これにより、Final Cut Proのデータを、他のアプリケーションでも利用できるようになります。
Tigerでは、ビデオ機能が強化されるとともに、それをサードパーティのアプリケーションで利用できる環境が整ってきたように感じます。これらの応用例としては、QuickTimeによるビデオ再生、MotionのようなリアルタイムフィードバックGUI、Dashboardのようなエフェクト、QuartzComposerを使ったプレゼンテーション、などが考えられるでしょう。
FxPlug for Motion Released
http://developer.apple.com/appleapplications/fxplugsdk.html
Final Cut Pro XML Interchange Format DTDs
Apple Applications – Downloads
http://developer.apple.com/appleapplications/download/
———————————————————————-
Core Dataのチュートリアル
———————————————————————-
Cocoa Dev Centralで、Core Dataのためのチュートリアル記事、”Build a Core Data Application”が公開されています。Core Dataを使ったサンプルアプリケーションの作り方を、ステップ・バイ・ステップで説明しています。
簡潔な説明と、豊富で分かりやすい図のおかげで、非常に追いかけやすい記事となっています。
Cocoa Dev Central: Build a Core Data Application
http://cocoadevcentral.com/articles/000085.php
———————————————————————-
Dashboardウィジェットのチュートリアル
———————————————————————-
MacDevCenterで、Dashboardウィジェットを作成するためのチュートリアル、”Build a Dashboard Widget”が公開されています。UNIXコマンドを実行し、その結果を表示するウィジェットのサンプルのようです。
MacDevCenter.com: Build a Dashboard Widget
http://www.macdevcenter.com/pub/a/mac/2005/05/06/dashboard.html
———————————————————————-
QuickTime Kitの紹介記事
———————————————————————-
MYCOM PC WEBで、QuickTime Kitを利用したプログラミングを紹介する、「QuickTime Kit – CocoaでQuickTimeプログラミング」が公開されています。QuickTime Kitを使って、ムービーを再生するためのCocoaアプリケーションを、ステップ・バイ・ステップで紹介する記事になっています。
QuickTime Kitの登場で、CocoaアプリケーションからQuickTimeを利用するための敷居が、グッと低くなりました。Pantherでも使えるところがうれしいところです。ちなみに、この記事は、私木下が書かせていただきました。
QuickTime Kit – CocoaでQuickTimeプログラミング
http://pcweb.mycom.co.jp/articles/2005/05/06/qtkit/index.html
MOSAからのお知らせと編集後記は割愛します