2006-02-21
目次
「WebObjects Dev Report」 第40回 田畑 英和
まずは告知から。2/25(土)の19:00からApple Store Shinsaibashiにて開発者向けのイベント「Kansai Developer’s Night」が開催されます。WOの紹介も予定されていますので、お近くのかたはぜひご参加ください。
・Kansai Developer’s Night
http://www.apple.com/jp/retail/shinsaibashi/week/20060219.html
http://developer.apple.com/jp/
さて、今回はValidation処理について解説いたします。Validationは正当性検証などと訳されることもありますが、ようするに入力したデータが正しいものであるかどうかを判定する処理になります。
例えば年齢のデータに負の数が入力されていないかとか、文字列の長さが長過ぎないかといったチェックになります。
◇Webブラウザ側でのチェック
入力する文字列の文字数を制限したい場合は、あらかじめテキストフィールド(1行のテキストフィールド)へ入力できる文字数を制限するようにHTMLをコーディングすることができます。具体的にはmaxlength属性を使って文字数の上限値を設定します。
・入力できる文字数を制限したHTML
<input maxlength=”10″ type=text name=”0.4.3.11″>
これでブラウザ上で入力できる文字の文字数が限定されますので、あらかじめデータベースで定義しておいた文字列のサイズを超えてデータが入力されることを防ぐことができます。ただし、このとき設定をおこなっている値が「文字数」なのか、あるいは「バイト数」なのか注意する必要があります。また使用するエンコーディングによっては1文字あたりのバイト数も異なってきますので、データベース側でどようなエンコーディングを使用しているかも注意する必要があります。
この設定をWebObjects Builder上で行う方法ですが、WOTextFieldを選択した状態でStatic Inspectorを表示し、Maximum Lengthを設定します。ここで設定した値はAttribute “maxlength”として追加され、Dynamic Inspectorでも値を設定することができます。
◇サーバ側でのチェック
1行だけのテキストフィールドの場合はmaxlengthを設定するだけで簡単に入力制限をかけることができましたが、では複数行のテキスト(textareatタグ)を使用した場合はどうでしょうか。複数行のテキストではmaxlengthを使うことはできません。JavaScriptを駆使して、入力中の文字をカウントするという方法も考えられますが、ここではデータを一度サーバ側に送り込んでからサーバ側でチェックする方法を紹介します。
といいましても、実はWebObjectsではモデルで定義した情報に基づいて自動的に文字列のサイズチェックが行われます。EOのattributeを直接Formの項目にバインドしていた場合、FormをSubmitしたときにデータがモデルで定義していた文字列のサイズに収まらないと、EOに対してデータの更新はおこなわれず、データの入力は失敗します。
モデルでの文字列サイズの指定ですが、Attributeの設定でWidthを用いて、文字列の上限値(バイト数)を設定します。
◇エラー処理
自動的にValidation処理が行われるのはよいのですが、デフォルトの挙動ではただデータの入力に失敗するだけですので、このままではユーザはなにがおこったのかよく分かりません。そこで次のWOComponentのメソッドをオーバーライドして、エラー処理を行います。
public void validationFailedWithException(Throwable t,
Object value,
String keyPath)
まず引数の説明ですが第一引数の”t”はValidation処理で発生したExceptionになります。第二引数のvalueにはValidationの対象になったデータが格納され、最後の第三引数にはValidationの対象になった項目の名前が格納されています。
よって、このメソッドをオーバーライドすることにより、どの項目に入力したどのデータが、どのようなexceptionを発生させたかが分かります。例えば次のようなコードで、Validation処理で発生したExceptionのメッセージと項目の名前を取得することができます。
・サンプルコード
public String keyPath;
public String errMessage;
public void validationFailedWithException(Throwable exception,
Object value,
String key) {
keyPath = key;
errMessage = exception.getMessage();
}
・keyPathの例
session.loginUser.mosaUserdata.apeal
・Exceptionのメッセージ例
The apeal property of MOSAUserData exceeds maximum
length of 4096 characters
後はメッセージを画面上に表示すればユーザへのフィードバックになるのですが、デフォルトのメッセージは英文になっているため、このまま使用するには厳しいものがあります。エラーの表示については別途工夫が必要になります。
また、Validation処理のチェックにひっかかった場合にはまた同じページを表示するように処理するなどの対応も必要になってきます。それでは今回はここまでにして、次回はカスタムEOに独自のValidation処理を組み込む方法をご紹介いたします。
小池邦人のCarbon API 徒然草(2006/02/17)
今回は、MWC用プロジェクトの移植作業において、Xcode側でしなければいけない追加処理について解説します。Info.plistやMOSA_Prefix.pchファイルのプロジェクトへの登録、SDKの種類の選択、コンパイルやリンクオプションの設定を行います。
前回は、Xcodeのファイルメニューにある「プロジェクトの読み込み…」機能を利用して、開発プロジェクトをMWC用からXcode用へ移植しました。たとえMWC用のプロジェクトが完全だとしても、移植後のXcode用プロジェクトでは、Resourcesフォルダ内の以下のファイルが未登録のままであることも指摘しました。
1.English.lprojフォルダとその中身のInfoPlist.stringsテキストファイル
2.Japanese.lprojフォルダとその中身のInfoPlist.stringsテキストファイル
3.MosA.icnsアイコンファイル
4.MosD.icnsアイコンファイル
アプリケーションパッケージのResourcesフォルダに保存するファイルについては、Xcodeのプロジェクトウィンドの「グループとファイル」に表示されている、Resources(フォルダの形をした小アイコン)に登録しておく必要があります。
3と4のアイコンファイルはドラッグ&ドロップで、そのままResources内に登録すればOKです。ところが、1と2のEnglish.lprojとJapanese.lprojフォルダは、そのままドラッグ&ドロップで登録しても、アプリケーション作成(Make)後にパッケージ内に保存されません。何と!フォルダではなく、InfoPlist.stringsファイル自身をドラッグ&ドロップして登録します。まずは、English.lprojフォルダ内のInfoPlist.stringsを登録します。続いてJapanese.lprojフォルダ内のInfoPlist.stringsを登録します。すると、Resources内に表示されているInfoPlist.stringsの左側に三角アイコンが付き、それをクリックすることで「English」と「Japanese」という表示が現れます。これにより、2種類(2言語対応)のInfoPlist.stringsがちゃんと登録されていることが判断できます。
筆者は、このInfoPlist.stringsの登録方法を発見するまで、かなり長い間苦しみました(涙)。どう考えてもおかしなユーザインターフェースだと思うのですが?ひょっとすると何か別のアプローチがあるのかもしれません。また、今回のプロジェクトでは用意していませんが、English.lprojやJapanese.lprojフォルダに個別に保存しておいた各言語用(ローカライズした)nibファイルやリソースファイルなども、InfoPlist.stringsと同様に、各ファイル自身をResourcesへとドラッグ&ドロップすることで登録可能です。
次に、「グループとファイル」からプロジェクトアイコン(今回の名称はMOSA)を選択し、ツールバーの「i」ボタンをクリックします(ダブルクリックやファイルメニューからの「情報を見る」でもよい)。すると「”プロジェクト”MOSA”"の情報」というウィンドウがオープンします。上部の「一般」タブを選択し、「ターゲットSDKを使用したクロス開発」メニューで「Mac OS X 10.4(Universal)」を選択します。続いてタブを「ビルド」に切り換え、「コレクション」メニューから「アーキテクチャ」を選択し、下に表示されている「アーキテクチャ」をダブルクリックします。この時に表示されたダイアログで「PowerPC」と「Intel」の両方をチェックしておけば、このプロジェクトの対象アプリケーションは、Universal BinaryとしてMakeされることになります。
今度は、アプリケーションに関する情報が設定されているInfo.plistファイルをプロジェクトに登録します。この登録を行わないと、Makeされたアプリケーションパッケージは不完全のままであり起動することはできません。まず、Info.plistをプロジェクトファイル(MOSA.xcodeproj)と同階層に保存します。そして、「グループとファイル」の「ターゲット」をオープンし、その中のアプリケーション名(MOSA)を選択して、ツールバーの「i」ボタンをクリックします(ダブルクリックやファイルメニューの「情報を見る」でもよい)。すると「”ターゲット”MOSA”"の情報」というウィンドウがオープンします。「ビルド」タブの「コレクション」メニューから「パッケージング」を選び、表示された項目一覧の中から「Info.plistファイル」をダブルクリックします。するとファイル名を入力するためのダイアログがオープンしますので、そこにInfo.plist」と入力すれば登録は完了です。
最後はプレフィックスヘッダファイルの登録です。こちらの名称は「MOSA_Prefix.pch」と付け、やはりプロジェクトファイルと同階層に保存しておきます。先ほどと同様な操作で「コレクション」メニューから「言語」を選び、オプション項目の一覧で「プレフィックスヘッダ」をダブルクリックして「MOSA_Prefix.pch」と入力します。続いて、すぐ下の「プレフィックスヘッダをプリコンパイルする」にチェックを入れると登録完了となります。これにより、プレフィックスヘッダ内に記述されているQuickTime.h(Carbon.hも含まれる)がプリコンパイルされるので、アプリケーションのMake時間を大幅に短縮することが可能となります。
その他のオプションも「”ターゲット”MOSA”"の情報」の「ビルド」において設定します。こうしたオプションは、「”プロジェクト”MOSA”"の情報」の「ビルド」の方でも設定できますが、設定内容はターゲットが優先されますので、混乱を避けるために、ターゲットの方でまとめて設定しておくのが良いでしょう。ちなみに、ディフォルトから変更されているオプション項目は、太文字でリスト表示されています。変更されたオプションをまとめて確認したい場合には、「コレクション」メニューから「カスタマイズされた設定」を選択することで一覧することが可能です。MWC用プロジェクトから移植した場合には、そちらで設定されていたオプションがすべて(完全一致ではない)継続設定されています。
コンパイルやリンクのオプションですが、「コード生成」カテゴリーの「デバッグシンボルの生成」「最適化レベル」「関数プロトタイプの不在」等、加えて「リンク」カテゴリーの「ゼロリンク」「標準ライブラリにリンク」などのON/OFFに注意してください。これらの設定は、開発行程の段階によって逐次切り換える必要があるかもしれません。ちなみに「警告」カテゴリーの「推奨されない関数についての警告」ですが、これをONにすると、QuickDrawなどの古いAPIがソースコード内で呼ばれる度に警告が表示されます。すべてモダンなAPIに切り換えてしまった人にとっては弊害は無いのですが、現実的には非常にうっとおしいので、筆者はこのチェックだけは外しています(笑)。
次回は、PowerPC用のソースコードをUniversal Binary化する時に、一般的に注意すべき点をピックアップして解説したいと思います。最大の関門は、PowerPCとIntel CPUのエンディアンの違いを克服することです。
つづく
SqueakではじめるSmalltalk入門 第56回 鷲見 正人
本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、ウインドウやメニューなどのGUIウィジェットの成り立ちを理解するうえで欠かせない「サブモーフ化」についてです。
▼サブモーフ化とは
サブモーフ化というのは、簡単に言ってしまえば、あるモーフに別のモーフをくっつけて一緒に移動できるようにすることです。イメージとしては、ドロー系ソフトのオブジェクトのグループ化に似ています。ただ、登録する側、される側…というようにいわゆる“親子関係”がはっきりしている点で異なります。“子”に当たるモーフを「サブモーフ(submorph)」と呼び、逆にサブモーフに対して“親”にあたるモーフのことは「オーナー(owner)」といいます。
▼GUI操作でのサブモーフ化
まずサブモーフ化という概念を具体的にイメージしやすいように、GUI操作を使ってサブモーフ化を実際に試してみましょう。
ここでは、四角形モーフ(a RectangleMorph)と楕円モーフ(an EllipseMorph)を用意し、楕円を四角形のサブモーフにしてみます。四角形モーフと楕円モーフはそれぞれ次の式をdo it(cmd + D)して作ることができます。
RectangleMorph new openInHand
EllipseMorph new openInHand
これらのモーフは、GUI操作で画面右下の「部品」フラップから取り出すことも可能です。「部品」タブをクリックしたりドラッグしてフラップ(引き出し)を開き、デスクトップにドラッグ&ドロップします。
[fig.A]四角形モーフと楕円モーフ
http://squab.no-ip.com:8080/mosaren/uploads/56a.png
サブモーフ化にあたり、まず、サブモーフ化したいモーフのオーナーに対する位置を決めておおきます。今は、四角形の中心よりほんの少しだけ右下に置くことにしましょう。楕円モーフはクリックでピックアップすることが出来るので、この操作により持ち上げて、ねらった位置でクリックしてそこに置いてください。なお一部の例外を除き、サブモーフ化したいモーフは、原則としてオーナーの手前になければいけません。
[fig.B]楕円モーフをねらった位置へ
http://squab.no-ip.com:8080/mosaren/uploads/56b.png
次に楕円モーフをコマンドクリック(コマンドキーを押しながらクリック。ブルーボタンクリックとも呼びます)で選択し、現れた赤色ハローをクリックしてポップアップする「埋め込む先…」サブメニューを呼び出します。そのメニューには「ワールド」と「四角形」があるはずなので「四角形」のほうを選びます。これでサブモーフ化の作業は完了です。
[fig.C]楕円を四角形のサブモーフにする
http://squab.no-ip.com:8080/mosaren/uploads/56c.png
ちなみに「ワールド」とはモーフとしてのデスクトップのことです。Smalltalk言語を通じてアクセスする場合は、ActiveWorldとかWorldというグローバル変数に束縛されているので、いつでも参照可能です。これは後に出てくるスクリプトでも使っています。
▼サブモーフ化されたモーフの選択のしかた
いったんサブモーフ化されると、通常、そのモーフはオーナーと一体化します。つまりこの場合、楕円部分をクリックしてピックアップしようとしても、オーナーの四角形ごとピックアップされてしまい、楕円単体でピックアップすることができなくなります。同様にコマンドクリックによる選択もオーナーの選択に代えられてしまいます。
改めてサブモーフのみを選択するには、楕円をいったんコマンドクリックしてオーナーである四角形が選択されるのを確認したあと、もう一度、楕円をコマンドクリックします。なお、この操作のショートカットとして、シフトキーを押しながらコマンドクリックすることでねらったサブモーフを一発で選択する方法も用意されています。
[fig.D]サブモーフを選択
http://squab.no-ip.com:8080/mosaren/uploads/56D.png
余談ですが、この楕円のようにサブモーフ化されたモーフを扱う際に、黒色ハローと茶色ハロー差がはっきりします。もしこの局面で、楕円の黒色ハローをクリックしてしまうと、楕円のサブモーフ化は解除されてしまいます。サブモーフ化を解除せずに楕円のオーナーとの位置関係を変えたい場合は、茶色ハローをドラッグする必要があります。
▼スクリプトでサブモーフ化
サブモーフ化のイメージをつかめたところで、まったく同じ作業をSmalltalkのコードで表現してみましょう。ざっと書き下すと、次のような感じになります。
| rectangle ellipse |
rectangle := RectangleMorph new.
rectangle center: ActiveWorld center.
ellipse := EllipseMorph new.
ellipse center: rectangle center + 10 asPoint.
rectangle addMorph: ellipse.
rectangle openInWorld
メッセージ「center: ポイント」は、モーフの中心の位置を決めるためのものです。先に述べたようにActiveWorldはモーフとしてのデスクトップを束縛しています。他方で、メッセージ「center」はモーフの中心の座標を得るためのものです。これらをまとめると、「rectangle center: ActiveWorld center」という式は、rectangleを画面の中心に据えることを意味していることがわかります。
サブモーフ化には「addMorph: サブモーフ化したいモーフ」というメッセージをオーナーとなるモーフに送ります。「openInWorld」はモーフを画面上に表示するためのメッセージです。
ワークスペースなど文字を入力できる場所で、上のようにタイプするか、このメールからコピー&ペーストして、全体を選択したのちdo it(cmd + D)してみましょう。画面中央に先ほどGUI操作でこしらえたのとほぼ同じ、楕円がサブモーフ化された四角形が現れるはずです。
[fig.E]四角形に楕円をサブモーフ化するスクリプトと評価結果
http://squab.no-ip.com:8080/mosaren/uploads/56e.png
バックナンバー:
http://squab.no-ip.com:8080/mosaren/
ニュース・解説
今週の解説担当:木下 誠
———————————————————————-
Quartz Composerの説明ドキュメント
———————————————————————-
Mac OS Xのグラフィックス環境は、10.4においては、Cooca、Quartz 2D、Core Image、Open GL、QuickTimeと多岐にわたるようになりました。これらをすべて利用した、グラフィックスのためのプログラミング環境が、Quartz Composerです。このQuartz Composerを紹介するドキュメント、「Working with Quartz Composer」が公開されています。
Quartz Composerは、「パッチ」と呼ばれるコンポーネントを接続しながらプログラミングしていきます。このドキュメントでは、ハンズオンでパッチの使い方を説明しています。また、出来上がったファイルはスクリーンセーバとしても利用できますので、その方法も説明しています。
Working with Quartz Composer
http://developer.apple.com/graphicsimaging/quartz/quartzcomposer.html
———————————————————————-
10.4.5用のKernel Debug Kit
———————————————————————-
Mac OS X 10.4.5のリリースにともなって、新しいKernel Debug Kitが公開されています。Kernel Debug Kit 10.4.5です。Intel版とPower PC版が提供されています。
Kernel Debug Kit 10.4.5
http://developer.apple.com/sdk/index.html
MOSAからのお知らせと編集後記は割愛します