MOSA Multi-OS Software Artists

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

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

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

2005-11-15

目次

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

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

 前回に引き続きセッション管理のお話です。WebObjectsでは自動的にセッション管理がおこなわれるということを前回説明しました。自動的にセッション管理をおこなってくれますのでとても便利なのですが、逆にデフォルトの状態では、クライアントからリクエストがあるたびにサーバ側でセッションオブジェクトが生成されてしまいます。これが逆に不便な場合というのもありますので、今回はセッションを用いない処理について解説していきます。

DirectAction

 Webアプリケーションといってもいつもセッションが必要になるわけではありません。基本的には状態を管理する必要がなければセッションも必要ないわけですが、必要のないものを生成していては余計な負荷にもなりかねません。例えば、検索をおこなうようなアプリではセッションを用いない場合もあるでしょう。
 また、セッションを用いた場合は、URLに自動的にセッションIDが含まれるようになり、各画面のURLというものは常に変化します。これではクライアント側でブックマークに追加することはできませんが、セッションを用いない処理をおこなう場合は、URLにセッションIDが含まれなくなりURLも固定になりますので、各画面をブックマークできるようになります。

 では、セッションを使わずに処理をおこなう方法ですが、セッションが用いられたときのURLをみてみますと以下のようになっています。

・URL
/cgi-bin/WebObjects/MOSAJobMatch.woa/wo/5smyn1cV1XzALuFPFVCMUw/2.0.4.3

 ここで、アプリケーション名とセッションIDの間にある文字列”wo”に注目してください。WebObjectsでは、クライアントからのリクエストをリクエストハンドラーを用いて処理しますが、このリクエストハンドラーにはいくつかの種類があり、どのリクエストハンドラーを用いるかはリクエストハンドラーキーによって指定されます。URLに埋め込まれた”wo”はこのリクエストハンドラーキーなのです。
 セッションを用いた処理ではリクエストハンドラーキー”wo”が使用されますが、DirectActionと呼ばれるセッションを用いない処理をおこなう場合は”wa”というリクエストハンドラーキーを用います。

 次に、リクエストハンドラーキーによって呼び出される処理をどのように実装するかですが、WebObjectsアプリケーションのプロジェクトを作成したときに、”Classes”グループの中に”DirectAction.java”というクラスファイルが自動生成されています。このクラスがDirectActionの処理を実装するためのクラスになります。このクラスは”WODirectAction”クラスを継承して作成されています。例えばこのクラスに次のようなメソッドを追加したとしましょう。

     public WOActionResults browseAction() {
         return pageWithName("UserList");
     }


 このメソッドを実際に実行するには、以下のようなURLにアクセスします。

・DirectActionのURL
/cgi-bin/WebObjects/MOSAJobMatch.woa/wa/browse

 つまり、”wo”の代わりに”wa”を用い、その次に呼び出したいメソッド名を指定します。このとき実際のメソッド名は”…Action”となっていますがURL上では”Action”の部分は省略します。ようするにURLで直接呼び出したいメソッドを指定しているわけです。
 DirectActionを実装できるのは”DirectAction”クラスだけではありません。”WODirectAction”クラスを継承したクラスを作成してメソッドを追加すれば、そちらを呼び出すこともできます。あとから追加したクラスのメソッドを呼び出すには次のようなURLを用います。

・クラスを追加した場合のURL
/cgi-bin/WebObjects/MOSAJobMatch.woa/wa/クラス名/メソッド名

 たとえばMyDirectクラスを追加して、sampleAction()というメソッドを実装した場合には次のURLで実行することができます。

・クラスを追加した場合のURL
/cgi-bin/WebObjects/MOSAJobMatch.woa/wa/MyAction/sample

 これでDirectActionの実装方法と、どのような形式のURLで呼び出すかが分かりましたが、動的に生成されたページからDirectActionを呼び出すにはどうすればよいでしょうか。例えば、WOHyperLinkのInspectorをみてみますと、アクションメソッドをバインドするAttributeとして”action”があります。セッションを用いる場合はこのAttributeを用いたりしますが、DirectActionのメソッドを呼び出したい場合には”actionClass”と”directActionName”を用います。使い方は名前からなんとなく想像できるかと思いますが、それぞれ次のような使い方をします。

actionClass:DirectActionクラスのクラス名を指定
directActionName:actionClassで指定したクラス内のメソッド名を指定
         ※ただし”Action”を除いたもの

 例えば、MyActionクラスのsampleAction()を呼び出す場合には次のようにバインドをおこないます。

actionClass:MyAction
directActionName:sample

 これでDirectActionの基本的な使い方が分かりましたが、このままではアプリケーションのトップ画面にアクセスしたさいにはセッションが生成されてしまいます。トップページにアクセスした時点で本当にセッションが必要になるようでしたら問題ないのですが、そうでない場合はDirectActionを利用してセッションの生成をおこなわない方法があります。
 実際にビジネスマッチングシステムでは、トップページからDirectActionで処理をおこなうようにApplication.javaのコンストラクタに次のような処理を追加してあります。

setDefaultRequestHandler(requestHandlerForKey(
     directActionRequestHandlerKey()));

 アプリケーションが使用するデフォルトのリクエストハンドラーを変更してDirectAction用のリクエストハンドラーを使用するように設定しています。
 このメソッドを追加しておけば、DirectAction.javaのdefaultAction()によってトップページの処理がおこなわれます。defaultAction()はプロジェクトを生成した時点で自動的に生成されており、”Main”ページを返すようになっていますので、これでトップページをセッションを生成させずに表示できるようになります。
 このようにDirectActionを使えばセッションを用いない処理にも対応することができます。

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

というわけで「タイトルバーのないウィンドウの作り方・実践編」である。マシンの準備はよろしいか。

 まず第一にこの「タイトルバーのないウィンドウ」の class を定義する。え、そんなもの別に NSWindow のままでいいぢゃねぇかって? どっこいそうでもないのである。実は NSWindow のインスタンスは自分がタイトルバーを持たない場合、以下の2つのメッセージに対して「NO」を返す。

- (BOOL) canBecomeMainWindow;
- (BOOL) canBecomeKeyWindow;

 つまり「タイトルバーを持たないウィンドウはそのままではメインウィンドウにもキーウィンドウにもなれないのだ。……なぜそうなのかは各自考えることにして(ホントのことを言うとオレは考えたことがなかった。で、今ちょっと考えたけど「これだ」と言う理由が思いつかない)、なぜそれでは困るのか。
 えっと……これは「タイトルバーのないウィンドウを作って何に使うか」の問題なので、「いや、オレは困らないもん」とあなたが言うのは勝手なんだが、オレなどはこれを例えば初期化に時間がかかるアプリの「アバウトボックス」として使いたいので、メインウィンドウになれてもらえないとちとまずいのである。
 で、こいつらをオーバーライドして「タイトルバーは持ってないけどメインウィンドウになれる、ついでだからキーウィンドウにもなれる NSWindow のサブクラス」というのを「TLWindow」(TLはTitleLessね)と定義する。

@interface TLWindow : NSWindow {   // TL = TitleLess
    //  インスタンス変数はなし。
}

- (BOOL) canBecomeMainWindow;
- (BOOL) canBecomeKeyWindow;

@end

 あとは上の2つのメッセージ両方に「YES」を返すインプリメンテーションをすればそれでOKである。

 次に Interface Builder を使って上のウィンドウに表示する View を持つウィンドウを作成する。動的に表示を変更するなどの細工をおこないたい場合にはこの View をカスタムビューにしておいてフルマイを記述すればいい。

 ではいよいよ実際にウィンドウを作成するコード。上で定義したウィンドウを IBOutlet として参照しているオブジェクトの中で(dummyWindowというのがそれだとする)……

OurTitlelessWindow = [[TLWindow alloc]
  initWithContentRect: [[dummyWindow contentView] frame]
  styleMask: NSBorderlessWindowMask
  backing: [aboutPanel backingType]
  defer: NO];

  if(OurTitlelessWindow) {

    [OurTitlelessWindow setHasShadow: YES];
    [OurTitlelessWindow setDelegate: self];
    [OurTitlelessWindow center];

    NSView          *content = [[dummyWindow contentView] retain];
    [content removeFromSuperview];
    [OurTitlelessWindow setContentView: content];
    [content release];
  }


 とまぁ、これでめでたくタイトルバーのないウィンドウのできあがりである。
 やれやれ、ようやくNSWindowに関する「最初の話題」が一段落かぁ。次回からは……次回からのことは次回までに考えることにする。あしからず。
(2005_11_11)

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

UNIXとしてのMac OS X

〜Perlについて(24)〜

 こんにちは、高橋真人です。早速、前回の最後で触れたバグの件を解説します。
 まずはスクリプトをご覧ください。

while ($data =~ m/会員向け¥t([^¥t]+)¥t(.+)¥n/g) {
    print "タイトル:" . $1 . "¥t状況:" . $2 . "¥n";
}

 データをセットしている部分を今回は省略しましたが、実は前回のスクリプトでは、入力をファイルから行わずにヒアドキュメント方式で行っていたためにバグが顕在化しなかったのです。そこで今回はファイルからデータを読み込むやり方に変えてみましょう。

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

$data = join "", ;

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

print "Done¥n";

 の部分は、当たり前ですがご自分の環境に合わせて書き換えてください。ついでに仕様も少し変更しました。
 今回は「会員向け」の行を拾うのではなく、先頭項目に日付が入っているものを拾う形になっています。正規表現の先頭部分がかなり込み入ってしまっていますが、「数字の1個以上の連続、ピリオド、数字の1個以上の連続、ピリオド、数字の1個以上の連続、(タブを除く)任意の文字の0個以上の連続」ということで日付部分に対応しています。
 末尾の「任意の文字の0個以上の連続」という部分は、日付のあとに「迄」などの文字が付加されているケースに対応したものです。
 それから処理対象のファイルですが、以下のデータ(前回のものと同じ)をテキストファイルとして保存します。

MOSA NEWS
10.21-22 湘南ミーティングへのご参加ありがとうございました!
会員向け アップル技術者トレーニング割引のご案内 受付中
会員向け アップル技術者試験 受験料半額割引のご提供 受付中
会員向け MOSA会員向け掲示板開設のお知らせ 運用中
参加受付中のセミナー、イベントなど
2005.11.12 Dashboard ウィジェット作成セミナー 受付中
2005.11.15 NEW!ポッドキャスティング・セミナー 受付中
2005.11.30迄 Dashboardウィジェット コンテスト 受付中
終了したセミナー、イベントなどのご報告
2005.10.15 Dashboard ウィジェット作成セミナー ご報告

 注意していただきたいのは、文字コードと改行コードです。PerlにはC言語のようなテキストモードなどという概念はないので、今回の場合改行コードはLF(UNIX)にしておく必要があります。また、文字コードについてもPerlスクリプト自体のエンコーディングに合わせる必要があるかもしれません。

 それでは早速実行してみましょう。
 結果は、私のところでは以下のようになりました。

日付:2005.11.12, 内容:Dashboard ウィジェット作成セミナー, 状況:受付中
日付:2005.11.15, 内容:NEW!ポッドキャスティング・セミナー, 状況:受付中
日付:2005.11.30迄, 内容:Dashboardウィジェット コンテスト, 状況:受付中
Done

 おや? 最後の行が出力されていませんね。って、わざとらしいですね(笑)
 実は、私はデータをファイルに保存する時に、最後の行のあとに改行を入れなかったのです。従って、最後の行の末尾にはLF(¥n)がなかったために、マッチしなかったということになります。
 Perlに限らず、行単位のテキストファイルを処理する場合にはこの問題を無視することができないのですが、Perlの場合どのようにすればよいのでしょう?
 まず、いちばん単純なのは¥nを取ってしまうことです。何故これでうまく行くかというと、正規表現における . の役目は「改行以外の任意の文字」だからです。.+ という表現は、改行文字の直前までマッチすることになるので、末尾の改行はあってもなくても関係がないわけです。
 ただ、これで問題がないわけでもないのです。前回も触れましたが、.+ という表現だけだとデータ項目の区切りであるタブ文字にもマッチしてしまうため、万が一想定した以上にタブが含まれていてもそこで止まってはくれません。もちろん、今回のスクリプトはそこまで考慮しているわけではありませんし、そもそも万能の正規表現などというものはあり得ないのです。
 まあ、それでもどうしてもタブを含ませたくないのでしたら、[^¥t¥n]+ とでもすることになるでしょうが。

 さて、何とも歯切れの悪い展開になってしまいましたが(笑)、実は今回のようなやり方はPerlとしては一般的ではありません。もともと文字列処理を得意とするPerlの場合、今回のような「タブ区切り、行単位」の典型的なデータテキスト(例えばファイルメーカーやExcelからデータをテキストで書き出す場合にはこの形式になることが多いでしょう)を処理するポピュラーなやり方がちゃんとあるのです。
 次回は、その辺のお話と、併せてファイル処理について説明したいと思います。

ニュース・解説

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

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

【開発環境】

前号のニュースで木下さんも紹介されていますが、Metrowerks社(と言うよりFreescale Semiconductor社が正しいのかな?)から「CodeWarrior Development Studio for the Mac OS X v10」が販売開始となりました。

http://www.metrowerks.com/MW/Develop/Desktop/mac10

ダウンロード販売のみで、Professional版は$99です。さっそく購入して正規のレジストレーション手続きをしたのですが、何故だかコンパイル時に「レジストレーションされてない!」と言った趣旨のエラーが出て作業が終了しませんでした(涙)。自分であれこれ試すのもバカらしいので、license@metrowerks.comへ認証用ファイルのlicense.datを送りつけて修復してもらいOKとなりました。ライセンスの認証システムにバグがあったんじゃ話になりませんよねぇ(笑)。同じ現象で悩んでいる方は、この解決方法が近道なのでお試しください。

私としては、PowerPlant、PowerPlant X、Constructorのどれも使用しないので、v9.6から大きく変わった箇所は見受けられません。また、Mac OS X 10.4.3環境でライブラリを再構築すると問題が出るという話もあります。ソースコードをコンパイルした後のコードサイズなどにも大きな変化は見られないので、v9.6が利用できる間はそれで済ませようと考えています。この発表に対抗したのかどうかは分かりませんが(笑)、Apple社からもXcode 2.2の正式版が発表となりました。これで、自作アプリケーション をUniversal Binary化するための最終準備は整ったわけです。

「Xcode 2.2」

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

嬉しいことに、2.2対応ユーザーズガイドもちゃんと日本語訳されて登録されています。

「Xcode 2.2ユーザーガイド」(日本語訳)

http://developer.apple.com/documentation/DeveloperTools/Conceptual/XcodeUserGuide21/Contents/Resources/ja.lproj/index.html

ちなみに、Xcode 2.2をインストールするのと同時にCHUDもインストールしたい場合には、インストーラの「カスタマイズ」ボタンで表示されるツール一覧で「CHUD Tools」をチェックしてからインストールを実行する必要があります。お試しください。

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

前回から11月11日の期間中、Apple社のDocumentationサイトには数多くのドキュメントが登録されました。ただし、大部分は今までの内容のマイナーチェンジです。今回は、その中で初版ドキュメントと内容が大幅変更になったドキュメントだけをピックアップしておきます。全体的に見ると、GCCやGDBといったツール類のドキュメント改訂が多いようですが、注目ドキュメントは、Universal Binary関連の「Mac OS X ABI Function Call Guide」と「Universal Binary Programming Guidelines, Second Edition」でしょう。ちなみに、ABIとは「Application Binary Interface」の略です。

新規リリースノートの方は4つ登録されました。そのうち3つがXcode 2.2関連なのですが、何故だか今頃になって2.1のリリースノートも登録されています(忘れていた?)。また、デベロッパー向け読み物も2つ登録されました。「The Audio Units Community Takes Off」については、前号の木下さんの記事を参照してみてください。

「Accessibility (ApplicationServices/HIServices) Reference」
「Audio Device Driver Programming Guide」(PDFあり)
「Carbon Overview」(PDFあり)
「Coding in the Kernel」
「CPlusTest Reference」(初版)
「Cross-Development Programming Guide」(PDFあり)
「Debugging with GDB」
「Flex」
「GCC Porting Guide」(PDFあり)
「GDB Internals」
「GNU C/C++/Objective-C 4.0.1 Compiler User Guide」(PDFあり)
「GNU macro processor」
「GNU Make」
「Kernel Programming Guide」(PDFあり)
「Libtool」
「Mac OS X ABI Function Call Guide」(PDFあり)(初版)
「Mac OS X Server Administrator Topics」(PDFあり)(初版)
「Mach-O Programming Topics」(PDFあり)
「Navigation Services Programming Guide」(PDFあり)
「Navigation Services Reference」(PDFあり)
「Quartz 2D Reference」(PDFあり)
「QuickTime Kit Programming Guide」(PDFあり)
「STABS Debug Format」
「Universal Binary Programming Guidelines, Second Edition」(PDFあり)
「WebObjects Builder User Guide」(PDFあり)(初版)
「Xcode 2.2 User Guide」(PDFあり)(日本語訳あり)

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

リリースノート

「Xcode 2.1 Release Notes」
「Xcode Build Settings Release Notes」(v2.2用)
「Xcode Expert Preferences Release Notes」(v2.2用)
「Xcode Release Notes」(v2.2用)

http://developer.apple.com/releasenotes/

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

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

「The Audio Units Community Takes Off」(読み物)

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

前回から11月11日の期間中、新規テクニカルノートとクニカルQ&Aはひとつも登録されませんでした。最近では珍しいことです(笑)。

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

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

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

前回から11月11日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが10登録されました。Widget関連の4つのサンプルは、Mac OS X 10.4.3に対応させるために内容が更新されています。新顔の「CocoaDVDPlayer」については、前号の木下さんの記事を参照してください。

「CocoaDVDPlayer」(Cocoa関連)(初版)
「SampleRSS」(Widget関連)
「Scroller」(Widget関連)
「Stretcher」(Widget関連)
「Fader」(Widget関連)
「QTMetaData」(QuickTime関連)
「TabsShowcase」(Carbon関連)(初版)
「FileNotification」(Carbon関連)
「GetPrimaryMACAddress」(Network関連)
「SampleD」(Darwin関連)

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

【デベロップメント SDK】

前回から11月11日の期間中、Apple社のSDKサイトには新しいSDKがひとつだけ登録されました。Mac OS X 10.4.3に対応した「Kernel Debug Kit」です。同様に、10.4.3に対応したDarwinの最新ソースコードもダウンロード可能になっています。

「QuickTime Windows SDK」

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

「Mac OS X 10.4.3 (Darwin 8.3)」

http://www.opensource.apple.com/darwinsource/10.4.3/

また、以下のサイトからCHUDの最新版である4.2.3がダウンロード可能です。

「Computer Hardware Understanding Development Tools (CHUD )4.2.3」

http://developer.apple.com/tools/download/

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

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