MOSA Multi-OS Software Artists

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

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

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

2005-07-26

目次

  • 「WebObjects Dev Report」     第15回  田畑 英和
  • 藤本裕之のプログラミング夜話 #73
  • 高橋真人の「プログラミング指南」  第71回
  • ニュース・解説                小池 邦人

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

 ここ数回モデルファイルの作成方法について解説してきましたが、いつまでもモデルの話ばかりしてられないので、そろそろ次の話題に移っていきたいと思います。
 モデルには、データベースとオブジェクトをマッピングするための情報が定義されていますが、実際にモデルを利用するにはプロジェクトに追加する必要があります。プロジェクトに追加したモデルファイルは自動的に認識されますが、モデルファイルを直接プロジェクトに登録してしまいますとそのプロジェクトからしか認識されません。
 1つのプロジェクトしか作成しない場合はもちろんこれでもよいのですが、プロジェクトを複数作成し、各プロジェクトで共通のモデルファイルを参照したい場合もあります。たとえば一般ユーザ用と管理用のアプリケーションを個別に作成するようなことが考えられます。
 このときそれぞれのプロジェクトに直接モデルファイルを登録してしまいますと、モデルファイルを更新する場合、プロジェクトごとにモデルファイルの更新をおこなわなければならなくなります。このような問題を解決する手段として複数のプロジェクトから共通のリソースを呼び出すための仕組み「フレームワーク」が用意されています。今回はこのフレームワークの作成方法について解説したいと思います。

フレームワーク

 WebObjectsアプリケーションを開発する場合は、Xcodeで新規プロジェクトを作成(「WebObjects Application」タイプを使用)するのが一般的ですが、このタイプのプロジェクトを作成するとすでにプロジェクトにいくつかのフレームワークが登録されています。
 ここで一応フレームワークについて簡単に説明しておきますと、ライブラリや画像ファイルなどの様々なリソースをたばねて、他のプロジェクトから参照可能にするのがフレームワークの役割です。”/System/Library/Frameworks”にシステム標準のフレームワークがあらかじめインストールされていることを確認することができます。フレームワークは既存のものを利用することもできますし、自分でフレームワークを作成することもできます。フレームワークにはとにかく色々なファイルを格納することができますので、モデルファイルを格納したフレームワークを作成しておけば、そのフレームワークを複数のプロジェクトから参照し、1つのモデルファイルを共有することが可能になります。こうしておけばフレームワーク内のモデルファイルだけをメンテナンスすればよいことになります。またフレームワークにはJavaプログラムも格納しておくことができますので、共通して利用するようなロジックをフレームワーク化して、複数のプロジェクトから利用することもできます。

フレームワークの作成

 では実際にどのようにしてフレームワークを作成するかですが、Xcodeで新規プロジェクトを作成するときに「WebObjects Framework」を選択してください。これでまず空のフレームワーク用プロジェクトが生成されます。
 空のプロジェクトが作成できましたら次に、モデルファイルをプロジェクトに登録します。プロジェクトにはあらかじめいくつかのグループが設定されていますが、モデルファイルを登録する場合は「Resources」グループあたりがよいでしょうし、新しいグループを作成してそちらに登録してもよいです。
 フレームワークのインストール先ですが、”/Library/Frameworks”にインストールします。また、WebObjectsのサンプルにもいくつかフレームワークのサンプルが登録されていますので、次のディレクトリも参照してみてください。

・サンプルフレームワーク
/Developer/Examples/JavaWebObjects/Frameworks

フレームワークの利用

 フレームワークが作成できれば、あとはそのフレームワークをプロジェクトに登録することにより、プロジェクトからフレームワーク内のモデルファイルやその他のリソースにアクセスできるようになります。
 このようにフレームワーク化をおこなっておくことにより、効率よく開発がおこなえるようになりますが、どのような区切りでフレームワークを作成するかは十分検討する必要があります。無秩序にフレームワークを作成していってしまいますと、今度はかえってフレームワークのメンテナンスに手間がかかってしまう、なんてことになりかねません。
 またどのようにフレームワークを作っていけばよいかよく分からないような場合は、まずはプロジェクトを単体で開発していき、そのなかからまとまりのある部分や、他のプロジェクトと共通している部分をフレームワーク化していくのもよいでしょう。

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

 承前。優秀で勤勉なる我が読者の皆さんのこと、大多数はワタシが前回ここで作ってみせたサンプルプログラムと同じものを自分で作成、あーだこーだといろいろ試しまくり調べまくり納得しまくっただろうから、今回ワタシがする説明などは必要なくなっているだろうと思う。しかしワタシは「一握りのエリートだけが国の将来を左右するに足るような高等教育を受ければいい、シモジモは読み書きそろばんくらいでいいのだ」という三浦朱門先生みたいな考え方には反対である。予習復習をキチンとやるようなヨイ子は確かに手間もかからず頼もしいが、サボリまくりの劣等生の中にもしかしたら天才がいるかも知れないのだ。エジソンもアインシュタインも初等教育の段階では劣等生だったことを忘れてはいけないのである(音楽盛り上がって)。
 
 閑話休題。前回ワレワレは(という疑似共犯的書き方は好きではないが)、NSViewのサブクラスを2種類つくって一方(MySmallView)を他方(MyBigView)に包含される形に配置し、背後にあるMyBigView の mouseDown:をオーバーライドして前面の MySmallView をクリックしたときも MyBigViewに mouseDown: メッセージが送られてくることを見た。これはどういう仕組みなのか。
 ウィンドウとその内部に配置されるビューなど包含関係を成すオブジェクトの集合は、NSResponderのサブクラスとして、Nibファイルからロードされてメモリ上に配置された時に一連の「レスポンダ・チェイン」というものを形成する。レスポンダ・チェインはNSResponderクラスの唯一のインスタンス変数である _nextResponder というオブジェクトへのポインタを介したいわゆるリスト構造で、上の例でいえばMySmallView(正確に言うとMySmallViewのインスタンス、長いので省略する。以下も同じ) はそのインスタンス変数_nextResponder にMyBigView へのポインタを保持し、MyBigView は同じくウィンドウの contentView を保持している。
 そして、サブクラス(あるいはカテゴリ)によってオーバーライドされないNSResponderの mouseDown: の中身は(ソースが公開されてないので「おそらく」だが)以下のようなものである。

-(void) mouseDown: (NSEvent*) theEvent {
    [_nextResponder mouseDown:theEvent];
}


 もうお分かりだろうが、mouseDown: をオーバーライドしていないMySmallViewはマウスクリックが起こるとこれを実行する。こいつの_nextRespnder はMyBigViewなので、MyBigView にmouseDown: が送られ、それはオーバーライドされて console にメッセージを出すようになっている、という寸法で、前回最後に見た実行結果が現出したわけである。おわかりか。
 なお、このMySmallViewの代わりにNSButtonやNSTextFieldなどを配置した場合、NSBigViewにmouseDown: は送られて来ない。確かにNSButtonもNSTextFieldもNSResponderのサブクラスには違いないが、それ自体が既にmouseDown: をオーバーライドしているから。そんなこと当然ではないかと思うかも知れないが(いや、オレもそう思ったんだけど)、以前どっかで上のようなレスポンダ・チェインの説明に、先頭にNSButtonがある図を使ってるのを見たような気がするので念のため。

 次回はレスポンダ・チェインのもう一つの活躍ドコロ、ちうかこっちがメインの活躍場所だけど(だって上のような一種のパス機能を意図的に使う機会ってそうないからね)、「nil をターゲットにしたアクション」を説明する。そして、「ファースト・レスポンダ」にまつわる思い込みや勘違いをただしたい。では。
(2005_07_21)

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

UNIXとしてのMac OS X

〜Perlについて(17)〜

 こんにちは、高橋真人です。
 さて前回の最後に、Perlで正規表現を記述するときに最もよく使われる//という演算子は、本当はm//という形だということをご紹介しました。このm//演算子にはいくつかのオプションを指定することができます。今回はこのオプションについてのお話です。
 Perlのリファレンスを見ますとm//演算子に付けられるオプションは7つもあるのですが、すべてを説明するのはこの連載のポリシーに合いませんので(笑)、代表的なものを二、三紹介します。

 まずは、s///演算子のところでも触れたことがあるので憶えている方もおいでかもしれませんが、gです。たとえば以下のように使います。

if ($string =~ m/abc/g) {
    ...
}


 このようにすると、abcという正規表現は、$stringの中に含まれるabcという文字並びすべてにマッチすることになります。ただ、ちょっと考えてみればお分かりのように、このような書き方をするときにgオプションを使うことにはあまり意味はありません。なぜなら、$stringの中にabcが一つでも含まれていれば、それだけで条件判断は成立してしまいますから。マッチ個所が二つあろうが三つあろうが条件が成立したことに変わりはありません。
 そもそもm//演算子にgオプションを付ける意味なんてあるんでしょうか? もちろんあるんです。ここがまたPerlの面白いところでもあり、複雑なところでもあるのですが。
 今まで条件判断の中でm//演算子を使ってきましたが、実はここがスカラーコンテキストなのだということに気付かれていたでしょうか? さあ、出てきましたよ、「コンテキスト」(笑)。もう忘れてしまった人は連載の62回目あたりを読み返してみてくださいね。
 さてm//演算子は、スカラーコンテキストでは真偽値を返します。つまり、パターンマッチングが成功すれば真を返し、ダメなら偽を返すのです。では、リストコンテキストではどうなるのかということですが、まずは以下のコードを見てください。

@matched = $string =~ m/abc/g;

 ちょっと、見慣れないと何をしているのか分かりにくいかもしれませんが、パターンマッチングを$stringに対して行い、その結果を@matchedに代入しているのです。ごらんのように@matchedはリスト変数ですから、この代入式はリストコンテキストになります。
 では、実際に走らせて、リストに何が入るのかを見てみましょう。

$string = 'aBcdefABCdefabcffabc';
@matched = $string =~ /abc/g;
print @matched;

 出力結果は、

abcabc

となりました。
 本当はもう少し体裁よくプリントしたいところですが、そのためにはまた新しい要素をいくつか説明しないとならないので、今回はリストをそのままprint演算子に渡します。print演算子は、リストを処理するときすべての要素を連結した形で出力します。従って、@matchedの中身は(‘abc’, ‘abc’)だということです。
 以上でお分かりの通り、m//演算子にgオプションを付けた場合、リストコンテキストではマッチしたものすべてをリストにして返すことになっています。(ただしgオプションを付けない場合にはまた状況が異なるのですが、話が複雑になるため今回は説明から除外します)

 さて次は、iオプションです。iを付けるとm//演算子は大文字と小文字の違いを無視します。早速やってみましょう。オプションは複数のものを併用できますから、先ほどの例にiオプションを加えて試してみます。

$string = 'aBcdefABCdefabcffabc';
@matched = $string =~ /abc/gi;
print @matched;

 出力結果は、

aBcABCabcabc

となります。
 パターンの際には大文字と小文字の違いが無視されますが、マッチした部分が変化するわけではないので、リストコンテキストで返されるとき、それぞれの要素の大文字、小文字はオリジナルのままです。
 さて、以前「大文字、小文字を問わない」表現として、[aA][bB][cC]というものを紹介しましたが、Perlの場合には、iオプションを使うことでよりシンプルに表現できるのです。

ニュース・解説

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

Carbon ドキュメント & サンプル & SDK ナビゲーション(2005/7/22)

【開発環境】

日本でも、Apple社によるWidgetダウンロードサイトが立ち上がりました。
MOSAでは「Dashboard Widgetプログラミングセミナー」開催を機に、様々なカテゴリーのWidgetを会員の皆様から募集しています。例えば、以下のようなカテゴリーのWidgetの開発にチャレンジしてみてはいかがでしょうか?

「株価」「乗り換え案内」「地図」「辞書」「和風単位換算」「占い」「今日は何の日」「映画情報」「時刻表」「ライブカメラ」「交通情報(渋滞情報とか)」「貨物追跡」「イエローページ」「郵便番号検索」「今日の料理」「お買い得情報」「Mixi更新状況」「パッケージツアー情報」「ヤフオクウオッチャ」「花粉情報」「サーチエンジン系」「行楽情報」「日本の祝日・六曜」「ゲーム系」「iCalビューワ」「たまごっち系」「UGイベントカレンダー」

開発されたWidgetについてご連絡を頂ければ、Apple社ご協力のもと、MOSAおよびApple社ウェブサイトやメーリングリストにて、積極的にご紹介したいと考えています。
ご連絡はMOSA事務局までどうぞ!

MOSAのWidgetセミナー内容に関しては以下のサイトをご参照ください。
http://www.mosa.gr.jp/htmdocs/article/170701-dashboard.htm

Apple社のサイトではWidgetのダウンロードサイトも立ち上がっています。
http://www.apple.com/jp/downloads/macosx/

一般ソフトウェアやWidgetの申し込みのガイドライン(Apple社)はこちらです。
http://www.apple.com/jp/downloads/macosx/submit/index.html

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

前回から7月22日の期間中、Apple社のDocumentationサイトには新規ドキュメントがひとつも登録されませんでした。その代わりに、新規のデベロッパー向け読み物が2つ登録されています。「Simplifying Data Handling with Uniform Type Identifiers」については、前号の木下さんの記事を参照してみてください。

「Using Automator to Expand the Market for Your Software」(読み物)

http://developer.apple.com/macosx/automatormarket.html

「Simplifying Data Handling with Uniform Type Identifiers」(読み物)

http://developer.apple.com/macosx/uniformtypeidentifiers.html

前回から7月22日の期間中、新規テクニカルノートは2つ登録されました。新規テクニカルQ&Aの方は4つ登録されています。QA1439では、「kEventControlHit」イベントでControl(HIView)のPart Codeを受け取るには、先んじて「kEventControlHitTest」イベントを受け、その処理の中でPart Codeを渡す必要があることがソースコードと共に解説されています。TN2138については、前号の木下さんの記事も参照してみてください。

TN2138「QTKit Frequently Asked Questions」
TN2148「Multi-Buffer Aware Image Decompressors」

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

QA1439「Why am I not receiving kEventControlHit events for some of the parts of my custom HIView?」
QA1357「Mixing link-local IP addresses and routable IP addresses」
QA1389「Problems getting Bonjour TXT record information」
QA1424「What are the predefined macros for GCC?」

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

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

前回から7月22日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが8つ登録されました。QuickTime関連のサンプルソースコードが多いのは、古いQuickTime APIをモダンAPIに差し替えたサンプルの提供が活発化しているためのようです。「WhackedTV」と「QTCoreImage101」はCocoa用のサンプルソースコードで、後者は、Movie再生中の映像に「Core Imageエフェクト」をかけるサンプルです。

「ASCIIMoviePlayerSample」(QuickTime関連)
「CaptureAndCompressIPBMovie」(QuickTime関連)
「QTCoreImage101」(QuickTime関連)
「QTCarbonShell」(QuickTime関連)
「SimpleAudioExtraction」(QuickTime関連)
「WhackedTV」(QuickTime関連)
「EnhancedAudioBurn」(DiscRecord関連)
「Quartz Composer QCTV」(Quartz Composer関連)

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

【デベロップメント SDK】

前回から7月22日の期間中、Apple社のSDKサイトには新しいSDKが2つ登録されました。最近、.Macでは、新しい「bandwidth/storageアップグレード・オプション」が開始されたようですので、「.Mac 2.0 SDK」は、それに合わせたバージョンアップかもしれません。「Kernel Debug Kit 10.4.2」は、最近登場したMac OS X 10.4.2に対応したバージョンとなっています。

「.Mac 2.0 SDK Developer Preview」
「Kernel Debug Kit 10.4.2」

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

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

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