MOSA Multi-OS Software Artists

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

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

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

2005-02-22

目次

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

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

 本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回から新しく「コレクション」と呼ばれる、配列や文字列の仲間のオブジェクトについて触れるつもりだったのですが、もう一回だけ、ブロックにからめた処理制御について追加させてください。

 前回、処理をフォークさせて、かつ待ち合わせするために便宜的に用いた#forkAndWaitというメソッドがありました。その定義は次のようなものです。「forkAndWait」とタイプした後に選択してbrowse it (cmd + B)することで、いつでも閲覧できます。

BlockContext >> forkAndWait
   | semaphore |
   semaphore _ Semaphore new.                    "セマフォを作成"
   [self ensure: [semaphore signal]] fork.
   "レシーバの評価が終わり次第signalを送信する処理としてフォーク"
   semaphore wait                      "signal送信までここで待機"

 この内容に関連してセマフォ、そして#ensure:などの例外関係の処理について紹介します。

前回も触れましたがセマフォは英語でsemaphore、日本語で腕木信号機とでもいうべきオブジェクトで、主にsignalとwaitというメッセージを送って使います。waitを受信したとき、すでにsignalを受け取っていれば、そのまま処理は進みますが、signalを受け取っていなければ別途signalを受け取るまでその処理を中断します。したがって、

Semaphore new signal; wait

はすぐに処理を終えますが、

Semaphore new wait

とすると、誰が送るわけもないsignalを永遠に待ち続けることになるので、結局、制御は戻ってこずハングアップします(cmd + ピリオドで中断してください)。

先の#forkAndWaitでは、まず最初にセマフォを作り、続く式で、これからフォークさせる処理(forkAndWaitのレシーバであるブロック。selfに束縛されている)の最後に、そのセマフォへのsignal送信を追加(#ensure:は最後に触れます)してから改めてフォークしています。最後にセマフォにwaitを送って待ちに入り、フォークした処理でセマフォがsignalを受け取ると、その待ち状態が解除され処理が続行する…というからくりになっています。

さて、話は変わって例外処理についてです。まず、例外を生じさせてそれを捕捉してみましょう。

| result |
result _ 3 / #(0 1) atRandom.
^ result

 このスクリプトは#(0 1) atRandom、つまり0か1かの選択の結果次第では完了しません。二分の一の確率で0が選ばれると3に「/ 0」というメッセージが送られることになり、その時点で「ZeroDivide」という例外が生じてとまってしまいます(ノーティファイアが出現)。

ここでいったん、例外が生じる可能性のある処理をブロックで括ってみることにします。お馴染みのvalueを送信すれば直ちに評価できるので、上のスクリプトと同じことになります。

| result |
result _ [3 / #(0 1) atRandom] value.
^ result


 もちろん、これだけでは何も解決しないのですが、ここでvalueの代わりにifError: [...]というメッセージを送ることで、次のような対処が可能になります。

| result |
result _ [3 / #(-1 0 1) atRandom] ifError: [Float infinity].
^ result

 #ifError:はレシーバを評価し、例外が生じたときはパラメータとして添えられたブロックの評価値を代わりに用いるメソッドです。パラメータとして添えるブロックには2つまでのブロック変数を持たせることが可能で、それぞれから例外の種類と、例外を生じさせたメッセージのレシーバを知ることもできます。くわしくは#ifError:をbrowse it (cmd + B)して定義を眺めてみてください。なお、Float infinityは、浮動小数点数として振る舞う正の無限大値を返します。

さて。例外が生じたときだけでなく、生じなかったときにでも、共通してきちんと済ませておきたい処理、というのもあります。先ほどの処理待ちセマフォへのsignal送信や、いったん開いたファイルをcloseする作業がよい例です。そんなときは、ifError: [...]の代わりに#forkAndWaitの定義で出てきたensure: [...]を送ります。

次のスクリプトはtest1.txtというファイルを開いた後、「3 / 0」の結果の文字列表現を書き込んで、最後にファイルをcloseしています。

| file |
file _ FileStream fileNamed: 'test1.txt'.
file nextPutAll: (3 / 0) printString.
file close.


 もちろん、3に「/ 0」というメッセージを送った時点で例外が生じますので以降の処理は続行できず、スクリプトはノーティファイアを出して止まってしまいます。このとき、ファイルは開いたままなので、続けて、

(FileStream fileNamed: ‘test1.txt’) edit

 などとした場合、このファイルを再び開くことができず、期待された作業ができない可能性があります。

そこで最初のスクリプトを、

| file |
file _ FileStream fileNamed: 'test2.txt'.
[file nextPutAll: (3 / 0) printString] ensure: [file close].

というように#ensure:を使って記述しておけば、何らかの原因でブロック内の処理が正常に終了できなくとも、ファイルへのclose送信だけは確実に行なわれ、以後の同ファイルの取扱いに支障はない…というわけです。続けて次の式を評価しても、問題は起こらないはずです。

(FileStream fileNamed: ‘test2.txt’) edit

 ブロックは、まだまだいろいろなところに出てきますが、ひとまずこれで終わります。次回からは予告通り、コレクションについてです。

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

お詫びと訂正:前回、Processor yieldという式の解説のところで、「Processはa ProcessSchedulerを束縛するグローバル変数で、」と書いてしまいましたが、これは「Processorは…」の誤りです。続けてa Processについても触れているので紛らわしかったかと思います。申しわけありません。

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

 今回は楽しいデリゲートの話。え、そのデリゲートって何だって? ではそこから解説しよう。デリゲート、英語のスペルはdelegateである。これを辞書で調べると、名詞としては「代表者、使節、(米州議会の)下院議員」、動詞としては「代理として送る、委任する」である。ちうことは、NSApplicationのインスタンスであるグローバル変数(これは前回までにやったことなのでもう解説しない)、NSAppに対してあるオブジェクト……なんでもいいんだが委託されるんだから仮にAgentとしようか、をそのデリゲートとしてセットする、つまり

 [ NSApp setDelegate: Agent ];

とやると、AgentはめでたくNSAppにその仕事の一部を委託されたことになるんである。

いったんNSAppのデリゲートになれば、NSAppはあらかじめ決められたいくつかの事態が発生したとき、デリゲートとしてセットされているAgentに対してその事態への対処をまかせてくれる。例えばAgentが

 -(void) applicationDidBecomeActive: (NSNotification*) notification;

というメソッドを持っていれば、NSAppはユーザーの操作によってアプリケーションがアクティブになったとき、このメソッドを呼んで、「アクティブになったときにしておかなければならないこと」をやらせてくるし、

 -(void) applicationDidResignActive: (NSNotification*) notification;

も定義しておけば、アクティブでなくなったときにも何かを行なうチャンスが貰えるわけである。便利でしょ?

 ここまで来ると、ちょっと経験のあるヒトはこう思うかも。「そんぢゃデリゲートと通知(Notification)は同じもんなんか」と。答えは「ほぼYES」である。上の2つのような、ただ知らせをもらって必要な処理を行なうだけであればデリゲートはそれを必要とするいくつかのオブジェクトのための専属オブザーバーと言ってそうハズレていない。実際問題、デリゲートにこのくらいのことしかさせないでコト足りてしまうアプリケーションだってあるだろう。
 でもあなた、わざわざ言葉を変え、「委託」されているんだからもそっとなんかあるのである。そのひとつ、まずデリゲートはコトの可否判断を任される。よく使いそうなのが、

 -(NSApplicationTerminateReply)
                applicationShouldTerminate: (NSApplication*) sender;

であろうか。デリゲートにこのメソッドがあれば、NSAppはアプリケーション終了の前にこれを呼んでお伺いをたててくる。答えは「すぐ終了してよし」「終了しちゃ駄目」「あとで終了」の3種類である。ほかに「Windowが全部閉じられたら終了しちゃっていいか」てなお伺いもある。

 さて、NSApplicationの話はまだ続く。次回はNSAppのデリゲートを使ってヤるコトの中でも最も重要な初期化と終了に関わる部分を重点的に。
(2005_02_17)

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

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

 こんにちは、高橋真人です。
 今回は「コンテキスト」という考え方について説明します。
 今まで配列というものを何度か扱ってきましたが、Perlで配列の長さを調べるにはどうしたらよいのでしょうか。Perlのリファレンスにlengthという演算子があるので見てみますと、これは文字列用であることが分かります。
 実は、Perlでは「配列はある特定の状況下では、そのまま長さを表す整数として評価される」ことになっています。つまり、配列は「特定の状況下では長さを返す」ということです。
 で、その「特定の状況」を「スカラーコンテキスト」と言います。連載の57回で「リストコンテキスト」という言葉を使いましたが、この二つのコンテキストはよく対比的に語られる、Perlにおける重要な要素です。
 コンテキストという言葉を辞書で調べますと「文脈」とか「前後関係」などという訳語が見つけられます。Carbonプログラマの皆さんにはQuartz 2Dで使われるCGContextというのがおなじみですよね。
 Perlの場合、コンテキストという言葉は「何を求めているか」ということだと考えると分かりやすいと思います。
 スカラーコンテキストとリストコンテキスト。個々に解説するよりも、この二つを対比させて説明した方が違いが際立って分かりやすいので、比較しながら説明していきましょう。

 以前お話ししたように、printという演算子はリストコンテキストを要求するということになっています。従って以下のコードでは配列@arrayはリストコンテキストで解釈されます。

@array = (1, 2, 3);
print @array;

 出力結果は「123」となります。
 ところが、この配列をスカラー変数に代入してからprint演算子に渡すと、

@array = (1, 2, 3);
$length = @array;
print $length;


配列の長さである「3」が出力されます。
 print演算子はリストコンテキストを求めていますが、与えられたものがスカラー変数なので変数の内容がそのまま出力されているわけです。
 今、さらっと流してしまいましたが、配列はスカラー変数に代入される時には「長さを表す整数値になる」のです。これをコンテキストの側面から言うと、$lengthという変数に代入される状況はスカラーコンテキストであり、「配列変数@arrayは要素数を返す」となります。
 少し整理しましょう。スカラー、リストの両コンテキストのいちばん典型的な例は、スカラー変数、配列変数、それぞれへの代入です。

$length = @array;
@items = @array;


 最初の$lengthという変数への代入が行われているところでは、@arrayはスカラーコンテキストで解釈され、保持している要素数である3が入ります。
 対して@itemsという配列変数への代入は、リストコンテキストなので@itemsの各要素は@arrayの中身と同じになるというわけです。
 「何だ、配列同士で代入しているだけじゃないか」と言われれば、確かにその通りなのですが、例えば以下のような書き方も可能です。

($a, $b, $c) = @array;

 ここでは、スカラー変数を3つ、カンマで区切ってリストとしていますが、Perlではリストに対しての代入はリストコンテキストとなり、$a、$b、$cにはそれぞれ@arrayの要素が先頭から順番に入るのです(あふれた要素は捨てられる)。もちろんこの代入もリストコンテキストです。

 ところで、配列をスカラーコンテキストで使った場合にはその要素数を返すわけですが、スカラーコンテキストで“リスト”を使ったらどうなると思いますか?

$value = ('Hello', 256, 'world');

 実際に走らせてみれば分かりますが、この場合、$valueの値は、’world’ になります。実は、「スカラーコンテキストでリストを使うと、最後の要素を返す」ことになっているのです。
 連載の58回でも「配列とリストは同じではない」というお話をしましたが、両者にはこんな違いもあるのです。

ニュース・解説

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

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

【開発環境】

Apple社が正式に「WWDC 2005」の開催日程を発表しました。今年は、6月6日から6月10日までの5日間の日程でサンフランシスコ(昨年と同じ場所?)で開催されます。

http://developer.apple.com/wwdc/index.html

今回は、新規OSのプレビュー版配布といった大きな目玉はなさそうですが、デベロッパー側の興味としては、「この時期までにMac OS X 10.4(Tiger)が正式に発表されているのか?」につきると思われます。どこそこのネット販売サイトでTigerの予約が開始されたり、カッコイイ製品パッケージの写真がリークされたり、Tiger登場近しの雰囲気が漂っている中、筆者としては「開発順調で3月末までには完成!」という噂を信じたいのですが、「6月30日までが前期なのだ!」という「闇の声」もあるようで(笑)まったく予断を許しません。そんなかんなで、WWDC 2005の基調講演において、Jobsの「Today!」の声と共に正式発表となれば、いにしえのSystem 7以来の快挙(?)となるわけです(これだけは避けて欲しい…)。

今回も、早期参加費用割引や、4チケット同時購入で1チケットは無料というサービスが行われます(4/22まで)。今のところ、当日開催されるセッションの詳細や日本からのツアー紹介などは掲載されていませんが、そのうち追加されると思われます。しばらくの間はこまめにサイトをチェックいたしましょう。

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

前回から2月18日の期間中、Apple社のDocumentationサイトには新規ドキュメントが8つ登録されました。初版ドキュメントは、最近発表された3機種の新型PowerBook G4のハードウェア仕様書のみで、それ以外はマイナーな改訂版です。また、デベロッパー向けに2つの読み物が登録されています。
「Introduction to MPI Distributed Programming on Mac OS X」では、分散コンピューティングの世界では標準システム (APIも含む)として広く認知されているMPI(Message Passing Interface)と、Mac OS Xとの関係を詳しく解説しています。分散コンピューティングに興味がある方には、Apple社がTiger Serverで提供するXgridと共に、これから目が離せない話題のひとつでしょう。「Working with Xcode 2.0」」の詳しい内容については、前号の木下さんの解説も参考にしてください。

「Introduction to MPI Distributed Programming on Mac OS X」(読み物)

http://developer.apple.com/hardware/hpc/mpionmacosx.html

「Tiger Developer Overview Series: Working with Xcode 2.0」(読み物)

http://developer.apple.com/macosx/tiger/xcode2.html

「17-inch PowerBook G4 Developer Note」(PDFあり)
「15-inch PowerBook G4 Developer Note」(PDFあり)
「12-inch PowerBook G4 Developer Note」(PDFあり)
「Address Book Reference for Objective-C」(PDFあり)
「Kernel Programming」(PDFあり)
「Runtime Configuration」
「WebObjects Overview」(PDFあり)
「Writing Drivers for Mass Storage Device」(PDFあり)

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

前回から2月18日の期間中、新規テクニカルノートはひとつだけ登録され、新規テクニカルQ&Aの方は6つ登録されました。TN2131では、Mac OS X 10.3におけるOpenGLの変更やバグ修正の履歴がまとめられています。ただし、このテクニカルノートには最新の10.3.8に関する記載がありません。10.3.8のリリースノートを読んでみると、されに追加された変更点があるものと予想されますので、OpenGLを利用されている方は注意してください。QA1410では、QuickTime APIがモダンなAPIへ変身するための課題や問題点が見え隠れしております(笑)。QA1408については、前号の木下さんの解説も参考にしてください。

TN2131「OpenGL Release Highlights – Mac OS X 10.3 Panther」

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

QA1364「Where are the LiveConnect classes on Mac OS X?」
QA1406「Public UTIs supported by Mac OS X v10.3」
QA1373「CFBundleIdentifier and user application access」
QA1410「Using language-tagged QuickTime UserData text APIs with CFStrings」
QA1248「Context Sharing Tips」
QA1408「Determine the version of an Audio Unit」

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

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

前回から2月18日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードがひとつだけ登録されました。以前に登録された「OSXAdapter」のマイナーな改訂版です。

「OSXAdapter」(Java関連)

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

【デベロップメント SDK】

前回から2月18日の期間中、Apple社のSDKサイトには新しいSDKが2つ登録されました。
「.Mac 1.1 SDK」とBluetooth SDKの最新版となる「Bluetooth SDK 1.5.3」です。「.Mac 1.1 SDK」については、以前にはADCメンバーサイト経由のみで入手可能でしたが、一般SDKサイトからもダウンロードが可能になりました。

「.Mac 1.1 SDK」
「Bluetooth SDK 1.5.3」

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.