2004-11-24
目次
SqueakではじめるSmalltalk入門 第19回 鷲見 正人
本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は遅延初期化についてです。
前回、生成した直後のオブジェクトa BankAccountがメッセージ「deposit: 100」に正しく反応できないことに(いささかわざとらしく…)気が付き、そのとき表示されるノーティファイアが提供する情報から、数値の束縛が期待されるインスタンス変数balanceにnilが束縛されていたことが原因だということも分かりました。したがって、インスタンス変数balanceに数値を(アクセッサを介して)束縛しておくことで、消極的ではありますが、とりあえずこの問題は解決できそうです。
| account |
account _ BankAccount new.
account deposit: 100 "=> ノーティファイア "
↓
| account |
account _ BankAccount new.
account balance: 0 "インスタンス変数balanceに0を束縛"
account deposit: 100 "エラーは出ない"
^ account balance "=> 100 "
ただ、これではおもしろくないので、アクセッサにひと工夫することにより別の方向から、よりスマートに、この問題を解決する方法を模索してみることにします。今、BankAccount >> #balanceの定義は、
balance
^ balance
と、単純にインスタンス変数balanceを返すだけです。これを「もしbalanceがnilなら、balanceに0を束縛して、あらためてそれを返値とする」…というような遅延初期化を行なうコードに置き換えてしまえば、このメソッドを介してインスタンス変数balanceにアクセスする限り、nilが返ることはなくなります。では、実際にコードを書いてみましょう。
balance
^ balance ifNil: [balance _ 0]
1行目はメッセージパターン(パラメータがないので、メソッド名とも一致)なので変わりません。なお、ブラウザのコードペインでは、メソッド名が既存のものと同じメソッドの定義は、断りなく古いものと置き換わります。バージョンは管理されているので、ファイルの重ね書きのような気の使い方をする必要はありません。
メソッド本体は2行目です。まず、行頭の「^」は無視して考えましょう。改めて書き直すとこうなります。
balance ifNil: [balance _ 0]
初出の#ifNil:で腰が引けてしまうかたもあるかもしれませんが、この式は典型的なメッセージ式です。インスタンス変数balanceに束縛されているオブジェクトに「ifNil: …」というメッセージを送ることを表わします。ここで起動されるメソッド#ifNil:はレシーバがnilならパラメータとして添えられたブロック(手続きのオブジェクト)を評価してその結果を返し、そうでなければレシーバを式の返値とします。したがってこの場合、balanceにnil以外が束縛されていれば、balanceに束縛されているオブジェクトがこの式の返値になり、balanceにnilが束縛されている場合は、ブロックが評価されてその値がこの式全体の返値になります。
ブロックの内容である「balance _ 0」は、インスタンス変数balanceに0を束縛する代入式です。Smalltalkはメッセージ式ですべてを表現するのが原則ですが、代入式は例外でこのように書きます。ただ、Smalltalkにおいて代入の手続きは“式”なので返値があります。それは、変数に代入(束縛)しようとするオブジェクトで、くだんの代入式では「0」がこれにあたります。
改めてまとめると、この式は、インスタンス変数balanceにnil以外が束縛されているときはそのオブジェクトを、nilが束縛されているときはbalanceに改めて0を束縛し、同時に0を返す式…となります。さらに頭に「^」が付いていたので、この式の返値がそのままこの#balanceメソッド(と言っても、メソッドにはこの式しかないのですが…)の返値になります。
このようなBankAccount >> #balanceの改変により、以後生成するa BankAccountはもちろん、すでに存在するインスタンスについても、そのインスタンス変数balanceが未定義か否かに関わらず、メッセージ「deposit: 100」への応答は正常に行なわれるようになるでしょう。これにて一件落着ですね。
一般に遅延初期化という手法は、アクセス頻度の低いプロパティ(インスタンス変数)を多数抱えるオブジェクトで、生成時の初期化のコストを削減しパフォーマンスを稼ぐために用いられるのが普通です。しかし、Smalltalkのように動的な(つまりシステムを止めずに動かしながら改変を加えることが多い)システムでは、すでに運用中のオブジェクトに対し、インスタンス変数やアクセッサを比較的安全に追加できる…というメリットが加わります。
次回は最後のメソッド#withdraw:を追加して、このBankAccountを完成させます。
バックナンバー:
http://squab.no-ip.com:8080/mosaren/
藤本裕之のプログラミング夜話 #57
えーと、今回は「カッコをつける話」をしたい。実はこないだのモサ湘南ミーティングのセッションでタカハシマコトさんが「Cocoa……というよりObjective-Cが嫌いなヒトはあのカッコが嫌だっていうんですね」みたいな話をしたんだよな。もちろん嫌だってヒトにカッコはいいぞカッコはいいぞこれからはカッコの時代だぞカッコを使わないと取り残されるぞみたいな脅迫的宗旨替えを迫る気持ちはこれっぽっちもないんだが、この種のカッコ嫌いの中には相当数の食わず嫌いも混入しているのではないかと思い、ちょっとこのカッコについてちょっとその効用を説明してみようかなと。
昔懐かしいニコラス・ビルト先生考案のPASCALという言語にはプロシージャとファンクションというもんがあった。プロシージャは値を戻さないサブルーティン・コール、ファンクションは結果として値を戻すサブルーティン・コールのことだ。で、ご存知かと思うがCやC++には元々この区別は無かった。PASCALの仕様を口を極めて罵ったブライアン・W・カーニハン先生は「呼び出された側が何を戻そうとそれを使うかどうか、見るかどうかは呼び出した側の勝手である」という考えに基づいてCを設計、ANSIが void型というのを採用するまで、戻り値の型が明示されていないサブルーティンは int型を返すという暗黙の了解もあったくらいなのだ。
いや、ここで言いたいのはそういうANSIによるC言語のPASCAL化(だってそうでしょ? 最初カーニハンたちはこのテの融通の利かなさを批判してたはずなのだ)の是非ではなくて、「Cでは全てのサブルーティン・コールが『ファンクション(関数)』であり、値を持っている」ことの方なのだ。……あっと、厳密に言って、void型を「返す」モノが関数か? という疑問はないではないけど、その尻はANSIに持って行ってくれ。
たとえばだ、「strcat()」という有名なファクションのプロトタイプ宣言(これが必要になったのもANSI以来である)は確か以下のようになっている(手持ちの「ANSI C言語大辞典」による)。
char *strcat(char *string1, char* string2);
この関数は戻り値としてstring1へのポインタを返す。したがって以下のようなコーディングが可能だ。
printf ("The result of concatination = %s n", strcat(string1, string2));
さらに、
printf ("The result of concatination = %s n",
strcat( strcat(string1, string2), strcat(string3, string4)));
さらに事態をエスカレートさせれば、
printf ("The result of concatination = %s n",
strcat( strcat(string1, string2), strcat(string3, string4)),
strcat( strcat(string5, string6), strcat(string7, string8)) );
まだまだ入れ子にすることが可能である。で、あなた今、「ああややこしい、だからカッコは嫌いなんだよ」と思ったでしょ? でもそれは誤解なのだ。このコードが見にくいのは実はカッコのせいぢゃない。以下のように書いたらどうだね?
printf ("The result of concatination = %s n",
strcat(
strcat(string1, string2),
strcat(string3, string4)
),
strcat(
strcat(string5, string6),
strcat(string7, string8)
)
);
ね、コトはカッコのせいではなく、「{ }」と「( )」の記述のしかたに関するあなたの手癖というか習慣のせいである。「{ }」ではこういう風に書いてへーきなヒトが「( )」をこう書けずに見にくいなどと愚痴をこぼすのは自分が悪いのだ。
誤解を解いたところで次回からは積極的にカッコを売り込んで行こうと思う。乞うご期待。
(2004_11_17)
高橋真人の「プログラミング指南」第56回
〜Perlについて(2)〜
こんにちは、高橋真人です。
さて、Perlは最初はテキスト処理を目的に作られたというようなことを聞いたことがありますが、実際Perlにはテキスト処理をするための豊富な仕組みが備わっています。
かつてMacOS 9の時代にはMacPerlという便利なツールがあって、テキスト処理のためのドロップレットが簡単に作れてしまうので大変重宝したものです。幸いにも現在のMac OS X上でもClassic環境を使えば問題なく使えるのですが、Perlのバージョンが少し古いところ(日本語版:5.2ベース、英語版:5.6ベース)が残念なところです。
ご存知のようにMac OS Xには最初からPerlが装備されていますから、Terminalを起動するだけでPerlは使えます。ただ、MacPerlの快適な環境に慣れてしまった身にとっては、コマンドラインのみでの作業はつらいものがあります。こういう方にとってお勧めなのがAffrusというツール。
これは、ScriptDebuggerというAppleScriptのデバッグツールを発売しているLate Night Software社の製品で、現在のバージョンではMacPerlのようなドロップレットを作る機能こそありませんが(将来できると嬉しいのですね)、MacPerlの弱点だったエディタ機能も充実していますし、何よりもソースデバッガが備わっているためにまるでIDE上で開発作業を進めるような快適さでPerlスクリプトのコーディングができます。
オープンソースであるPerlの関連製品としては珍しく市販の製品で、ダウンロード販売の価格が99ドルとなっていますが、30日間全機能を試してみることの可能なデモ版も用意されていますので、興味のある方はトライしてみることをお勧めします。
http://www.latenightsw.com/affrus/index.html
ついでに無料で使える製品がないかと探してみましたが、今話題のEclipseには案の定Perl対応のプラグインも作られているようです。epicというのがそれですが、Mac OS Xへの対応状況は不明です。
http://e-p-i-c.sourceforge.net/
さて、MacOS 9時代にもある程度本格的なテキスト変換処理をMacPerlで作ったことはありましたが、私にとってMacPerlのいちばんの用途はC/C++でのコーディングの際の補助ツールとしてのものでした。
いくつか例をご紹介したいと思いますが、せっかくですからまだMacPerlをお持ちでない方もこの際入手されてみることをお勧めします。Classic環境上で何の問題もなく使えるはずです。
http://world.std.com/~habilis/macjperl/MacJP5.j.htm
起動して、新規書類を開いたら、そこに打ったスクリプトをすぐに実行できます。保存すらしなくてもコマンド+シフト+Rでアクティブなウインドウのスクリプトが実行できる手軽さが「補助ツール」として極めて役に立ってくれるのです。
実際の使い方に関しては追って解説していきますが、まずは以下のように打ち込んで、コマンド+シフト+Rで走らせてみましょう。
print A..Z;
次回はこのスクリプトをきっかけにして、もう少し細かく見ていきたいと思います。
湘南ミーティング 2004 レポート 高橋 政明
11月12日金曜日13日土曜日の二日間「第11回 Macintosh Software Meeting in 湘南2004(通称:湘南ミーティング)」が開催されました。
ここ数年と同じく今年の湘南ミーティングも一日目の午後に初台オペラシティタワーにあるアップルコンピュータ株式会社のセミナールームでスタートしました。昼過ぎに受付を済ませ抽選会用の写真を撮影し、あらかじめ席に置かれた分厚い配布資料を受け取ります。
アップルセッションは来日中のI/Oテクノロジーエバンジェリストによる『I/Oセッション』と質問と要望を伝える『フィードバックセッション』それに『Dashboardセッション』の三つです。このセッションはApple Developer Connectionメンバー向けで具体的な内容は残念ながら守秘義務対象のため書けません。『I/Oセッション』は逐次通訳が付き、MacだけでなくiPodなどを含めいろいろなお話を聞く事ができました。また『Dashboardセッション』はちょうどコンテストの始まったDashboardについて日本語での解説を聞く事ができました。
Apple Dashboard Widget Contestの情報はこちらです
http://developer.apple.com/macosx/tiger/dashboard/index.html
葉山の湘南国際村センターへ2台の貸切バスで移動しました。今年は都内の渋滞もさほどではなく順調でした。さらに湘南国際村センター近くのトンネルが開通していて、逗子市内の混雑に影響されず快適でした。バスの車内では交流のきっかけを作るため参加者自己紹介を行っています。はじめて参加された方も多く、UNIX畑の方の参加もすっかり定着したようです。ご家族での参加もありました。
ほぼ予定通り立食パーティがはじまり、おなかが落ち着いた頃に抽選会です。各社および講師らから提供されたたくさんの景品を例年通り顔面ルーレットで抽選します。顔写真を撮影した参加者全員に何かが当たります。この抽選にはいつも小池さんの作ったソフト(トトマック)を使っていましたが、今年はOpenGLセッションのサンプルを兼ねたMac OS Xネイティブバージョンでキーノートのエフェクトのように顔写真が回転しました。
なお顔面ルーレットのルーツは大谷さんです。最初はQuickTimeプレーヤーを使い、デジカメで撮影した静止画を貼付けて行き、それをループ再生していたのだそうです。(そのためにPowerMac8100本体を会場に持って来られていました)まず景品を決め止まったとき表示していた人が当たり、のシンプルなルールも伝統です。
iPod miniが5本をはじめ、ハードウェア、パッケージソフト、書籍、アップルグッズ、さらにその他のグッズ〔^_^;〕など豪華で多彩でした。書籍の著者に直接会えるのも湘南ならではです。
新庄さんから差し入れの林檎もとてもおいしかったですね。
テクノロジーライターでMOSA理事でもある大谷さんのキーノートセッションは、今年も盛りだくさんでした。窓ガラスや机をスピーカ−に変えるグッズや、プラスチック素材製の水に強い本などを持参していただきました。注目すべきソフトのデモや、届いたばかりのiPod photoの使いこなしをいち早くご披露いただくなど『目から鱗』の楽しいひとときでした。
キーノートの後は私の担当する「Xcode使いのためのCVS入門」セッションでした。少人数で膝を突き合せるような場を予想していたのですが、深夜にも関わらず(Xcodeでソースコード管理を利用するための情報が少ないためか)多くに方に参加していただき驚きました。UNIXとCVSに精通されている方も多く参加している方に助けていただきながらセッションを進める事ができました。★なおこのセッションの配布資料に誤りがありました。「コンソール」と書いた部分はすべて「ターミナル」です。コンソールではコマンドを入力できません、ターミナルと読み替えてください。
CVSセッションを終えた後オールナイトセッション会場に戻ると例年よりも多くの方が残っていた印象です。そのためかお酒がなくなるのは早かったようですが、かなり盛り上がっていた事は間違いありません。お酒が適量だったので情報交換が進んだのかもしれません。
二日目は3つのトラックに分かれ合計9セッションに加えアップルスペシャルセッションと充実しておりました。全員参加できたアップルセッション以外は配布資料を解説します。
アップルスペシャルセッションはWWDRのShaan Pruden氏による「Apple Update」。残念ながら通訳なしでしたが、プレゼン画面がわかりやすく密度の高い1時間でした。(こちらの内容も守秘義務対象のため公にできません)
藤本さんの「AppleScriptで駆動可能なCocoaアプリを作る」セッションは配布資料にプロパティリストとソースがあり、貴重なサンプルとなりそうです。
田畑さんの「Behind the WebObjects Live!!」セッションは41ページに及ぶ配布資料が圧巻です。データベースのインストールからモデル、フレームワーク、テストの解説などが続きます。フレームワークの多言語化の説明もあります。
小池さんの「Mac OS X環境におけるOpenGL」セッションはOpenGLの情報源や開発ツールの紹介がありサンプルソースコードが載っています。さらに来年の予告まであり!
長久さんの「Javaゲームプログラミング」セッションはデスクトップ上でのJava、ゲームプログラムのしくみ、ゲームプログラミングの実際の三部構成です。「市場の分析」や「プログラムと人間」などのトピックもあります。
木下さんの「Web Kitプログラミング解説と、その実例としてのシイラプロジェクト紹介」セッションは現在プレゼンデータが公開されています。
http://homepage.mac.com/mkino2/backnumber/image/2004_11/ShiiraAtMOSA.pdf
Web Kitとシイラ紹介、Web Kitプログラミング入門、シイラプロジェクトの三部構成でスライド枚数は88もあります。
中野さんの「HID Managerを使ったゲームコントローラの活用と実装」セッションは「予備知識」と「プログラムへの実装」の二部構成です。入力デバイスとしてのゲームコントローラーをアプリケーションから利用する方法がサンプルコードの詳しい解説とともに記されています。
長野谷さんの「軟派のためのプログラミング環境「AppleScript」解説 最新動向と可能性の限界に迫る!」セッションは「AppleScriptとは何か?」「AppleScriptの最新動向」「可能性を探る」の三部構成で、AutomatorなどTigerの公開されている機能を含め解説されています。
佐藤さんの「Mac OS X Server 10.3」セッションは、Mac OS X Server 10.3の新機能、10.3で可能になった機能、期待されるフィードバックの三部構成です。(この資料は参加者に連絡したURLからダウンロード可能)普段目にする事の少ない設定画面なども載っています。
高橋真人さんの「PowerPlant X 入門〜CoreFoundation から、Cocoa との融合まで〜」セッションはCoreFoundationの利用例、STLの参考書籍リスト、PowerPlant Xサンプルソースコード、Cocoaとの融合の詳しい設定とサンプルソースがあります。高密度の配布資料です。
「より広範囲な応用分野に接する!」がテーマの今年の湘南ですが、あっと言う間に過ぎてしまいました。英語でのセッションが二つもあった事も特徴です。講師の平均年齢も若返ったと思うのですがどうでしょう〔^_^;〕? 二日目の昼休みに恒例の記念撮影を行いました、近くMOSAのwebに掲載されると思います。
今年参加できなかった方も来年はぜひ抽選会の賞品のため余裕のある大きめの鞄を持参し、夜更かしに耐えられるよう体調を整えて、参加してください!
ニュース・解説
今週の解説担当:小池邦人
【開発環境】
Mac OS X 10.3.5に潜んでいた様々な不都合を改善した10.3.6が登場しました。筆者の手元にある複数のシステムHDにもインストールし動作確認をしてみたところ、80Gの外付けFireWire HD(随分古いタイプ)のみ、Mac OS Xのシステムブートが出来なくなってしまいました。もちろん10.3.5までは可能だったのですが、アップデート後は起動時のAppleマーク表示状態でストップしてしまいます。Macintoshのトラブル関連を網羅しているサイトを色々と覗いてみたところ、この問題以外にもHDのマウントすら出来なくなったケースがあるようです。こちらの症状に関しては、HDメーカ各社がFirmwareのアップデートを開始したようで、徐々に問題も収束しているようです。ところが、うちのHDの場合にはシステムブートしようとしなければ何の問題もなくマウントできます。色々調べた結果、FinderからHDのボリューム情報を表示し「所有権とアクセス権:」に表示される「このボリューム上の所有権を無視する」のチェックを外した後、ディスクユーティリティでアクセス権の修復を行うと、再びシステムブートが可能になりました。何故こうなったのかは謎のままですが(よくあること…)、まあ直ってしまえば問題ありません(笑)。
前回から11月19日の期間中、Apple社のDocumentationサイトには新規ドキュメントが13登録されました。初版のドキュメントは「Darwin Notification API Reference」と「Message Framework API Reference」のみで、後はマイナーな改訂版です。デベロッパ向け読み物としての解説も3つ登録されています。「Optimizing Your Application with Shark 4」では、CHUD 4.0(Computer Hardware Understanding Development Tools)に含まれるパフォーマンス・チューニング(最適化)ツールの「Shark 4」を利用したアプリケーション最適化の事例が紹介されています(必見)。「Working with Spotlight」では、Mac OS X 10.4(Tiger)に搭載されるデスクトップ検索システムの「Spotlight」について、今までになかった詳細な解説を読むことができます。
「Apple Human Interface Guidelines」(PDFあり)
「Darwin Notification API Reference」(初版)
「Design Concepts」
「HeaderDoc User’s Guide」(PDFあり)
「Java 1.4 Development for Mac OS X」(PDFあり)
「Kernel Programming」(PDFあり)
「Mac OS X Frameworks」
「Message Framework API Reference」(初版)
「Pasteboard Manager Reference」(PDFあり)
「System Configuration Programming Guidelines」(PDFあり)
「Writing PCI Drivers」(PDFあり)
「QuickTime Overview」(PDFあり)
「Initializing QuickTime」(PDFあり)
「Using Java Studio Creator on Mac OS X」(読み物)
http://developer.apple.com/java/creator.html
「Optimizing Your Application with Shark 4」(読み物)
http://developer.apple.com/tools/sharkoptimize.html
「Tiger Developer Overview Series: Working with Spotlight」(読み物)
http://developer.apple.com/macosx/tiger/spotlight.html
前回から11月19日の期間中、新規のテクニカルノートがひとつだけ登録されました。「Idling Movie Importers」はQuickTime関連のテクニカルノートで、アイドリングを必要とする「Movie Importer Componet」(MovieでないデータやファイルをQuickTime Movieファイルへと変換するためのモジュール)の作成の方法が解説されています。新しいテクニカルQ&Aの方は4つ登録されました。「Sending an Email」については、前号の新居さんの記事を参考にしてください。
TN2111「Idling Movie Importers」
http://developer.apple.com/technicalnotes/index-rev-date.html
QA1388「Symbol to Library in GDB」
QA1386「Core Audio & Xcode – Ensuring the latest Core Audio Headers are installed」
QA1084「Sending an Email」
QA1167「Using Interface Builders NSOpenGLView or Custom View objects for an OpenGL application」
http://developer.apple.com/technicalqas/index-rev-date.html
【サンプルソースコード】
前回から11月19日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが6つ登録されました。このうちCarbonアプリケーション開発者に速効で有用なのは「AppleScriptRunner」でしょう。アプリケーション内からAppleScriptを実行し、ターゲットとなるモジュールにそれを実行させるためのサンプルコードです。自動でMailにメールを送信させたり、スピーチシンセサイザーを使いテキストを朗読させるような仕組みを参考にすることができます。
「AppleScriptRunner」(AppleScript関連)
「MachPortDump」(Mach Port関連)
「DumpVolumeInfo」(File Volume関連)
「Fiendishthngs」(Component Manager関連)
「CryptNoMore」(Security関連)
「VideoHardwareInfo」(CoreGraphics&OpenGL関連)
http://developer.apple.com/samplecode/index-rev-date.html
【デベロップメント SDK】
前回から11月19日の期間中、Apple社のSDKサイトには新しいSDKが3つ登録されました。「iTunes COM for Windows SDK」の新版は、iTunes 4.7 for Windowsの発表に合わせた改訂のようです。
「CoreAudio SDK v1.3.3」
「iTunes COM for Windows SDK」
「Kernel Debug Kit 10.3.6」(for Mac OS X 10.3.6)
http://developer.apple.com/sdk/
また、デベロッパー向けツールとしてCHUD(Computer Hardware Understanding Development Tools)4.0.1の配布が開始されました。Mac OS X 10.3.6に準拠したDarwinの新しいソースコードの配布も開始されています。
「CHUD Tools 4.0.1」(Computer Hardware Understanding Development Tools)
http://developer.apple.com/tools/performance/
「Mac OS X 10.3.6 (Darwin 7.6)」
http://www.opensource.apple.com/darwinsource/10.3.6/
MOSAからのお知らせと編集後記は割愛します