MOSA Multi-OS Software Artists

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

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

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

2005-01-11

目次

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

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

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

 これまで、手っ取り早くSmalltalk言語を使ったプログラミングを体験していただこうという思いから、既存のオブジェクトについては最低限にしか触れてきませんでした。しかし、それもぼちぼちツラくなってまいりましたので、身近なオブジェクトの解説を一気に済ませてしまいたいと思います。まず、リテラル式で生成できるオブジェクトです。

 すべてをメッセージ送信で表現するSmalltalkシステムにおいてオブジェクトは、それが属するクラスにメッセージ「new」かそれに準じるメッセージを送って生成するのがスジです。しかし、よく使用する“馴染み”のオブジェクトについてはリテラル式、つまりメッセージ送信を介さずにそのものズバリを直接表現することができるよう配慮されています。

3                    "an Integer                     "
16r82A0              "an Integerの16進表現(n進可能)"
3.0                  "a Float                        "
$x                   "a Character                    "
'string'             "a String                       "
'It''s mine!'        "a Stringで'を含むとき          "
#symbol              "a Symbol                       "
#'s y m b o l'       "a Symbolでスペースを含む場合   "
#(1 2 3 4)           "an Array                       "
#('this' #is $a 10)  "an Array      

 では、普通の言語ではあまり見かけない、あるいはちょっと勝手が違うオブジェクトについてコメントしてまいりましょう。

▼シンボル
 シンボル(a Symbol)は要素を変更できず、かつ、同じ内容なら同じオブジェクトであることが保証されたオブジェクトです。たとえば、変更不可(immutable)であることは、次の式で確認できます。

'string' at: 4 put: $o; yourself  "=> 'strong' "
#symbol at: 5 put: $a; yourself
   "=> Error: symbols can not be modified. "

 メッセージ「at: n put: obj」はn番目の要素をobjと置き換える破壊的なメソッド「#at:put:」を起動し、objを返値として返します。「;」は前の式の返値ではなくレシーバに続くメッセージを送るとき使う記号です。メッセージ「yourself」はレシーバ自身をレシーバに返させます。【註1】 シンボルは内容を変える操作を受け付けません。

 他方で、シンボルの同内容の同一性保証は次のような作業で確認できます。

| str1 str2 sym1 sym2 sym3 |
str1 _ 'abc'.
str2 _ str1 copy.
sym1 _ #abc.
sym2 _ sym1 copy.
sym3 _ #($a $b $c) as: Symbol.
World findATranscript: nil.   "トランスクリプト呼び出し "
Transcript
   cr; show: str1 = str2;    "=> true  "
   cr; show: str1 == str2;   "=> false "
   cr; show: sym1 = sym2;    "=> true  "
   cr; show: sym1 == sym2;   "=> true  "
   cr; show: sym1 = sym3;    "=> true  "
   cr; show: sym1 == sym3    "=> true  "

 「= obj」はレシーバとobjとが同内容かを、「== obj」は同一かを確認するためのメッセージです。メッセージ「copy」はレシーバと同内容で別のオブジェクトを作るのですが、シンボルではそうなっていないことが分かります。これは、Symbol >> #copyの定義(再定義)を見ても明らかです。

[fig.A]Symbol >> #copyの定義
http://squab.no-ip.com:8080/mosaren/uploads/25a.png

 メソッドはコメントのみで何も記述されていないように見えますが、このような場合、暗黙の「^ self」が機能して、self、つまりレシーバを返します。sym3の例でもお分かりいただけるように、コピー以外の方法で作られたシンボルについても同一性が保証されています。

 スペースを含むシンボルをリテラル式で表現することも可能です。ただし、そのようなときは、#の後に、文字列のリテラル式、つまり「’」で括って記述します。

 シンボルは、辞書のキーなどにおいて文字列の代わりに使用します。

▼文字列
 文字列(a String)のリテラル式で「’」を含むときは、これを2つ連ねることで表現します。

▼配列
 配列(an Array)は、要素をスペースで区切って表現します。ただし、配列のリテラル式では、要素がリテラルの配列しか作れません。シンボルの「#」は(そのシンボルがスペースを含まない場合にかぎり)省略することができます。

 くわえて、Squeak用Smalltalk言語独自【註2】で、他のSmalltalk言語にはない配列の表現方法に、カーリーブレイス表現というのがあります。カーリーブレイスとは、中括弧「{ }」のことです。カーリーブレイス内の式は、評価され、その返値が配列の要素になります。したがって、配列のリテラル式ではできない、リテラル以外の要素を含む配列を表現することが可能となります。

{3 + 4. 3 * 4. 3 - 4}   "=> #(7 12 -1) "

 余談ですが、カーリーブレイス表現を持たない通常のSmalltalk言語では、同様のことをするのに、Array class >> #with:、#with:with:、#with:with:with:、#with:with:with:with:などを使用します。

Array with: 3 + 4 with: 3 * 4 with: 3 - 4  "=> #(7 12 -1) "

 配列の要素への参照には、通常の言語に見られる添え字を使った特別な構文は用意されていません。先のシンボルや文字列のときと同様に「at: n」あるいは「at: n put: obj」というメッセージを介して行ないます。しつこく繰り返すと、Smalltalk言語においては、何ごとも常に「オブジェクトに対するメッセージ送信」なのです。もっとも、リテラル式の話をしているときにこのドグマを持ち出すのは、いささか説得力に欠けるというものですが…。

#(10 20 30 40) at: 3                      "=> 30 "
#(10 20 30 40) at: 3 put: 100; yourself   "=> #(10 20 100 40)

▼注釈、コメント
 オブジェクトではありませんが、コメントはダブルクオート「”」で括って表現します。コメント内でのダブルクオートは、文字列のときと同様に、二回繰り返すことで使用できます。

"She said, ""It's mine!"""

 もっとも、コメントの場合、このようにしてまでダブルクオートをあえてコメント内に含めることにそれほどの意味はないでしょう。ただ、既存の式をコメントアウトしたいとき、ダブルクオートを含んでいないかを注意する必要はありそうです。逆、つまりコメントアウトした式を復活させるときについても同じことが言えます。

 Smalltalk言語では、文字列リテラルもコメントも改行を含むことができます。

註1:レシーバそれ自身を返すメッセージ「yourself」は、もちろん単独では意味をなしませんが、「at: n put: obj」のようにレシーバを返さない(あるいは、返すことが保証されていない)メソッドの直後にレシーバを参照したい場合などに、「;」と併せてよく用います。これは、テンポラリ変数の使用を端折って簡潔に表現するための、ある種のイディオム(慣用的表現)です。

註2:カーリーブレイスは、より正確にはSqueakではなく、Squeakの前身のApple Smalltalk時代にラリー・テスラーの手により加えられた拡張です。ラリー・テスラーは、古くからのMac用ソフト開発者の間でその名前知らない人はいないほどの有名人ですが、同時に、Apple移籍前のPARC時代、Smalltalkシステムの拡充に大きく貢献した人でもあります。

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

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

 御慶。年も変わったことだし昨年と同じようなことをやっていてもしょうがないので(いや別にしょうがなくはないと思うが書いている方が飽きて来た)、今年はちと趣向を変え、興味のないヒトには申し訳ないがワタシの原稿のネタをCocoaに限りたいと思う。
 なにしろCocoaは、昨年の湘南ミーティングのアンケートでも、Q21「あなたがこれから使いたい環境は?」という質問において、複数回答可とは言え堂々39%の1位を獲得したのである。
 にも関わらず、このモサ伝でヨシキ君が連載してたCocoaの入門が終わってからこっち、コイケさんの「Carbon」、タカハシマコトさんの「Perl」(まぁこれは「今はPerlの話」ちゅう雰囲気だけど)、スミ君の「Smalltalk」、タバタ君の「WebObjects」があって「輝けこれから使いたい環境第1位」の「Cocoa」の話がないのだ。
 湘南のミーティングの時も喋ったけど、Cocoaを使ったプログラミングは楽なんである。そりゃニンゲンは苦労すべきかもしれないし、若いうちのそれは買ってでもしろ、と、もう若くないヒトは訓戒を垂れもする。が、同じ苦労にも身になる苦労とそうでないものがあるのであり、Cocoaが楽にしてくれるそれはどう考えても後者である。ワタシとしては、もっと身になる苦労をするために(いや別に休日にトコトン遊ぶためでも構わないんだが)、皆さんにもっとCocoaを使っていただきたい。
 とくに編集長になにか言われたわけぢゃないし、彼がもし誰かホカの人にCocoa専門の連載を持ちかけていたりしたら申し訳ないんだけど、義を見てせざるは勇なきなり、故国のために勝手に立ったドン・キホーテ(放火されたディスカウントショップぢゃないほう)のココロイキ、とにかく今年はとことんCocoaネタで行くことにしたのである。

 とまぁ、斯くして2005年の大方針は決まったわけだが、モノにはやり方というものがある。巷に溢れる……あんまり溢れてないか、Cocoaの入門書のなぞりなどここでやっても面白くない。それに下手をすれば営業妨害だ著作権侵害だと(そんなの誰が書いても同じになりそうだが)著者に叱られないとも限らない。
 それになんというか、このモサ伝の読者の多くは、そういう本で展開されている手取り足取り「誰でも出来る料理のレシピ本的チュートリアル」ごときは疾うに卒業しており、もっと細部の重箱の隅に残った蒲焼きのタレに含まれるアミノ酸分子の構造やらその鏡像異性体との性質の違いなどこそを読みたいのではないかと思うのだ。
 つまり(ちゃんと「つまり」になっているかどうか若干心もとないが)、Cocoaという題材を碁や将棋に例えれば、この連載では「ゲームのルール」や「次の一手」、あるいは「大局観」(そういえば、昨年は主にプログラミングにおける「大局観」というのを書いたつもりなんだよね)みたいなものではなく、「詰め将棋/詰め碁」みたいな部分の問題をやっていきたいと思うのである。
 以上、能書きだけで今回の紙幅をほとんど費やしてしまうコトになったが、次回からなにをどんな風に展開して行くつもりであるかを、ここに具体的に述べて予告編の終わりとしよう。
 Cocoaで定義されているクラスを一個ずつ、順不同で取り上げて、その成り立ちやら用途用法、バグや陥りやすい誤解など、あることないこと……いや、出来るだけ「ないこと」は書かないつもりだが、思いつくままに書いて行く。Xcodeに付属しているリファレンスを翻訳するつもりはないので、網羅的に全てのメソッドを追ったり定数などの解説を無味乾燥に羅列するつもりはない。次回、最初にとりあげるクラスはNSApplicationである。乞うご期待。
(2005_01_06)

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

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

 こんにちは、高橋真人です。
 さて、前回はリストと配列の似ているところと違うところをご説明しました。このままさらに話を展開させていくことも可能なのですが、とりあえず保留にしてあったことを片付けてしまいましょう。
 もう、お忘れになったかもしれませんが(笑)、連載56回の最後に出てきた

print A..Z;

を見ていきます。
 一見単純なコードですが、いろいろ興味深い要素を含んでいます。まず、A..Zという表現ですが、これはAとZという識別子が「..」という演算子を挟んでいる、ということになります。
 さて、ここでのAとZは何でしょうか? 思い出してください。Perlでは、スカラー変数は必ず頭に$マークが付くのでしたね。従って、AやZはスカラー変数を表してはいないということにまず気付く必要があります。
 「スカラー変数でないとしたら、何?」
 まだこの連載では触れていないのですが、$や@から始まらないタイプの変数もPerlには存在していて、中にはアルファベットのみの変数というものもあるのです。ところが、ここでのAやZはコードの中で初めて出てきたので、まだ何も値を割り当てられていません。したがって、これらは変数としては機能しないのです。
 実は、これらは「..」という演算子を挟んでいるオペランドだということになるのです。
 ..という演算子は「範囲演算子」と言い、左のオペランドで始まり、右のオペランドで終わる連続した範囲の値をリストにまとめて返すのです。いくつか例を挙げてみましょう。

1..10 —> (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
‘a’..’e’ —> (‘a’, ‘b’, ‘c’, ‘d’, ‘e’)

 こんな感じです。後者の’a’..’e'という表現ですが、文字を囲んでいる引用符を外しても(つまり、a..eですね)、ちゃんと同じように解釈されます。
 このように、状況的に他の役割(ここでは、aという識別子が何らかの変数であるということ)をしている可能性がない場合に、アルファベットは文字列として解釈されるのです。
 ところで、今までずっとシングルコーテーションを文字列を囲むところで使ってきています(一部に例外あり)。事実、Perlでは、’a'と”a”は実質上同じ意味となるため、’abc’という表現も問題なく使えるのです。シングルコーテーションとダブルコーテーションの違いについては少し後で説明するので、それまでは「文字列にはシングルコーテーションも使える」と思っていてください。
 さて、範囲演算子が数値以外のケースに適用されるのは、アルファベット1文字の場合だけに限りません。たとえば’a0′..’b2′という式は、(‘a0′, ‘a1′,’a2′, ‘a3′, ‘a4′, ‘a5′, ‘a6′, ‘a7′, ‘a8′, ‘a9′, ‘b0′, ‘b1′, ‘b2′)というリストを返します。また、’ap’..’be’という式は、(‘ap’, ‘aq’, ‘ar’,'as’, ‘at’, ‘au’, ‘av’, ‘aw’, ‘ax’, ‘ay’, ‘az’, ‘ba’, ‘bb’, ‘bc’,'bd’, ‘be’)というリストを返すのです。
 後者の方ですが、どうなっているのか分かりますか?
 これは、’ap’という文字列のそれぞれの文字を数字のケタのように見立てると分かりやすいです。下の「ケタ」の’p'が’q'、’r'、’s'と順番に’z'まで「増えて」いったら、次に「ケタ上がり」して’ba’となり、さらに下の「ケタ」が’b'、’c'、’d'という具合に「増加」していくわけです。
 ところで、’a7′..’b3′は、(‘a7′, ‘a8′, ‘a9′, ‘b0′, ‘b1′, ‘b2′, ‘b3′)となりますが、’0p’..’1c’は、(’0p’, ’0q’, ’0r’, ’0s’, ’0t’, ’0u’, ’0v’,’0w’, ’0x’, ’0y’, ’0z’, ’1a’, ’1b’, ’1c’)というリストには「なりません」。
 まあ、「どんな組み合わせならうまく行くのか」などと考えだすと、キリがありませんが、問題のあるケースではPerlが文句を言ってくれるので、興味があったらいろいろとご自分で実験してみてください。
 さて、そんなわけで範囲演算子を使うと、数値に限らず文字を含んだ連続した値を出力することができるので、生成したリストをさらに整形して出力することで、いろいろ面白いことができるのです。
 たとえば以下は私の昔書いたソースの断片です。

const static UTF16TextChar upperTable[] = {
    10004, 10005, 10006, 10007, 10008, 10009, 10010, 10011, 10012,
    10013, 10014, 10015, 10016, 10017, 10018, 10019, 10020, 10021,
    10022, 10023, 10024, 10025, 10026, 10027, 10028, 10029, 10030,
    10031, 10032, 10033, 10034,
};

 私は比較的キーボードの操作に長けている方だと思いますが、さすがにこのようなテーブルを書く時に、中のデータをいちいち手打ちしているのは面倒くさい。こんな時はMacPerlをサッと立ち上げ、

print join ', ', 10004..10034;

というようなコードを書いて、「コマンド+シフト+Rで実行!」とやります。
 すぐに出力ウインドウにすぐにカンマ区切りの数値のリストが表示されるので、それをソースエディタにコピーして、ちょっと整形してやれば「一丁上がり!」というわけです。
 この辺は、いちいちプロジェクトを起こす必要も、コンパイルする必要もないPerlの気楽なところだと思っています。

ニュース・解説

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

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

【開発環境】

この原稿を書いている時点では、まだサンフランシスコ Expo(1/10から)は開催されていません。毎年Apple社の新製品の発表はこのExpoから始まるのですが、今年はその前に新型Xserve G5やXsanが発表されました。「それほどJobsが基調講演で発表する新製品が多いのか?」と、勘ぐってしまうわけですが(笑)、確かにMacintosh関連のWebサイトに上がる「新製品の噂」は例年になく多いようです。その中で一番注目されているのが、モニターが外付け可能な(Headless)iMac(eMac?)が登場すると言う噂です。Apple社は、過去にもそうしたタイプのデスクトップマシンとして「PowerMac G4 Cube」を発表したことがありました。しかし、価格や電源スイッチの不調、本体の傷(ではなかったのだが…)の問題で出鼻をくじかれ、ヒットさせることができませんでした。

しかし、今回はiPodを購入した大量のWindowsマシンユーザが存在しますので、もし彼らがMacintoshに興味を持っているとすれば、Headless iMacを普及させるチャンスはCubeの時代より大きいでしょう。ほとんどのWindowsユーザはモニターを所有しているわけですから、Macintoshへの切り替えコストはモニターの価格分だけ低くて済むわけです。つまり、現状のiMacを購入するより割安に感じるわけですね。また、教育やビジネス分野へ売り込む場合でも、既存モニターの再利用やApple製ではない低価格モニター(Appleも発表するのかも?)の選択が可能となりますので、本体価格が低ければ($499という噂あり)販売戦略も立てやすいと思われます。

さて、この噂は本当になっているでしょうか? もし噂通りの値段でHeadless iMacが登場したとすれば、複数台導入してXgridを用いた分散コンピューティングを含め、様々な目的のサーバ&クライアント実験に活用してみたいと考えています(笑)。

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

前回から1月7日の期間中、Apple社のDocumentationサイトには新規ドキュメントがひとつも登録されませんでしたが、その代わりに、デベロッパ向けの解説が3つ登録されています。「Developing 64-bit Applications」は、Mac OS X 10.4(Tiger)から開発可能となる64Bitアドレッシング・アプリケーションについての解説です。しかし、GUIを使い大容量データ(4G byte以上)を直接操作するようなアプリケーションの開発は、もう少し待たなければいけないようです(残念)。

「OpenAL for Mac OS X FAQ」

http://developer.apple.com/audio/openal.html

「Delicious Library Takes Advantage of Cocoa Bindings」(読み物)

http://developer.apple.com/business/macmarket/deliciouslibrary.html

「Tiger Developer Overview Series: Developing 64-bit Applications」(読み物)

http://developer.apple.com/macosx/tiger/64bit.html

前回から1月7日の期間中、新規のテクニカルノートとテクニカルQ&Aはひとつも登録されませんでした。担当メンバーはクリスマス休暇中だと思われます(笑)。

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

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

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

前回から1月7日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが2つ登録されました。Finderのカスタムアイコンの取り扱いについて勉強したい方は「SetCustomIcon」を参照してください。

「SetCustomIcon」(Icon関連)
「Audio Unit Effect Templates」(Core Audio関連)

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

【デベロップメント SDK】

前回から1月7日の期間中、Apple社のSDKサイトには新しいSDKがひとつだけ登録されました。Mac OS X 10.3.7の発表に合わせた「Kernel Debug Kit」の最新バージョンです。

「Kernel Debug Kit 10.3.7」

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

また、同時にMac OS X 10.3.7に対応した「Darwin 7.7 Source Code」の配布も開始されています。それから、CHUDの最新バージョン4.0.2が登録されました。すでにCHUDを利用されている方は、CHUD Updaterが知らせてくれるでしょう。

http://www.opensource.apple.com/darwinsource/10.3.7/

「CHUD(Computer Hardware Understanding Development Tools )4.0.2」

http://developer.apple.com/tools/performance/

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

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