Macintosh Developer Online (MDOnline)


2001年11月28日発行号 - Cocoaはやっぱり!書籍レビュー



今日からJavaOneですが、私は明日からの1泊の予定で行ってきます。Appleのセッションの記事に加えて、Apple ComputerのJava担当の方々とインタビューができるので、それも記事にします。いずれも、明日の配信を目指します。もし、インタビューで確認してほしいことがあれば、メール等を下さい。可能な限りがんばります。JavaOneの第1回って、1996年にサンフランシスコであったのですが、ちょうどそのとき、サンフランシスコに私はいました。よっぽど立ち寄ろうかと思ったのですけど、実は新婚旅行だったので、思いとどまった次第です(笑)。車で通りかかったモスコーニセンターに人がいっぱいいたのは確認しましたけど、そのときはWWDC程度の入りだったみたいですが、その後10倍近い参加社の増加になったみたいです。そして5年が経過し、はじめてアメリカ以外で開催されることになったそうです。今回の参加者はどれくらいなのでしょうか。Javaについては今後どうなるのかは微妙ですけど、言語としては残るような気がしますから、Mac OS Xではメンテナンスをずっと続けてほしいと思うところです。

さて、今週で、今月は終わってしまいますが、何度もお知らせしたように、MacWIREへの配信量が、来月からぐっと減少する予定です。今月に購読期間が終わる方は、ぜひとも更新をお願いします。もし、明日、明後日に、郵便振替で入金される方はすみませんが、メールでご一報いただけますでしょうか。入金通知のタイミングが遅いときがありますので、よろしくお願いします。

さて、お待ちかねのプレゼントです。なんか見え見えのスケジューリングで申し訳ないですが、12月に購読権のある方だけが当選の権利があるということになります。よろしくお願いします。

===============================プレゼント
Mac OS Xプログラミング入門 Cocoaはやっぱり!(5冊、広文社様ご提供)
――――――――――――――――――――――――――――――――――――


(新居雅行 msyk@mdonline.jp


Cocoaはやっぱり!の書籍版が発売、初心者からしっかり勉強したい人にもおすすめ

Cocoaでのアプリケーション開発を解説した、「Mac OS Xプログラミング入門 Cocoaはやっぱり!」が広文社より出版された。価格は3,800円で、筆者は、MDOnlineでの執筆や同名のWebサイトでも知られる鶴園賢吾氏だ。Objective-Cでのプログラミングとなっているが、コーディングはもちろん、Interface Builderの使い方を図をしっかり示しながら説明しているのが特徴だ。GUIをベースにした開発環境は、分かっている人からすれば「見ての通り」ですまされてしまい、初心者を遠ざける傾向もあるのだが、本書はそうした心配はない。操作が分かりやすい図で示されると同時に、それが何をするためのものかということが解説されており、最初の1歩から理解するところまでをフォローする。書籍では、メモ帳、画像ビューアといった具体的なテーマで、Mac OS Xネイティブなアプリケーションを作成する。そして、グラフィックスの描画についても詳しく説明されている。Objective-Cの基礎についても簡単に説明されているので、C言語の知識があれば、読みこなすことができるだろう。Cocoaのフレームワークで利用するメソッドなどについては、リファレンス的に利用できるように、引数の説明や戻り値も含めて、きちんと解説されている。これから、Cocoaでのアプリケーション作成をはじめようと思っている人や、Interface Builderの使い方がいま一つ分からないという人など、Mac OS XでのCocoaプログラミングを行う初心者、あるいは中級者までも含めて、しっかり読んでみたい本であることは間違いない。

関連リンク:広文社
カテゴリ:雑誌、書籍, Cocoa


小池邦人のプログラミング日記》2001/11/28<Interface Builderに再挑戦する>

以前、「NibベースのCarbonアプリを作る」という題目で、CarbonアプリとNibファイルやInterface Builderの関係について何回か解説したことがありました。ただし、その時に用いたMac OS Xはパブリックβ版でしたので、最終仕様を確認するには至らなかったわけです。今回は、Mac OS X 10.1と同時に発表されたInterface Builder 2.1を使い、CarbonアプリでのNibファイルの活用を再考してみたいと思います。

11/28現在、ADCメンバーサイトには「CarebonLib_1.5f2_SDK」が登録されています。前回、「余裕ある開発進行状態」を褒め、「完成は来年初頭か?」などと書いてしまったのですが、どうも様相は一変したようです(笑)。β版をすっ飛ばして突然f版が登場いたしました。(昔々、QuickDraw 3Dがd版からα版とβ版をすっ飛ばしてf版になったことがある...)Appleは、近々発表されるだろうと噂されているMac OS 9.2.2に、このバージョンを搭載するつもりでしょうか?もしそうなら、Mac OS 9とMac OS Xで同バージョンのCarbonLibが使えないと、色々と面倒なことが起こります。デベロッパー側としては、Mac OS X 10.1にも1.5準拠のCarbon Framewrokを早急に搭載して欲しいところです。

まずは、おさらいからです。NibベースのCarbonアプリの簡単なサンプルをを得るには、Project Builder 1.1を起動し、アシスタントで「Carbon Application (Nib Based)」を選び、ひな形プロジェクトを作ります。

 

このプロジェクトの「グループとファイルリスト」に表示される「Resources」内の「main.nib」をダブルクリックすれば、Interface Builderが起動し、そこに含まれているオブジェクトがすべて表示されます。初期状態では「MenuBar」と「MainWindow」(メインメニューバーと空のウィンドウ)の2つのオブジェクトが登録されています。これらをアプリケーション側から呼び出すには、以下のような簡単なソースコードを記載するだけでOKです。

 

このルーチンを実行した後にRunApplicationEventLoop()を呼べば、メニュー、ウィンドウ、コントロールなどに対する適切なCarbon Event処理が開始されることになります。

それでは、Project Builder 経由でなくNibファイルを作成するにはどうしたらよいのでしょうか?ダイレクトにInterface Builderを起動し、最初に表示される「Starting Point」ダイアログで「Main Window With Menu Bar」を選択します。

 

この時、Languageメニューから「Japanese」を選んでおけば、出来上がったディフォルトのメニューバーやタイトルは日本語表記となります。ただし、Project Builderは日本語版なのですが、Interface Builderの方は日本語版になっていません。Mac OS X付属アプリの中では珍しいケースです。ぜひ、次期バージョンでは日本語版を提供して欲しいと思います。

昔からのMacintoshデベロッパーは、リソースファイルのメニューやダイアログをNibファイルへと変換したい場合があります。そんな時には、Fileメニューの「Import Resource File」を使います。ファイル選択ダイアログで変換したいオブジェクトを含むリソースファイルを選び、表示された「Resources」ダイアログで変換対象を個別に選びます。

 

Encodingメニューで「Japanese (Mac OS)」を選択しておけば、日本語表記のメニューやコントロールタイトルも文字化けせずに変換されます。ただし、いくつか変換の実験をしてみたところ、コントロールタイプがうまく移行できないケースが見つかりました。

 

この場合には、左上のダイアログのチェックボックスが、右上のような正体不明のコントロールに変換されています。また、これをFileメニューの「Test Interface」で動作確認してみると、左下のようにスライダーとして表示されてしまいます?

個別にコントロールを作成する時にも、いくつかの不都合が見受けられました。まず、Tabコントロールですが、Tabアイテムの名称に日本語を入力しても表示されません(半角英語はOK)。

 

これには困りました。とりあえず英語でダミーを入力しておき、後からAPIを使って日本語に差し替えればOKだろうと考えていました。ところが、Tabアイテムの名称を後から変更する方法が見つかりません(涙)。現在調査中ですが、ひょっとすると不可能なのでしょうか? 加えて、ポップアップメニューのように、メニューリソースを付加する必要があるコントロールのAttributesに、何故だかメニューIDを入力するカラムがありません。

 

これだと、アプリ側でメニューの割り付け処理を行わなければならず、煩雑で美しくありません。リソースはメニューIDが登録可能なのですから、これはNibデータの仕様の不備かもしれません?

Project BuilderからInterface Builderを呼び出す場合、コントロールに表示させたいアイコンやPICT画像は、リソースファイルにしてNibファイルと同階層に置けばOKです。これにより、Interface Builderの「Image」Tabに、アイコンやPICTリソースが表示され、それをドラッグ&ドロップでコントロールに付加できるようになります。

 

しかし、どうもこの仕組みはProject Builderとの連携のみで機能するようです。Porject Builderではなく、CodeWarriorのプロジェクトでNibファイルを使う場合、リソースファイルをそれと同階層に置いても、その中のアイコンやPICTリソースはnterface Builderでは表示されません。

 

アイコンやPICT画像ぐらいは、ドラッグ&ドロップでImage Tabにダイレクトに登録できるようにしてもらいたいものです。ただし、ここで紹介した不都合は、私の操作方法に問題があるため起こっている可能性もあります。うまくいく方法をご存知の方は、ぜひ私宛にご連絡いただければと思います。よろしくお願い致します。

さて、コントロールの配置やコマンド編集などでは非常に高い能力を発揮するInterface Builderなのですが、作成できるオブジェクトの種類が限定されているのが残念でなりません。このままですと、我々デベロッパーは相も変わらずResEditやResorcererなどのリソース編集アプリを併用する必要があります。ResEditに関してはCarbon化されるとは思えませんし、Resorcerer 2.4の方はCarbon化はされてはいますが、Mac OS X 10.0をリファレンスに開発されており、レスポンスが悪い機能や不安定な箇所が多々見受けられます。それ以外にもいくつかライバル製品は存在しているようですが、「これだ!」と言えるMac OS X対応アプリは登場していません。マウスカーソル、アイコン、パタン、PICT画像、文字列など、Macintosh環境には長い年月をかけて積み上げられてきた数多くのリソースが存在します。そうした物の多くは、アプリケーションと密接な関係を保ち、簡単には外せない状態となっています。そうしたリソースの編集が可能になるか、もしくは、それらの代用となる仕組みが確立されるか..。とにかく、我々がリソース編集ソフトを使わなくてもよい時代が来るように、Interface Builderの更なる進化を心から望みたいと思います。

Interface Builder 2.1について、現状の不都合や将来的に改良してほしい点を取り上げてきましたが、今までのリソース編集ツールと比較すると、はるかに使いやすく有用であることは明らかです。Metrowerks社のCodeWarriorなどの他社製の開発環境も、Project Builderに対抗するためには、Interface Builderとのスムーズな連携を強化することが不可欠でしょう。ぜひ負けずに頑張って欲しいと思います。
[小池邦人/オッティモ]

関連リンク:オッティモ
カテゴリ:ProjectBuilder/Interface Builder, Carbon/CF, 小池邦人のプログラミング日記


Java Watch on the X》3 - 今度こそ「JavaからAppleScript」を実行する(1)

【MDOnline読者様限定コンテンツ】
前回のJava Watch on the Xでは、さっそく“最後の手段”としてのAppleScriptを実行する方法を、さっそうと紹介しようとしたが、なぜかJDirectでOSA関連のAPIをたたく方法ではきちんどスクリプトが動作しなかった。そのリベンジということで、きちんと動くAppleScriptの実行クラスを作成したので、それを紹介しよう。ポイントは、Mac OS Xに用意されているosascriptというコマンドを使うことだ。このコマンドを呼び出すクラスを作成した。もちろん、Mac OS Xでないと利用できないクラスになる点は注意してもらいたい。Mac OS 8/9でも使えないし、WindowsやLinuxでもだめだ。もっとも、後者のOSはAppleScript自体が動かない…。

プログラムのポイントは、単に外部のプロセスを呼び出し、そこで標準入出力や診断入出力をどうするのかといった点だけである。まずは、サンプルプログラムをダウンロードしておいてもらいたい。Mac OS X 10.1のDeveloper Toolsで利用可能なプロジェクトファイルが含まれている。

◇サンプルプログラム:MDOnline_03_DoAppleScript
 http://mdonline.jp/figs/01/0041/MDOnline_03_DoAppleScript.sit

ソースファイルは3つだが、AboutBox.javaとMDOnline_03_DoAppleScript.javaは、プロジェクトを新たに作成するとき、「Swing Application」をテンプレートとして選択して表示されるものだ。なお、AppleScriptの実行テストを行うために、MDOnline_03_DoAppleScript.javaにはプログラムを追加しているが、このクラスのコンストラクタの後半にそれらがある。どこに追加したのか分かるようにはしておいてあるので、ソースを御覧いただきたい。プログラムとしては、paintメソッドでdrawStringで文字をでっかく書くのをやめて、BorderLayoutにしてウインドウいっぱいにJTextAreaを配置し、そこで文字列を表示できるようにしている。
そして、実際にAppleScriptを実行するクラスはAppleScriptRunner.javaに定義してある。そのクラスのドキュメントだけ、オンラインで参照できるようにしておいた。(前記のサンプルプログラムのディレクトリにも入っている)

◇AppleScriptRunnerクラス
 http://mdonline.jp/figs/01/0041/AppleScriptRunner.html

こうしたクラスを作成するとき、どこまで汎用的に作るかということはなかなか難しいところであるが、ある程度の分かりやすさと汎用性を兼ね備えて作ったつもりである。そのため、staticなクラスとした。メインとなるのは、doScriptメソッドである。staticなメソッドであるため、

AppleScriptRunner.doScript(".....");

で呼び出すことで、引数に文字列で指定したAppleScriptのプログラムを実行する。スクリプト編集プログラム(Script Editor)を使って実行したときには、実行後に「結果」ウインドウで、resultの値が得られるが、このdoScriptでは、その結果は戻り値のテキストとして得られる。テキストなので、戻り値自体が参照の場合などでは後処理も必要かもしれないが、スクリプトによる情報の取得結果などは基本的には得られるところだ。
スクリプトの実行でエラーがあったら、getErrorMessageメソッドでそのエラーを文字列として取得できる。逆に、エラーがあったかどうかは、getErrorMessageの戻り値で判断するしかない。エラーがなければnullとなる。このgetErrorMessageメソッドもstaticなので、

AppleScriptRunner.getErrorMessage()

と利用すればいい。なお、スクリプトでのエラーがあった場合も例外を発生させるという方が考え様によっては便利なときもあるだろう。そのときは、ソースを修正して使っていただければかまわない。
デバッグ用に用意したのが、setPrintScriptメソッドでこれもstaticだ。この引数にtrueを与えて呼び出すと、doScriptのメソッド内で、スクリプトの実行を行う前に実行するスクリプトを標準出力に書き出す。思った通りのスクリプトプログラムとなっているかを確認できるという具合だ。
実際にさまざまなスクリプトを作るようになったときに面倒なのが、ファイルの指定方法がJavaとAppleScriptで大きく違うところだ。これを吸収するために、getMacOSPathというクラスメソッドを用意した。たとえば、

AppleScriptRunner.getMacOSPath(new File("/Users/msyk/test.txt"))

の戻り値は、以下のような文字列となる。

(file "Users:msyk:test.txt" of startup disk)

いちおう、起動ボリュームでも、起動ボリュームでない場合でも対応できるようにした。また、Fileオブジェクトがフォルダのものなら、folder ... となるようにしている。チルダをホームディレクトリに変更したりもする。また、さまざまな文字列の変換も組み込んである。また、31バイトを超える長さのファイル名でもいちおう基本的には動くことを確認している(FinderはOKのようだがアプリケーションが対応しているいかどうかの問題がある)。
これにより、JavaのFileクラスから、AppleScriptでのファイル参照形式が得られるが、もちろん、基本的にはFinderのスクリプト向けである。なお、あらゆるキャラクタに適用されるのかと言われれば、若干自信はない面もあるので、もし、ある種の文字列がファイル名に入っている場合にうまくいかないなどの不具合があれば、ぜひともおしえていただきたい。
あと、いくつかのstaticメソッドを用意したが、いずれも、doScriptを使った応用である。getCommentやsetCommentは、Fileクラスで指定したファイルのコメントを取り出したり、あるいはコメントを設定できるものだ。doScriptByFinderは、Finderに実行させるスクリプトプログラムの断片を与えて、doScriptを実行するものだ。要は、tell application "Finder"とend tellの間の部分だけを指定することで、プログラムの実行をできるようにしたものである。ズボラさん向きかもしれない(笑)。

doScriptメソッドを使ったプログラム例を紹介しておこう。MDOnline_03_DoAppleScript.javaにあるように、たとえば次のようにすることで、AppleScriptのプログラムを実行することができる。(\は実際にはバックスペースである)


String script = "tell application \"Finder\"\r activate\rend tell";
try {
System.out.println(AppleScriptRunner.doScript(script));
}
catch(Exception e) { System.out.println(e.getMessage()); }
System.out.println("Script Error-->"+AppleScriptRunner.getErrorMessage());

簡単なスクリプトだが、変数scriptには、以下のようなAppleScriptプログラムを代入している。

tell application "Finder"
activate
end tell

実行されると、Finderがアクティブになるというだけである。このスクリプトは結果はなにもないので、標準出力には何も出力されないし、スクリプトのエラーはnullとなる。まじめには、getErrorMessageメソッドの戻り値を見てnullなら出力しないということを組み込む必要はあるだろうが、ここはテストランということでお許しいただきたいと思う。なお、ここでは改行は\rとしているが、\nにしても稼働する。何でもいいようだ。また、日本語を含むスクリプトも、単にJavaの文字列として用意すればいい。特に変換をしなくてもいいようである。
ここで、スクリプトとして、

script = "tell application \"Finder\"\r zzzzzzz\rend tell";

のように無理に間違ったものを指定すると、標準出力には次のように表示される。

========== Execute the following script:
tell application "Finder"
zzzzzzz
end tell
==========

Script Error-->execution error: The variable zzzzzzz is not defined. (-2753)

つまり、getErrorMessageメソッドで、スクリプトのエラーメッセージを取り出しているということになるわけだ。

AppleScriptRunnerクラスの使い方はおおまかには以上の通りだ。ファイルのコメントの設定などとなると、class MacFile extends java.io.Fileなどとして、MacFileクラスをきちんと定義して使えとおっしゃるかもしれないが、今回は簡単に完結するサンプルであるとしてお許しいただきたい。引き続いて、AppleScriptRunnerクラスの中身を解説しよう。

(この項、続く)

カテゴリ:AppleScript, Java Watch on the X


OpenBase SQL 7.0.2がリリース、Mac OS X以外のプラットフォームにも対応

Mac OS X/Server 10.1で稼働するデータベースエンジンのOpenBase SQLがバージョンアップして、Ver.7.0.2となった。Ver.7.0.0ではMac OS X/Serverだけが対応となっていたが、7.0.2では、Solaris 8、Linux、Windows NT/2000、OS X Server 1.2にも対応した。OpenBase SQLは、WebObjectsに組み込まれて出荷されていることから、WebObjectsでの利用が多いが、JavaやPHPに対応しておりさまざまなアプリケーションサーバからの利用が可能となっている。ODBCドライバ、JDBC 2.0対応のドライバが供給されている。また、4DやREALbasicでのデータベース接続プラグインもある。C、Cocoa、Carbonからの利用にも対応している。Mac OS X/Server 10.1ではGUIを利用した管理ツールも利用でき、Ver.7.0ではより使いやすい形態に機能アップされている。

関連リンク:OpenBase International
カテゴリ:Windows, UNIX, データベース


KBase》Classicを終了しようとして応答しないというメッセージがでる場合

システム環境設定でClassicを終了しようとしたとき、Classic環境からの応答がないという意味のメッセージを出すことがある点について、Knowledge Baseで公開された。これは、Mac OS 9のシステムを別のボリュームにある場合にメッセージが出る。そのとき、Classicが起動してないというメッセージが出るのであれば、応答しないというメッセージは不正確な表示をしただけである。ログアウトなどの作業でそうしたメッセージが出ないのなら、問題はないということのようだ。

関連リンク:Mac OS X 10.1: "The Classic Environment is Not Responding" Message
カテゴリ:Knowledge Base(旧TIL), Classic