MOSA Multi-OS Software Artists

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

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

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

2005-12-20

目次

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

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

 前回、前々回とセッション、アプリケーションの処理について解説してきましたが、今回はダイレクトアクションの解説をしたいと思います。ダイレクトアクションについてはその呼び出し方などを以前解説済ですが、今回はダイレクトアクション内部の実装方法について紹介します。

 単純なダイレクトアクションには次のようなものがありますが、こちらのダイレクトアクションは”Main”ページを呼び出すだけの単純な処理です。

・単純なダイレクトアクションの例

     public WOActionResults defaultAction() {
         return pageWithName("Main");
     }


 このようなダイレクトアクションでは、いつも同じ処理しかおこないませんが、ダイレクトアクションにパラメータを渡すことによって、たとえば任意の条件での検索処理などが可能になります。
 ビジネスマッチングシステムでは特定のユーザの情報を表示するという処理をダイレクトアクションでおこなっていますが、これを例に処理の実装方法をみていきましょう。

・パラメータをともなうダイレクトアクションの例

     public WOActionResults browseCareerAction() {
          String mosaUserId = request().stringFormValueForKey("id");
          MOSAUser selectedUser = findUser(mosaUserId);

          if(selectedUser != null) {
               WOComponent nextPage = pageWithName("UserCareer");
               nextPage.takeValueForKey(selectedUser, "selectedUser");

               return nextPage;
          }

          return browseAction();
     }


 まずパラメータの取り出し方ですが、セッションをもった通常のアクションでは、あらかじめWebObjects Builder上でバインドしておいた情報に基づいて自動的にパラメータの処理がおこなわれます。一方ダイレクトアクションではパラメータを直接操作する必要があります。
 HTTPで渡されるパラメータはkey=valueの形式になっていますが、リクエストデータからkeyを指定してvalueを取り出す必要があります。この処理をおこなっているのが次のコードになります。

String mosaUserId = request().stringFormValueForKey(“id”);

 このときkeyとして”id”を指定し、request()が返すWORequestのインスタンスからvalueを取り出しています。valueを取り出すにはWORequestのメソッドのstringFormValueForKey()を使用していますが、このメソッドはString型としてvalueを返してくれます。formValueForKey()というよく似た名前のメソッドもありますが、こちらはObject型でvalueを返します。
 パラメータが複数ある場合は、必要に応じてそれぞれのvalueを取り出すことになります。なおパラメータがPOSTでクライアントから送信されてきた場合でも、GETで送信されてきた場合でも、同じコードの処理で対応できます。

 次の処理はfindUser()を使って、パラメータで指定されたidをもとにユーザの検索をおこなっています。findUser()の実装は次のようになっています。

     private MOSAUser findUser(String mosaUserId) {
          EOQualifier qualifier = EOQualifier.
             qualifierWithQualifierFormat(
                 "mosaUserId = %@",
                 new NSArray(Integer.valueOf(mosaUserId)));
          EOFetchSpecification fetchSpec =
             new EOFetchSpecification("MOSAUser", qualifier, null);

          EOEditingContext ec = new EOEditingContext();
          ec.lock();
          NSArray results = ec.objectsWithFetchSpecification(fetchSpec);
          ec.unlock();

          if(results != null && results.count() == 1) {
               return (MOSAUser)results.objectAtIndex(0);
          }

          return null;
     }


 これは通常の検索処理ですが、ダイレクトアクションではEditingContextの使い方に注意する必要があります。セッションをもたない場合にはセッションが提供するdefaultEditingContextを使用することができませんので、明示的にEditingContextを生成して処理をおこなう必要があります。
 またセッションとdefaultEditingContextを使用すると、EditingContextのロックを自動的におこなってくれますが、ロックの処理も明示的に行う必要があります。
 ユーザが1人だけ検索された場合には、そのユーザをセットしてUserCareerページに移動し、もし検索できなかった場合にはbrowseAction()メソッドを利用して別のページに移動しています。

 このようにダイレクトアクションでは、パラメータの処理を実装する必要があったり、EditingContextを用意する必要がありますので、コードの量は若干多くなります。それでは、次回はダイレクトアクションへのパラメータの指定方法について解説します。

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

 では前回の続き。Interface BuilderのNSWindow Inspector、Attributesで指定できる項目を追ってみる。Auto Save Nameの下には「Title Bar Controls」として3つのチェックボックスがある。……まぁこれの説明は要りませんな、タイトル・バーの左上に並ぶ、赤(クローズ)、黄色(ミニマイズ)、緑(ズーム)のボタンを活かすか殺すかのスイッチであり、このタイトルバー自体を持たないウィンドウはInterface Builderだけで作ることはできないんであった。
 その次に並んでいるのが「Window Backing」というラジオボタン3つ。これも既にみたように、ウィンドウの描画の仕方を指定する。覚えてますかね。

 その下にいろいろとチェックボックスが群れをなしているんだが、これらを一個ずつ検証して行こうというわけだ。
 まず最初、「Release when closed」というのは文字通り、クローズされたときにこのインスタンスをリリースしてしまうという意味だろうが、どんな時に指定/解除するのだろうか。例えばドキュメント・ベースのアプリケーションなどの場合、1ドキュメントがすなわち1ウィンドウを構成し、ウィンドウが閉じられればそのドキュメントが閉じられることになる。自動的にそのインスタンスが解放された方が嬉しい。それに対して例えば初期設定のパネルのような、ユーザーによって何度開かれるかわからないウィンドウの場合は、逆の方がいい。
 ……もう少し具体的に見てみようか。ウィンドウひとつにチェックボックス1個、ボタン2個を並べ、チェックボックスを「□Release when closed」とする。ボタンはそれぞれ「Close」と「OrderOut」。NSObjectのサブクラスをひとつ作り、そいつのIBOutletとして、このウィンドウ本体とチェックボックスを連結。IBActionとして以下の4つを定義する。

-(void) closeWindow:(id) sender {
    [ourWindow close];
}                          // 当然、「Close」ボタンに連結

-(void) orderOutWindow:(id) sender {
    [ourWindow orderOut:self];
}                          //  「OrderOut」ボタンに連結

-(void) toggleReleaseFlag:(id) sender {
    [ourWindow setReleasedWhenClosed:
            ([sender state] == NSOnState) ? YES:NO];
}                            // チェックボックスに連結

-(void) openWindow:(id) sender {
    [ourWindow orderFront:self];
}                            // メインメニューのFile->Openに連結


あと、Interface Builderでの設定を起動時にチェックボックスに反映するための以下のコードを書けばテストの準備完了。

- (void) awakeFromNib {
    [ourCheckBox setState:([ourWindow isReleasedWhenClosed] == YES) ?
                                                    NSOnState:NSOffState];
}

 さぁ、実験開始。まずはチェックボックスの状態に構わず「OrderOut」ボタンと「Open」メニューを交互に実行してみる。当然ながらこの場合、「OrderOut」でウィンドウが画面から消え、「Open」で再び現れる。次にチェックボックスを「オフ」、すなわち「Close時にウィンドウを解放しない」状態にして「Close」ボタンから「Open」のワンツーパンチ。この場合も「Open」でウィンドウは再び開く。
 ではいよいよ本日のメインイベント、チェックボックスをオンにして同じ手順をやってみると……、ああ残念ながら紙幅が尽きた。どうなるか知りたい人はやってみること。知りたいけどやるのは面倒なヒトは2006年正月の新年特大号(つうのがあるのか)を待て(笑)!
(2005_12_15)

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

UNIXとしてのMac OS X

〜Perlについて(26)〜

 こんにちは、高橋真人です。さて前回学んだPerlにおけるファイル処理のオーソドックスなパターンを、早速以前の正規表現処理に応用してみましょう。
 以前の処理は以下のようなものでした。

$file_path = '/Users//Desktop/data.txt';
open IN, "$file_path" or die;

$data = join "", <IN>;

while ($data =~ m/(¥d+¥.¥d+¥.¥d+[^¥t]*)¥t([^¥t]+)¥t(.+)¥n/g) {
     print "日付:" . $1 . ", 内容:" . $2 . ", 状況:" . $3 . "¥n";
}

print "Done¥n";


 この例では、join “”, <IN>というように、<>演算子をリストコンテキストで使っているため、ファイルの内容がリストとして(リストにはファイルの各行が入ります)一挙に読み込まれてしまいます。ですから、サイズの大きいファイルの場合にはメモリーへの圧迫も大きくなります。
 では早速、これをPerlのオーソドックスな処理に変えてみましょう。

$file_path = '/Users//Desktop/data.txt';
open IN, "$file_path" or die;

while (<IN>) {
     chomp;
     if (/(¥d+¥.¥d+¥.¥d+[^¥t]*)¥t([^¥t]+)¥t(.+)/) {
          print "日付:" . $1 . ", 内容:" . $2 . ", 状況:" . $3 . "¥n";
     }
}
print "Done¥n";

 ところで、もしかしたら以前もトラブった方がおいでかもしれませんが、今のMacでPerlを使う場合、これはUNIXの領域になるので、ファイルの改行コードはLF(0x0a)でなければなりません。CR+LF、つまりWindowsタイプの場合では、CR(0x0d)がゴミとして邪魔をするだけですが、Mac本来のCRを使ったテキストファイルは、UNIX系のソフトからはすべてが1行につながった状態に見えてしまうので、うまく行かないのです。
 それと、Perlスクリプトとデータファイルのエンコードは、共にUTF-8にする必要があるかもしれません。この連載の本文はシフトJISを使用しているために、いわゆるバックスラッシュを¥マークにしてありますが、スクリプトをUTF-8にした場合には、ここもバックスラッシュに打ち替える必要があるかもしれません。
 単にこれだけのことをするのに、前提条件がいろいろと出てくるのがテキスト処理の厄介な点の一つなのかもしれません。テキスト処理を中心に仕事をしている人なら、一度ならずも「あーあ、何で日本人に生まれてしまったかなぁ」と嘆いた経験があるのではないでしょうか(笑)

 さて、本題に戻ります。
 書き替えた方のスクリプトでは、if文を使って、いちいち条件判断をしているので少し冗長に見えるかもしれません。ですが、Perlの場合、if以下を後ろに持ってきて、

print “$n” if ($n < 10);

などというような書き方ができるので、幾分すっきりさせることはできます。
 さらに、Perlではダブルコーテーションで囲った文字列の中には変数を埋め込めますから、上記のprint文は、以下のように書くこともできます。

print "日付:$1, 内容:$2, 状況:$3¥n";

 こうすると、ずっとコンパクトになって読みやすくなりますね。
 それと、書き替えたスクリプトでもう一つ注目すべきなのは、正規表現の部分が単にスラッシュで囲まれただけになっていることです。以前にも触れたと思いますが、m//演算子は、検索の対象が$_の場合には、=~演算子で検索対象を明示する必要がありませんし、さらに 'm' も書かなくてもよいのです。というより、むしろPerlで正規表現を書く場合、m を書くことの方が少ないかもしれません。
 さて、以上で処理はだいぶオーソドックスになってきましたが、あと一つ。読み込むデータをスクリプトに直接埋め込んでしまっているのでは、余りにも汎用性がなさ過ぎますので、次回はファイル名を動的に与えるやり方についての解説をします。

ニュース・解説

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

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

【開発環境】

今回もApple側からのネタがありませんので(笑)MOSA会員専用掲示板(MOSAdeBB)に登録された興味深いスレッドをご紹介しておきます。まだMOSAdeBBをのぞいたことのない会員の方は、ぜひお立ち寄りください。

http://www.mosa.gr.jp/bb/modules/newbb/

【談話室】フォーラムから…

「皆さんの環境は?」

MOSAのメンバーがどんな開発環境で作業をしているのかと言う質問が上がったのをきっかけに、話はC++からOOPへと幅広く展開しております(笑)。

【プログラミング技術Q&A 中・上級】フォーラムから…

「WebKitが作成するキャッシュファイル」

CarbonからWebKitを利用した時、自動で作成されるキャッシュファイルの取り扱いについての質疑応答です。

「DataBrowserでCheckBoxをあとからEditableにする方法」

CarbonのDataBrowserで「check box」を使う場合についての考察です。対象APIの機能チェックには最新のサンプルを利用しましょうという教訓付き(笑)。

「Xcodeでプロジェクト名と別のプロダクト名にするには?」

Xcodeで開発する場合のプロジェクト名とプロダクト名の設定の仕方について解説されています。

「Carbon Font Panelで文字カラー」

Carbonから「Font Panel」を利用する場合、そこから文字カラーの情報を得る方法が説明されています(Mac OS X 10.4.3から可能になったもよう)。

「Quartzでindexed color は?」

Quartz 2Dでは、indexed color(カラーパレット256色)の取り扱いはどうなっているのかという話題が取り上げられています。

「読み取り専用とファイルのロック」

PosixPermissionsでファイルの読み取り専用を判断する方法と、Finderでのロックを検出するCocoaメソッドはあるのか? という質問を軸に、ファイル処理回りの話題が展開しています。

【プログラミング技術Q&A 入門・初級】フォーラムから…

「スクリーンキャプチャ」

Macintoshのスクリーンを高速にキャプチャする方法について、いくつかのヒントが書き込まれています。こうした処理では、マウスカーソル画像が同時にキャプチャできない点がボトルネックになるもよう。

「Cのリファレンス本」

メンバーの方々が推薦されるCのリファレンス本の話題です。

「CrossDevelopment」

Xcode 2.2を利用し、Mac OS X 10.3.Xや10.2.Xなどの旧バージョンOSで問題なく起動するアプリケーションを開発する方法について考察されています。色々と制限があるようですので要注意!

「pascalってなんでしょう?」

Carbon Framworkにおいて、ルーチンの先頭に「pascal」と定義されているコールバックルーチンがありますが、その「pascal」の意味が何であるのかが解説されています。そこには意外な顛末が….。

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

前回から12月16日の期間中、Apple社のDocumentationサイトには数多くのドキュメントが登録されました。ただし、大部分は今までの内容のマイナーチェンジです。今回は、その中で初版と内容が大幅変更になったドキュメントだけをピックアップしました。今回の初版は「DVD Playback Services Programming Guide」のみですね。また、デベロッパー向け読み物も5つ登録されました。Xcode関連の読み物が3つ登録されています。そろそろエンジンをかけなさいと言うApple社からの暗黙の圧力でしょうか(笑)。「Moving Your Project from CodeWarrior to Xcode」については、前号の木下さんの記事も参照してみてください。

「Apple Human Interface Guidelines」(PDFあり)
「Dashboard Programming Topics」(PDFあり)
「Dashboard Tutorial」(PDFあり)
「DVD Playback Services Programming Guide」(初版)(PDFあり)
「Process Manager Reference」(PDFあり)
「Search Kit Programming Guide」(PDFあり)
「Universal Binary Programming Guidelines, Second Edition」(PDFあり)

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

「Working with Xcode Build Settings」(読み物)

http://developer.apple.com/tools/xcode/xcodebuildsettings.html

「Salon Transcripts Exploits Benefits of Mac Advantages」(読み物)

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

「Moving Your Project from CodeWarrior to Xcode」(読み物)

http://developer.apple.com/tools/movingfromcodewarrior.html

「Getting Control with Subversion and Xcode」(読み物)

http://developer.apple.com/tools/subversionxcode.html

「Sound of Opportunity: The Audio Units Community Takes Off」(読み物)

http://developer.apple.com/audio/audiocommunity.html

前回から12月16日の期間中、新規テクニカルノートはひとつも登録されませんでしたが、新規テクニカルQ&Aは2つ登録されました。「How can I handle smooth mouse wheel scrolling?」の方については、前号の木下さんの記事を参照してみてください。

QA1180「Is dlopen available on all versions of Mac OS X?」
QA1453「How can I handle smooth mouse wheel scrolling?」

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

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

前回から12月16日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードがひとつも登録されませんでした。

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

【デベロップメント SDK】

前回から12月16日の期間中、Apple社のSDKサイトには新しいSDKがひとつも登録されませんでした。

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

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

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