MOSA Multi-OS Software Artists

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

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

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

2006-04-18

目次

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

 

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

 前回はアプリケーションの利用方法を解説しましたが、今回はビジネスマッチングシステムのプロジェクトを実際にフレームワーク化する方法を紹介してみたいと思います。アプリケーション単体で起動するバージョンはすでに以下のURLでプロジェクトを公開していますが、こちらのプロジェクトをアプリケーション本体とフレームワークに分離してみたいと思います。

・プロジェクトのダウンロードURL
http://210.175.246.197/WebObjects/mosa/MOSAJobMatch_0330.zip

◇プロジェクトの構造
 まず現状のプロジェクトの構造ですが、本プロジェクトは以下のようなファイルで構成されています。

・Javaソースコード
  -Application.java, Session.java, DirectAction.java
  -カスタムEO
・Webコンポーネント
  -Main.woなどのコンポーネント
  -Header.woやFootor.woなどのReusableコンポーネント
・リソース
  -Propertiesファイル
  -モデルファイル
・Webサーバリソース
  -CSSファイル
  -画像ファイル

 フレームワークに移行するファイルをまずは決めたいと思います。フレームワークに移行するかどうかは、アプリケーションに依存せず汎用性があるかどうかや、複数のアプリケーションから共有するかどうかがポイントになります。
 とはいいましても、本プロジェクトではアプリケーションを1つしか作成していません。そこでアプリケーションを機能別に2つに分離して、さらに共通部分をフレームワーク化してみたいと思います。
 アプリケーションの分離ですが、機能的には大きく分けてデータの登録と参照に分かれますので、データ登録用のアプリケーションと、データの参照用のアプリケーションに分けてみたいと思います。

◇Javaソースコード
 まず、JavaソースコードですがApplication、Session、DirectActionの各クラスファイルはアプリケーションに関する機能を実装しますので、これらはそのままアプリケーション本体に残します。
 ですが、アプリケーション間で共有できるような処理は、その部分を親クラス化してフレームワークで実装します。通常Applicationクラスは次のような階層関係を持っていますが、WOApplicationを継承したクラスをフレームワークに実装しておきます。

・通常のApplicationの継承関係
WOApplication <- Application
・独自の親クラスを作成した場合の継承関係
WOApplication <- MOSAApplication <- Application

 各アプリケーションのApplicationクラスでの共有処理をMOSAApplicationクラスに実装し、アプリケーション側のApplicationクラスはMyApplicationクラスを継承するように変更します。本プロジェクトではエンコーディング処理に関する部分が共有処理になります。
 カスタムEOのJavaソースコードに関してはデータベースにアクセスするアプリケーションであれば共通して利用することになりますので、これらはすべてフレームワークに移行します。

◇Webコンポーネント
 各画面を実装しているアプリケーション固有のコンポーネントはアプリケーション間で共有することもないでしょうから、そのままアプリケーション本体に残します。
 一方、再利用可能なReusableコンポーネントはフレームワークに移行して、アプリケーションから共有できるようにします。ただしReusableコンポーネントであってもアプリケーション内でしか再利用しないようなものは、フレームワークには移行しないでおきます。

◇リソース
 モデルファイルについては、カスタムEOのJavaクラスと同様に、アプリケーションから共通して利用することになりますので、フレームワークに移行します。

◇Webサーバリソース
 CSSファイルについては、今回のアプリケーションではフレームワークに移行して、共有するようにします。また、画像ファイルはアプリケーション間で共通して利用しないものもあるのですが、ファイルの数が多いために、管理しやすいようまとめてフレームワークに移行することにします。

これでアプリケーションのどの部分をフレームワーク化するかが決まりました。あとは前回解説したようにフレームワーク用のプロジェクトを新規に作成してアプリケーションのプロジェクトからファイルを移行し、プロジェクトにビルド済のフレームワークを登録します。
 Webサーバリソースに関しては、アプリケーションに登録してあるのか、フレームワークに登録してあるのかで設定が少し違ってきます。アプリケーションに登録してある場合にはWOImageのframework属性は"app"となりますが、フレームワークに登録してある場合にはframework属性にフレームワーク名を指定します。

さて、約1年間にわたって連載してきました「WebObjects Dev Report」ですが次回をもって最終回となります。次回はフレームワーク化の結果や今後の課題をまとめてみたいと思います。

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

 自分でこんなことを言うのもなんだが、NSWindowの説明だけで半年もかかってしまったことにいささか驚いている。もちろん、Cocoaの全てのオブジェクトを解説しようなどという、手塚治虫の「火の鳥」以上に無謀なライフワークを抱え込むつもりは毛頭ないんだが、NSWindowの最後の方で出てきたような「いかにもタコにも使用機会の少なそうなアトリビュートだのなんだの」を微に入り細をうがって説明していくのはいかにも効率が悪かろう。

そういうわけなので、今回から今までのようなクラスオリエンティッドな話の進め方を改め、オブジェクティブオリエンティッドなやり方をしようと思う。オブジェクトオリエンティッドぢゃなくてオブジェクティブ(目的・目標)ね。具体的には「●●を▽▽したい」という風にまず目標を設定し、そのための手段ミチスジ最短距離や搦め手などをクラス横断的に考えていくというふうにしたい。これだと読者諸兄から「おれは■■を○○する方法が知りたい」とかいうリクエストも受けやすいし(オレにもさっぱり解んなくて知らないふりをすることはあるにしても、ね)。

で、今回からその第1弾を始めるとして、初回だから勝手にこっちで目標を決めた。とりあえず簡単そうなところで、「プログラムからアプリケーションを起動したい」というあたりからやってみたい。Classic環境、あるいはCarbonでこれをやった経験のあるヒトは「そんなのLaunchApplicationを呼べばいいだけぢゃん」と言うと思う。こんな感じですかな(オレのCarbonの知識はちと古いのでちと不安だけど)。

NSString*           aPath;         // これにアプリのフルパスが入ってる。
FSRef               aRef;
FSSpec              aSpec;
LaunchParamBlockRec aParams;
unsigned char*      aName = (unsigned char*)[aPath UTF8String];

OSStatus status = FSPathMakeRef(aName, &aRef, FALSE);
if(status == noErr){
     status = FSGetCatalogInfo(&aRef, kFSCatInfoNone, NULL, NULL, &aSpec, NULL);
     if(status == noErr){
          aParams.launchBlockID = extendedBlock;
          aParams.launchEPBLength = extendedBlockLen;
          aParams.launchFileFlags = 0;
          aParams.launchControlFlags = launchContinue + launchNoFileFlags;
          aParams.launchAppSpec = &aSpec;
          aParams.launchAppParameters = NULL;
          status = LaunchApplication(&aParams);
     }
}


 ヒトは知らず、実を言うとオレは上に出てくる LaunchParamBlockRec というヤツが昔から嫌いだった。いちいち面倒くさいんだもん。これ、Cocoaでは以下のように書ける。オレがCocoaを好きなわけが解るでしょ(笑)?

NSString*                aPath;         // 同じくこれにアプリのフルパス。
[[NSWorkspace sharedWorkspace] launchApplication: aPath];


 とは言え、いくらなんでもこれで問題解決ではない。というか、それならこんな原稿は書かない。面倒くさいことにも利点はあってCarbonだといろいろと小技を使えるのだ。例えば上のaParams.launchControlFlags というパラメータ、これに渡す値にlaunchDontSwitch という定数を足してやれば、アプリケーションをバックグラウンドで起動できる。逆に言えば、CocoaにおけるNSWorkspaceのメソッド、launchApplication: でアプリを起動すると、そいつは必ずアクティブアプリケーションになってしまう。
 さぁここで問題。ではどうやったらCocoaでアプリケーションをアクティブにせずに起動できるでしょう? ……そういうときだけCarbonを使うってのももちろんアリだけど(そうするしか方法がない時も確かにあるけどね)、これはなんとかCocoaの中で解決できる。次回までにあれこれ考えてみてちょうだいな。
(2006_04_14)

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

UNIXとしてのMac OS X

〜Perlについて(33)〜

 こんにちは、高橋真人です。早速続きを始めましょう。
 さて、Perlネタの最後のお話として解説している、map、grep、sortなどの演算子にリストデータを順に受け渡しながら処理していくやり方ですが、sortに続いて今回はgrepです。
 多少なりともUNIXに親しんでいる人であれば、grepというコマンドがあることはご存知でしょう。ご存じない方のために少し解説します。
 manコマンド(UNIXのオンラインリファレンス)によれば、「パターンにマッチする行を表示する」となっています。使い方としては

grep pattern file

のような形で、patternの部分にはおなじみの正規表現を、fileの部分には任意のファイルのパスを指定します。
 コマンドの名前のgrepは、時に正規表現の代名詞として使われるほど代表的なものですが、grepコマンドが持つパターンマッチング機能に関してはさほど高いものではなく、後発のPerlにすっかりお株を奪われてしまった感があります。
 とはいえ、UNIXのコマンドラインで作業する上においては必要欠くべからざる常用ツールでもあります。ただ、多くのUNIXユーザにとってgrepを使う局面というのは、ファイルを対象とするケースよりも他のコマンドの出力結果から必要な情報のみを取り出すというケースが圧倒的に多いでしょう。
 コマンドからコマンドへのデータの受け渡しなどの話についてはいずれまた詳しく取り上げてみたいと思いますが、今回は具体的な例で使い方を見てみます。

Terminalを開いて、psと打ち込んでみてください(例によって末尾のリターンはいちいち記述しません)。
 数行のテキストが表示されたと思います。これはps(process status)コマンドによって現在実行中のプロセスのリストが表示された状態です。
 もちろん今表示されたものがあなたのマシンで動いているすべてのプロセスではありません。細かい説明は抜きにして、今度はps auxと打ってみてください。今度は一画面で表示し切れずに画面の彼方に多くの行が流れていったと思います。
 さて、ただ表示させてみただけではつまらないので、ここからドックのプロセスを探してみましょう。皆さんはドックを再起動させるにはどうしたらいいかをご存知ですか? Finderの再起動ならば、アップルメニューの強制終了を選んで「再度開く」を押せば行えますが、ドックのようにアプリケーションとしてユーザーから見えないプロセスの場合、標準で用意されたインターフェースでは強制終了や再起動は簡単に行えません。
 ではそれをやってみましょう。
 ps auxで表示された中からドックのプロセスを探し、あとはkillコマンドを使って強制的にプロセスを終了させるだけです。強制的にプロセスを終了させれば、システムがドックを再起動してくれます。
 killコマンドの使い方などは割愛しますが、ドックのプロセスIDの探し方を。
 まず、初期状態のTerminalのウインドウは横幅が狭いので、ドックのプロセスが表示し切れないはずです。そこで、さらにオプションを追加して、ps auxwwとします(wを2つ入れるところがミソ)。
 そうするとウインドウの幅に合わせて切れることなく、各プロセスが最後まで表示されます。でも、行が折り返されていて見にくいですね。ウインドウを広げて、折り返しを解消してもよいのですが、ここでは余計な情報を隠してしまいましょう。
 そこでgrepの登場です。UNIXにおける特徴であるパイプという仕組みを使って、psコマンドの出力をgrepにつなぎます。具体的には以下のようにします。

ps auxww | grep Dock

 これでずっとすっきりとした表示になるはずです。ただし、ここでやっているのはあくまで文字列検索です。最初に説明したようにgrepコマンドは「パターンがマッチした行」を表示するだけなので、psコマンドから渡された複数の行の中から、Dockという文字列が含まれるもののみを取り出しているにすぎません。
 ですから、よく見ると今打ったコマンド自体も表示されているのが分かります。Dockという文字列を含んでいますからね。

 さて、ここまでの説明でUNIXにおけるgrepというコマンドがフィルタリングの仕組みを持ったものだということがお分かりいただけましたでしょうか?
 実は、今回の主題であるPerlのgrepも同様です。渡されたリストの中から、「条件に一致したもの」のみを取り出し、それをリストにして返す。これがgrep演算子の機能になります。
 もっとも、条件と言うのはもう少し込み入っていまして、文字列の一致のみに留まりません。以下のような例を見ていただければ、「条件に一致」の意味がお分かりいただけるでしょう。

@list = grep { $_ % 2 == 0 } (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
print join(", ", @list);


 これは、1から10までの数値のリストを作って、grepコマンドで偶数のものを取り出しています。ブロックの中ではリストの各要素が特殊変数$_を使って渡されていることを読み取ってください。
 %はC言語でもおなじみのモジュロ演算子です。$_を2で割った時、余りが0であれば真となるわけですが、ブロック全体の値が評価される仕組みは前回のsort演算子と同様です。grepの場合には、ここが真になった要素が取り出され、新しいリストとして返されることになります。

ニュース・解説

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

● Carbon ドキュメント & サンプル & SDK ナビゲーション(2006/04/14)

【開発環境】

このところのMac業界は、Intel CPU版のMacintoshでWindows XPを起動するための「Boot Camp」の登場で盛り上がっていますが、 OS切り換えのもう一つの方向性として、Mac OS XからLinuxやWindowsを制御可能にする(Virtual PCライク)「Parallels Workstation 2.1」(Parallels, Inc.)というソフトが注目を集めています。

http://www.parallels.com/

サイトでβ版が公開されていますが、すごい勢いで改良されており、あっという間にβ3となりました。USBサポートももうすぐのようです。製品は$49 .99で販売されるそうですが、現時点でプリオーダーすると$39.99で購入できます。OSのデュアルブートと目的別に切り換えて使えば利用価値が高いでしょう。ただし、Apple社もMac OS X 10.5で同じことをやっているような気もするのですが(笑)…さて、どうなるでしょうか?

以前ここでも紹介したMac OS X用のインテル版開発環境が正式に販売開始になりました。製品概要は以下のPDFを参照してみてください。C/C++コンパイラはXcodeに組み込んで利用します。

http://jp.xlsoft.com/documents/intel/catalog/intel_brochure_mac.pdf

MOSA会員は、MOSA特別販売で購入することが可能です。購入を考えている方は、以下のURLを参照してください。

http://www.xlsoft.com/jp/products/intel/mosa_camp.html

ライブラリとのセット価格が大変安いですね(6万円引き)。私もさっそく注文したので、次回のニュースでは、その使用感などについて報告したいと思います。

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

前回から4月14日の期間中、Apple社のDocumentationサイトには数多くのドキュメントが登録されました。ただし、大部分は今までの内容のマイナーチェンジです。今回は、その中で初版と内容が大幅変更になったドキュメントだけをピックアップしました。新顔として「…Developer Note」という形態のドキュメントが多数登録されています。また、リリースノートとして「What’s New In Mac OS X 」も登録されましたが、こちらについては改訂版となっています。加えて、デベロッパ向け読み物も2つ登録されました。このうち「Delivering Content with RSS for Web Developers on Mac OS X」については、前号の木下さんの記事も参考にしてください。

「Animation Programming Guide」(PDFあり)(初版)
「Apple Filing Protocol Reference」(初版)
「Darwin Notification API Referenc」
「Open Directory Reference」(PDFあり)(初版)
「Quartz 2D Reference」
「Quartz Display Services Reference」(PDFあり)
「Quartz Event Services Reference」(PDFあり)(初版)
「Spotlight Reference」(初版)
「Tree-Based XML Programming Guide for Cocoa」(PDFあり)
「AirPort Developer Note」(初版)
「Audio Developer Note」(初版)
「Bluetooth Developer Note」(初版)
「Ethernet Developer Note」(初版)
「FireWire Developer Note」(初版)
「Hardware Developer Note Terms and Abbreviations」(PDFあり)(初版)
「iMac G5 Developer Note」(初版)
「PCI Developer Note」(初版)
「Power Mac G5 Developer Note」(初版)
「RAM Expansion Developer Note」(初版)
「Universal Serial Bus Developer Note」(初版)
「Video Developer Note」(初版)

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

リリースノート

「What’s New In Mac OS X 」

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

「Elluminate Live! on Mac OS X: Going to the Head of the Virtual Class」

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

「Delivering Content with RSS for Web Developers on Mac OS X」

http://developer.apple.com/internet/deliveringcontentwithrss.html

前回から4月14日の期間中、新規テクニカルノートはひとつ登録され、新規テクニカルQ&Aの方は3つ登録されました。

TN2124「Mac OS X Debugging Magic」

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

QA1476「Using the kQTPropertyClass_DRM properties with QuickTime」(初版)
QA1467「CoreAudio Overload Warnings 」(初版)
QA1469「MovieAudioExtraction – Ensure a Movie is fully loaded before starting
an extraction session」(初版)

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

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

前回から4月14日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが3つ登録されました。「WcharDataFormatter 」のみが新規登録となります。

「CFFTPSample」(Network関連)
「ExtractMovieAudioToAIFF」(QuickTime関連)
「WcharDataFormatter」(Tools関連)(初版)

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

【デベロップメント SDK】

前回から4月14日の期間中、Apple社のSDKサイトには新しいSDKが2つ登録されました。Mac OS X 10.4.6対応「Kernel Debug Kit」(PowerPC版とIntel版あり)です。

「Kernel Debug Kit 10.4.6 – Intel 」
「Kernel Debug Kit 10.4.6 – PowerPC」

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

 

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

 

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