Macintosh Developer Online (MDOnline)


2002年2月15日発行号 - WOのセミナー



今日のWebObjectsのセミナーの記事は、昨晩にmdo-dのMLで流したものと同じものです。昨晩流したものは、アップル様からの生原稿で、今日のは記事ということです。繰り返しますが、申し込みはお早めにどうぞ。
ところで、REAL softwareのCEOであるGeoff Perlman氏が以下のようなWhite Paperを発表しています。

◇What is the difference between Carbon and Cocoa and should I even care?
 http://www.realsoftware.com/realbasic/about/Carbon_vs_Cocoa.html

CarbonベースのREALbasicへの風当たりが強いのか、最後の結論は、確かにCarbonよりCocoaの方が機能は優れているけど、REALbasicはCocoaよりも優れているということになっています。REALbasicだと、Mac OSでもWindowsでも動くということや、同じ機能でも簡単に実現できるとしています。Carbonの必要性はもちろん高く、CarbonがあることからOfficeやAdobeの従来のソフトがMac OS Xでもネイティブで利用できるのは確かですので、Cocoaを使わないのはバカだみたいな意見はまったく話にはなりませんが、一方で、上記のWhite Paperの意見は論調がちょっと苦しいのではないかとも思われます。言語やフレームワークで決まる部分は確かにあるけど、それが最終的な結論かと言えば、結局は作るものによって決まってしまいます。ツールやフレームワークは、柔らかいところもあれば固いところもあるわけで、開発者としては要は使い分ければいいわけです。もっとも、CarbonというのはMac OS互換というある意味では後ろ向きなイメージがあることから、REALbasicに対してもネガティブな意見が投げ付けられているのかもしれません。
また、少し気になっていたことではありますが、REALbasicはアップデート間隔を短くしてきて、その都度アップデート料金を取ります。4.0では2.0以降のアップデートができるようになりましたが、3.5までは直前のものからしかアップデートできないので、ある意味では使わなくてもアップデートしないといけない状況でした。メーカーとしての収入確保という点では理解できるのですが、そこまでするのなら、「年間契約」とかのサブスクリプションにすべきではないかと思います。むしろその方が、価格に対する透明性は高いはずです。もっとも、CodeWarriorもサブスクリプションだったのをやめているなど、市場環境にマッチしないということもあるのかもしれませんけど、頻繁なバージョンアップで資金回収するというモデル自体が開発者から見放されませんでしょうか?
いずれにしても、REAL softwareとしては、正念場でしょう。なんせ、Cocoaの開発環境はアップルが無償で配付しています。それに対抗する必要があるからです。じゃあどうすればいいかといえば、それはなかなか難しいところです。私たち開発している側からすると、選択肢が減るのは困ります。だから、やっぱり、当面は使わないなと思っても買うしかないのかなと思います。
(新居雅行 msyk@mdonline.jp


WebObjectsの技術解説やソリューションを紹介するセミナーを開催

アップルコンピュータは、2002年3月8日(金)に東京初台のオペラシティにあるアップルコンピュータセミナールームにおいて、「WebObjects テクニカル&ソリューションセミナー」を開催する。13:30〜17:00に渡って行われ、事前登録制で無料で受講できる。アップルコンピュータの担当者による「WebObjects 5.1 最新情報」は、EJBに対応したWebObjects 5.1について、EJBとEOFの使い分けといったことが解説される。テクニカルピットの倉橋浩一氏による「WebObjects による効果的なシステム開発手法」、プラネットコンピュータ「WebObjectsによるPDFソリューション」、オブジェクトビジョンによる「マルチリンガル対応ECサイト・マーケットプレイス構築ソリューション」、そしてQ&Aが行われる予定である。申し込みは、メールの宛先をwo_seminar@apple.co.jp、件名を「WebObjectsセミナー参加希望」として、名前、会社名(団体、学校名)、部署名、住所、電話番号、電子メールアドレスを本文に記載し、3月8日のセミナー受講であることを記載して申し込む。

関連リンク:WebObjects
カテゴリ:WebObjects, イベント


安価で取り扱いが簡単なマルチユーザSQLデータベース

Colourfull Creationsは、マルチユーザ対応のデータベースエンジン「Multi-DBServer」をリリースした。Mac OS 9、Mac OS X、そしてWindowsで利用できるデータベースエンジンである。まるちユーザからの接続に対応しており、TCPのソケットベースでのコネクションを行って、データベース利用ができる。SQL言語でのデータベース利用に対応している。3クライアントまでの利用はフリーである。5ユーザライセンスは$35、10ユーザライセンスは$60となっている。それぞれ、MacないしはWindows版だが、両方まとめてのライセンスは$55と$90となっている。フリー版ではサポートが受けられない。なお、15ユーザ以上は問い合わせることになっているがニュースリリースでは100ユーザで$300という価格が示されている。
Multi-DBServerの特徴はシンプルということだ。単にアプリケーションを起動すればサーバとして利用できる。マルチユーザ対応であるが、100ユーザを超えるような大規模なシステムには向いていないとしている。数十クライアントまでの小規模なシステムでの利用を勧めている。いずれにしても、シンプルに使えて安価であるということが大きな特徴だろう。ただし、現在はクライアントとしては、REALbasicで作成するか、あるいはソケットを利用したものということになる。REALbasicでクライアントを作成するためのライブラリが付属する。また、Pure Javaでの簡単なサンプルがあるが、java.net.Socketからストリームをやりとりするだけのシンプルなものだ。JDBCのドライバ等は付属していない。サーバ自体はREALbasicで作成されている。SQLについては主要なコマンドはサポートされているが、一部にサポートされていないものもある。製品自体はシンプルなものではあるが、気楽に使えるSQLサーバという意味では、重宝するかもしれない。

関連リンク:Colourfull Creations
カテゴリ:データベース


【MacWIRE配信予定】小池邦人のプログラミング日記》2002/2/15 _ ウィンドウのグループ化 その1(1)

   この記事のPDFファイル(738KB)は以下のアドレスにあります。
   ダウンロードには、MDOnlineのアカウントが必要です。
   pdfs/MDOnline020011.pdf
 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
今回は、Mac OS X 10.1で利用できるようになったウィンドウのグループ化について解説します。この機能を利用すると、マウスドラッグにより複数のウィンドウを同時に移動させるようなことが可能となります。

今年のWWDC(Worldwide Developer Conference)は、5/6から5/10までアメリカのサンホセ市で開催される予定です。Apple社のサイトでは、まだ参加登録は始まっていないようですが、そろそろ開始されるのではないでしょうか? 今年のスケジュールでは、開始日がゴールデンウィークの終わりと重なっていますので、海外へ出るために国内移動をしなければならないデベロッパーにとっては、交通機関の予約などを早めにしておく必要があります。ところが、毎年アップル社がデベロッパーに斡旋する日本からのツアーは、スケジュールが決定するのが遅れがちでした。国内事情も考慮に入れて、今年は早めのスケジュール決定をお願いしたいと思います。

それでは、ウィンドウのグループ化についての話を始めます。Sheetウィンドウが降りている場合でも、その親ウィンドウのタイトルバーをドラッグすることで、両ウィンドウを同時に移動させることが出来ます。これは、両方のウィンドウが「グループ化」されており、ユーザの操作に対して行動を伴にするようにシステム側で管理されているからです。ここでは、Window Managerの「グループ化」APIを利用した「Group_Demo1」というサンプルアプリケーションを紹介いたします。アプリケーションを起動すると、「テキスト」「ポップアップ」「終了」という3つのボタンが配置されたウィンドウがオープンします。各ボタンコントロールに対応するコマンドIDは、先んじてInterface Builderで設定してあります。「テキスト」には‘text’ が、「ポップアップ」には‘popu’が、「終了」には‘quit’が割り付けられています。まずは、アプリケーションの機能を紹介することにしましょう。

 

「テキスト」ボタンをクリックすると、ピクチャ上にテキスト入力カラムがオープンし、そこでテキスト入力が可能となります。このテキスト入力カラムは最初からウィンドウに配置されているわけではありません。新たにオープンされた子ウィンドウのEditTextコントロールが使われます。その証拠に、カラムの回りにはウィンドウと同じ「影」が表示されていることが分かります。このテキスト入力用ウィンドウは、親ウィンドウにと同じグループに属しています。よって、親ウィンドウに対す移動や最小化などの操作は、ちゃんと子ウィンドウ側にも反映されます。
 

Microsoft社のExcelではセル上に影付きの入力カラムが表示されますが、そうした機能もこの仕組みを利用すれば可能となります。ここでのテキスト入力カラムは、もう一度「テキスト」ボタンをクリックすることで消える仕組みになっています。

「ポップアップ」ボタンをクリックすると、ピクチャの「一点」から、Dockの「ジニーエフェクト」のように別のウィンドウが湧き出してきます。下になったウィンドウは、新しいウィンドウが表示し終わった瞬間に隠れます。新しいウィンドウには「OK」ボタンがあり、それをクリックすると、今度は先程の一点に吸い込まれるように消えます。ウィンドウが吸い込まれた瞬間に、前のウィンドウが再表示されます。この機能はSheetウィンドウが、親ウィンドウの上辺から降りてくる特徴をうまく利用しています。親ウィンドウのサイズを限りなく小さく(縦横1ピクセル)にすれば、Sheetウィンドウは、あたかも1点から湧き出したような現れ方をするわけです。

 

それでは、サンプルアプリケーションのソースコードを見てみます。まずは、メニューバーとメインウィンドウ(MainWindow)をNibファイルから読み込みます。続いてsetUpWindowEvent()でCarbon Event Handlerルーチンをインストールしていますが、この仕組みについては前回の「Transfer_Demo」サンプルとまったく同じですので説明は省略します。

 

ウィンドウをあるグループに属するようにするには、先んじて登録すべきグループを作成しておく必要があります。これにはWindow ManagerのCreateWindowGroup()を用います。得られたWindowGroupRefを、登録したいウィンドウのWindowRefと一緒にSetWindowGroup()に渡せば、グループへの登録が完了します。WindowGroupRefは後から利用するので、外部変数のsys_groupに保存しておきます。この処理で重要なことは、CreateWindowGroup()で作成するグループの性質をアトリビュートフラグ(WindowGroupAttributes)で設定することです。今回のグループには「ウィンドウの移動」「選択された場合のアクティベート」「Dockへの引き込み」などの性質を共有させることにします。つまり、グループのどれかのウィンドウがDockに引き込まれれば、同時にすべてのウィンドウが引き込まれるわけです。アトリビュートフラグの種類や内容については、Universal Interfacesの「MacWindows.h」に定義されています。

 

グループの設定が終わったら、TransitionWindow()でウィンドウ(MainWindow)をオープンします。ユーザによりウィンドウ上のボタンがクリックされると、先んじてインストールされているCarbon Event Handlerルーチンが呼ばれます。

 

「テキスト」ボタンがクリックされるとhandlTextEdit()ルーチンが実行され、「ポップアップ」ボタンがクリックされるとhandlPopUp()ルーチンが実行されます。「OK 」ボタンはポップアップされるウィンドウの方にあります。このボタンをクリックするとHideSheetWindow()が実行され、子ウィンドウは親ウィンドウへ引き込まれます。その後、ShowWindow()を使い隠していたウィンドウを再表示するのですが、この時に必要となるWindowRefは、GetIndexedWindow()で得ています。これは、ウィンドウ番号とkWindowGroupContentsReturnWindowsを渡すことで、グループに属するウィンドウのWindowRefを得るためのAPIです。
(この項、続く)

カテゴリ:ユーザインタフェース, Carbon/CF, 小池邦人のプログラミング日記


【MacWIRE配信予定】小池邦人のプログラミング日記》2002/2/15 _ ウィンドウのグループ化 その1(2)

まずは「テキスト」ボタンをクリックでした時に呼ばれるhandlTextEdit()ルーチンを見てみます。

 

最初にNibファイルからTextEditコントロール用のウィンドウ(EditWindow)を作成し、適切な位置へと移動させています。オープンする前に、SetWindowGroup()でMainWindowと同グループに登録し、それの表側に表示させるためにSelectWindow()を実行しています。ChangeWindowGroupAttributes()は、グループに新たに追加するアトリビュートと、グループから外してしまうアトリビュートを同時に設定できるAPIです。ここでは、一時的にウィンドウ選択を可能にするために「個別ウィンドウの選択が不可」というアトリビュート(kWindowGroupAttrSelectAsLayer)を外しています。これを外さないと、SelectWindow()を実行してもEditWindowがMainWindowの表側に現れません。最後は、getMyControlRef()でTextEditコントロールのControlRef得て、サンプル文字列(This is the EditText.)を登録しています。ShowWindow()でEditWindowを表示したら、AdvanceKeyboardFocus()を実行してTextEditコントロールをテキスト入力可能な状態にしておきます。

今度は「ポップアップ」ボタンをクリックした時に呼ばれるhandlPopUp()ルーチンを見てみます。

 

ポップアップされるSheetウィンドウ(SheetWindow)は、Nibファイルから作成されています。しかし、このウィンドウはMainWindowを親にはせず、CreateNewWindow()で作成された縦横1ピクセルサイズのOverlay(下地が透明)ウィンドウを親として使っています。これが、SheetWindowがMainWindowの一点から湧き出したように見えるトリックの種明かしです。SheetWindowをShowSheetWindow()でオープンしたら、MainWindowの方はHideWindow()で隠してしまいます。最後に、親ウィンドウの方も削除するのですが、SheetWindowは戻る場所を記憶していますので問題はありません。親ウィンドウに利用しているOverlayウィンドウの性質については、別の機会に詳しく説明します。

ここで解説した「Group_Demo1」サンプルアプリケーションは、以下のサイトに登録されていますので試してみてください。Mac OS X 10.1と最新版のDeveloper Toolsが必要です。

 http://www.ottimo.co.jp/library/

次回は、ウィンドウのグループ化の話の続きとなります。ウィンドウタイトルに配置することができるようになったToolBarボタンの利用方法についても解説します。
[小池邦人/オッティモ<http://www.ottimo.co.jp/>]

カテゴリ:ユーザインタフェース, Carbon/CF, 小池邦人のプログラミング日記


AppleScript Working》6 _ AppleScript Studioでlogコマンドを使う

   この記事のPDFファイル(888KB)は以下のアドレスにあります。
   ダウンロードには、MDOnlineのアカウントが必要です。
   pdfs/MDOnline020010.pdf
 ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
AppleScript StudioでのCocoaをベースにしたAppleScriptのプログラミング環境は、AppleScriptのイメージを一新するものと言ってもよいだろう。これまで、スクリプト編集プログラムでのプログラミングとは大きく異なり、ユーザインタフェースの構築ができるのである。しかしながら、スクリプト編集プログラムにあった便利な機能の1つである「ログ」の機能はAppleScript Studioでは利用できなくなってしまった。ところが、AppleScript Users Groupのメーリングリストで、H.Abe氏が発表したソースを使えば、AppleScript Studio、つまり、Project Builderの上で、logコマンドを使って標準出力への変数の書き出しやイベントの収集ができるのである。H.Abe氏の一連のソースなどを「HAStudioLogger」と呼ぶことにするが、この利用方法を紹介しよう。

――――AppleScriptでのログ出力
AppleScriptには、logというコマンドがシステムレベルでサポートされている。たとえば処理途中での文字列やリストの値を見たいとしたら、logの後に変数名を指定すると、その変数の中身を「ログウインドウ」に表示する。また、やりとりされるAppleEventの内容についても逐一表示される。従来のAppleScript開発ソフトにはこうしたログ表示のためのウインドウがあった。いわば、AppleScriptプログラミング環境での標準出力のようなものである。デバッガで逐一チェックするのももちろん必要だが、処理を流して結果を見たい場合にはログは非常に便利である。そして、start logとstop logというコマンドも用意されていて、ログの出力の開始や停止もできるようになっている。
ところが、AppleScript Studioの開発環境、つまりProject Builderでは、AppleScriptのログを参照する機能が用意されていない。Mac OS時代ではサードパーティのツールでもログがあったのだから、もしかすると知られていないAPIでログをとれるのかもしれないが、H.Abe氏は独自の方法で、Project BuilderでもAppleScriptのログを利用できるようにしたのである。
おおまかな動作は次の通りだ。ログを表示するObjective-Cのクラスを用意しておくが、Interface Builderでそのクラスのインスタンスを作成するようにしておく。そして、log、start log、stop logのコマンドに対応したAppleEventが発生すると、自分自身でそのイベントを受け取り、そして中で処理をしてしまうのである。ログの処理は、従来はAppleEventでシステム任せにできたのであるが、その手法を逆手に取ってのものである。もともと、システムにあったコマンドなので、Mac OS Xで作るあらゆるAppleScriptのソースにコマンドを書くことができ、規定のイベントが発生する。そこで、作成しているアプリケーションに、そのイベントのハンドラを書いておき、logコマンドを横取りして自分で標準出力に書くとうわけだ。従って、開発している途中でのログの利用はもちろん、生成したアプリケーションでも、Consoleにlogコマンドで出力することができる。
以下のアドレスで、サンプルを含めたProject Builderのプロジェクト一式を入手できる。サンプルのソースで、いきなり試すことができるのであるが、以下、自分で作ったプロジェクトで利用する方法を説明していくことにしよう。

◇HAStudioLogger
 http://www.azug.gr.jp/~h-abe/binary/ask/logger.tar.gz


――――プロジェクトでログ作成をできるようにする
AppleScript Applicationとして作られているプロジェクトがあるとしよう。そのプロジェクトでログを作成できるようにするには以下の3つの手続きが必要になる。これらはこの順序で作業をしなければならないわけではなく、必要に応じてやりやすい順序で作業してかまわない。



まず、プロジェクトにCarbonフレームワークを追加する。Project Builderで「プロジェクト」メニューから「フレームワークを追加」(Command+option+F)を選択するが、その前に、Frameworksのグループを、左側の一覧で選択しておくと良いだろう。メニューを選択すると、システムのフレームワークのフォルダをポイントしているはずなので、そこで、Carbon.framewokrkを選択して、「開く」ボタンをクリックする。

◇Carbon.frameworkをプロジェクトに取り込む
 

「開く」ボタンをクリックすると、次のように追加するターゲットを指定するシートが表示される。特にターゲットを増やしていないのならその他の設定項目も含めて、このまま「追加」ボタンをクリックすれば良い。

◇「追加」ボタンをクリックする
 

これで、Carbon.frameworkが、Frameworksグループの中に加わったが、もちろん、左側のチェックボックスがオンになっていることを確認しよう。
続いて、クラスのインスタンスを作成するが、ここでは、AppleScript Studioのデフォルトの状態であるとすると、最初から組み込まれているnibファイルのMainMenu.nibファイルがあるはずだ。これが、起動時にロードされるnibファイルとして最初から設定されているはずなので、そのファイルを編集することにしよう。Project BuilderでMainMenu.nibをダブルクリックして開く。そして、Interface BuilderでMainMenu.nibのウインドウをアクティブにして、Classesのタブをクリックして選択する。この状態で、ClassesメニューからRead Files(Command+option+R)を選択する。

◇クラス定義をファイルから読み込む
 

すると、ファイルを選択するダイアログボックスが出てくるので、HAStudioLogger.hというヘッダファイルを指定する。なお、ここでは、ダウンロードしたプロジェクトのフォルダであるLogTestにあるものを選択したが、後に示すように結果的にこのソースは自分のプロジェクトにコピーした方がいいので、コピーをしてから、ヘッダファイルの読み込みをした方が、手順的にはスマートかもしれない。

◇HAStudioLogger.hを指定する
 

すると、Classesのブラウズリストに、HAStudioLoggerというクラスが追加される。このクラスをインスタンス化するため、そのHAStduioLoggerという名前を、controlキーを押しながらクリックし、表示されるメニューでInstantiate HAStudioLoggerを選択する。

◇定義されたクラスをインスタンス化する
 

ここで、MainMenu.nibファイルのウインドウで、Instancesのタブをクリックすると、青い立方体のボックスのアイコンが見えており、HAStduioLoggerクラスのインスタンスがnibファイル内に定義されたことが示されているはずだ。もちろん、ここでnibファイルは保存しておく。
(この項、続く)

カテゴリ:ProjectBuilder/Interface Builder, AppleScript, AppleScript Working


AppleScript Working》6 _ AppleScript Studioでlogコマンドを使う(2)

ログを作成するクラスのファイルは、HAStudioLogger.hとHAStudioLogger.mの2つであるが、これを、自分のプロジェクトのフォルダにコピーをしておこう。もちろん、Finderで作業を行なうが、適当な方法で作業をすれば良い。

◇ログ作成を行うクラスのソースを自分のプロジェクトにコピーする
 

続いて、自分のプロジェクトに、これらのソースファイルを登録する。ここでは、Finderから、プロジェクトの「グループとファイル」のところに直接ドラッグ&ドロップした。場所は別にどこでもかまわないが、たとえば、Other Sourcesのグループに入れておけばよいだろう。なお、Objective-Cのソースとヘッダなので、その他の設定は問題なくなされる。ドラッグ&ドロップした後、Project Builderをアクティブにして追加するターゲットなどをたずねるシートで「追加」ボタンをクリックしなければならない。

◇ソースとヘッダをプロジェクトに追加する
 

以上で準備は終了だ。

――――HAStudioLoggerの使い方
HAStudioLoggerは、これまでのログ関連コマンドと同じように使えばよい。logコマンドの後に、変数名や式などを記述すると、その内容が出力される。数字や文字列はもちろん、リストやレコードでもかまわないし、参照でも基本的にはかまわない。すると、Project Builderから実行したアプリケーションの場合、Project Builderのコンソールに、日付時刻、発生したアプリケーション名とプロセスID、そしてlogコマンド以降に記述した式や変数の値が表示される。値はこれまでのログと同様、AppleScriptのコメント形式になっている。
一方、AppleScriptのプログラムに、start logというコマンドを入れれば、そこからイベントのの収集が始まる。そして、stop logコマンドがあるまで続ける。以下はその実行例だ。プログラムとして示されている部分は、ウインドウにあるボタンをクリックして実行されるプログラムである。

◇logコマンドの利用例
 

ここにあるように、たとえば、AppleScriptでlog 123のようなコマンドがあれば、コンソールに (* 123 *) のように表示される。アプリケーションの処理の途中結果などを、プログラムを流しながら見たいときには、これでlogコマンドを使えるというわけである。
一方、start logによってイベントの収集が行われている。ASCII charcterは外部コマンドとして用意されていて、文字コードから文字を生成するものだが、そのイベントが、現在のアプリケーションから発生されたことがコンソールに表示される。コンソールには、AppleScriptのプログラム形式で表示されている。
なお、生成したアプリケーションを実行すると、logコマンドの結果や収集したイベントは、UtilitiesフォルダにあるConsoleで参照できるようになる。つまり、素直に標準出力に出されているというわけである。

◇ビルドしたアプリケーションではConsoleに出力される
 

HAStduioLoggerで行っていることは、ちょっと複雑だが、概要を説明しておこう。まず、このクラスはnibファイルにインスタンスを作成しているので、nibファイルをロードしたときに生成される。そのときにAppleEventのディスパッチを行い、log、start log、stop logコマンドで、HAStudioLogger内のメソッドが呼び出されるようにしている。実際のログの書き出しはNSLog関数を使っているが、イベントからの値の取り出しやAppleEvent関連のさまざまな処理が組み込まれている。
ダウンロードしたプロジェクトには、NSDictionaryとAERecordとのコンバートを行うクラスもある、興味のある人には重要な情報源になるかもしれない。
なお、HAStudioLoggerは、Interface Builderのツール形式になったものを開発中であるので、近々、バージョンアップがあるかもしれない。その折には、記事でお届けしよう。
(この項、以上)

カテゴリ:ProjectBuilder/Interface Builder, AppleScript, AppleScript Working