MOSA Multi-OS Software Artists

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

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

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

2005-03-08

目次

  • SqueakではじめるSmalltalk入門   第33回  鷲見 正人
  • 藤本裕之のプログラミング夜話 #64
  • 高橋真人の「プログラミング指南」  第63回
  • ニュース・解説 小池 邦人

            

SqueakではじめるSmalltalk入門   第33回  鷲見 正人

 本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。

 Smalltalkでは、「Object」クラスを頂点とする単一継承の継承ツリーの中にすべてクラスが組み込まれています【註】。この継承ツリーをたどりながらそれぞれの定義を見てゆくことで、注目するクラスに属するオブジェクトがどんな特性を有するのかをよりよく知ることができます。

 コレクションは、「Object」を直接のスーパークラスとする「Collection」を頂点に巨大なサブツリーを形成します。前回挙げた「Array」「OrderedCollection」「Dictionary」「Set」「Bag」「Symbol」「String」「Interval」「SortedCollection」も、そのサブツリーの中のどこかに定義されています。念のため、たがいの位置関係を次に示しておきましょう。「字下げ」により、そのクラスが、ひとつ上の字下げレベルのクラスのサブクラスであることを表現しています(たとえば「String」は「ArrayedCollection」のサブクラスで「Symbol」のスーパークラスである、といった具合に)。

Collection
 SequenceableCollection
  ArrayedCollection
   Array
   String
    Symbol
  OrderedCollection
   SortedCollection
  Interval
 Set
  Dictionary #()
 Bag


 ここで新しく登場したSequenceableCollectionとArrayedCollectionは、Collection同様、それぞれの直下のサブクラス群を束ねるために存在する抽象クラスです。抽象クラスというのは、そのインスタンスの生成・使用は想定しないけれど、他のクラスのスーパークラスになることで、全体の継承関係を整理する目的で存在する特殊なクラスのことを言います。C++やEiffelなどでは、もっぱら多態性実現のために、型宣言において頻繁に用いられますが、Smalltalkでは完全に裏方に徹しており、せいぜいサブクラスに共通するメソッドを保持する場所…程度の意味しかないため、コード中でその名を見ることはほとんどないと思います。

 ではまずSmalltalkのコレクションオブジェクトの基本的な機能を知るために、Collectionの定義を覗いてみましょう。

 文字が入力できる適当な場所で「Collection」とタイプして選択後、browse it(Cmd-B)してCollectionの定義を呼び出します。

[fig.A]ブラウザでCollectionクラスを選択したところ。
http://squab.no-ip.com:8080/mosaren/uploads/33a.png

 ちなみに、ここで下のコードペインに目をやると、CollectionがObjectの直接のサブクラスであることが確認できます。

Object subclass: #Collection
   instanceVariableNames: ''
   classVariableNames: 'RandomForPicking '
   poolDictionaries: ''
   category: 'Collections-Abstract'


 また、この状態で、上段左から2番目のペイン下にある「?」ボタンを繰り返しクリックすることで、Collectionクラスのコメント、Collectionクラスを中心に見た、巨大なスーパークラス群およびサブクラス群が形成する巨大なサブツリーをトグルさせながら閲覧することも可能です。

[fig.B]Collectionクラスのコメントを呼び出したところ。
http://squab.no-ip.com:8080/mosaren/uploads/33b.png

[fig.C]Collectionを含むサブツリーを一覧したところ。
http://squab.no-ip.com:8080/mosaren/uploads/33c.png

 本題に戻ります(なお、作業を続けるにあたって、上の「?」ボタンのトグル状態は気にする必要はありません)。まず上段左から3番目のペイン(プロトコルリスト、あるいは、メソッドカテゴリリスト、メッセージカテゴリリストとも言う)からaccessingをクリックして選択してください。

[fig.D]accessingプロトコルを選択したところ。
http://squab.no-ip.com:8080/mosaren/uploads/33d.png

 すると、accessingプロトコルに属するメソッド名(セレクタ)が続く右側のペインで一覧できます。ここでコレクション共通の機能として注目したいのは、#sizeと#atRandomです。コレクションに対して、sizeというメッセージを送信することで要素数を、atRandomというメッセージを送信することで任意の要素を取り出すことが可能です。

Collection allInstances class ” => Array ”
Collection allInsntaces size ” an Arrayの要素数確認 ”
($a to: $z) size ” an Intervalの要素数確認 ”
#(‘this’ #is $a 10) atRandom ” an Arrayから任意の要素選択 ”
‘squeak’ atRandom ” a Stringから任意の文字選択 ”
($a to: $z) atRandom ” $aから$zまでのa Characterから任意選択 ”

 次のadaptingプロトコルはいったん無視して、addingプロトコルに属するメソッドを見ます。ここで注目しておきたいのは、#add:、#addAll:です。「add: newObject」というメッセージ送信により、コレクションへの要素(newObject)の追加、「addAll: aCollection」によりaCollectionに含まれる要素の追加を期待します。

| collection |
collection _ OrderedCollection new.
collection add: 'this'.
collection addAll: #(#is $a 10).
^ collection   " => an OrderedCollection('this' #is $a 10) "

 ただし、こうした要素の追加を期待するメッセージ送信は、当然、要素の追加を許すタイプのコレクションにしか通用しないので注意してください。なお、要素の追加ができないan Array、a String、a Symbol、an Intervalなどに、これらの要素追加用メッセージを送ると例外が生じます。

‘string’ add: $s
” => Error: This message is not appropriate for this object ”

 次回も引き続き、Collectionのプロトコルを見つつ、コレクションに共通な機能をさぐってゆきましょう。

註: SqueakシステムではObjectのスーパークラスとして、新たにProtoObjectという特殊なクラスが設けられていますが、通常はObjectが頂点であると考えていて差し支えありません。

バックナンバー:
http://squab.no-ip.com:8080/mosaren/

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

 NSApplicationにまつわる話の最終回。前回の最後でも書いたように、重要極まりない初期化と終了に関わるお話である。
 Cocoaの初期化というと、普通、それまでCだけを使ってプログラムを書いて来たヒトや、C++を使っていたけれど実はあんまりよくオブジェクト指向というものがわかってなかったヒトには戸惑うところが多いようだ。「なんでInterfaceBuilderでヒモづけしているのにこのオブジェクトがnilなんだよぉ」とか、思ったことありませんか? そんなこと思うほど使ってない? ああそうですか。

 例えばInterfaceBuilderでNSObject(いや、別にNSObjectControllerでもいいんだけどさ)をサブクラスしてOurObjectつうのを定義し、これをウィンドゥ内のあるテキストフィールドのdelegateにしよう。テキストフィールドをコントロールキーを押しながらクリックし、表示されるラインを今作ったオブジェクトに繋ぐ。Info ウィンドウのコネクションで、delegateに指定する。……これで、このテキストフィールドの文字列をユーザーが変更するたび、delegateになったオブジェクトにはその通知が来る。ここまではいいかな。
 だけど、delegateのオブジェクト側としては起動した最初に、そのテキストフィールドに入っている初期値を動的に設定したいとする。この場合、delegateによる通知がなくても、オブジェクト側から件のテキストフィールドにアクセスできないといけないので、新たにIBOutletを作ってそこにテキストフィールドを繋ぐことになるよね。これで、うまく図示できないけどNibファイル上で:

 テキストフィールドのIBOutlet:delegate —–> OurObject

 OurObjectのIBOutlet:textField —-> テキストフィールド

という相互参照が成ったことはお解りいただけると思う。
 では、こういう定義がなされたNibファイルを使ったアプリケーションが起動されたとき何が起きるか。当然ながらOurObjectとテキストフィ−ルド(というか実際にはこのテキストフィールドを内包するヴュウあるいはウィンドウだけどね)の定義が同時にメモリ上に読み込まれて配置されるなんてこたぁない(1つのCPUが2つの仕事を同時にすることはない)。
 OurObjectがまずメモリ上に確保されたとすれば(initメッセージが送られる)、その時点ではこいつのIBOutlet:textFieldは空である。だってそのテキストフィールドはそのときメモリ空間のどこにもまだ存在しないんだから、当然だよね? もしテキストフィールドの方が先でも同じ、このクラス、NSTextFieldがinitWithFrame: メッセージ(NSViewのサブクラスだから初期化はこれになる)を受け取ったときにはdelegateは空になってる。
 ところがこれでは、例えば上に書いたOurObjectによるテキストフィールドの初期化ができない。できないでしょ? そこで「全てのオブジェクトが確保され、IBOutletによる参照も実アドレスで初期化された」状態になると、NibファイルからオブジェクトおのおのにawakeFromNibというメッセージが送られる。つまり個々のオブジェクト単位の初期化はこのタイミングで行なえばいいというわけだ。
 ……ここまで書いてようやく話はNSApplicationに戻るのだが……、ああ、最終回のつもりが紙幅が尽きてしまった。しょうがないのでこれをあと1回……2回になるかも……続けることにする。次回考えるのは「awakeFromNibメッセージはどのオブジェクトに最後に送られるのか」である。暇があったら考えておいてくださいな。ではまた次回。
(2005_03_03)

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

UNIXとしてのMac OS X
〜Perlについて(9)〜

 こんにちは、高橋真人です。
 今回は、連載の第59回で予告した「シングルコーテーションとダブルコーテーションの違い」についてお話しします。
 シングルコーテーションはCではご存知のように文字定数に使われますが、鷲見さんの連載でおなじみのSmalltalkでは文字列の表現に使われます。ちなみにSmalltalkの場合、ダブルコーテーションで囲ったものはコメントと見なされます。
 さてPerlの場合はどうなのでしょう。
 Perlでは文字列にはシングルコーテーションもダブルコーテーションも使うことが可能ですが、両者には少し違いがあります。
 たとえば、Cの入門でおなじみのprintf()という関数はPerlにも存在します。しかしPerlにおいてはprintfの登場はCの場合ほど多くはありません。なぜならPerlでは文字列の中に変数を埋め込むことができるからです。たとえば、

$number = 256;
print "The number is $number.";

と書くと、文字列の中の$numberの部分は256に置き換えられ、出力は、

The number is 256.

となるのです。
 もうお分かりかと思いますが、ダブルコーテーションで囲った文字列では、変数はその保持する値に置き換わった上で埋め込まれます。ですが、シングルコーテーションで囲まれた文字列ではこの置き換えは起こりません。
 従って、

print ‘The number is $number.’;

というコードの出力は、

The number is $number.

となるということです。
 ところで、上記のケースで$numという変数も存在していたらどうなると思いますか? つまり、以下のようなケースです。

$num = 100;
$number = 256;
print "The number is $number.";

 ここでは、256、つまり$numberの方が出力されます。つまり、単語の区切りが変数の識別にも使われているということです。
 では、もし$numberの定義がなかったらどうなるのでしょう? つまり、以下のようなケースです。

$num = 100;
print "The number is $number.";

 これでもやはり、変数は$numberであると見なされ、出力結果は

The number is .

となります。$numという変数があるからといって、「number」という単語のまとまりが不自然に分割されることはないのです。で、$numberという変数の定義は行われていないので、この部分は結果的に何も出力されません。
 では、以下のような場合はどうでしょう?

$price = 100;
print "The price of this product is $priceyen.";

 気を利かせて100yenと出てくれてもいいようなものですが(笑)、残念ながらここでも「$priceyen」という変数が未定義なので、そうはなりません。
「じゃあ、ちゃんと100yenと出させることはできないのか?」と思われるかもしれませんが、もちろんそんなことはありません。
 このような場合、Perlに「変数の区切り」を教えてやる必要があります。やり方は以下のような感じです。

$price = 100;
print "The price of this product is ${price}yen.";

 つまり、変数の部分を{}で囲ってやることで、Perlは「price」という単語を識別し、$priceという変数を認識することができるというわけですね。
 このようにPerlでは変数には先頭に特別な記号が付くという決まりがあるために、文字列の中に直接変数を埋め込んだ記述が可能となるわけですが、代わりに今紹介したような「ちょっとつじつま合わせっぽい」やり方も時には必要とされるわけです。
 こういうところを私は「Perlの少し美しくない部分」だと思うのですが、皆さんはどう思われるでしょうか?

ニュース・解説

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

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

【開発環境】

最近は、QuickDraw APIを使うのを止め、積極的にCoreGraphics(Quartz 2D)APIの方を活用してアプリケーションを開発しております…。まあAPI自体の差し替えについては95%以上問題ないのですが、全面的に差し替えようとすると、何かと不都合や面倒なケースに遭遇します。特にCoreGraphicのディフォルト座標系が、Window ManagerやControl Managerと異なるのは実にうっとおしいですね(簡単に変更はできるが…)。それから、整数による座標、加えてCopyBits()、PICT、Polygon、Regionなどの「名作」との決別は、古くから継続しているアプリケーションによっては大きな障害になりうるでしょう。また、別のManagerやQuickTimeにQuickDrawに依存したAPIが残っている場合が多々あり、そうしたAPIを使用しなければいけない場合などは、はっきり言って矛盾を禁じ得ません(笑)。QuickDrawからCoreGraphicsへ切り替える作業については、以下のドキュメントが大変参考になります。

「Transitioning to Quartz 2D」

http://developer.apple.com/documentation/Carbon/Conceptual/QuickDrawToQuartz2D/index.html

幾つかの「懸案事項」については、ドキュメント内でも「機能が不足している」と正直に認めておるのですが(笑)、はたしてこうした部分がMac OS X 10.4(Tiger)で見事に解決されているのでしょうか? 注目したいところです。

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

前回から3月4日の期間中、Apple社のDocumentationサイトには新規ドキュメントが10登録されました。すべてマイナーな改訂版です。今回からドキュメントタイトルの後ろに、どんなテクノロジーに関係する資料なのかを記号で示すようにしてみました。CBはCarbon、COはCocoa、CFはCore Foundation、DWはDarwin、DVはDevice、ASはApple Script関連のドキュメントであることを意味しています(ちなみにCFはCBにもCOにも関係している)。こう見ると、CarbonとCocoaの両方から共通で使える技術が増えてきたことが分かります(CF関連資料はPDF版を用意して欲しい!)。また、デベロッパー向けに2つの読み物が登録されています。ここで解説されている両技術は、Mac OS Xが登場したおかげで積極的に活用できるようになったわけでして、デベロッパーとしては大変喜ばしいことです(笑)。「Accessing SQL Data in Apple Remote Desktop 2」の方は、前号の木下さんの解説も参考にしてください。

「Bundles」CF
「Certificate, Key, and Trust Services Reference」CB&CO(PDFあり)
「Communicating With Objects」CO
「Core Foundation Reference」CF
「Internationalizing Your Software」CB&CO(PDFあり)
「Kernel Extension Concepts」DW(PDFあり)
「Mac OS X Man Pages」DW&DV
「Multithreading Programming Topics」CB&CO(PDFあり)
「Plug-ins」CF
「XML-RPC and SOAP Programming Guide」AS&CB&CO(PDFあり)

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

「Developing Java Applications on Mac OS X with Eclipse」(読み物)

http://developer.apple.com/tools/usingeclipse.html

「Accessing SQL Data in Apple Remote Desktop 2」(読み物)

http://developer.apple.com/appleapplications/ardsql.html

前回から3月4日の期間中、新規のテクニカルノートはひとつだけ登録されました。また、新規テクニカルQ&Aの方は3つ登録されています。TN2110はMac OS X 10.3にインプリメントされているJavaのバージョンの種類とその認識方法が示されています。QA1411とQA1413については、前号の木下さんの解説を参考にしてください。現状のQuickTime 6におけるファイルハンドリングは、内部的にFSSpecに「頼り切っている」という証拠がボロボロと出ております(笑)。

TN2110「Identifying Java on Mac OS X」

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

QA1304「Movie Export – Always fill in the MovieExportGetDataParams dataSize field」
QA1413「NativePathNameToFSSpec returns bdNamErr (-37) error」
QA1411「Sequence Grabber preallocates large file when recording」

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

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

前回から3月4日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが3つ登録されました。「BrideOfMungGrab」と「HelpHook」については、前号で木下さんが紹介されています。

「SwapLAF」(Java関連)
「HelpHook」(Java関連)
「BrideOfMungGrab」(QuickTime&Sequence Grabber関連)

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

【デベロップメント SDK】

前回から3月4日の期間中、Apple社のSDKサイトには新しいSDKが2つ登録されました。「Kernel Debug Kit 」は、最近登場したMac OS X 10.3.8に対応したバージョンです。

「CoreAudio SDK v1.3.4」
「Kernel Debug Kit 10.3.8」

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

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

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