Macintosh Developer Online (MDOnline)


2002年1月22日発行号 - デジハリでXのJavaセミナー



お待ちかねの鶴薗さんの連載は、今日と明日で半分ずつお届けします。Webサイトにはすべてアップされていますので、すぐに御覧になりたい方はそれを御覧下さい。それから、PDFも用意してくれていますので、そちらもいいですね。実は、鶴薗さんの原稿のPDFは、鶴園さん自身が用意してくれているものなんです。それから、読者の谷津さんからJBuilder情報をいただきましたのでそちらも記事にしました。
あと、Knowledgeg Base関連で記事はいろいろあるのですが、今日は今年最後の講義で大学に行っておりましたので、執筆は明日に行います。講義の1つはプログラミングを教えているのですが、まったくの素人向けでもありますので、講義自体は簡単なものです。ま、だけど、いかにもな練習問題は解かせていますが、レポートは悩まないと行けないような問題にしましたところ、ちょっとハードルを高くし過ぎたみたいでした(笑)。今年からの講義なので、来年はちょっとレベルを調整しないといけません…。たとえば、forでループをくむということは分かっても、forの入れ子ループということにはなかなか頭が行かないみたいです。講義では説明しているのですが、ある問題を解くのに、その入れ子をしないといけないということがあるのだけど、その事実をだまっていてさせてみたら、やっぱりできない子はできないです…というかまったくそういうことに頭が向かなかったというのです。それから、たとえば演算子とか基本はしつこくやったけど、「counter++;」だけを書けばいいということもまったく思い付かなかったと言っていました。forステートメントはちゃんと書いているのですけどね。「forの3つ目のセクションと同じことでしょ」と言っても、唸っていました。もちろん、何も言わずともできるやつもいるのですが、なんというかプログラムって独特の思考が必要なのはやっぱりそうなんでしょうね。これらの質問を投げかけた学生は、練習問題とかそこそこちゃんとできていたんですよね。ただ、やはり数学的な思考がかけているのは確かでした。やっぱり文系の学生は、算数レベルでも論理的に考えるのは厳しいみたいです。だけど、今時理系も文系もないとは思うのですが…来年は、少し工夫をしたいと考えています。
(新居雅行 msyk@mdonline.jp


【MacWIRE配信予定】デジタルハリウッドがMac OS XのJavaに関するセミナーを開催

デジタルハリウッドは、「MacOS Xにおける最新Java開発環境」と題したセミナーを、2002年2月1日(金)19:00〜21:00、東京・御茶の水のデジタルハリウッド東京校で開催する。アップルコンピュータとボーランドが協力している。定員は120名で受講は無料だ。Mac OS Xの概略や、Mac OS Xの実行環境、そして、開発環境としてProject BuilderやBorland JBuilderのデモなどを行う予定である。クロスプラットフォームの開発環境に興味のある人や、Javaプログラマ、開発者を対象としている。問い合わせはメールアドレス(tokyo@dhw.co.jp)まで。

関連リンク:デジタルハリウッド
カテゴリ:イベント


鶴薗賢吾のCocoaはやっぱり!出張版》7. UNIXコマンドの実行(PDFファイル)

「Cocoaはやっぱり!出張版」の「7. UNIXコマンドの実行」の記事をすべてまとめたPDFファイルは、以下のリンクからダウンロードできます。

◇鶴薗賢吾のCocoaはやっぱり!出張版》7. UNIXコマンドの実行
 http://mdonline.jp/figs/02/006/MDOnline%202002.01.pdf

関連リンク:Cocoaはやっぱり!
カテゴリ:Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版


鶴薗賢吾のCocoaはやっぱり!出張版》7. UNIXコマンドの実行(1)

――――今回のテーマ
今回のテーマは、UNIXコマンドの実行です。AppleのサイトにあるサンプルプログラムのMoriarityの説明をしながら、CocoaアプリケーションからUNIXコマンドを実行する方法について解説を行っていきます。このサンプルは、Appleサイト内の以下のURLにありますので、まずはダウンロードしておいてください。

◇Moriarity
 http://developer.apple.com/samplecode/Sample_Code/Cocoa/Moriarity.htm

この解説は、以下の環境を前提にしていますので、ご確認ください。


――――アプリケーション概要
このMoriarityというアプリケーションは、以下のような画面になっています。

◇アプリケーションの実行画面
 

Find : の右側に文字列を入力してSleuthボタンをクリックすると、入力した文字列を含むパスが中央のNSTextViewに表示されます。

見た目は、普通のアプリケーションですが、内部ではUNIXのlocate ( /usr/bin/locate ) というコマンドを実行しています。コマンドのパラメータをウィンドウ上部のNSTextFieldから取り出して渡して、コマンドの実行結果をウィンドウ中央のNSTextViewに表示しています。実際に、Terminalアプリケーションで同じことをやってみた結果が以下の図です。コマンドラインから " locate ATIRagePro " とタイプしています。

◇Terminalアプリケーションでの実行画面
 

このようにCocoaアプリケーションからはUNIXのコマンドを実行することができるのです。

ちょっと補足:Moriarityというのは、シャーロック・ホームズに出てくる「モリアリティ教授」の名前から取ったもののようです。また、Sleuthというのは「探偵として働く」という意味です。親友である「ワトソン博士」の名前も後から出てきます。

――――プロジェクトとモジュールの構成
プロジェクトファイルをProject Builderで開いて、プロジェクトを構成するファイルを確認してみましょう。

◇プロジェクトの構成ファイル
 

TaskWrapper.m / TaskWrapper.hというのが、UNIXのコマンドとのやり取りを行うTaskWrapperクラスを定義しているファイルです。CocoaのFoundationフレームワークにはNSTaskというUNIXコマンドを実行するためのクラスがありますが、これをさらに簡単に使えるようにするためのクラスがTaskWrapperです。

MoriarityController.m / MoriarityController.hというのが、ウィンドウとTaskWrapperの仲介役になるMoriarityControllerクラスを定義しているファイルです。ユーザーが入力した内容をアウトレットのfindTextFieldから取り出してTaskWrapperに渡して起動し、また、TaskWrapperからの実行結果をアウトレットのresultsTextFieldに書き込むという仕事を行います。

これらのモジュールの関係を図にしてみました。

◇モジュールの関係図
 

簡単に処理の流れを追ってみます。まず、ユーザーがSleuthボタンをクリックします。すると、TaskWrapperControllerのsleuth : メソッドが実行されます…1。そして、TaskWrapperを初期化して…2、コマンドの実行を指示します…3。そうすると、TaskWrapperはMoriarityControllerに対して出力先の初期化 ( このサンプルではテキストフィールドのクリア ) を行って…4、UNIXコマンドを実行開始します。得られた結果を随時MoriarityControllerに渡して画面に表示させます…5。コマンド実行が終了したら終了処理を行います…6。

このサンプルは、MVC ( Model - View - Controller ) の設計になっていて、ウィンドウがView、MoriarityControllerがController、TaskWrapperがModelになっています。うまく作れば、ModelであるTaskWrapperに変更を加えることなく、ファイルからパラメータを読み込んで、結果をファイルに出力するというような別のアプリケーションに作り替えることが出来ます。

次に、プロジェクトウィンドウのResourcesの中にあるMainMenu.nibをダブルクリックして開いてみましょう。Interface Builderで見ると以下のようになっています ( ウィンドウは小さくしてあります )。WatsonControllerというのがMoriarityControllerのインスタンスになっています。

◇MainMenu.nibの中身
 

TaskWrapperのインスタンスはありませんが、WatsonController ( MoriarityController ) の中に含まれています。MoriarityController.hを見てみると以下のようになっています。searchTaskというのがそれです。

// ソース:MoriarityController.h/@interface MoriarityController

@interface MoriarityController : NSObject <TaskWrapperController>
{
IBOutlet id findTextField;
IBOutlet id resultsTextField;
 : 省略
BOOL findRunning; // 現在実行中
TaskWrapper *searchTask; // タスクラッパー
}
- (IBAction) sleuth : (id) sender; // アクションメソッド
 : 省略
@end

このヘッダーからMoriarityControllerは、TaskWrapperControllerプロトコルを持っていることが分かります。TaskWrapperは、コントローラを制御して出力等を行いますので、コントローラに必要なインターフェイス ( Objective-Cでいうところのプロトコル ) をTaskWrapperControllerとして定義していて、それをMoriarityControllerが持っています。

// ソース:TaskWrapper.h/@protocol TaskWrapperController

@protocol TaskWrapperController
- (void) appendOutput : (NSString *) output; // 結果の出力
- (void) processStarted; // 初期化
- (void) processFinished; // 終了処理
@end

続いてTaskWrapperのヘッダーも見てみましょう。

// ソース:TaskWrapper.h/@protocol TaskWrapperController

@interface TaskWrapper : NSObject
{
NSTask *task; // 実行するコマンド
id <TaskWrapperController> controller; // コントローラ
NSArray *arguments; // コマンドのパラメータ
}
- (id) initWithController : (id <TaskWrapperController>) controller
arguments : (NSArray *) args; // 初期化
- (void) startProcess; // コマンド実行開始
- (void) stopProcess; // コマンド実行中止
@end

taskにはNSTaskのインスタンス記憶し、argumentsにはコマンド実行のためのパラメータを記憶しています。出力をコントローラに任せるために、コントローラのインスタンスもcontrollerに記憶しています。
(この項続く)
[鶴薗賢吾]

関連リンク:Cocoaはやっぱり!
カテゴリ:Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版


鶴薗賢吾のCocoaはやっぱり!出張版》7. UNIXコマンドの実行(2)

――――MoriarityControllerの詳細
では、詳細の説明に入っていきます。ユーザーがSleuthボタンをクリックすると実行されるsleuth : メソッドからです。


// ソース:MoriarityController.m/メソッド:sleuth

- (IBAction) sleuth : (id) sender {

if ( findRunning ) { // コマンド実行中
[ searchTask stopProcess ]; // 実行中止
: 省略
}
else { // コマンド未実行時
: 省略
searchTask = [ [ TaskWrapper alloc ]
initWithController : self
arguments : [ NSArray arrayWithObjects :
@"/usr/bin/locate",
[ findTextField stringValue ],
nil ] ]; // 初期化
[ searchTask startProcess ]; // コマンド実行
}
}

コマンドが既に実行されている場合は、TaskWrapperのコマンド実行を止めるstopProcessメソッドを呼んだり、その他の終了処理を行います。実行されていない場合は、TaskWrapperクラスのインスタンスであるsearchTaskを生成します。allocした後、initWithController : arguments : メソッドを呼んで初期化します。このメソッドでコントローラとUNIXコマンドとパラメータを指定できます。コントローラは自分自身ですのでselfを渡します。パラメータは、配列で渡しますが、最初の要素は実行するコマンドのパスで、それ以降がコマンドのパラメータになっています。そして、startProcessメソッドを呼ぶことでUNIXコマンドが実行されます。stopProcessとstartPorcessについては、後程説明します。

startProcessメソッドを呼ぶと、searchTaskからコントローラ側の初期化としてのprocessStartedメソッドが呼び返されます。結果を表示するテキストフィールドをクリアしたり、Sleuthボタンのタイトルを変更したりします。

// ソース:MoriarityController.m/メソッド:processStarted

- (void) processStarted {
findRunning = YES;
[ resultsTextField setString : @"" ]; // テキストフィールドのクリア
[ sleuthButton setTitle : @"Stop" ]; // Sleuthボタンのタイトル変更
}

その後、UNIXコマンドが実行開始されます。UNIXコマンドから結果が出力されると、TaskWrapperからappendOutput : メソッドが呼ばれます。このメソッドは、繰り返し呼ばれます。NSTextViewにテキストを追加してスクロールする処理を行っています。

// ソース:MoriarityController.m/メソッド:appendOutput

- (void) appendOutput : (NSString *) output {

[ [ resultsTextField textStorage ]
appendAttributedString : [ [ [ NSAttributedString alloc ]
initWithString : output ] autorelease ] ];
[ self performSelector : @selector(scrollToVisible:)
withObject : nil
afterDelay : 0.0 ];
}

- (void) scrollToVisible : (id) ignore {
[ resultsTextField scrollRangeToVisible :
NSMakeRange( [ [ resultsTextField string ] length ], 0 ) ];
}

コマンド実行が終了したら、TaskWrapperからprocessFinishedメソッドが呼ばれます。ここでSleuthボタンのタイトルを元に戻したりしています。

// ソース:MoriarityController.m/メソッド:processFinished

- (void) processFinished {
findRunning = NO;
[ sleuthButton setTitle : @"Sleuth" ]; // Sleuthボタンのタイトル変更
}

――――TaskWrapperの詳細
ここからは、TaskWrapperクラスの詳細について説明を行います。TaskWrapperは、FoundationフレームワークのNSTaskというUNIXのコマンドを呼び出すクラスと直接やり取りを行うクラスですので、ここからが本題となります。

◎ コマンドの実行まで
まずは、TaskWrapperの初期化メソッドである initWithController : arguments : からです。このメソッドはallocされた直後に呼ばれます。やりとりを行うコントローラのインスタンスと、コマンドのパスとパラメータを配列で受け取って記憶します。

// ソース:MoriarityController.m/メソッド:initWithController

- (id) initWithController : (id <TaskWrapperController>) cont
arguments : (NSArray *) args {
self = [ super init ]; // スーパークラスによる初期化
controller = cont; // コントローラを記憶
arguments = [ args retain ];
// コマンドとコマンドに渡すパラメータを記憶
return self;
}

次は、実際にコマンドを実行するstartProcessメソッドです。ちょっと長くなりますが、まずは全体を見てください。最初のところでは、先程説明しましたprocessStartedというコントローラを初期化するメソッドを実行しています。

// ソース:MoriarityController.m/メソッド:startProcess

- (void) startProcess {

[ controller processStarted ]; // コントローラの初期化

// 実行準備
task = [ [ NSTask alloc ] init ]; // 生成と初期化
[ task setStandardOutput : [ NSPipe pipe ] ]; // 標準出力変更
[ task setStandardError : [ task standardOutput ] ]; // 標準エラー変更
[ task setLaunchPath : [ arguments objectAtIndex : 0 ] ];
// コマンド設定
[ task setArguments : [ arguments subarrayWithRange :
NSMakeRange( 1, ([arguments count] - 1) ) ] ];
// パラメータ設定
// 標準出力からのデータを受け取るための通知設定
[ [ NSNotificationCenter defaultCenter ]
addObserver : self
selector : @selector(getData:)
name : NSFileHandleReadCompletionNotification
object : [ [ task standardOutput ] fileHandleForReading ] ];

[ [ [ task standardOutput ] fileHandleForReading ]
readInBackgroundAndNotify ];

[ task launch ]; // コマンド実行

}

(この項続く)
[鶴薗賢吾]

関連リンク:Cocoaはやっぱり!
カテゴリ:Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版


Mac OS X版もあるJBuilder 6 Personalで、なんとか日本語を使ってみる

BorlandのJava開発ツールJBuilder 6では正式にMac OS Xに対応しているが、米Borlandのサイトでは、このバージョンのフリー版であるJBuilder 6 Personalが公開され、ダウンロードができるようになっている。Mac OS X版があり、ダウンロードし圧縮を解答すると、InstallAnywhereによるインストーラで、対話式にインストールができる。インストーラでは日本語の表示も出てくるので、JBuilder側では日本語対応についてはある程度は考慮しているということであろう。ただし、Mac OS X 10.1.2でも、Swingの動作の問題は日本語環境では存在するので、まだ、実用になるとは言えない部分もあるが、現状でも少し我慢をすれば、日本語をソースに入力したりができることが、MDOnline読者の谷津さんより教えていただいた。

JBuilderの初期状態では日本語の文字列をソースに打ち込んでも文字化けしてしまう。そこで、ToolsメニューのEditor Optionsを選択し、ダイアログボックスでDisplayのタブをクリックすると、そこでフォントを選択できる。システムに存在するすべてのフォントが出てくるわけではないのだが、その中には日本語の表示が可能な「Osaka-mono」を指定する。そうすれば、ソースでいちおう日本語が表示される。エンコーディングの設定は

/Developer/Applications/JBuilder6/JBuilder.framework/bin/jdk.config

というファイル記述できる。以下のような箇所があるので、vmparamの行の#を抜いてコメントをはずし、最後の部分をEUC_JPなどと記述すれば良い。なお、このファイルのこの部分は、シフトJISコードで記載されている。

# +-----------------------------------------------------+
# | |
# | デフォルトのファイルエンコーディングで問題がある |
# | 場合は、次の行のコメントを外してください。 |
# | |
# | |
# +-----------------------------------------------------+
#vmparam -Dfile.encoding=ISO8859_1

ただ、こうすれば、まったく問題がないわけではなく、やはり時々文字が消えたり化けたりはするようだ。また、動作が重たくなる問題もあるので、JBuilderをスムーズに使えるというところまでは行かないだろうけど、試用してみる分にはある程度は利用できるだろう。

さて、そのJBuilderであるが、Windowsでのおなじみの動作と特に大きな違いはないようだ。ただし、メニューは最初から、Mac OS Xの形式となっているため、メニューバーにメニューが出てくる。JBuilderのウインドウにはツールバーが並ぶがそちらにはメニューは出てこない。なお、メニューや画面メッセージなどは英語である。Personal版なので、各種ウィザードも利用できないものとなっている。また、同様にMac OS Xのパッケージ生成についても機能的には見られない。
JBuilder自体は、/Developer/Applicationsディレクトリにインストールされる。そして、JBuilderのアプリケーションはパッケージではあるが、そのアプリケーションは単なるローンチャのようで、実体は同じフォルダにあるフレームワークとしてまとめられているようである。
いずれにしても、Pure Java系のプログラマには待ち望まれるツールであるだけに、早く日本語で問題なく利用できるようになって、日本語版の出荷を実現してもらいたいところだ。

関連リンク:JBuilder 6 Personal
カテゴリ:Java, 開発ツールその他


【MacWIRE配信予定】MDOnline Digest》2002年1月第3週のMDOnlineから

――――この原稿は、MacWIRE様に掲載していただくための原稿で、MDOnline読者様向けにはすでに周知の事実も含まれていますが、あらかじめご了承ください。

Macintosh関連の開発情報や技術情報をお届けしている有償の日刊メールマガジン「Macintosh Developer Online(MDOnline)」で、2002年1月第3週にお届けした内容のダイジェストを紹介しよう。

まずは、Appleが2002年度の第一四半期の業績を発表した。営業での大きな赤字はないものの、経費を大きく削っての収支であることが伺える内容であった。

2002/1/17●Appleが2002年度第一四半期の決算を報告、経費を削り利益は黒字を達成

WebObjectsの最新版Ver.5.1が到着したのでさっそく使ってみた。また、アップルコンピュータで、WebObjects 5.1についての説明会が開催され、EJBを使った開発がどのようなものかが実際に示され、それを詳しく記事でお届けした。

2002/1/18●WebObjects 5.1に関する説明会が開催、EJBでの実際の開発をデモ
2002/1/16●WebObjects 5.1にさっそくアップデート、諸問題はとりあえず解決している模様
2002/1/19●WebObjects 5.1のアップデータはADCメンバサイトでダウンロード可能

Apple関連ソフトウエアのアップデート等もいくつかった。AirMac 2.0.1のリリース、Mac SO Xの北欧・アジア系言語リソースのアップデート、そして、Windows版のAirMac BaseStationの管理ツール、Mac OS X Server 10.1.2へのアップデータが登場した。

2002/1/18●AirMac 2.0.1がリリース、旧タイプのベースステーションのファームウエアも更新
2002/1/18●Mac OS Xの北欧系言語、韓国語、中国語の言語機能をソフトウエア・アップデートで配付
2002/1/18●KBase》Mac OS X Serverの10.1.2のアップデータが公開
2002/1/16●KBase》Windows向けのAirMac Base Stationの管理ツールが公開

Metrowerks社からは、同社のMac OS向けに開発されてきているアプリケーションフレームワークPowerPlantが、Adobe SystemsではWindows向けのアプリケーション開発でも使われていることが発表された。つまり、Windows向けのPowerPlantがあり、これを利用して、Mac OSとWindowsの両対応を効率的に実現しているということである。Metrowerksはこうしたテクノロジーのライセンス提供できることをアピールするものだ。

2002/1/15●Adobe SystemsはWindows向けのPowerPlantを使ってMac/Win両対応

連載コーナの「Java Watch on the X」では、前の週から引き続いて、Mac OS XでのPure Javaアプリケーションを、パッケージ形式で構築するときにさまざまな設定を説明している。実行に必要なクラスパスやメインクラスの設定、ライブラリを追加して実行したい場合の対処法などを説明した。

2002/1/15●Java Watch on the X》4 - アプリケーションをパッケージとしてビルドする(3)実行時に必要な情報
2002/1/17●Java Watch on the X》4 - アプリケーションをパッケージとしてビルドする(訂正)クラスパス
2002/1/17●Java Watch on the X》4 - アプリケーションをパッケージとしてビルドする(4)ライブラリについて
2002/1/17●Java Watch on the X》4 - アプリケーションをパッケージとしてビルドする(5)その他の実行時の情報

★MDOnlineは、ローカスが発行するオンライン情報メディアで、日刊のメールマガジンを中心に、Macintoshの開発情報や技術情報をお届けしている。過去の記事はWebサイトですべて参照できるようになっている。Mac OS Xの話題を積極的に取り上げるとともに、Knowledge Baseの公開情報を要約するなどAppleからの情報をフォローし、開発ツールやシステム関連ユーティリティなどのサードパーティ情報も扱う。購読料は有償で、年間8,000円、半年5,000円、1か月1,000円(消費税込みの基準価格、支払い方法により金額が増減する)。購読はWebページから申し込むことができ、郵便振替、クレジットカード(QQQシステム)、WebMoneyやBitCash(プリペイドカードやクレジットカードでのオンライン購入)での支払いに対応している。
Macintosh Developer Online

カテゴリ:MDOnline Digest