MOSA Developer News[MOSADeN=モサ伝]第195号
2006-02-28
目次
- 「WebObjects Dev Report」 第41回 田畑 英和
- 藤本裕之のプログラミング夜話 #86
- 高橋真人の「プログラミング指南」 第84回
- ニュース・解説 小池 邦人
「WebObjects Dev Report」 第41回 田畑 英和
前回に引き続きValidation処理を解説いたします。今回はカスタムEOに独自のValidation処理を組み込む方法をご紹介いたします。EOFはモデルに定義した情報(Allows NullやWidth)に基づいて自動的にある程度のValidation処理を行ってくれますが、より複雑な処理を行いたい場合はカスタムEOに独自の処理を組み込むことができます。
◇プロパティレベルでのValidation
「ビジネスマッチングシステム」ではユーザのProfile情報を管理しています。”MOSAUserData”という名前のEntityでユーザのProfile情報を管理し、このEntityには「自己アピール」文を入力するための”apeal”というプロパティがあります。この”apeal”というプロパティへの入力チェックを行いたい場合にはカスタムEOのMOSAUserData.javaに次のようなメソッドを実装します。
・プロパティレベルでのvalidateメソッド
public Object validateApeal(Object apealValue)
throws NSValidation.ValidationException {
if(((String)apealValue).length() > 100) {
throw new NSValidation.ValidationException("Too long!!");
}
return apealValue;
}
このようなメソッドを準備しておくと、”apeal”へのデータ入力が行われるときに自動的にvalidateApealメソッドが呼び出されて入力値のチェックを実行できます。
このようなメソッドを実装するにはメソッド名を”validate” + Key名として実装します。”apeal”用のvalidateメソッドの場合はvalidateApealという名前のメソッドを実装します。
メソッド内での処理ですが、まずvalidateメソッドでは引数でユーザが入力した値が渡ってきます。ですのでこの値に対して任意のValidation処理を実施することができます。今回の例では、入力された文字列の文字数をチェックしています。EOFはモデルで定義した情報をもとに文字列のサイズをチェックしますが、バイト単位でチェックしますので、ここでは文字数でチェックする処理を例にしてみました。
文字数をチェックして、長過ぎる場合は例外を生成してthrowしています。このようなメソッドを実装した場合、実行時に実際に例外が発生すると前回ご紹介したvalidationFailedWithExceptionで例外を検出することができます。
Validation処理を行った結果なにも問題がなければ、そのまま引数で渡ってきた値をreturnしています。
◇EOレベルでのvalidateメソッド
EOに対して特定の操作を行ったときにEOレベルでのvalidation処理を行うこともできます。EOレベルでのvalidatation処理を行うには次のようなメソッドをオーバーライドします。
・保存時のvalidateメソッド
public void validateForSave() throws NSValidation.ValidationException
・追加時のvalidateメソッド
public void validateForInsert() throws NSValidation.ValidationException
・更新時のvalidateメソッド
public void validateForUpdate() throws NSValidation.ValidationException
・削除時のvalidateメソッド
public void validateForDelete() throws NSValidation.ValidationException
これらのメソッドが、EOに対してそれぞれの操作を行ったときに呼び出されます。メソッドをオーバーライドするときには、まずスーパークラスのメソッドを呼び出してから、独自の処理を組み込むようにします。例えば次のようなコードを実装します。
・EOレベルでのvalidateメソッド
public void validateForSave()
throws NSValidation.ValidationException {
super.validateForSave();
if(Validationチェック) {
throw new NSValidation.ValidationException("Error!!");
}
}
このようなメソッドをカスタムEOに実装しておくと、EOの保存時に自動的に呼び出され、EOの正当性を検証することができます。プロパティレベルでのValidateメソッドと同様に独自のValidation処理を行った結果問題があれば例外を生成してthrowします。
また、このメソッドからはプロパティレベルのvalidateメソッドも呼び出されます。
EOの保存時に自動的に呼び出されるということは、EditingContextに対してsaveChangesメソッドを実行したときに呼び出されます。任意のタイミングでEOレベルでのValidation処理を行いたい場合はEOのvalidateメソッドを直接呼び出すこともできます。
◇エラーメッセージ
validateメソッドでthrowしている例外のメッセージですが、今回はあくまでもサンプルコードとして単純な例を紹介してあります。実際にはメッセージの部分をリソースとして切り出しておいて、別途管理したほうがメンテナンスが楽になるでしょう。
例えばPropertiesファイルにエラーメッセージを書き出しておけば、次のようなコードでエラーメッセージを読み込んで例外に設定することができます。
・例外へのエラーメッセージの設定
String error = System.getProperty(“ERROR_MESSAGE”);
throw new NSValidation.ValidationException(error);
・Propertiesファイル
ERROR_MESSAGE=エラーが発生しました。
このようにプロパティレベルやEOレベルでのvalidateメソッドをカスタムEOに実装しておくことにより、任意のデータチェックを行い、データベースに問題のあるデータが保存されることを防ぐことができます。
藤本裕之のプログラミング夜話 #86
2週間のご無沙汰である。今回の話はややこしいので前置き抜きでサクサク行くぞ。Interface BuilderでNSPanelのインスタンスに設定できる「Non activating panel (panel only)」というアトリビュートはいったいどういう意味かという話である。前回のラストで用意していただいたNibファイルを閉じ……別にコードをなんか書く必要はないが、そのプロジェクトをコンパイル、リンクして実行してもらえば……、一目瞭然とはいかないのでややこしいんだが。
実を言うと、特定の手順にしたがっていただかないとこのアトリビュートの意味はわからないのだ。とにかくここはオレを信じて(笑)以下のような操作を行ってみていただきたい。あ、横着をしてInterface Builderの「Test Interface」で済ませようと思うヒトもいるかも知れないが、あれだと以下のようには動かない。プロセス管理の問題がからむので一概にバグとも言い切れないが、なんの説明もないのは困ったことでは、あるね。
1)このNibファイルを含むプロジェクトをリンクして実行する。前回本稿で解説した通り作っていれば同じようにNSTextFieldを一個擁するNSWindowとNSPanelのインスタンスが画面に現れる。
2)さぁ話はこっからである。何か他のアプリケーション(以下の例ではFinderにしておく)をフォアグラウンドに移動し、テストプログラムをバックグラウンドに追いやる。当然ながらメニューバーはFinderのものに変わる。
3)この状態でNSPanel(このパネルは「Non activating panel」がオンに設定されている)をクリックすると、パネルもウインドウも前面に来て、パネルのNSTextFieldがアクティブになるけど、メニューバーはFinderのままである。
4)再びこいつらをバックグラウンドに追いやる。
5)今度はNSWindowのインスタンスをクリックしてみる。と、こっちの場合はちゃんとメニューバーもろともこのテストプログラムに切り替わる。
対照実験としてNSPanelの「Non activating panel」をオフにして同じことをしてみると、そのインスタンスの振る舞いは上のNSWindowと同じになる。結論としてこのアトリビュートは「そのパネルを出しているプロセスがバックグラウンドにあるとき、それをフォアグラウンドに持って来ることなしにアクティベートされてキーウインドウになれる」ということになる。ガッテンしていただけましたか?
では、ガッテンしていただいたところで次に……行くわけにはいかない。読者諸兄がガッテンしてもオレは納得がいかない。ほら、空を見上げれば「ほんぢゃこのアトリビュートはいったい何の役に立つのだ、実際にどっかで使われてるのか?」ちう疑問がぽっかり浮かんでしまうでしょうが。あの名作、フェリーニの「道」でキ印の男が言うように「どんなものでも何かの役に立ってる」はずなのだ、特にプログラミングの世界では、役に立ってない仕掛けがあったらそれは設計ミスである(まぁ稀に「歴史的理由により」ってのもあるけどね)。
そこで貴重な数時間を使い、このアトリビュートをオンにしていそうなプログラムを探してみた。が、残念ながらこのテストプログラムそのまんま、という状態で使われているものは見つからなかった。例えばOSに付属している「文字パレット」(こいつを出しているアプリケーション本体は、「/System/Library/Compnents」にある「CharacterPalette.component」パッケージの中の「SharedSupport」にある)のパネルは確かにこのアトリビュートがオンなんだが、やってみればわかる通りただアクティベートしただけではキーウインドウにはならない(検索用のNSTextFieldがあるが、それ自体をクリックしないとフォーカスされない)。
とにかくこのアトリビュートは、これとかフォントパネル、カラーパレットみたいなプログラムのためにあるようである。……ここ、突っ込んでくと面白そうだけどそれは各自でやっていただく、とゆーことで次回は次のアトリビュートへ。
(2006_02_23)
高橋真人の「プログラミング指南」第84回
UNIXとしてのMac OS X
〜Perlについて(30)〜
こんにちは、高橋真人です。
さて、この連載でのPerl話も30回を数えることとなりました。前回予告したように、今回から「リストコンテキストを利用したファイル処理」のお話をするわけですが、これでPerlの話題は一区切りとしたいと思います。
もちろん、語り尽くせない部分は多々ありますが、Perlの主立った部分には、つまみ食い的にではありますが、ほぼ触れてきたのではないかと思っています。
「え! まだあの話だって残っているじゃないか」と思われる方もおいででしょうが、そこは私自身のPerlの経験の浅さによるものだということでご甘受いただければと思います。
とはいえ、私としても「まだ、あれも残っているな」と感じるトピックのうちで代表的なものとしては、pack、サブルーチン、オブジェクト指向などがあります。
packというのは、フォーマット指定によってデータ変換をする仕組みです。かなり強力なもので、C言語のprintfのバイナリ対応版とでも言えるでしょうか。
サブルーチンは、Perlでもある程度の規模のスクリプトを書こうとすると必要になってくる仕組みです。ただPerlの場合、変数のスコープが原則的にはグローバルであり、ローカル変数を使おうとするとちょっとやっかいな制約がいくつかあるため、入門者向きのトピックではないような気もします。(私自身も余り使いません。というか、そこまでの規模が必要になってきた場合にはPerl以外の言語を使うでしょう)
オブジェクト指向に関しては、過去の連載(第61回)で触れた通りです。もっとも、かなり前から噂されているPerlの次のバージョンでは、Perl自体の実装言語もCからC++に変えているそうですし、ひょっとしたらもっとまともなオブジェクト指向の仕組みが備わるのかもしれません。
さて、最後のトピックとして説明するためのネタとして、私のハードディスクを漁って拾い出してきたMacPerl向けに書いたテキスト処理のスクリプトを取り上げます。これは、実際に過去の仕事で使ったものです。MacPerlのために書いたスクリプトなので、それに特化した部分もありますが、今回のテーマである「リストコンテキストによる処理」と、さらに「リファレンス」というテクニックも使っています。これらはPerlの技術の中では決して初心者向きのものではないので、コード例を解説するためにはそれなりに説明が必要になるはずです。
まずはコードをご覧いただきましょう。
#0: 管理ID
#1: 基本語
#2: よみ
#3: 品詞
#4: ルール種別
#5: 対象語
#6: 使わない
$file = $ARGV[0];
$file .= ".sort";
open OUT, ">$file" or die;
MacPerl::SetFileInfo('YoED', 'TEXT', $file);
map { print(OUT join("¥t", $_->[0], $_->[1], $_->[2], $_->[3], $_->[4], $_->[5]), "¥n"); }
sort {
if ($a->[6] ne $b->[6]) {
$a->[6] cmp $b->[6];
} elsif ($a->[8] ne $b->[8]) {
$a->[8] <=> $b->[8];
} elsif ($a->[8] == 1 and $b->[8] == 1) {
$a->[2] cmp $b->[2];
} else {
$a->[5] cmp $b->[5];
}
}
map {
$_->[6] = substr($_->[0], 0, 2);
$_->[7] = $_->[5];
$_->[7] =~ tr/亜-熙//d;
if (length($_->[7]) < 1) {
$_->[8] = 1;
} elsif ($_->[7] =~ /A-Z/) {
$_->[8] = 2;
} else {
$_->[8] = 3;
}
$_ ;
}
grep { $_->[6] =~ /False/ }
map { [(split /¥t/)] }
<>;
MacPerl::Answer("Done");
MacPerl::Quit(2);
とりあえず、私が仕事で使ったスクリプトを1バイトの変更もなく載せてみました。まあ、過去に書いたものなので所々気に入らない書き方の部分がありますが、そこは次回からの解説で併せて触れつつ修正したいと思います。
ところで、今回改めて自分の過去に書いたこのスクリプトを見てみて思うのは、大体この連載で触れたPerlについての集大成と言ってもよいものかな、ということです。
逆に言えば「私のPerlの技術はこの程度のものです」ということでもあるのですが(笑)。
ニュース・解説
今週の解説担当:小池邦人
● Carbon ドキュメント & サンプル & SDK ナビゲーション(2005/02/24)
【開発環境】
自作アプリケーションで用いているPPCのAltiVecコードをx86のSSE/SSE2コードに書き換える作業を行ってみました。「浮動小数点処理5%+OpenGL処理5%+整数処理90%」といった処理内容です。画像フィルタのように100%SIMD向きの処理ではなく、少々無茶な使い方なのですが(笑)それでもPowerMac G5でAltiVecに書き換えたところ、かなり処理速度が向上したので、SSE/SSE2にも期待していました。ところが結果は…
PowerMac G5 2GHz Dual (Normal) 53秒
PowerMac G5 2GHz Dual (AltiVec) 38秒
iMac Core Duo 1.83GHz (Normal) 20秒
iMac Core Duo 1.83GHz (SSE/SSE2) 30秒
という感じで、SSE/SSE2を用いた方が遅くなってしまいました(涙)。まあ、Core Duo搭載のiMacはSSE/SSE2を使わなくても整数処理が大変高速なので、結果的にはまったく問題ないのですが(笑)、SSE/SSE2はAltiVecよりも使いどころを考慮しないといけないようですね。
AltiVecからSSE/SSE2への書き換えについては「Universal Binary化の実践」というセミナを開催して詳しく解説する予定です。興味ある方は是非ご参加ください。
http://www.mosa.gr.jp/htmdocs/article/seminar-180407.php
インテル社のウェブサイトには、以下のMac OS X向け開発ツールのβ版リリースが登録されています。これらMac OS X用ツールに関して、インテル社の担当にお話しを聞く機会に恵まれました。現在商品版を開発中であり近々発売時期を発表できるそうです。その時点でβ版のダウンロードはストップされるそうなので、興味ある方は今のうちにダウンロードして試してみましょう!
「インテル(R) C++コンパイラ 9.0」
「インテル(R) Fortranコンパイラ 9.0」
「インテル(R) MKL( Math Kernel Library)ライブラリ 8.0」
「インテル(R) IPP( Integrated Performance Primitives)ライブラリ 4.1」
http://www.intel.com/cd/software/products/asmo-na/eng/227389.htm
gcc以外の本家本元コンパイラが入手できるようになるのは、デベロッパとしても頼もしいかぎりです。これら商品の日本での販売はエクセルソフト株式会社が行い、1年間無料サポート(日本語Q&AもOK)が受けられるそうです。また上記ツール以外にも、インテル社製の「アナライザ(VTune)」「スレッド化ツール」「クラスタ・ツール」などもありますので、これらについてもMac OS X対応に期待したいと思います。
また、インテル社は4月6日と7日に、東京プリンスホテル パークタワーで「インテル・デベロッパー・フォーラム Japan 2006」を開催します。興味がある方は参加してみてはいかがでしょうか?
http://www.intel.co.jp/jp/idf/
【テクニカルドキュメント】
前回から2月24日の期間中、Apple社のDocumentationサイトには新規ドキュメントがひとつも登録されませんでした。その代わり、デベロッパ向け読み物は2つ登録されています。「Working with Quartz Composer」の方については、前号の木下さんの記事も参考にしてみてください。
「Taking Advantage of PDF Kit in Your Cocoa Application」(読み物)
http://developer.apple.com/cocoa/pdfkit.html
「Working with Quartz Composer」(読み物)
http://developer.apple.com/graphicsimaging/quartz/quartzcomposer.html
前回から2月24日の期間中、新規テクニカルノートは2つ登録されましたが、新規テクニカルQ&Aの方はひとつも登録されませんでした。テクニカルノートの方は、両方とも内容の改訂です。TN2125の方は、Windows用QuickTimeに関する記述が追加されています。
TN2118「Kernel Core Dumps 」
TN2125「Thread-safe programming in QuickTime 」
http://developer.apple.com/technicalnotes/index-rev-date.html
【サンプルソースコード】
前回から2月24日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードがひとつだけ登録されました。Core Imageのフィルタを用いてQuickTime Movieを再生するCarbonアプリケーションです。Core Imageに関する機能はCocoa APIですので、CarbonアプリケーションモデルからObjective-Cで記述したルーチンを呼ぶことになります。QuickTime Movieの表示先には、AGLでコンテキストを設定したOpenGLの環境を使用しています。
「QTCarbonCoreImage101」(QuickTime関連)(初版)
http://developer.apple.com/samplecode/index-rev-date.html
【デベロップメント SDK】
前回から2月24日の期間中、Apple社のSDKサイトには新しいSDKが2つ登録されました。Mac OS X 10.4.5対応「Kernel Debug Kit」(PowerPC版とIntel版あり)です。
「Kernel Debug Kit 10.4.5 (Intel)」
「Kernel Debug Kit 10.4.5 (PowerPC)」
http://developer.apple.com/sdk/
また「Darwin Source Code」サイトに、Mac OS X 10.4.5に対応したPPC用とx86用のソースコードが登録されました。
「Mac OS X 10.4.5 (Darwin 8.5) for PPC」
http://www.opensource.apple.com/darwinsource/10.4.5.ppc/
「Mac OS X 10.4.5 (Darwin 8.5) for x86」
http://www.opensource.apple.com/darwinsource/10.4.5.x86/
MOSAからのお知らせと編集後記は割愛します
Apple、Mac OSは米国アップルコンピュータ社の登録商標です。またそのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。
このメールの再配信、および掲載された記事の無断転載を禁じます。
特定非営利活動法人MOSA
Copyright (C)2006 MOSA. All rights reserved.