MOSA Multi-OS Software Artists

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

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

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

2005-11-29

目次

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

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

 Apple社が運営しているメーリングリストがいくつかありますが、その中にWebObjectsのメーリングリスト「WebObjects-dev」があります。Apple関係者がこのMLに書き込むこともありますが、しばらく前にiTunes Music Storeのエンジニア求人情報が出ていました。求人といえばApple社のワールドワイドな求人サイトですが、こちらはWebObjectsで構築されています。

・WebObjects-dev
http://lists.apple.com/mailman/listinfo/webobjects-dev
・Apple社求人サイト
https://jobs.apple.com/cgi-bin/WebObjects/Employment.woa

Session.java

 前回までセッション管理およびDirectActionの解説をしてきましたが、今回はセッションでどのような処理をおこなうのかについて取り上げてみたいと思います。
 WebObjectsではプロジェクトを作成すると以下のようなファイルが自動的に作成されます。

Application.java <- WOApplicationから継承
Session.java <- WOSessionから継承
Main.java <- WOComponentから継承

 Applicationクラスのインスタンスは1つのアプリケーションプロセス内に1つしか生成されませんが、Sessionクラスのインスタンスはクライアントから新たなアクセスがあるたびに新たに生成されます。(*1)
 Main.javaはWebページのコンポーネント用クラスでページが新たに生成されるたびにインスタンス化されます。

 それぞれのクラスの使い分けは、名前からなんとなく想像がつくかと思いますが、Application.javaにはアプリケーション全体の処理を実装します。たとえば、アプリケーション全体の初期化処理やエラー処理、あるいはアプリケーション全体で共有するようなデータ処理の実装に利用できます。
 Session.javaはセッションごとにインスタンス化されますので、例えばユーザ固有の処理の実装に利用することができます。ビジネスマッチングシステムにおけるセッション処理では以下の2つの処理をおこなっています。

・ログインユーザの管理
・テーブル行の背景色の出力

 まずユーザ管理についてですが、プロフィールなどのユーザデータを登録するにはログイン処理をおこなっています。ログイン処理に成功した後は、現在どのユーザがログインしているのかを覚えておく必要がありますので、Sessionクラスにログイン中のユーザを記録しておくための変数を用意して管理しています。
 具体的には次のようなコードになります。ユーザのためのインスタンス変数としてloginUserを宣言し、loginUser用のセッターとゲッターを実装してあります。ログイン時にログイン認証に成功したユーザをセッション上にセットし、画面上にユーザの情報を表示するときもこのインスタンス変数を用いています。

     protected MOSAMember loginUser;

     public MOSAMember loginUser() {
         return loginUser;
     }

     public void setLoginUser(MOSAMember newLoginUser) {
         loginUser = newLoginUser;
     }


 次にテーブル行の背景色について解説します。テーブルを画面上に表示するときには、各行を識別しやすくするために、行の背景色を交互に変化させたりします。ここでは交互に使用する背景色の指定をおこなっています。背景色を出力するコードは次のようになっています。

     public static final String oddLine = "oddLine";
     public static final String evenLine = "evenLine";
     private boolean rowFlag;

     public String lineClass() {
         rowFlag = !rowFlag;
         if(rowFlag) {
             return oddLine;
         } else {
             return evenLine;
         }
     }


 先に使い方から説明しますと、まず交互に背景色を変化させたいテーブルの行
をWebObjects Builder上で選択して、Inspector上で「Make Dynamic」ボタン(左下にあります)をクリックします。
タグをDynamic化するとダイナミックエレメントのWOGenericContainerに置き換わり、Dynamic Inspectorで値をバインドできるようになります。
 背景色を指定する方法は
タグのAttributeで指定する方法とCSSを用いて指定する方法がありますが、CSSを使用する場合はInspector上でAttributeに"class"を追加し、そこに次のようなバインドをおこないます。

GenericContainer1: WOGenericContainer {
    class = session.lineClass;
}

 このときCSSでは次のような定義をおこなってあります。

.oddLine { font-size:11pt; background-color:white; }
.evenLine { font-size:11pt; background-color:#DDD; }

 このように設定しておくとテーブルを生成するさいに、oddLineとevenLineで指定した色がテーブル行の背景色として交互に使用されます。
 最後にコードについて解説しておきますが、実装はきわめてシンプルです。boolean型のrowFlagを宣言しておきlineClass()メソッドが呼び出されるたびにtrueとfalseが交互に入れ替わります。rowFlagがtrueの場合はoddLineを、falseの場合はevenLineをreturnするように実装してあります。
 背景色を交互に入れ替えるには、1つ前に使用した背景色がなんであったのかをどこかで覚えておく必要がありますので、それをセッション上で管理するというわけです。

 さて、今回はSesson.javaの使用方法について実例を交えて紹介しました。このようにセッション単位での処理にはSession.javaを利用することができます。

*1 DirectActionを使えばクライアントからのリクエスト時にセッションを生成しないようにもできます。

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

 まず最初にご挨拶。猿……猿ぢゃない去る11月20日、札幌で行なわれた「MOSAカフェ@札幌」にご参加くださいました皆さん、どうもご苦労様でした。やっぱり直に顔をあわせて喋るのは楽しいですな。あんまり(全然)テクニカルな話題とかは出なかったけど、それなりに有意義な会になったと思います。

 ほんでは本題。前回までワレワレは(と読者を巻き込む書き方には多少の偽善を感じたりするんだがまぁ堪忍)、「通常、アプリケーションで使われるNSWindow のインスタンスは、Interface Builder を使って定義され、起動時にNibファイルから読み込まれて生成させる」として、その例外として「タイトルバーのないウィンドウの作り方」を見てきた。
 今回からは逆に、……一部既に説明してしまったものもあるけれど、Interface Builder でウィンドウを定義する手順を追いながら、あの中で定義するあれこれがプログラム内部でどう使われるのか、または使えるのか、という部分を地味目に追ってみようと思う。いや地味目といっても大事なことなんである。

 Cocoa プロジェクトを新規に作成し、MainMenu.nibをダブルクリックしてInterface Buider を起動すると、画面には既にひとつ、ウィンドウが作られており、クリックすることでその内容をインスペクタ・ウィンドウに表示することができる。
 この段階でインスペクタ・ウィンドウに表示されているのは上から、まず「Window Title」。これは説明不要だろう、タイトルバーに表示されるタイトルであり、デフォルトで「Window」の文字列が入っている。次が「Auto Save Name」、今回の肴はこれである。

 また昔話が始まったと笑われるのを覚悟で書くが、その昔のアプリケーションで、ユーザーが移動したウィンドウの位置、大きさを覚えている、というのはなかなか面倒なコトだった。現状とズーム時(次にズーム・ボタンが押されたとき)の位置と大きさを……ワタシの場合で言えば Rect (つう名前の構造体があったんだよ、標準で)を2つ持った構造体をそのためのリソース型として準備して、初期設定ファイルに書き込んでおいた。まぁ誰もが似たようなやり方でやっていたはずだ。
 それがCocoaでは、Interface Builder でウィンドウを作ったときに、この「Auto Save Name」の欄に、そのアプリケーションで作られるウィンドウ内でユニークな文字列を名前として定義しておきさえすれば、その保存もロードも勝手にやってくれるのである。まぁなんて便利なんでしょう、てなもんや三度笠。
 しくみは至極簡単。プログラムが終了してウィンドウが破棄されるときに、その位置や大きさが変更されていれば、初期設定ファイルに「NSWindow Frame(Auto Save Nameとして定義した名前)」というキーでそれが記録され、次のオープン時に読み込まれて使われるのである。試しに最初からあるこのウィンドウのAuto Save Nameに「MOSAWindow」と指定しただけでプロジェクトをビルド、ランし、ウィンドウを動かしただけで終了。初期設定ファイル(こんだけしかやってない場合、このファイルは「~/library/preferences/com.apple.myCocoaApplication.plist」のはず)の中身をProperty List Editorで確認してみて欲しい。

 ……と、これでおしまいではまるでビギナー向けのチュートリアルなので、使わないかも知れないけど知っておいてもいいだろう余計な話をつけくわえておく。上の機能を実現しているのは以下の3つのメッセージ。これを知っておけばInterface Builder で定義をしなくても似たようなことが可能である。……そんなことになんの意味があるのかはイマひとつ分からないけれど。

-(void) saveFrameUsingName:(NSString*) name;

-(BOOL) setFrameUsingName:(NSString*) name;

-(BOOL) setFrameAutoSaveName:(NSString*) name;

それではまた次回。
(2005_11_24)

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

UNIXとしてのMac OS X

〜Perlについて(25)〜

 こんにちは、高橋真人です。さて今回はPerlにおけるファイル処理のお話です。では早速コードを見ていただきましょう。

open IN, "test.txt" or die;

while () {
     chomp;
     print $_, "¥n";
}


 このコードは、単にテキストファイルを開いて内容を出力しているだけのものですが、ファイル処理の基本的な部分が含まれています。
 順に解説いたしましょう。

 まず、ファイルのオープンです。
 Perlでは、ファイルを開く場合にファイルハンドルというのを使います。ここでは「IN」というのがそれに当たります。Perlの変数は、スカラー変数は$、配列は@、ハッシュは%で始まることになっていましたが、ファイルハンドルには何も付きません。また、これは強制ではないのですが、通例としてすべて大文字にすることになっています。
 open IN, "test.txt"で、test.txtというファイルを開いて、INというファイルハンドルに結び付けることをしますが、このopenという演算子はファイルのオープンに失敗すると偽の値を返すことになっています。
 よって、C言語などでしたら、

if (open IN, "test.txt" == 0) { ...

といったような書き方をするところですが、Perlではこういうときには、orというのを使います。
 dieというのは、Cで言うところのexit()ないしはabort()を意味します。Perlではこうした書き方が一般的なのですが、「開け、さもなくば、死ね」という文章になっていて、非常に分かりやすいというか、面白いというか...
 ちなみに、dieのあとに、"$!"と書き添えることもよくあります。例えば上記のスクリプトを実行した場合、test.txtというファイルが見つからないと、スクリプトは、dieするわけですが、単にdieだけ書いてある場合には、"Died at test.pl line1."(test.plはスクリプトのファイル名)というメッセージを出して終了しますが、"$!"が書き添えてある場合には、"No such file or directory at test.pl line 1."と、具体的にdieした理由がメッセージとして出力されるようになります。
 さて、INというファイルハンドルに無事にファイルが結び付けられた場合、いよいよ読み込みに入るわけですが、Perlではファイルからの読み込みには<>という演算子を使用します。この演算子は、通常は<IN>というようにファイルハンドルを挟んで使用しますが、中に何も挟まずに <> とだけ記述することもありますが、今回はそれには触れません。
 そしてこの演算子は、スカラーコンテキストで使用されると、ファイルハンドルによって結び付いているファイルの先頭から、呼び出される度に1行ずつを読み取って返します。今回のようにwhileの後のカッコ内で単独で使われると、ループが繰り返されるごとに特殊変数$_の中にファイルの各行が順番に入っているというわけです。

 次に、chompです。この演算子は引数にスカラー変数をとりますが、今回のスクリプトでは引数が省略されているので、例によって$_が暗黙のうちに与えられていることになります。
 で、chomp演算子の動作ですが、実はPerlにはもともとchopという演算子があります。このchop演算子は、「文字列の末尾の文字を切り落とす」という、正にその名の通りの処理をするのですが、今回の処理のようにファイルから1行ずつ取り出してきて処理していく場合、末尾の改行が邪魔になるケースにもよく使われます。
 ところが前回も触れたように、ファイルの最終行には改行が付いていない場合がよくあります。chopを使うとそういう場合に「改行でない最後の1文字」を切り落としてしまって都合が悪いので、ifを使って末尾に改行があるかどうかをいちいち調べなければなりませんでした。しかし、たかが(?)改行を落とす処理だけのためにわざわざそのような書き方をするのは、Perlの流儀に似つかわしくないと判断したのかどうなのか、Perl 5になってからこのchompという演算子が登場したのです。
 そんなわけで、このchompという何ともユニークな名前の演算子は、「文字列の末尾が改行であった時のみ切り落とす」という、名前に劣らぬ面白い動作をする仕組みとなっています。

 で、スクリプトの最後ですが、$_の最後に改行を付け足してから出力しています。「付け足すぐらいなら、何でわざわざ改行を切り落とすのか」と思われるかもしれませんが、前述の通り、ファイルの末尾に改行が付いていなくても、このスクリプトでは「すべての行」にきちんと改行が付いて出力されるわけです。

ニュース・解説

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

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

【開発環境】

MOSA会員専用掲示板(MOSAdeBB)が開設されて3ヶ月が経ちました。

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

現在では色々な質疑応答スレッドが立ちあがり、会員同士によるディープな(笑)情報交換がなされています。今回は、そのうちいくつかの興味深いスレッドをご紹介しておきます。まだMOSAdeBBをのぞいたことのない会員の方は、ぜひお立ち寄りください。会員相互の交流、技術情報交換に大いに役立つと思われますので、皆さんバリバリ活用しましょう!以前にも書きましたが、アップル社へひとつ質問をすると、その正式な回答を得るために高額な費用が発生します。日々のソフト開発に、MOSAdeBBでの情報交換をうまく活用してみてはいかがでしょうか?

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

「CodeWarrior Development Studio for the Mac OS X v10」
「CodeWarrior v10のレジストレーショントラブル」

つい最近Metrowerks社から発表されたCodeWarrior Cの最終版であると思われるv10についての情報交換がなされています。

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

「HIViewローカルなマウスロケーションを得る方法について」

Carbon環境でHIViewを利用する場合、そのローカルマウス位置を簡単に得る方法についての質疑応答です。話はHIViewにおけるマウス処理の問題点へと展開しています。

「シリアル番号」

アプリケーションからMac本体の「シリアル番号」を得るためにどのような方法があるのかの質疑応答です。Mac本体の固有情報としてEthernetのMACアドレスを使う方法やUUIDを使う方法も紹介されています。

「消えないテンポラリーファイル」

Spotlightが情報を読み書きするため、即座にテンポラリーファイルが削除できない問題に対して色々な解決方法が提示されています。加えて、Spotlightにより引き起こされるファイル関連の問題について情報交換もなされています。

「NSScrollViewの中のViewを自由に操るには?」

Cocoa環境において、NSScrollViewの中にNSViewを継承したCustomView作った場合、それをハンドリングする時の手法について色々な情報交換がなされています。

「Mac OS X 10.4.3のFinderが画像アイコンを表示しない」

Mac OS X 10.4.3になってから、Finder側のアイコン表示のアップデートが不安定になった問題点が紹介され、それを回避する方法がサンプルソースとして提示されています。

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

「Carbonウインドウの再描画イベントは来なくなったのでしょうか?」

Carbon環境において、ウインドウを表示した時の再描画のイベントの授受に関する質疑応答が展開されています。

「iTunes、iPhoto、iMovieをAppleScriptでコントロール」

iTunes、iPhoto、iMovieなどをAppleScriptでコントロールするための手法を解説した、良い資料や書籍についての情報交換です。

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

前回から10月25日の期間中、Apple社のDocumentationサイトには新規ドキュメントがひとつも登録されませんでしたが、新規リリースノートの方はひとつだけ登録されました。リリースノートで紹介されている「J2SE 5.0 Release 3」については、前号の木下さんの記事も参照してみてください。

リリースノート

「J2SE 5.0 Release 3 Release Notes」

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

前回から10月25日の期間中、新規テクニカルノートと新規テクニカルQ&Aはひとつも登録されませんでした。ADCへ質問メールを送付したときの返答メールによると、Apple社のテクニカル関係のメンバーは一足先にクリスマス休暇(?)を取っているようですね。ひょっとして、1月のサンフランシスコ Expoで大きな発表があり忙しくなるのを予想しての早めの休暇なのかもしれません(笑)

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

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

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

前回から10月25日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが4つ登録されました。
すべてのサンプルが初めての登録(初版)となりますが、どうしたことか、Windows用のサンプルが多いですね(笑)。サンプル内容については前号の木下さんの記事を参照してください。

「NullAuthPlugin」(Security関連)(初版)
「CreateMovie - C#」QuickTime関連)(初版)
「CreateMovie - VB6」QuickTime関連)(初版)
「EventMonitorTest」(Carbon関連)(初版)
「MoviePlayer - C#」(QuickTime関連)(初版)

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

【デベロップメント SDK】

前回から10月25日の期間中、Apple社のSDKサイトには新しいSDKが2つ登録されました。Mac OS X 10.4.3対応の「CoreAudio SDK」と「.Mac 2.0 SDK」のDeveloper Preview 2です。

「.Mac 2.0 SDK (Developer Preview 2)」
「CoreAudio SDK v1.4.3」

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

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

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