MOSA Developer News[MOSADeN=モサ伝]第107号
2004-03-30
目次
- Cocoaでいこう! Macらしく 第44回 Yoshiki(DreamField)
- 藤本裕之のプログラミング夜話 #42
- 高橋真人の「プログラミング指南」 第41回
- ニュース・解説
- MOSAからのお知らせ
Cocoaでいこう! Macらしく 第44回 Yoshiki(DreamField)
今回でこの連載も丸一年になります。一年間のご愛読、ありがとうございました。実は、丁度一年で連載終了・・・のつもりだったのですが、きりの良い所まで行きませんでした(^^;)。最低限説明しないといけないことも残っていますし、今しばらく続きます。
パネルを表示しよう(その6)
さて、今回はパネルの方に手を入れます。第42回でパネル上にNSFormクラスのインスタンスを加えましたが、プログラムからこれにアクセスできないと、これに情報を表示できません。そこでこのアドレスを格納するインスタンス変数を実装し、nibファイルで接続しておくことにします。InfoPanel.nibでは、File’s OwnerはInfoPanelControllerクラスでした。そこで、InfoPanelController.hを開いて、次の様にインスタンス変数を加えてください。
@interface InfoPanelController : NSWindowController {
IBOutlet NSForm *infoForm;
}
ところで、今までは、こういう時は次の様に書いていました。
IBOutlet id infoForm;
idは任意のオブジェクト型へのポインタです。このように書けば、infoFormはどんなオブジェクトを指しても良いことになります。その代わり、当然、ビルド時に型のチェックは行われません。一方、今回の様な書き方をすると、infoFormはNSFormクラスのオブジェクトしか指せなくなりますが、ビルド時に型のチェックを行ってくれます。一長一短がありますので、状況や好みに応じて使い分けてください。今回はどちらでも良かったのですが、あえて、今までと違う書き方をしてみました。
それでは、変更したInfoPanelController.hを保存しましょう。そして、InfoPanel.nibに反映させてください。やり方は何度も書きましたので、簡単に書きます。nibファイルウィンドウでFile’s Ownerを選び、Classesタブを選んでクラスの一覧に切り替え、InfoPanelControllerクラスが選ばれている状態でClassesメニューを選び、そこからRead InfoPanelController.hを選びます。
これでInfoPanel.nibはFile’s OwnerがinfoFormを持つことを知りましたので、これをパネル上のNSFormクラスのインスタンスに接続しましょう(この辺りの方法は第9回でやっています)。Instancesタブを選んでインスタンスの一覧に戻してください。そして、controlキーを押したままFile’s Ownerをマウスで選択し、そのままドラッグしてパネルのデザインウィンドウ上のNSFormまで持っていって離してください(fig.01)。今回はそんなことは無いと思いますが、もしデザインウィンドウで選択しにくいような時には、インスタンスの一覧をOutlineモードに切り替えて、その中で接続先を指定することもできます(fig.02)。InfoパネルがConnectionsに切り替わりますので、OutletsのinfoFormを選んでConnectボタンを押してください(fig.03)。実を言えば、ヘッダーファイルで型をidにせずに、今回のようにきちんとクラスまで書くと、この時にも型のチェックをしてくれます。これで接続ができましたので、保存してください。
[fig.01] contorlキーを押したまま、File’s OwnerからNSFormまでドラッグ
http://www.remus.dti.ne.jp/~yoshiki/cocoa/ed1/44/images/fig01.jpg
[fig.02] Outlineモードで接続先を指定することもできる
http://www.remus.dti.ne.jp/~yoshiki/cocoa/ed1/44/images/fig02.gif
[fig.03] infoFormを選んで、Connectボタンを押す
http://www.remus.dti.ne.jp/~yoshiki/cocoa/ed1/44/images/fig03.gif
これでNSFormクラスのインスタンスにアクセスできるようになりましたので、これに情報を表示するメソッドを実装しましょう。
InfoPanelController.mに次のメソッドを加えてください。
- (void)updateImageInfo{
ImageInfo *imageInfo;
NSSize imageSize;
imageInfo = [ ImageInfo sharedImageInfo];
imageSize = [ imageInfo imageSize];
[ [ infoForm cellAtIndex:0] setFloatValue:imageSize.width];
[ [ infoForm cellAtIndex:1] setFloatValue:imageSize.height];
}
このメソッドの中で使っているImageInfoクラスをInfoPanelController.mは知りませんので、#import “InfoPanelController.h”の次に、次の一行を加えてください。
#import "ImageInfo.h"
では、順番に見て行きましょう。
imageInfo = [ ImageInfo sharedImageInfo];
みんなで共通で使うImageInfoクラスのインスタンスのアドレスを教えてもらっています。ImageInfoクラスは前回実装しましたから、覚えていますよね。
imageSize = [ imageInfo imageSize];
imageInfoにimageSizeメッセージを投げて、イメージのサイズを教えてもらいます。この値を表示すれば良いわけです。
[ infoForm cellAtIndex:0]
infoFormにcellAtIndex:メッセージを投げて、0番目のフィールドを教えてもらっています。返って来るのはNSFormCellクラスのインスタンスです。
CodeWarriorでPowerPlantを使っていた方は、どのフィールドであるかを指定するのに、indexではなくてTagを使いたいと思うかもしれないですね。それもできます。その場合は、indexOfCellWithTag:で、まずTagに対するindexを教えてもらい、それを指定します。Tagはもちろん、InterfaceBuilderで設定できます。
[ [ infoForm cellAtIndex:0] setFloatValue:imageSize.width];
0番目のNSFormCellクラスのインスタンスに対して、横幅の値をセットしています。
[ [ infoForm cellAtIndex:1] setFloatValue:imageSize.height];
やってることは一つ前といっしょですね。1番目のフィールドに縦幅をセットしています。
これでこのメソッドを実行すれば、パネルにイメージの横幅と縦幅を表示することができるようになりました。この続きは次回です。
藤本裕之のプログラミング夜話 #42
先日(つか前回のこいつの原稿を書いていたまさにその時の出来事だったんだが)71になるウチの母親が自転車に乗っていて高校生の自転車と衝突、右上腕骨を骨折してただいま要介護の状態なんである。
いや別に身内の不幸を書いて同情を集めたいわけではなくて(お見舞いの品などは拒みませんが)、つまりそれ以来、ワタシは炊事洗濯掃除など所謂「火事」……ぢゃない「家事」というものを一通りこなしつつ仕事をしているわけなんである。
もともと母親と同居を始める前10年ほど一人暮らしをしていたし、こう見えてなかなかのキチントさん(笑)なので別段苦でもないんだが、それは措き、こうなってつくづく思ったのは家事というのは「段取り」であるということである。
例えば本日の朝の行動、6:30に準備開始、主菜のシャケの切り身を冷凍庫から取り出して解凍プレートの上に置き、カーテンを開け母親をベッドから出して座椅子を準備(こいつが昼間のままの位置にあるとベッドに寝たとき背が邪魔でTVが見えないのだ)し、これまた冷凍のハッシュドポテトをオーブントースターに入れて(油が出るのでクッキング・シートを天板の上に敷く)15分にセット。今日は燃えるゴミの日なので生ゴミを含めて一袋にまとめ階下のゴミ置き場に持って行く。ポストから朝刊を取って戻り、解凍できたシャケをロースターに入れて弱火に。昨夜の残りの野菜スープも火にかけ、頂き物のニシンのコブ巻きを2切れ、切り分ける。スープが沸騰したら冷蔵庫から残りご飯を出して電子レンジであたため、食器棚から皿、茶碗、小鉢など出して食材を盛りつける。箸が使えない母親のためにシャケの身を食べやすくほぐし、スプーンとフォークとともに出す。食い終わったら食器を軽くすすいで食器洗い機(これには実に助かってる)に入れ、スイッチ・オン。母親にクスリを飲ませる。野菜スープが終わったので、NHK BS 7:30からの「てるてる家族」を観ながらタマネギとキャベツ、セロリとピーマンを切り、缶詰のトマトとブイヨンと共に圧力鍋へ。強火にして錘の回転を待ちつつ新聞を読む。錘が回転を始めたら弱火にして10分、また新聞。キッチン・タイマーが鳴ったら火を止めて10分蒸らす。朝刊を読み終わり、圧力を抜いてスープを普通の大鍋に移して圧力鍋を洗う。スープのために出たタマネギの皮などの生ゴミを新聞紙に包んで生ゴミ入れに入れ(こうしておくと悪臭が少ない)、コーヒー豆を挽いてコーヒーメイカーのスイッチを入れてベランダの鉢植えに水をやる。そうこうするうちに食器洗い機が止まるので皿や茶碗を棚に戻し、落ちたコーヒーを魔法瓶に移し、サーバーなどは昼の食器と一緒に洗うべく食器洗い機に入れて仕事場に入るとほぼ9時、仕事開始である。
思い出しながら書いてみるとなかなかスゴいことをやっているようだが、実はそれほどたいしたことではない。シャケを解凍しているウチにゴミを出しに行き朝刊を取ってくるのも野菜スープを作りながら新聞を読むのもコーヒーメーカーがポコポコ言ってる時に鉢植えに水をやるのもごく普通のことである。そうでしょ?
ところがプログラムを書く段になると、稀にどうしてもこれが出来ないヒトがいるんだよね。昔風の、スタートとエンドがあるフローチャートで書けるようなプログラムってのはつまり、「シャケの解凍」が終わるまで「ゴミ出しと朝刊取り」に行けず、鍋を火にかければずっと火の前でたたずんでいることになる。
もちろん前後関係が重要な段取りもある。タマネギやキャベツを切る前に圧力鍋を火にかけたら危ないし、コーヒーメーカーのスイッチを入れてから豆を挽く馬鹿はいない。問題はそういう後先に意味や依存関係がある動きと相互に独立した動きとの見極めなんだよね。その見極めも含めての段取り能力こそプログラマの腕だ、と。
最近話題の「片付けられないヒト」ってのはこういう段取り能力が圧倒的に劣っているんだろう。オレの過去の経験に照らしても、出来るプログラマに部屋が片付けられないヤツは……あれ? なんでゾロゾロといるんだろう(笑)。
(2004_03_26)
高橋真人の「プログラミング指南」第41回
オブジェクト指向のとっかかり(27)
こんにちは、高橋真人です。早速続きを始めます。
ようやく今回のプログラムのキモの部分になるわけですが、コードとしては極めて単純で以下のようになっています。
tc->WriteTo(ofs);
tcはTextContentクラスのインスタンスを指すポインタで、ofsは書き出し用のストリームでしたね。
表面上は単純に見えても内部にそれなりの仕組みが潜んでいる場合が多いのがオブジェクト指向のコードです。もちろんこのコードも単純な関数の呼び出しではありません。
以前に説明しましたようにWriteTo関数は純粋仮想関数となっています。ですから実装ファイル(TextContent.cpp)中には実装コードは存在しません。そしてその代わりにサブクラスで必ず関数の実装が必要となるわけでしたね。クラス定義ファイルであるTextContent.hにおいてvirtualという修飾語が付けられていることが仮想関数を意味していたのを思い出しましょう。このvirtualがあることで、関数の呼び出しはポインタが指しているインスタンスのメンバ関数の呼び出しにすり替えられるということでした。
今回の例でtcが指しているのはDosTextクラスのインスタンスですから、実際に呼び出されているのはDosText::WriteTo()です。(「::」という記号はスコープ解決演算子と呼ばれる演算子ですが、ここではこの関数がDosTextクラスに所属していることを表していると理解しておいてください)
ところで、「インスタンスがDosTextクラスのものなのだから、そのクラスの実装が呼ばれて当たり前ではないか」と疑問を持たれる方もおいでかもしれません。
そう思われるのも無理はありません。ですが「ポインタが指しているインスタンスのクラスは実行時にならないと分からない」ということがここでの重要なポイントです。今回のコードでは最初からインスタンスのクラスがDosTextだということが分かり切っているためにその辺がよく見えませんが、次回の連載でプログラムに少し手を加えて、生成するインスタンスが実行時に切り替わるように改造してみることにします。
では、DosTextクラスにおけるWriteToの定義を見てみましょう。
void DosText::WriteTo(ofstream& outStream)
{
for (size_t i = 0; i < content.size(); ++i) {
outStream << content[i].c_str() << DOS;
}
}
関数の中身は単純なforループ文です。ループしながらvectorの要素を一つずつ巡回しています。(このように配列の要素を順に巡っていく処理をする場合、最近ではイテレータという仕組みがよく使われます。今どきのプログラミングではポビュラーな仕組みなので、これについてもいずれ説明します)
ストリームに書き出しているのは、content[i]が保持している文字列、そして改行コードになります。
前回の説明で抜け落ちていたのですが、getline(ifs, buffer);という関数呼び出しでは、改行コードはbufferの中に格納されません。ですので、ファイルから読み込む段階で切り落とされていた改行文字を、しかるべき改行コードに変換したということになります。
こんなところで、長きにわたった今回のサンプルプログラムの説明を終わります。(漏れている部分もあるかもしれませんが)
結局のところ、WriteTo()での改行コードをDOS、つまりCR+LFにするというだけのためにわざわざポリモーフィズムを使ったというのが今回のプログラムです。この程度の理由でわざわざポリモーフィズムを使うことは普通はあり得ないでしょう。ポリモーフィズムの仕組みが見えやすいように、実行内容を極めて単純にすることこそがプログラムの目的ですので、その辺の不自然さに関しては目をつぶってください(笑)。
全体的に中身の薄い単純なプログラムではあったわけですが、それでもC++という言語の特有の表現がいくつもあって、理解しづらいものだったかもしれません(これでもかなりシンプルな書き方をしてあるんですが)。
プログラム全体を通して見てみると、main.cppの冒頭で定義しているdefine文、現在はDOSとなっていますが、これをMACまたはUNIXと書き換えることでtc->WriteTo()によって呼び出される関数が切り替わるという相関関係をご理解いただけば今回の不自然なサンプルプログラムの目的は達したということになります。
ニュース・解説
今週の解説担当:小池邦人
Carbon ドキュメント & サンプル & SDK ナビゲーション(2004/03/26)
【開発環境】
Apple社のDeveloperサイト内に「Reference Library」サイトが新設されました。ここからApple社が発表した最新のドキュメント、リリースノート、テクニカルノート、サンプルコード、Q&Aを一括で参照することができます。ページの右上にポップアップメニューがありますので、それを選択して各カテゴリーへダイレクトに移動します。Developerサイトの構成については、Mac OS Xへの切り替え以来、紆余曲折、色々と変遷があったのですが、ようやく分かりやすい体系にまとまったもようです。WWDCにおいて、サイト担当者が参加者にアンケートを取りプロトタイプを見せて意見を聞いていたのを思い出します(意見を述べるとTシャツがもらえた)。これでもう少し日本語訳ドキュメントが増えれば嬉しいのですが...(笑)。
http://developer.apple.com/referencelibrary/index.html
Apple社から「Xgrid Technology Preview 2」が発表されました。前回のPreview 1にはまともなドキュメントが付属していませんでしたが、今回は「Xgrid Guide」という30ページ程度のPDFドキュメントが付いています。アップロードされたばかりなので、前回のバージョンと比較してどのような点が変更、強化されているのかはまだ未確認です。ドキュメントをざっと見た感じでは、まだまだ情報不足のような気がしますが、正式版の登場が待ち遠しいテクノロジーであることは間違いありません。
http://www.apple.com/acg/xgrid/
また、Apple社から「Spoken Interface」というUniversal Accessに関連した新テクノロジーが発表されています。以下のサイトに幾つかの図版と共に技術についての詳しい内容が解説されていますので、興味があるかたは参照してください。音声認識にしろ、音声による操作のナビゲートにしろ、とにかく日本語対応でなければ我々にとっては宝の持ち腐れです。その点についてApple社は、もう少しよ〜く考えて欲しいと思います。
http://www.apple.com/accessibility/spokeninterface/
【テクニカルドキュメント】
前回から3月26日の期間中、Apple社のDeveloperサイトにはドキュメントが多数登録されました。やっとこさ販売が開始されたXserve G5の仕様ドキュメントも含まれています。また、Quartz 2Dについてのカテゴリー別リファレンスが大量に登録されましたので、ここではそれらをすべてまとめて参照できるサイトを記載しておきます。
「Xserve G5 Developer Note」(PDFあり)
http://developer.apple.com/documentation/Hardware/Developer_Notes/Servers/XserveG5/index.html
「New Getting Started Documents」
http://developer.apple.com/gettingstarted/index.html
「Introduction to Adding Behavior to a Cocoa Program」
http://developer.apple.com/documentation/Cocoa/Conceptual/AddingBehaviorToCocoa/index.html
「Cocoa Text & Fonts」
http://developer.apple.com/documentation/Cocoa/TextFonts-date.html
「Data Browser Reference」(PDFあり)
http://developer.apple.com/documentation/Carbon/Reference/databrow_reference/index.html
「Displaying Data in a Data Browser」(PDFあり)
http://developer.apple.com/documentation/Carbon/Conceptual/display_databrowser/index.html
「Apple Human Interface Guidelines」(PDFあり)
http://developer.apple.com/documentation/UserExperience/Conceptual/OSXHIGuidelines/index.html
「Mac OS X Man Pages」(PDFあり)
http://developer.apple.com/documentation/Darwin/Reference/ManPages/index.html
「Menu Manager Reference」(PDFあり)
http://developer.apple.com/documentation/Carbon/Reference/Menu_Manager/index.html
「Quartz 2D Reference」(PDFあり)
http://developer.apple.com/documentation/GraphicsImaging/Reference/CGAPI-date.html
また、デベロッパ向けの読み物として以下の内容が登録されています。先ほど紹介したReference Libraryサイトの使い方についての解説です。
「Making the Most of the ADC Reference Library」(読み物)
http://developer.apple.com/referencelibrary/usingreflib.html
前回から3月26日の期間中、新規テクニカルノートはひとつも登録されませんでしたが、テクニカルQ&Aの方は3つ登録されました。
QA1343 「Audio Unit Resizing」
QA1198 「Rendezvous enforces the service type format in Panther」
QA1344 「DDR SDRAM ICs for PowerBooks and iBooks that use Memory bus slewing」
http://developer.apple.com/qa/indexes/whatsnew0.html
【サンプルソースコード】
前回から3月26日の期間中、Apple社のSample Codeサイトにはサンプルソースコードがひとつも登録されませんでした。う〜ん、ついにサンプル打ち止めか?
http://developer.apple.com/samplecode/
【デベロップメント SDK】
前回から3月26日の期間中、Apple社のSDKサイトには「CoreAudio SDK v1.3.1」がひとつだけ登録されました。また10.3.3の登場に伴ない、ダーウィンの最新ソース7.3も登録されています。
「CoreAudio SDK v1.3.1」
http://developer.apple.com/sdk/
「Darwin 7.3 Source Code」
http://www.opensource.apple.com/darwinsource/
MOSAからのお知らせと編集後記は割愛します
Apple、Mac OSは米国アップルコンピュータ社の登録商標です。またそのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。
このメールの再配信、および掲載された記事の無断転載を禁じます。
http://www.mosa.gr.jp/
Copyright (C)2004-2006 MOSA. All rights reserved.