MOSA Multi-OS Software Artists

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

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

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

2005-07-12

目次

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

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

 前回の続きとして、モデルファイルを作成するときのRelationの詳細設定について解説します。なおEOModelerの使い方については下記のドキュメントが公開されていますので、こちらもあわせて参照していただければと思います。

・Using EOModeler
http://developer.apple.com/documentation/WebObjects/UsingEOModeler/

 さて前回は、MOSAUserとPrefecture Entityの間にRelationを設定するところまでを紹介しました。MOSAUser側からみると対1のRelation、Prefecture側からみると対多のRelationを双方向に設定しました。今回はRelationの詳細設定を解説したいと思いますが、まずはOptionalityの設定からみていくととにしましょう。

Optionality

 Relationが設定されているということは、あるEntity上のデータがRelation先のEntitiy上のなんらかのデータと関係をもつということになります。このときRelationが設定されているからといってかならず関係するデータが必要なわけではありません。
 例えばMOSAUserのデータを登録する場合のことを考えてみましょう。データを登録するさいPrefecture(都道府県)の入力を省略可にする場合も考えられますし、省略不可にする場合も考えられます。
 実際どちらにするのかはどのようなデータを登録させたいかによりますが、省略可にした場合、Relationが設定されていたとしても、あるMOSAUserデータに関係するPrefectureのデータはあってもなくてもよいことになります。一方省略不可にした場合、あるMOSAUserデータには必ず関連するPrefectureのデータが1つ必要になります。
 こういったRelation先のデータの省略可/不可を設定するのがOptionalityの設定になります。Optionalityの設定は省略可か不可の2つだけで、それぞれ次のような呼び方をしています。

・Optional:省略可
・Mandatory:省略不可

 またRelationが設定されるということは、Relation先のデータのプライマリーキーを外部キーとして記録することになります。もしRelationをOptionalとして設定するのであれば、外部キーはNullである可能性(つまりRelation先のデータを省略する場合)がありますので、外部キーAttributeも省略可(Allows Null)の設定にしておく必要があります。

Delete Rule

 Optionalityはデータを登録するときに影響する設定でしたが、次はデータを削除するときの設定です。データを削除する条件の設定としてDelete Ruleがあります。
 例えば、MOSAUserのデータを削除するとしましょう。MOSAUserにはRelationが設定されていますので、データの削除時にはRelationの参照をもつ他のデータに与える影響も考慮する必要があります。MOSAUserデータを削除するといっても、そのMOSAUserデータがRelation先として参照していたPrefectureデータはそのまま残しておくことになるでしょう。

 一方Prefectureのデータを削除する場合はどうでしょうか。Prefectureは都道府県のデータですので、一度登録してしまえば運用上削除するようなことはないかと思いますが、仮に削除するとしましょう。Prefectureは、MOSAUserに対して対多のRelationを設定していました。つまりあるPrefectureデータは複数のMOSAUserデータを参照しているかもしれません。Prefectureデータを削除してしまいますと、そのPrefectureデータをRelation先として設定してあった複数のMOSAUserデータの都道府県情報が失われることになります。こういった問題を防ぐには、Relation先としてなんらかのデータから参照されている場合、そのデータの削除を禁止するといった処置が必要になってきます。
 それでももしPrefectureデータを削除したいとしましょう。このとき問題になるのが削除するデータを参照していたデータの外部キーです。データが削除されると、もはや存在しないデータのプライマリーを外部キーとして持ち続けることになってしまいますので、データの不整合が生じます。ですのでデータを削除する場合には、そのデータをリレーション先として参照していたデータの外部キーをNullに設定する必要があります。

 さらにデータ構造によっては、あるデータの削除時にRelation先のデータも同時に削除してしまいたい場合もあるでしょう。こういったデータ削除時の設定として役立つのがDelete Ruleの設定です。Delete Ruleの設定には次の4種類があります。

・Nullify:削除データをRelation先として参照するデータの外部キーをNull
・Cascade:Relation先のデータも同時に削除
・Deny:他のデータからRelationの参照がある場合は削除を禁止
・No Action:なにもしない

 No Actionはデータの不整合を生じる危険性がありますので、使用する機会はないかもしれませんが、もしNo Actionの設定をおこなう場合は、データの整合性を保つ処理を明示的におこなう必要があります。

設定方法

 Relationを設定したときには、今回説明したOptionalityやDelete Ruleの設定にも注意してください。どのような設定にするかはデータ構造や使用目的によって異なってきますが、双方向のRelationを設定した場合には、両Entity側のRelationでDelete Ruleの設定をおこなうことになりますのでご注意ください。
 実際にこれらの設定をおこなう方法ですが、EOModeler上でRelationを選択し、Inspectorを表示してAdvanced Relationship Inspectorの画面から設定をおこなうことができます。
 今回は予定していた多対多のRelationまで解説できませんでしたがまた次回に解説したいと思います。

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

 さて、今回からCocoaにおけるイベント・ハンドリングの説明をするために、この連載始まって以来のコード満載の話が始まるわけだが覚悟はよろしいであろうか。ご両親やお子さんに言い残したことはありませんか、死後に見つかって恥ずかしいファイルとかは処分しましたか……ってそういう覚悟ぢゃないか(笑)。

 まずXcode(Xcodeでありさえすればバージョンは大して問題ではない……はずである。とはいえ私はこれをXcode2.1でやっているので、ここに書いた通り動作しない場合は2.1でやってみてほしいが)を起動し、Fileメニューから「New Project…」を選択、当然だけど「Cocoa Application」を選ぶ。
 これでスケルトンというか、何もしないWindowが一個出るだけのプロジェクトが出来上がったはずである。時間のあるヒトは一度実行して動くことを確認するべし。あ、実行にあたっては「Build & Run」ではなく「Build & Debug」を選んでほしい。そうするとGDBのウィンドウが開く。そのウィンドウに十分な横幅があれば、ツールバーの一番右に「Console」というアイコンがあるはずなので、これをクリックして「Debugger Console」のウィンドウも開いておくと後々便利である。

 動作を確認したらこれを終了し、プロジェクト・ウィンドウの「Group &Files」の中の「MainMenu.nib」をダブルクリックしてInterface Builderを起動しよう。そして……こういうのを文章だけで説明するのは難しいんだが、さっき出たウィンドウに、(*)パレットから「Custom View」というのをドラッグ&ドロップしてほしい。できましたか? そしたらそれを……ウィンドウの真ん中あたりで、だいたい上下左右に1cmくらい余白がでるくらいにリサイズする。次に「MainMenu.nib」というウィンドウを前面に持ってきて、「Classes」タブを押し、NSObject->NSResponder->NSViewを選んでリターンキーを押す。つまりNSViewのサブクラスを作るわけ。これを「MyBigView」と名付け、Classes メニューから「Create Files For MyBigView」を選んでソースファイルを生成する。ウィンドウの中の「CustomView」を選択し、インスペクタ・ウィンドウの「Custom Class」を選択してこのビューを今作った「MyBigView」とする。
 ここまで来たら、*印繰り返し(笑)。パレットからもう一度「Custom View」をこの「MyBigView」の内側にドラッグ&ドロップして同じ手順、ただしこっちはクラス名を「MySmallView」にする。ウィンドウのなかにちょうど漢字の「回」のように包含関係にある2つのビューが見え、プロジェクトのディレクトリ内に「MyBigView.h」「MyBigView.m」「MySmallView.h」「MySmallView.m」という4つのファイルが出来ていたらOKである。

 InterfaceBuilderを終了してXcodeに戻ったら、とりあえず2つのビューが目に見えるようにそれぞれのクラスの「drawRect:」を以下のようにする。

/* MyBigView.m の drawRect */
-(void) drawRect:(NSRect) rect {

  [[NSColor grayColor] set];
  [[NSBezierPath bezierPathWithRect:[self bounds]] fill];
}

/* MySmallView.m の drawRect */
-(void) drawRect:(NSRect) rect {

  [[NSColor blackColor] set];
  [[NSBezierPath bezierPathWithRect:[self bounds]] fill];
}


 そして今回の眼目、MyBigViewの方にだけ、mouseDown: というメソッドを以下のように定義する。言わずもがなと思うけど、これはNSResponderのmouseDown:をオーバーライドしてることをお忘れなく。

-(void) mouseDown:(NSEvent*) theEvent {

  NSLog(@"MyBigView received 'mouseDown:' message");

}


 これをビルドして「デバッグ」する。と、内側の黒いビューをクリックしても上のメッセージがConsole ウィンドウに出力されるのである。もちろんグレイの部分をクリックしても同じ。これはどういう仕組みでこうなっているんでしょう、というのが次回のお話である。どっとはらい。
(2005_07_07)

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

UNIXとしてのMac OS X

〜Perlについて(16)〜

 こんにちは、高橋真人です。
 さて前回の最後にご紹介しましたs///演算子ですが、これは演算子としてはかなり不思議な見た目をしています。他の多くのプログラミング言語における演算子と比較した場合はもちろんのこと、Perlにおける演算子というイメージからもかけ離れています。しかし、それでもこの演算子はPerlにおいては重要な位置を占め、なくてはならない存在として異彩を放って(?)いるのです。
 使い方としては、既に紹介した以下のような形が普通です。

$string =~ s/ABC/123/;

 s///は置換をするための演算子ですが、この演算子と文字列をつないでいるのもまた演算子です。この「=~」をパターン結合演算子と呼んでいます。
 ところで、多くのPerlの演算子と同様にs///演算子も、既におなじみの$_変数と共に使うことができます。つまり、検索置換対象の文字列が$_変数の中に格納されている場合には、単に以下のような書き方をするだけでよいのです。

s/ABC/123/;

 あまりにシンプルな表現なので、少し違和感を持たれるかもしれませんが、すぐに慣れます(笑)。私の場合、入門の早いうちにこっちの書き方を先に学んだので、むしろこの方がしっくりきます。
 ちなみに、Perlで簡単なテキストフィルタを書く場合に典型的な書き方は以下のような形です。

while (<>) {
    s/a/A/g;
    print;
}

 まだ触れていないことがたくさん盛り込まれているので少し分かりにくいかもしれませんが、これだけで標準入力からテキストを一行ずつ読み込み、小文字のaがあったら大文字のAに変換した上で標準出力に書き出すという処理になります。
 以前CGIを解説した時に説明したように、ファイルの先頭に#!/usr/bin/perlと加えてからスクリプトファイル自体に実行権限を与えてやると、このままテキストフィルタのコマンドとして機能します。
 例えば、テキストファイル(test.txt)がスクリプトファイル(convert.pl)と共にホームディレクトリにあった場合、ターミナルを開いて以下のように打ち込むと、

Mac:~ mosa$ cat test.txt | ./convert.pl > out.txt

 out.txtという名のテキストファイルが作成され、s///演算子によって変換された結果が書き込まれます。もちろん、out.txtという名のファイルが存在していた場合には上書きされてしまうので注意してください。もっとも、その代わりと言うか、上記のout.txtの部分をtest.txtと元のファイル名にしますと、対象ファイル自体を書き換えることができます。

 さてパターン結合演算子は、決してs///演算子の専用ではありません。実はPerlにはm//演算子というのもありまして、これはパターンにマッチするかどうかをテストするためのものです。ところで、以前にパターンマッチの表現を使った時に、正規表現の両側をスラッシュで囲んでいたのを憶えていますか?
 実はm//演算子では、mを省略して書かれることが多いのです。つまり、今までもたびたび登場していた正規表現パターンの表記にはこのm//演算子を使っていたというわけです。
 //もしくはm//を使った正規表現では、改めて言うまでもなく暗黙に$_が対象となっていました。ですから上で説明してきたことと同様に、$_変数に格納された文字列以外のものとパターンマッチングさせたい場合には、パターン結合演算子を使うことになります。
 例えば以前、カラの行または文字列かどうかを判断するために、

if (/^$/)

という書き方をしましたが、検査の対象が$_でなく$stringの場合には、

if ($string =~ /^$/)

というように書きます。
 もっとも、文字列がカラかどうかを検査するのに正規表現を使うのは少し冗長なのですけれども。

ニュース・解説

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

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

【開発環境】

開発してきた自作アプリケーションをx86コードへ移行させる準備として「Universal Binary Programming Guidelines」をざっと読んでみました。しかし、ドキュメントの最後に、PowerPlant用”PPob “リソースのFlipper(エンディアン反転ルーチン)のサンプルソースコードが載っているのには笑ってしまいましたが…。筆者は、開発環境としてMetrowerks CodeWarriorを使い、Carbon+NibファイルでMach-Oアプリケーションを開発しています。PowerPlant等の特別なフレームワークには依存していませんので、プロジェクトをXcodeへ移行するのは簡単です(ほんの数十分)。基本的にはエンディアンとAltiVecの問題だけをクリアすれば、トランジションはそこそこ達成できそうです。ついでに、CodeWarriorがMach-OのX86コードに対応してくれるようになれば、もっと楽なんですけどね(笑)。

それから、今更という感じもありますが(笑)、IBMから新しいPowerPC 970プロセッサが発表されました。以前、このニュースでも開発の噂を取り上げたデュアルコアバージョンの「PowerPC 970MP」と、低電圧版の「PowerPC 970FX」です。Intel CPUへの移行までにはまだ随分と時間がありますので、この両プロセッサを搭載したMacintoshが登場するのは間違いないと思われます。しかし、970MPの方は2.5GHzまでしかクロックが上がっていないので、現行マシン(2.7GHz)との差別化を考えると、このCPUをDualで搭載(4 Core)したPowerMacが登場する可能性が高いかもしれません?一番の注目は、低電圧版の970FXを搭載したPowerBook G5が登場するかという点ですが…う〜ん、今となっては何とも言い難いところです(笑)。

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

前回から7月8日の期間中、Apple社のDocumentationサイトには大量のドキュメントが登録されました。また、デベロッパー向けの読み物がひとつだけ登録されています。ただし、登録されたドキュメントのほとんどが、マイナーな変更(Minor Change)のみです。今回は、その中で「Content Update」と「First Version」と併記されているドキュメントのみをピックアップしてみました。ただし、初版(First Version)のドキュメントとは「Core Endian Reference」のみです。ソースコードをx86への移行させる時に利用するエンディアン反転用のAPIリファレンスです。TIFFやExifファイルの読み込みなどの用途にも利用できるでしょう。

「Cocoa Bindings Programming Topics」(内容更新)
「Cocoa Tutorial for Java Programmers」(内容更新)(PDFあり)
「Cocoa-Java Integration Guide」(内容更新)
「Core Endian Reference」(初版)(PDFあり)
「Multiprocessing Services Programming Guide」(内容更新)(PDFあり)
「Quartz 2D Reference」(内容更新)
「QuickTime API Reference」(内容更新)
「QuickTime Overview」(内容更新)(PDFあり)
「Sync Services Tutorial」(内容更新)
「Text Services Manager Reference」(内容更新)(PDFあり)
「Transferring Data With URL Access Manager」(内容更新)(PDFあり)
「URL Access Manager Reference」(内容更新)(PDFあり)

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

「Ready for the Future: Chronos Switches to Cocoa」(読み物)

http://developer.apple.com/business/macmarket/chronos.html

前回から7月8日の期間中、テクニカルノートはひとつだけ登録されました。また、新規テクニカルQ&Aの方は3つ登録されています。TN2144とQA1394については前号の木下さんの記事を参照してみてください。

TN2144「Detecting low printer ink levels」

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

QA1438「Using the QuickTime DVCompressor properties」
QA1429「Deprecated CALL_ON_[UN]LOAD pragmas」
QA1394「Using NSSound with CoreAudio on Mac OS 10.3.x」

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

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

前回から7月8日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが4つ登録されました。詳しい内容については前号の木下さんの記事を参照してみてください。

「AlbumToSlideshow」(CFXML&NSXML関連)
「QTAudioExtractionPanel」(QuickTime関連)
「ScriptingDefinitions」(AppleScript関連)
「TextTrack」(AppleScript関連)

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

【デベロップメント SDK】

前回から7月8日の期間中、Apple社のSDKサイトには新しいSDKが3つ登録されました。
ひょっとして、かなり以前に登録されていたかもしれませんが、申し訳ない!気づいていませんでした(笑)。「FireWire SDK 20 for Mac OS X」と「Image Capture SDK for Mac OS X v10.4」は、Mac OS X 10.4(Tiger)に対応したバージョンです。

「QuickTime 7.01 SDK 」
「FireWire SDK 20 for Mac OS X」
「Image Capture SDK for Mac OS X v10.4」

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

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

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