MOSA Multi-OS Software Artists

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

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

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

2004-02-18

目次

  • 藤本裕之のプログラミング夜話 #39
  • 高橋真人の「プログラミング指南」 第38回
  • ニュース・解説
  • MOSAからのお知らせ

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

 ついさっき,かなり以前にヒトに譲ってしまったルータのマニュアルをシュレッダにかけていた(オレは客先から来たコンフィデンシャルの書類とかも裏紙として使うので処分する時には全部シュレッダにかけることにしている。
Fellows製パーソナル・シュレッダーFS5というのを使用)。
 ルータのメイカーのサイトからPDFをダウンロードして印刷したそれ,気がつけばなんとも懐かしい文書の裏に印刷されているではないか。1990年に港区のラフォーレ飯倉で開催された第2回『アップル・デベロッパー・カンファレンス’90日本」で配布されたレジュメである。「MacApp」とか「アップルの新技術・TrueType」てな文字が次々とコマギレにされて消えて行く。そうかそうか,そういう時代もあったなぁ,と。

 そんなかに,色違いの紙に印刷されたレジュメがあってデカい字で「ローカライズというビジネスチャンス」と書いてあるのを見つけた。そーなのだ,この頃デベロッパーでデカい顔をしていたのは(つうこたぁないっすな,でかい会社だったのは,であります)みんな,米国で発売され好評を博したソフトを日本語にローカライズして売ってる会社ばっかりであり,日本国内でオリジナルのソフトを開発・販売してたのはほんまに数えるほどだったのである。
 あー,だんだん思い出して来たぞ。このカンファレンス,技術的な話はクソの役にも立たない内容だったうえ(英文資料の翻訳が抱腹モノだったのを覚えてる),あげくの果てに当時MacPowerの編集者だったトジマさんの司会でそのテのローカライザーの巨頭数社の社長だか専務だかとにかく偉いヒトばっかりの座談会まで聞かされたのだ。
 出席したのは……別にさしさわりはなかろうが念のため匿名にすると「北海道でハードウエアを作っていた○社」,「PageMakerのローカライズをしていた△社」,「大阪で漢字変換モジュールを作りローカライズもやってた◆社」「福岡にあったあそこ,というだけで誰でも思い出せるだろう■社」の4社で,もうここまで書けばお気づきと思うが,一社たりともMac業界に残ってない(笑)。いや,どこにも残ってないところの方が多いくらいなんである。そうでしょ?
 トジマさんがどういう司会をしたか忘れたが,この座談会を企画したアップルの意図といえば,先の「ローカライズというビジネスチャンス」のレジュメでも分かるように,アメリカで売れているソフトをわずかな(っていうと語弊があるだろうけどさ)手間でローカライズして日本で売るのは美味しい商売でっせ,今日はそういう戦略で成功してらっしゃる皆さんをお招きしましたんでみんなでお話を拝聴しましょう,そして皆さんも続いてください,というようなもんだったんだろう。

 当時数少ない日本オリジナルのMacソフトを作ってたオレ自身は,そういうアップルのモノイイにちとカチンと来たような記憶がある。デベロッパーカンファレンスといいながら,来ているヒトも今のMOSAの会合を思えばやたら営業バタケ,マーケティングバタケのヒトが多かったようにも思うし,おお,そう言えばまだ当時は「ソ連」という国があって,あの飯倉の坂を降りたところに大使館があり,右翼の街宣車がふんじゃらかんじゃら喚いていたなぁ。あ,それは関係ないか。
 オレは別にアリとキリギリスの話をしようとかウサギとカメの話をしようというんぢゃない。賭けてもいいが,あのときステージでふんぞり返っていたヒトらは今でもオレよりきっといい暮らしをしているだろうし,そもそもオレだってアリよかキリギリスの暮らしの方が,カメの地道よりもウサギの飛躍の方が好きだ。そうぢゃなくて。
 「ローカライズしてお金儲けましょ」と言ってたころのこの催しはラフォーレ飯倉で2日間,昼飯にサンドウィッチとブリック・パックの牛乳がでただけで参加費がデベロッパー30,000円,一般40,000円というものだった。もちろんマシンの値段も当時とは違うし比べる方が間違っているんだけど,昨年のモサの湘南イベントなんか思い出しても,この14年でアップルもずいぶん変わり,オレたちみたいな零細デベロッパを大切にしてくれるようになったなぁ,と。そうそう,新聞などによればハラダさんはこの年にアップルに入ったのね,長いことご苦労さまでした。
(2004_02_09)

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

オブジェクト指向のとっかかり(24)

 こんにちは、高橋真人です。早速、続きに入りましょう。
 コードは、さらに以下のように続きます。

TextContent *tc;
if (strcmp(RETURN_CHAR, MAC) == 0) {
     tc = new MacText;
}
else if (strcmp(RETURN_CHAR, UNIX) == 0) {
     tc = new UnixText;
}
else {
     tc = new DosText;
}

 ようやく、TextContentという今回のプログラムの核心の機能を果たすクラスが登場しました。このクラスの定義はTextContent.hにあります。以下の部分ですね。

class TextContent
{
public:
     virtual             ~TextContent() {}
     virtual void        WriteTo(ofstream& outStream) = 0;
     vector<string>      content;
};

 以前も書きましたように、このプログラムは説明を分かりやすくするために多分に作為的です。そのためオブジェクト指向のやり方としてはまずい部分をいくつか抱えていますが、それは今の段階では無視します。(なので、public:というのは気にしないでください)
 さて、このクラスはメンバ関数2つとメンバ変数1つとを持ちます。~TextContent()とWriteTo()、それからcontentがそれらに当たります。~TextContent()はいわゆるデストラクタというやつで、インスタンスが破壊されるタイミングで呼び出される関数でしたね。
 ところで、それぞれの関数の頭に付いている「virtual」という識別子は何でしょうか? それを説明するためにはメンバ関数の実装について考える必要があります。
 既に書いたようにTextContentのクラス定義はTextContent.hというヘッダファイルにあります。対応する実装ファイルであるTextContent.cppを見てみますと、ナンと中身が何もありません。ヘッダファイルをインクルードしているだけで、あとはなぁーんにも書かれていないのです。一体、メンバ関数の実装はどこにあるのでしょう?
 まずはデストラクタである~TextContent()の後ろに注目してみてください。
 {}というカラのカッコがありますよね。実はこれがこの関数(デストラクタ)の実装部分です。C++では、通常はメンバ関数の実装は実装ファイル(cppファイル)に書くことが多いですが、内容が極めて短い場合やちょっとした事情がある場合には、クラス定義の中に直接関数の実装を記述することがあるのです。(Javaのやり方と同じですね)
 そんなわけで、ほとんど存在感の感じられない {} ですが、これで立派な関数定義を表しているということになるわけです。ちなみに、今回のような書き方でなく、cppファイルの方に実装を記述する場合には、

TextContent::~TextContent()
{
}


のようになりますが、その場合、関数の定義部分(つまり、ヘッダファイルの方)の末尾にはセミコロンを付けないとエラーになりますので。
 さて、virtualの話でしたね。実は、C++ではクラスのメンバ関数の前にvirtualと付くと、それを「仮想関数」と呼ぶのです。仮想関数というのは「サブクラスによって再定義される可能性のある関数」のことでして、つまりメンバ関数の前にvirtualというキーワードがあると、「この関数はサブクラスによってオーバーライドされるかもよ」ってことを意味するわけです。
 この「かもよ」ってところがミソなんです。「仮想関数」なんて名前が付くから実体(つまり実装)がないのかと言えばそんなことはなく、オーバーライドされない場合には、ちゃんとデフォルトの実装(つまり、このクラスにおける定義)が働く仕組みになっています。
 ところで、WriteTo()というメンバ関数ですが、こっちの方はよくみると、末尾に「= 0」なんていう奇妙なものがくっついてます。実は、virtualに加えてこの = 0 が付くと、今度は「純粋仮想関数」という名前に変わります。
 純粋仮想関数だなんて、ずいぶん大層な名前だと思いませんか? ただでさえこむずかしい用語が並んでいるC++ですが、さすがにこの用語を見た時には、私も「何なんだ、これはっ」と、ギョッとした記憶があります(笑)。
 さて、仮想関数が「純粋」になってきますと、今度は本当に実体(つまり実装)がなくなっちゃいます。従ってサブクラスによる上書きが、今度は必須ということになってまいります。さらに、この純粋仮想関数を一つでもメンバに含んだクラスのことを「抽象クラス」と呼びまして、これは「サブクラスによって上書きされることが前提となっているクラス」ということになります。
 言い換えれば、このクラスは実体化ができないということでして、今回の例で言えば、TextContentクラスからはインスタンスを作ることができないのです。

TextContent  aInstance;    // エラー
TextContent  *aInstancePtr = new TextContent;    // エラー

と、いずれの場合もエラーになってコンパイルはできません。
 ちなみにC++によるポリモーフィズムは、親クラスに対する関数呼び出しがサブクラスによって上書きされるという形で動作しますが、このvirtualというキーワードを付け忘れると、この仕組みが働かなくなるので注意しましょう。
 さて、C++の難解ワードの森を彷徨っているうちに、今回も終わりになってしまいました。うーん。冒頭に掲げたコードも、最初の1行めだけしか説明できませんでしたね(笑)。では、また次回。

ニュース・解説

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

Carbon ドキュメント & サンプル & SDK ナビゲーション(2004/02/14)

【開発環境】

皆さん、ADCでSeedingされている物を仕事で利用しているマシンにインストールする時は注意しましょう(当たり前ですよね)。完成版のような振りをしていたので(笑)あまり深く考えずにナニの最新環境をインストールして動作確認をしてみました。すると、ナニの方は問題ないのですが、なんと、Metrowerks CodeWarriorのCarbonプロジェクトがMakeできなくなることが判明いたしました! 色々と調べてみると、テンプレートの時点でLibraryとしてリンクされているcrt1.oで何らかのトラブルが発生しているようです。これをMacOS X Support/Libraries/Startup/mwcrt1.oに差し替えたところ無事Makeできるようになりました。う〜ん、ナニはメイン環境じゃないので油断していたのがいけなかったようです(反省)。

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

前回から2月14日の期間中、Apple社のDeveloperサイトには数多くのドキュメントが登録されました。すべて、Developer ConnectionのDocumentation Revision Listのサイトからアクセスすることが可能です。Java 1.4.2の発表に伴い、それに関連するドキュメントがいくつも登録されています。どうも、Cocoa関連のドキュメントにPDF版が少ないというのは伝統のようですね。

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

「Java 1.4.2 Release Notes」 (PDFあり)
「PowerPC Numerics」 (PDFあり)
「Working With Bluetooth Devices」 (PDFあり)
「Event-Driven XML Parsing」
「Apple Event Manager Reference」 (PDFあり)
「Printing」
「Foundation Reference for Java」 (PDFあり)
「Foundation Reference for Objective-C」 (PDFあり)
「Application Kit Reference for Java」 (PDFあり)
「Application Kit Reference for Objective-C」 (PDFあり)
「Foundation Framework」
「Runtime Configuration」
「Launch Services Concepts and Tasks」 (PDFあり)
「Launch Services Reference」 (PDFあり)
「Java 1.4.2 API Reference: Apple Extension」
「Java 1.4.2 API Reference: J2SE」
「Java 1.4 Info.plist Java Dictionary Keys」 (PDFあり)
「Java 1.4 System Properties」 (PDFあり)
「Java 1.4 Virtual Machine Option」 (PDFあり)

また、デベロッパ向けの読み物として以下の2つの内容が追加登録されています。

「OpenGL Tools for Serious Graphics」(読み物)

http://developer.apple.com/opengl/opengl_serious.html

「Fighting Spam on Mac OS X Server」(読み物)

http://developer.apple.com/server/fighting_spam.html

前回から2月14日の期間中、新規テクニカルノートは4つ登録されました。
「Mac OS X 10.3 Navigation Services Changes」では、Mac OS X 10.3になりNavigation Servicesへ新規に実装された機能とその変更点が取り上げられています。重要な点は、Navigation Services Dialogに表示されている各アイテム(メニューとかボタン)は、すでにダイアログアイテムではないということです。ダイアログを前提にして何らかのカスタマイズを行っているソフトは、Mac OS X 10.3以降では正しく動かなくなります。ただし、今までのアプリケーションとの互換性を維持するために、Navigation Services Dialogのカスタムエリア(ユーザがコントロールを追加できる領域)は、今まで通りダイアログとして機能しており、Dialog Manager APIを利用することが可能です。
「The System Sound APIs for Mac OS X 10.2, 10.3 and later」では、SysBeep()の代わりとなるAPIが紹介されています。いよいよSysBeep()に渡す謎の引数ともお別れのようです…(笑)。

TN2102 「The System Sound APIs for Mac OS X 10.2, 10.3 and later」
TN2104 「Handling Audio Unit Events」
TN2107 「Working Around Incorrect -needsToDrawRect: Behavior in Custom View Classes」
TN2105 「Mac OS X 10.3 Navigation Services Changes」

テクニカルQ&Aの方は8つ登録されました。Rendezvous関連のQ&Aが複数登録さ
れています。「QA1334」「QA1335」「QA1339」については、前号の新居さんの
解説を参照してください。

QA1310「Clearing the Rendezvous service cache」
QA1059「Setting the look-and-feel for Swing applications」(日本語訳)
QA1312「Rendezvous service types used in Mac OS X」
QA1331「Use empty string for Rendezvous domains」
QA1333「Duplicate Rendezvous services while browsing」
QA1339「The state of mDNSResponder」
QA1335「Use NSSound instead of NSMovie for audio only playback on Mac OS X 10.3 and greater」
QA1334「OpenGL Driver Monitor Decoder Ring」

http://developer.apple.com/qa/

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

前回から2月14日の期間中、Apple社のSample Codeサイトには3つのサンプルソースコードが登録されました。「ThreadsExportMovie」はCocoaアプリケーショです。このサンプルでは、QuickTime 6.4から導入されたスレッドセーフのAPI(今回はQuickTime Movie Export Component)の仕組みを試すことができます。ただし、QuickTime 6.4 がインストールされていたとしても、このアプリケーションはMac OS X 10.2(Jaguar)環境では動作しませんので注意してください。

「ThreadsExportMovie」(QuickTime関連)
「Video Hardware Info」(Graphics 3D関連)
「NSOpenGL Fullscreen」(Cocoa&OpenGL関連)

http://developer.apple.com/samplecode/

【デベロップメント SDK】

前回から2月14日の期間中、Apple社のDeveloperサイトに登録されたデベロップメントSDKは「Bluetooth SDK 1.3.3」と「Bluetooth SDK 1.4.1」です。1.3.3の方がMac OS X 10.2(Jaguar)用で、1.4.1の方がMac OS X 10.3(Panther)用となっています。

「Bluetooth SDK 1.3.3」
「Bluetooth SDK 1.4.1」

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

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

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