MOSA Multi-OS Software Artists

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

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

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

2005-01-18

目次

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

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

 本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。前回に引き続き、リテラル式、あるいはそれに準じる表現により生成できる定番のオブジェクトたちをとりあげ、簡単な解説を加えてゆきましょう。

▼真偽値、未定義値
 true、false、nilは他のリテラルとはちょっと違った扱いになっています。その実体は同名の擬変数に束縛されたTrue、False、UndefinedObject(“Nil”ではないのでお間違えなく!)の唯一のインスタンス…です。擬変数というのは、参照はできても代入(束縛のやりなおし)のできない特殊な変数のことをいいます。リテラルと同様に、true、false、nilと書いて直接表現できますが、それ自体は変数(ある種グローバル変数的なもの)なので、配列のリテラル式の要素になれないなどの制約もあります。たとえば、リテラルだと思って、それらを要素にとる配列を作るつもりで次のように記述してしまうと…

#(true false nil) “=> #(#true #false #nil) ”

 このようにtrue、false、nilは、それぞれ「#」を省略したシンボルリテラルだと解釈されてしまいます。こうした事態を避けるためには、配列のリテラル式ではなく、前回紹介したカーリーブレイス表現を用います。カーリーブレイスでは要素はスペースではなく、ピリオドで区切ります。

{true. false. nil} “=> #(true false nil) ”

 なお、この出力結果からもお分かりいただけるように、Smalltalkシステムが返すオブジェクトの文字列表現において、リテラル式(あるいはメッセージ式)を模したものの中には、式として評価は可能でも(つまりSmalltalk言語として文法的に誤りがなくとも)同じオブジェクトを返すことができないものも含まれます。注意してください。

▼分数
 よく使うわけではないのですが、あることが分かっていると便利、あるいは逆に、思わぬ所に登場して悪さをするオブジェクトに、分数(a Fraction)というものがあります。これはリテラル式ではないのですが「n / m」という直感的で簡潔なメッセージ式で作ることができます。

3 / 4 “=> (3/4) ”
2 / 4 “=> (1/2) ”
(3 / 4) + (5 / 6) “=> (19/12) ”

 電卓のような結果を得たければ、レシーバかパラメータのどちらかに「.0」を付して、浮動小数点少数(a Float)リテラルとして記述しなければいけません。

3.0 / 4 “=> 0.75 ”
3 / 4.0 “=> 0.75 ”

 または、レシーバかパラメータ、もしくは、結果を明示的に浮動小数点少数に変換する(より正確には、変換したオブジェクトを返す)メッセージ「asFloat」を送信します。

3 asFloat / 4 “=> 0.75 ”
3 / 4 asFloat “=> 0.75 ”
(3 / 4) asFloat “=> 0.75 ”

 C言語の二項演算子のように使いたければ、結果に対し改めて「truncated」などの“まるめ処理”のためメッセージを送信する必要があります。

(3 / 4) truncated “=> 0 ” “整数部を抽出 ”
(13 / 4) truncated “=> 3 ”
(-3 / 4) truncated “=> 0 ”
(-3 / 4) floor “=> -1 ” “マイナス側にまるめる”
(3 / 4) ceiling “=> 1 ” “プラス側にまるめる ”

 こうした“まるめ処理”のためのメソッドは、Numberのサブクラス群の「truncation and round off」プロトコルにまとめられているので興味があったらブラウザで覗いてみてください。

▼ポイント
 座標やベクトルを表わすポイント(a Point)も、リテラルではありませんが、それに準ずる簡単なメッセージ式で表わすことができるオブジェクトです。ある数値に対し、パラメータとして別の数値を添えた「@ aNumber」というメッセージを送ることで生成できます。

3 @ 4 “=> 3@4 ”
(3 @ 4) + (5 @ 6) “=> 8@10 ”

 きちんとした二次元座標、あるいは、二次元ベクトルを模したオブジェクトというわけではないので、こんな計算もできてしまったりもします。

(3 @ 4) * (5 @ 6) “=> 15@24 ”
#(3 4) * #(5 6) “=> #(15 24) ”

 このように特に演算に関してポイントは、座標やベクトルというよりは、要素が二つの配列とよく似た振る舞いをすることが多いようです。

 リテラル表現とはちょっと趣を異にしますが、ポイントはクラス「Point」にメッセージ「fromUser」を送信することで、続く画面のクリック操作でインスタンスを得ることも可能です。

Point fromUser “=> (クリック位置の座標)”

 なお、この「fromUser」というメッセージは、Point以外にもRectangle(矩形範囲)、Form(ビットマップ画像)、Color(色情報)、StrikeFont(テキストのフォント情報)についても同様に使用できます。たとえば、

Form fromUser asMorph openInHand

などとすることで、選択して指定した画面の一部を基本図形オブジェクトとして簡単に取り出せます。

バックナンバー:
http://squab.no-ip.com:8080/mosaren/

小池邦人の「Carbon API 徒然草」(2005/01/14)

Navigation Service APIの活用(その2)

今回は、navMyPutFile()ルーチンから呼ばれているNavPutFile()を詳しく解説します。それに加え、Carbon Frameworkで使われているファイル保存場所を認識するため(ファイルアクセス用)の「4つの仕組み」を紹介したいと思います。

以下が、ドキュメント保存用の「ファイル名入力ダイアログ」を表示するnavMyPutFile()ルーチンです。ファイルメニューから「保存…」を選択した時か、まだ保存していないカタログウィンドウを閉じようとした時に実行されます。

#define   MY_SIG   'MosA'   // アプリケーションのシグネイチャ
#define   MY_DOC   'MosD'   // ドキュメントのファイルタイプ

short navMyPutFile( Str255 title,FSSpec *fsc )
{
    NavReplyRecord      reply;
    DescType            rtype;
    short               ret;
    AEKeyword           key;
    Size                len;
    NavDialogOptions    opt;

    NavGetDefaultDialogOptions( &opt );     // ダイアログのオプションを初期化
    opt.preferenceKey=MY_SIG;               // 使用形態を識別するための値を設定
    opt.dialogOptionFlags+=kNavNoTypePopup; // 種類ポップアップメニューを外す
    copyString( title,opt.savedFileName );  // ディフォルトファイル名を設定する
    GetIndString( opt.clientName,128,1 );   // クライアント名をリソースから得る

    ret=NavPutFile( NULL,&reply,&opt,NULL,MY_DOC,MY_SIG,NULL ); //ダイアログ表示

    if( reply.validRecord && ret==0 ) // OKボタンが押された場合...
    {
        ret=AEGetNthPtr( &(reply.selection),1,typeFSS,&key,&rtype,(Ptr)fsc,
                                                  (long)sizeof(FSSpec),&len );
                                     // 入力したファイル名のFSSpecを得る
        NavDisposeReply( &reply );   // NavReplyRecordを削除する
    }
    return( ret ); // ret==noErrであればOKボタンが押されたことになる
}


NavPutFile()で表示されるダイアログは、前回解説したNavAskSaveChanges()と同様に、NavDialogOptions構造体の内容を操作することで色々なオプション機能を追加できます。まずはNavGetDefaultDialogOptions()を実行し、NavDialogOptions構造体の内容を初期化します。次に、preferenceKeyに使用形態に応じた識別子となる値(任意の値)を代入します。この操作により、Navigation Service側は、初期表示されるファイル階層などの情報を識別子ごとに保持します(次回利用する時に前回と同じ階層を表示する)。本サンプルでは、dialogOptionFlagsのkNavNoTypePopupビットを立てることで、ダイアログに配置される「ファイル種類選択用ポップアップメニュー」を使用できないように制限しています。savedFileNameには、オープン時に入力カラムに表示されるディフォルトファイル名を、clientNameにはサービスを利用するアプリケーション名をセットします。

NavDialogOptionsを設定し終わりNavPutFile()を実行すると、画面にファイル名入力ダイアログがオープンされます。ユーザによりファイル名が入力され、OKボタンがクリックされた場合にのみ、AEGetNthPtr()で保存先ファイルのFSSpec構造体を得ることができます。Mac OS X 10.3環境では、表示されたファイル名入力ダイアログはマウスドラッグにより移動可能(Movable Modeless Dialog)なのですが、10.2環境では移動不可な状態となります。この現象を回避するには、以下のようにダミーのeventProcを定義しておき、それをNavPutFile()の4番目の引数として代入します。これにより、どちらのバージョン環境でもダイアログを移動することが可能となります。

pascal void navEventProc( NavEventCallbackMessage sel,
                                     NavCBRecPtr parm,NavCallBackUserData ud )
{
}

ret=NavPutFile( NULL,&reply,&opt,navEventProc,MY_DOC,MY_SIG,NULL );


本アプリケーションでは、上記のnavMyPutFile()ルーチンを含め、ファイルアクセス用としてFSSpec構造体を採用しています。FSSpecを用いるのは、Mac OS 9時代から使われている手頃な方法ですが、Carbon Frameworkには、ファイルアクセス用としてAliasHandle、FSRef、CFURLRefという別の定義も用意されています。Mac OS X環境でのファイルアクセスにおいて、32文字より長いファイル名やUnicodeファイル名への対応が必須であるならば、FSSpecの代わりにFSRefを使う必要があります。AliasHandleは、ファイル保存場所を追跡するような処理に活用すると大変便利です。また、Mac OS Xから導入されたQuartz 2DやCore Foundationに含まれる多くのAPIは、ファイルアクセス時にCFURLRefを使う場合が多いようです。

アプリケーションによっては、そのドキュメント内に処理のターゲットとなるファイルの保存場所情報を埋め込みたい場合があります。例えば、データベースがアサインしているファイルとか、ワープロにリンクされている画像の保存場所情報などです。4つの定義を用いたファイルアクセスにはそれぞれに特徴、利点、欠点があり、選択を間違えると後から色々な不都合が生じ、状況によってはファイルが認識できなくなるケースに遭遇することもあります。ちなみに、この4つのファイルアクセス用パラメータは相互に変換することが可能です。まず最初に、その方法のいくつかを紹介しておきたいと思います。

以下はFSSpecを作成する例です。FindFolder()によりHome/Library/Preferencesフォルダのボリュームリファレンス番号(vref)とディレクトリID(did)を得ています。これらをアクセスしたいファイル名(fname)と一緒にFSMakeFSSpec()に渡すことにより、目的のFSSpec構造体を作成します。

Str255   fname
short    vref;
FSSpec   fsc;
long     did;

FindFolder(kOnSystemDisk,kPreferencesFolderType,kCreateFolder,&vref,&did );
FSMakeFSSpec( vref,did,fname,&fsc );

次は、同様にFSFindFolder()を使いPreferencesフォルダのFSRefを得る方法です。

FSRef    fsref;

FSFindFolder( kOnSystemDisk,kPreferencesFolderType,kCreateFolder,&fref );

FSSpecからFSRefを得るのにはFSpMakeFSRef()を利用します。FSSpecはアサイン先のファイルが存在していなくても定義できますが、FSRefの方はファイルがファイルが存在していないと定義できませんので注意しましょう。もし存在しないファイルのFSSpecをFSpMakeFSRef()に渡すとエラーが返ります。この特徴をうまく利用すると、FSpMakeFSRef()はファイルの存在を判断する処理に使えます。逆にFSRefからFSSpecを得るのには、FSGetCatalogInfo()を利用します。

FSpMakeFSRef( &fsc,&fsref );
FSGetCatalogInfo( &fsref,kFSCatInfoGettableInfo,NULL,NULL,&fsc,NULL );

次にFSSpecからAliasHandleを作成する場合です。この作業にはNewAlias()を用い、作成したAliasHandleからFSSpecを導くにはResolveAlias()を用います。この処理のFSRef版APIはFSNewAlias()とFSResolveAlias()です。

Boolean      chg=0;
AliasHandle  ahd;
FSSpec       fsc;

NewAlias( NULL,&fsc,&ahd );
ResolveAlias( NULL,ahd,&fsc,&chg );

最後にCFURLCreateFromFSRef()を使い、FSRefからCFURLRefを得る方法を紹介します。その逆はCFURLGetFSRef()で実現します。

FSRef        fsref;
CFURLRef     url;

url=CFURLCreateFromFSRef( NULL,&fsref );
CFURLGetFSRef( url,&fsref );

Apple社には、ファイルアクセスはCFURLRefを用いる方法に統一したいという雰囲気が漂っているのですが、なにせまだ多くのファイル関連APIがFSSpecやFSRefに依存している状態でして(FSSpec依存はかなり減った)早期実現は不可能だと思われます。ちなみに、Mac OS Xが登場したばかりのころ、CFURLRefの使用のみを推薦し、FSSpecやFSRefの使用を否定するテックノート(Technical Note)がデベロッパーサイトに登録されたことがありました。しかし、多くの開発者の「時期尚早である!」という大反論に見舞われ、あえなく引っ込められた経緯があります。だいたい、当時のQuickTime APIはFSSpecしか受け取らなかったわけですし…いったい何を考えていたのやら(笑)。

次回は、FSSpec、AliasHandle、FSRef、CFURLRefを用いたファイルアクセスの特徴や仕組み、利点や欠点について、もう少し詳しく解説したいと思います。そして、その例題としてFSSpecの代わりにFSRefを得るシートウィンドウ(Sheet Window)タイプのファイル名入力ダイアログ(本サンプルでは未使用)を紹介したいと思います。

つづく

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

 Macworldでは続々とAppleの新製品が発表されましたが、WebObjectsはあいかわらずニュースのないのが残念なところです。運用のことを考えますとサーバ系の製品は頻繁にアップデートされても逆に手間が増えてしまいますが、それでも開発ツールなどはまだまだ改良の余地があるはずですので、今年は明るいニュースに期待したいところです。
 さて、今年初の連載はそんな期待も込めつつ、これからWOを始めるデベロッパー向けの情報をまとめてみました。

まずは開発環境

 正式にサポートされている開発環境はMacかWinになります。WOの実行環境はJavaですので、技術的にはJava環境があればどこでも動作するのですが、独自形式のファイルを扱う必要があったりしますので、Appleが提供している開発ツールを使うことになります。
 開発ツールはMac版とWin版がそれぞれ用意されていますが、完全に同じというわけではありません。開発の中心となるXcodeですが、Win版ではXcodeの前に使われていたProject Builderを使用することになります。もっともProject BuilderはMac OS Xが登場したときに大幅にバージョンアップされましたが、Win版のProject Builderは古いバージョンのままになっています。

 つまり開発環境としてはMac版のほうが進化しているということになりますが、最近はXcode/Project Builderの代わりにEclipse上での開発環境も整いつつあり、いったん使い出すと手放せない状態になるようです。
 WebObjectsのパッケージは1種類のみで、そこにMac版とWin版の開発ツールが両方入っています。Mac OS X ServerにもWebObjectsは付属していますが、こちらは運用環境しか付属していませんので、開発をおこなう場合は開発用のパッケージが必要になります。

必要なもの

 WO以外の環境でWebアプリケーションの開発経験があるようでしたらおそらくHTMLやデータベースに関する知識は習得済みかと思いますが、そうでない場合は、Webアプリケーションで必須となるこれらの技術を学習していかねばなりません。またWOのプログラミング言語はJavaを採用していますので、Javaプログラミングに関する知識も必要になってきます。
 これらの技術をまだ習得できていない場合でも、WOを学びながら必要に応じて学習していけばよいでしょう。プロジェクトによっては少人数で使用する簡単なものから、Internet上で運用する大規模なものまで様々でしょうから、プロジェクトの規模によって求められるスキルも変わってくるかと思います。

 WOは価格が安いこともあり、小規模なプロジェクトでも導入しやすいですし、iTunes Music Storeのような大規模なサービスでも活用されている実績があります。ですので、最初は小規模なものから始めて、あとから徐々に規模を拡大していくようなことも可能です。

データベース

 Webアプリケーションを開発するうえで、様々な技術が必要になってきますが、なかでもデータベースに関するものはほとんどの場合で不可欠な技術となります。データベースといいましても実際には色々な種類がありますが、WOが標準でサポートしているのはリレーショナルデータベースになります。リレーショナルデータベースにアクセスするにはSQLという言語を用いますがWebObjectsではORマッパーという手法を用いることで、Java上でオブジェクトの操作をおこなうだけで、データを自動的にデータベースに格納することができます。
 これはオブジェクトの内容に応じて自動的にSQLが生成される仕組みが提供されているからなのですが、WOでデータベースアクセスをおこなうプログラミングをおこなう場合、SQLをコーディングする必要はありません。(*1)
 ですのでSQLをまったく知らなくともデータベースアクセスをおこなうWebアプリケーションを開発することはできるのですが、最適なSQLを発行するためのチューニングが必要になる場面があり、自動発行されたSQLの意味が分かる程度には最低限なっていたいところです。
 SQLの発行は自動的におこなわれても、データベースを格納するためのデータベースの設計は自分でおこなう必要がありますので、リレーショナルデータベースそのものに関する基本的な知識も必要になってきます。

*1 必要があればSQLを直接コーディングすることもできます。

まとめ

 簡単ではありますがWOで開発を始めるうえでの情報をまとめてみました。周囲にWOで開発をおこなっている開発者でもいないとなかなか情報を集めるだけでも大変かと思いますが、今年はできるかぎり実用的な情報をこの連載で発信していければと思います。それでは今年もよろしくお願いします。

ニュース・解説

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

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃Kagiの決済登録機能を組み込むモジュールがクロスプラットフォームへ
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
オンラインでのシェアウエア料金決済やライセンス販売を行うKagiは、ソフトウエアにKagiでの決済機能を組み込むモジュールを開発して配布している。
Kagi Registration Module(KRM)と呼ばれており、Cocoa、Carbon、REALbasic、Java版がすでにリリースされており、1月にはWindows版とPure Java版、さらに今後はPalm、Director、FileMaker、Revolution、SuperCard、FutureBASIC、Symbianといったプラットフォームに広げる。Cocoa版の組み込みサンプルアプリケーションも参照できるようになっているが、ボタンをクリックすると名前などに加えてクレジットカード番号などを入力するシートが出てきて、アプリケーションの中で購入や登録作業ができるようになっている。サンプルのアプリケーションでは日本語は出ないが、Cocoa向けのフレームワークには日本語の文字列も組み込まれている。

Kagi Registration Module (KRM) Home Page
http://www.kagi.com/KRM/

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃Objective-Cでの可変引数のメソッド
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Objective-Cでの可変引数のメソッドを定義する方法を解説した文書が掲載されている。こうしたメソッドは、「variadicメソッド」と呼ぶそうで、stdargの3セクション目をmanコマンドで見れば、va_startなどとして解説されている。サンプルプログラムとして、NSMutableArrayのカテゴリで、appendObjectsメソッドの引数を可変にする例が掲載されている。

Technical Q&A:Variable arguments in Objective-C methods
http://developer.apple.com/qa/qa2005/qa1405.html

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃正確な時間を得る方法
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
正確な時間を得るためにmach_absolute_timeを利用して時間を取得した場合の数値の単位についての質問に答えた文書が掲載されている。この時間値の単位はCPU依存するため、実際の時間を知るにはCoreServiceのAPIを使うのがいいとしている。もし、CoreServiceが使えない場合にはmach_absolute_timeを使う方法があると説明されている。それぞれのサンプルコードが掲載されている。
Technical Q&A: Mach Absolute Time Units
http://developer.apple.com/qa/qa2004/qa1398.html

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃エンジニアリングツールのMac OS Xネイティブ版がリリース
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Excel Softwareは、ソフトウエアエンジニアリングツール「MacA&D OSX 1.0」をリリースした。Windows版やMac OS 9版は存在していたが、Mac OS Xネイティブバージョンがリリースされた。価格はシングルユーザ版の$1995から。MacA&Dは、UMLによるチャートなどの作成や要求分析、データベーススキーマの設計、ソースの生成などの機能を持つ。なお、同社からはUMLツールのQuickUMLもリリースされている。

Excel Software
http://www.excelsoftware.com/

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃FileMaker 7のアカウント管理を行うツール
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
FileMaker 7向けのアカウント管理ツール「Account Manager 1.0」がFM.NEXUSからリリースされた。FileMaker 7よりデータベースのアカウントの形式が変わり、より細かく設定が可能になっているが、アカウントの管理の機能をより使いやすくするのがAccount Managerである。サーバにあるデータベースをブラウズして、それぞれのアクセス権やアカウントを参照したり、特定のアカウントのログを見るなどをウインドウの中でできるようになっている。5ユーザ版で$179からとなっており、ユーザ数やFSAおよび教育機関向けの割引も設定されている。ユーザ数の多いものは、スクリプトやレイアウト、あるいは全体的な修正が可能になっており、独自に設計変更ができることになる。

Account Manager 1.0 for FileMaker 7
http://fmnexus.com/accountmanager

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

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