MOSA Multi-OS Software Artists

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

プログラマーに興味がある方なら誰でも入会いただけます。
MOSA Multi-OS Software Artists
===SINCE 1995===

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

MOSADenバックナンバー 2005年1月発行分

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

    2005-01-25

    目次

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

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。定番オブジェクト解説の三回目は「ブロック」です。

     ブロック(a BlockContext)は手続きをオブジェクトとして取り扱えるようにしたものです。制御構造構文を持たないSmalltalk言語では、苦肉の策…というわけではないのですが、ブロックをパラメータに添えたメッセージ送信を行なうことで、制御構造を実現します。

    1 < 2 ifTrue: [3 + 4] ifFalse: [5 - 6] "=> 7 ”

     特別な制御構造を持たず、ブロックとメソッド(関数)の組み合わせで同様の機能を提供するということは、Smalltalk言語においては、ユーザーがその必要に応じて、自由に制御構造を創造し言語機能を拡張できることを意味します。

     ブロックは、通常の処理を大括弧「[ ]」で括ることで表現できます。

    3 + 4 “=> 7 ”
    [3 + 4] “=> a BlockContext ”

     通常のオブジェクトと同様に、メッセージのレシーバになったり、変数に束縛(代入)したり、パラメータ(引数)として渡したりできます。制御構造的なしくみでは、最後の性質を利用しているわけです。

    | block |
    block _ [3 + 4].
    World findATranscript: nil.   "トランスクリプト呼び出し"
    Transcript
       cr; show: 7 = block;       "=> false        "
       cr; show: block = block;   "=> true         "
       cr; show: block class      "=> BlockContext "

     処理を実行するためには改めてメッセージ「value」を送る必要があります。

    [3 + 4] value “=> 7 ”

     関数のように引数(パラメータ)を持たせることも可能です。パラメータを束縛する変数を「ブロック変数」と呼び、ブロック表現の先頭に列挙して宣言します。たとえば、パラメータを二乗して返すブロックは、次のように表現します。

    [:x | x * x]

     ブロック変数を宣言するとき、その頭にはコロン「:」を付けます【註1】。ブロック変数の宣言が終わったら「|」を置いて、ブロック本体の処理と区別します。ブロック変数が複数あるときは、スペースで区切って列挙します。

    [:x :y | x + y]

     処理を実行するときは「value」ではなく「value: arg」や「value: arg1 value: arg2」を使います。なお、ブロックの持つブロック変数の数と、評価時に与えるパラメータの数は一致していなければいけません。

    [:x | x * x] value: 3               "=> 9 "
    [:x :y | x + y] value: 3 value: 4   "=> 7 "
    [:x :y | x + y] value: 3
       "=> Error: This block requires 2 arguments. "

     #value:value:value:value:、つまりパラメータが四つのブロック向けのものまで用意されていますが、追いつかないときは、#valueWithArguments:でパラメータを配列に収めた状態で渡すこともできます。

    [:x :y | x + y] valueWithArguments: #(3 4) “=> 7 ”

     余談ですが、パラメータの数を動的(実行時)に知りたいときは、メッセージ「numArgs」を送ればブロック自身が答えてくれます。

    [3 + 4] numArgs “=> 0 ”
    [:x | x * x] numArgs “=> 1 ”
    [:x :y | x + y] numArgs “=> 2 ”

     ブロックは無名の関数、あるいは、どのクラスにも属さない無名のメソッドのように考えると理解しやすいことがあります。LISPに通じておられるかたは「ラムダ式に相当する」と言えば、ピンと来るはずです。【註2】

    [:x :y | x + y]
    (lambda (x y) (+ x y))

    註1:このコロンは、メソッド定義におけるメッセージパターン(一行目)において、キーワードがない状態を想定してその書式を模したものだと言われています。実際、こうした書き方はあまり推奨されていませんが、メソッド定義のメッセージパターンと同じように書くこと、つまり、ブロック変数とコロンの間にスペースを入れることも許されています。

    [:x :y | x + y] ” OK ”
    [: x : y | x + y] ” OK ”
    [: x: y | x + y] ” NG ”

    註2:ただし、Squeakは古典的なSmalltalkシステムであるため、ブロックがきちんとしたクロージャになっていません(ブロック内に独自のテンポラリ変数が持てず、テンポラリ変数を定義しても外部から自由にアクセスできてしまう。つまり“クローズ”してしない)。したがって、再帰や(疑似)並列処理には使えなかったり、使えても、いろいろと注意する必要があります。なお、最新のSmalltalkであるVisualWorksやANSI準拠のSmalltalk言語処理系では、この点は改良されていて、ブロックはクロージャとして問題なく使用できます。

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

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

     ならば代案を出せと言われるとオレとて困ってしまうのだが、NSApplicationというクラスはあんまり名前がよろしくないと常々思っている。とにかく誤解されやすい名前なのである。
     以前、オブジェクト指向プログラミングについて解説した際に、一つの「アプリケーション・プログラム」を人体に喩え、その構成要素であるヒジ、ヒザ、眼球、そして懐かしいランゲルハンス島などをそれぞれ独自の機能/メソッドを内包するクラスになぞらえて説明した。……いや、覚えていないヒトもいるだろうけどしたんだよ。
     で、NSApplicationというクラスの問題は、上の喩えをまんま食らってこのクラスがヒジやヒザや眼球やランゲルハンス島をその構成要素として抱え込んだ「アプリケーション・プログラム」のヒナ型だと理解しちゃうヒトがいることなんである。
     ……言い方が難しいかな。具体例を出すと、あなたが例えば「MOSAEdit」とかいう名前のテキストエディタをプログラミングしたとする。するとオブジェクト指向プログラミング初心者は、その「MOSAEdit」というアプリケーション・プログラム全体が、包括的にNSApplicationというクラスのインスタンスである、と思ってしまいがちなんである。で、そう考えるといろいろなことがワカリにくくなっちゃうんだよ。

     基本から行こう。XcodeでCocoaアプリケーションのプロジェクトを作ると、ファイル「main.c」の中身はこんな風になってる。

      int main( int argc, const char* argv[] ) {
    
          return NSApplicationMain( argc, argv );
      }
    


     この「NSApplicationMain() というCの関数(気をつけて、これは単なるCの関数である)は次のことを行なう。

     1. NSApplication クラスのインスタンス(グローバル変数のNSAppとしてアプリケーション内のどこからでも参照できる)を生成する。
     2. アプリケーションのメインNibファイルをロードする(どれがメインNibファイルかは「info.plist」に定義されている)。
     3. 1で作ったインスタンスに「run」メッセージを送って「run loop」をスタートさせる。

     注意して欲しいのは1と2のトコ。つまり1でNSApplicationのインスタンスが生成されても、その中にNibファイルで定義されているウィンドウとかメニューとかのインスタンスは含まれてないのである。
     それではNSApplicationとはなんなのだろうか。……比喩としてはちと苦しいんだが、人体で言えばそれは「感覚器」と「神経系」を合わせたようなモノである。上の3の「run」メッセージを受け取ると、NSApplicationのインスタンスは「run loop」を開始する。具体的には各種入力ソースをポーリングしてまわり、なにか処理する必要のある事案が発生したらそれを処理すべきオブジェクトにその案件を渡す。受け取ったオブジェクトがその案件を処理することで、初めてそのアプリケーション・プログラムは期待される「機能」を全うできる。NSApplicationはアプリケーション・プログラムの「受付窓口」みたいなものと言えば解りやすいだろうか。

     では次回から、NSApplicationの具体的な使い方を見て行こう。
    (2005_01_19)

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

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

     こんにちは、高橋真人です。
     さて、前回の最後で範囲演算子を使ってプログラムのパーツ作りをしているということをお話ししましたが、さすがにあの程度の単純な例だけではあまり活用の範囲は広くないと思いますので、活用範囲を広げるためのヒントをいくつかお伝えします。
     私がこのようなパーツ作りにPerlを利用するケースの多くはテーブル処理のためということがほとんどです。極めて単純な

    char table[] = “ABCDEFGHIJKLMNOPQRSTUVWXYZ”;

    なんていうものを作る場合だったら、手で打ってしまえばいいのですが、ASCIIの可視文字をコード順に並べたテーブルだとか、アルファベットの大文字小文字と数字という、ANSI Cのisalnum()に渡すと真になる値を羅列したテーブルなんてのも、コードで生成すれば手で打つよりも正確だったりするわけです。
     まずASCIIの可視文字をコード順に、という件ですが、そもそも可視文字の先頭がスペースで最後が~(チルダ)だということが分かっているならば、

    print ‘ ‘..’~';

    とやればいいように思われます。しかし、残念ながらこのコードは機能しません。理由に関しては正確なところは分からないのですが、PerlではCとは違って文字定数という概念はなく、従って文字列を数字として解釈はしないようです。
     それに、ASCIIの可視文字範囲の頭と終わりのコードを覚えていなかった場合、いちいちどこかからASCII表を引っ張りだして調べていたりしたら、何のためにラクをしようとしているのか分からないので、もっとお手軽な方法で切り抜けます。
     まず、以下のようなコードを書きます。

    for (0..127) {
         print chr;
    }
    


     これによって、ASCIIコードの$00から$7Fまでの文字が連続して表示されます。もちろん中には不可視文字も含まれていますから、表示は一部乱れます。
     コードの解説は後に回して、次に出力された結果を見て、最初の文字を見つけます。!が先頭のように見えますが、その一つ前が半角スペースになります。末尾の方はすぐに分かりますね。
     この結果を受けて最後に以下のようなコードを書きます。

    for (ord ' ' .. ord '~') {
         print chr;
    }
    


     これで完了です。ASCIIの可視文字がコード順に得られました。
     ではこのコードを解説しましょう。
     forというのはCでもおなじみのループのための制御構造ですが、Perlでは、Cにおけるforと同じ使い方のほかにforeachと等価にも使うことが可能です。
    foreachというのは、

    foreach $item (@list) {
         ...
    }

    といった形で使われる構文で、@listの中の要素を順に$itemの中に入れて、要素の数だけループをするというものです。AppleScriptをご存知の方でしたら、

    repeat with theItem in theList

    という構文と同じだと考えていただければよいでしょう。
     ただ、Perlの場合、foreachの直後の$itemの部分が省略された場合、配列の要素は$_という変数に入れられることになります。$_というのはPerlでは極めて頻繁に使われる特殊な変数で、演算子の多くでは引数を省略した場合に暗黙に$_という変数が与えられていると解釈します。よって、ループ内のprint chr;というコードでは、chrという「引数のコードに対応する文字を返す」演算子に対して、暗黙に$_が与えられているということになります。
     結果、先のループにおいては(0..127)というリストの要素が順番に$_という変数を通してprint chr;に渡されているのです。
     後半のループで使用したordというのは、引数として与えられた文字列の先頭の文字(バイト)のコード値を返す演算子です。

     次に、2番目に挙げた「アルファベットの大文字、小文字そして数字」という文字列の作成ですが、これは考えてみたらfor構文は必要なかったですね。

    print ‘A’..’Z', ‘a’..’z', ’0′..’9′;

     これだけでOKです。範囲演算子を使った範囲リストをさらにカンマでつなぐところがポイントです。リストはスカラー変数をカッコでつないだものですから、リストとリストをカンマでつないだものも、またリストとなります。

     さて、次回は今回のfor構文をさらに発展させていく方法についてお話しすることにします。

    ニュース・解説

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

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

    【開発環境】

    サンフランシスコ Expoで行われた基調講演では、噂通りの新製品が大量に発表されました(リアルタイムのストリーミング放送がなかったのは残念でしたが…)。しかし、私が一番期待していた新型のPowerBook G4だけは、とうとう最後まで発表されませんでした(涙)。近々登場する予定はあるのでしょうか? 一番注目されていたモニターが外付け可能なマシン(Mac mini)もちゃんと発表されました。「WindowsユーザにMacintoshを購入してもらう」と言う戦略を担う大事なニューフェースですが、こうした製品が出せるようになったのも、Apple社にiPodという「もう一本の柱」が出来たからでしょう。

    以前のApple社であれば、商品構成をやたらに増やす余裕がありませんでしたから、こうした企画自体がボツになっていたと想像されます。ところで、サブノート大好きの日本のユーザからは、「Mac miniが出せたのだから、PowerBook miniも出して欲しい!」という声が聞こえてきそうです。昔なら「日本だけでしか売れないマシンは×」(過去の苦い経験から…)の一声で企画はボツでしょうが、iPodで潤っている今であれば何とかなるかもしれません。ほんのちょっとだけ期待したいと思います(笑)。

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

    前回から1月21日の期間中、Apple社のDocumentationサイトには新規ドキュメントが9つ登録されました。このうち、「Writing Drivers for Mass Storage Devices」「Transitioning to Quartz 2D」「Multithreading Programming Topics」の3つのドキュメントには大幅な改訂がなされていますが、それ以外はマイナーな改訂です。また、デベロッパ向けに「Automator」と「X11」を解説した2つの読み物が登録されています。

    「Accessing Hardware From Applications」(PDFあり)
    「Enterprise Objects」(PDFあり)
    「Moving Projects From CodeWarrior to Xcod」(PDFあり)
    「Multithreading Programming Topics」(PDFあり)
    「Run Loops」
    「Supporting Unicode Input」(PDFあり)
    「Text Input Management」(PDFあり)
    「Transitioning to Quartz 2D」(PDFあり)
    「Writing Drivers for Mass Storage Devices」(PDFあり)

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

    「Configuring and Running X11 Applications on Mac OS X」(読み物)

    http://developer.apple.com/darwin/runningx11.html

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

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

    前回から1月21日の期間中、新規のテクニカルノートはひとつも登録されませんでしたが、新規テクニカルQ&Aの方は4つ登録されました。QA1405とQA1398については、前号の新居さんの解説も参考にしてください。

    QA1396「Creating color spaces that ensure color matching」
    QA1405「Variable arguments in Objective-C methods」
    QA1398「Mach Absolute Time Units」
    QA1403「Sequence Grabber-Determining the capture resolution of an IIDC device」

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

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

    前回から1月21日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードがひとつだけ登録されました。「HIObjectThreadController」は、開始したスレッドの状況を表示するためのユーザインターフェースをHIObjectとして実装するサンプルアプリケーションです。以前に登録されていた物のマイナーな改訂版となっています。

    「HIObjectThreadController 」(HIObject関連)

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

    【デベロップメント SDK】

    前回から1月21日の期間中、Apple社のSDKサイトには新しいSDKがひとつも登録されませんでした。

    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.

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

    2005-01-18

    目次

    • SqueakではじめるSmalltalk入門  第26回  鷲見 正人
    • 小池邦人の「Carbon API 徒然草」
    • 「Behind the WebObjects」    第35回  田畑 英和
    • ニュース・解説

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。前回に引き続き、リテラル式、あるいはそれに準じる表現により生成できる定番のオブジェクトたちをとりあげ、簡単な解説を加えてゆきましょう。

    ▼真偽値、未定義値
     true、false、nilは他のリテラルとはちょっと違った扱いになっています。その実体は同名の擬変数に束縛されたTrue、False、UndefinedObject(“Nil”ではないのでお間違えなく!)の唯一のインスタンス…です。擬変数というのは、参照はできても代入(束縛のやりなおし)のできない特殊な変数のことをいいます。リテラルと同様に、true、false、nilと書いて直接表現できますが、それ自体は変数(ある種グローバル変数的なもの)なので、配列のリテラル式の要素になれないなどの制約もあります。たとえば、リテラルだと思って、それらを要素にとる配列を作るつもりで次のように記述してしまうと…

    #(true false nil) “=> #(#true #false #nil) ”

     このようにtrue、false、nilは、それぞれ「#」を省略したシンボルリテラルだと解釈されてしまいます。こうした事態を避けるためには、配列のリテラル式ではなく、前回紹介したカーリーブレイス表現を用います。カーリーブレイスでは要素はスペースではなく、ピリオドで区切ります。

    {true. false. nil} “=> #(true false nil) ”

     なお、この出力結果からもお分かりいただけるように、Smalltalkシステムが返すオブジェクトの文字列表現において、リテラル式(あるいはメッセージ式)を模したものの中には、式として評価は可能でも(つまりSmalltalk言語として文法的に誤りがなくとも)同じオブジェクトを返すことができないものも含まれます。注意してください。

    ▼分数
     よく使うわけではないのですが、あることが分かっていると便利、あるいは逆に、思わぬ所に登場して悪さをするオブジェクトに、分数(a Fraction)というものがあります。これはリテラル式ではないのですが「n / m」という直感的で簡潔なメッセージ式で作ることができます。

    3 / 4 “=> (3/4) ”
    2 / 4 “=> (1/2) ”
    (3 / 4) + (5 / 6) “=> (19/12) ”

     電卓のような結果を得たければ、レシーバかパラメータのどちらかに「.0」を付して、浮動小数点少数(a Float)リテラルとして記述しなければいけません。

    3.0 / 4 “=> 0.75 ”
    3 / 4.0 “=> 0.75 ”

     または、レシーバかパラメータ、もしくは、結果を明示的に浮動小数点少数に変換する(より正確には、変換したオブジェクトを返す)メッセージ「asFloat」を送信します。

    3 asFloat / 4 “=> 0.75 ”
    3 / 4 asFloat “=> 0.75 ”
    (3 / 4) asFloat “=> 0.75 ”

     C言語の二項演算子のように使いたければ、結果に対し改めて「truncated」などの“まるめ処理”のためメッセージを送信する必要があります。

    (3 / 4) truncated “=> 0 ” “整数部を抽出 ”
    (13 / 4) truncated “=> 3 ”
    (-3 / 4) truncated “=> 0 ”
    (-3 / 4) floor “=> -1 ” “マイナス側にまるめる”
    (3 / 4) ceiling “=> 1 ” “プラス側にまるめる ”

     こうした“まるめ処理”のためのメソッドは、Numberのサブクラス群の「truncation and round off」プロトコルにまとめられているので興味があったらブラウザで覗いてみてください。

    ▼ポイント
     座標やベクトルを表わすポイント(a Point)も、リテラルではありませんが、それに準ずる簡単なメッセージ式で表わすことができるオブジェクトです。ある数値に対し、パラメータとして別の数値を添えた「@ aNumber」というメッセージを送ることで生成できます。

    3 @ 4 “=> 3@4 ”
    (3 @ 4) + (5 @ 6) “=> 8@10 ”

     きちんとした二次元座標、あるいは、二次元ベクトルを模したオブジェクトというわけではないので、こんな計算もできてしまったりもします。

    (3 @ 4) * (5 @ 6) “=> 15@24 ”
    #(3 4) * #(5 6) “=> #(15 24) ”

     このように特に演算に関してポイントは、座標やベクトルというよりは、要素が二つの配列とよく似た振る舞いをすることが多いようです。

     リテラル表現とはちょっと趣を異にしますが、ポイントはクラス「Point」にメッセージ「fromUser」を送信することで、続く画面のクリック操作でインスタンスを得ることも可能です。

    Point fromUser “=> (クリック位置の座標)”

     なお、この「fromUser」というメッセージは、Point以外にもRectangle(矩形範囲)、Form(ビットマップ画像)、Color(色情報)、StrikeFont(テキストのフォント情報)についても同様に使用できます。たとえば、

    Form fromUser asMorph openInHand

    などとすることで、選択して指定した画面の一部を基本図形オブジェクトとして簡単に取り出せます。

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

    小池邦人の「Carbon API 徒然草」(2005/01/14)

    Navigation Service APIの活用(その2)

    今回は、navMyPutFile()ルーチンから呼ばれているNavPutFile()を詳しく解説します。それに加え、Carbon Frameworkで使われているファイル保存場所を認識するため(ファイルアクセス用)の「4つの仕組み」を紹介したいと思います。

    以下が、ドキュメント保存用の「ファイル名入力ダイアログ」を表示するnavMyPutFile()ルーチンです。ファイルメニューから「保存…」を選択した時か、まだ保存していないカタログウィンドウを閉じようとした時に実行されます。

    #define   MY_SIG   'MosA'   // アプリケーションのシグネイチャ
    #define   MY_DOC   'MosD'   // ドキュメントのファイルタイプ
    
    short navMyPutFile( Str255 title,FSSpec *fsc )
    {
        NavReplyRecord      reply;
        DescType            rtype;
        short               ret;
        AEKeyword           key;
        Size                len;
        NavDialogOptions    opt;
    
        NavGetDefaultDialogOptions( &opt );     // ダイアログのオプションを初期化
        opt.preferenceKey=MY_SIG;               // 使用形態を識別するための値を設定
        opt.dialogOptionFlags+=kNavNoTypePopup; // 種類ポップアップメニューを外す
        copyString( title,opt.savedFileName );  // ディフォルトファイル名を設定する
        GetIndString( opt.clientName,128,1 );   // クライアント名をリソースから得る
    
        ret=NavPutFile( NULL,&reply,&opt,NULL,MY_DOC,MY_SIG,NULL ); //ダイアログ表示
    
        if( reply.validRecord && ret==0 ) // OKボタンが押された場合...
        {
            ret=AEGetNthPtr( &(reply.selection),1,typeFSS,&key,&rtype,(Ptr)fsc,
                                                      (long)sizeof(FSSpec),&len );
                                         // 入力したファイル名のFSSpecを得る
            NavDisposeReply( &reply );   // NavReplyRecordを削除する
        }
        return( ret ); // ret==noErrであればOKボタンが押されたことになる
    }
    


    NavPutFile()で表示されるダイアログは、前回解説したNavAskSaveChanges()と同様に、NavDialogOptions構造体の内容を操作することで色々なオプション機能を追加できます。まずはNavGetDefaultDialogOptions()を実行し、NavDialogOptions構造体の内容を初期化します。次に、preferenceKeyに使用形態に応じた識別子となる値(任意の値)を代入します。この操作により、Navigation Service側は、初期表示されるファイル階層などの情報を識別子ごとに保持します(次回利用する時に前回と同じ階層を表示する)。本サンプルでは、dialogOptionFlagsのkNavNoTypePopupビットを立てることで、ダイアログに配置される「ファイル種類選択用ポップアップメニュー」を使用できないように制限しています。savedFileNameには、オープン時に入力カラムに表示されるディフォルトファイル名を、clientNameにはサービスを利用するアプリケーション名をセットします。

    NavDialogOptionsを設定し終わりNavPutFile()を実行すると、画面にファイル名入力ダイアログがオープンされます。ユーザによりファイル名が入力され、OKボタンがクリックされた場合にのみ、AEGetNthPtr()で保存先ファイルのFSSpec構造体を得ることができます。Mac OS X 10.3環境では、表示されたファイル名入力ダイアログはマウスドラッグにより移動可能(Movable Modeless Dialog)なのですが、10.2環境では移動不可な状態となります。この現象を回避するには、以下のようにダミーのeventProcを定義しておき、それをNavPutFile()の4番目の引数として代入します。これにより、どちらのバージョン環境でもダイアログを移動することが可能となります。

    pascal void navEventProc( NavEventCallbackMessage sel,
                                         NavCBRecPtr parm,NavCallBackUserData ud )
    {
    }
    
    ret=NavPutFile( NULL,&reply,&opt,navEventProc,MY_DOC,MY_SIG,NULL );
    


    本アプリケーションでは、上記のnavMyPutFile()ルーチンを含め、ファイルアクセス用としてFSSpec構造体を採用しています。FSSpecを用いるのは、Mac OS 9時代から使われている手頃な方法ですが、Carbon Frameworkには、ファイルアクセス用としてAliasHandle、FSRef、CFURLRefという別の定義も用意されています。Mac OS X環境でのファイルアクセスにおいて、32文字より長いファイル名やUnicodeファイル名への対応が必須であるならば、FSSpecの代わりにFSRefを使う必要があります。AliasHandleは、ファイル保存場所を追跡するような処理に活用すると大変便利です。また、Mac OS Xから導入されたQuartz 2DやCore Foundationに含まれる多くのAPIは、ファイルアクセス時にCFURLRefを使う場合が多いようです。

    アプリケーションによっては、そのドキュメント内に処理のターゲットとなるファイルの保存場所情報を埋め込みたい場合があります。例えば、データベースがアサインしているファイルとか、ワープロにリンクされている画像の保存場所情報などです。4つの定義を用いたファイルアクセスにはそれぞれに特徴、利点、欠点があり、選択を間違えると後から色々な不都合が生じ、状況によってはファイルが認識できなくなるケースに遭遇することもあります。ちなみに、この4つのファイルアクセス用パラメータは相互に変換することが可能です。まず最初に、その方法のいくつかを紹介しておきたいと思います。

    以下はFSSpecを作成する例です。FindFolder()によりHome/Library/Preferencesフォルダのボリュームリファレンス番号(vref)とディレクトリID(did)を得ています。これらをアクセスしたいファイル名(fname)と一緒にFSMakeFSSpec()に渡すことにより、目的のFSSpec構造体を作成します。

    Str255   fname
    short    vref;
    FSSpec   fsc;
    long     did;
    
    FindFolder(kOnSystemDisk,kPreferencesFolderType,kCreateFolder,&vref,&did );
    FSMakeFSSpec( vref,did,fname,&fsc );

    次は、同様にFSFindFolder()を使いPreferencesフォルダのFSRefを得る方法です。

    FSRef    fsref;
    
    FSFindFolder( kOnSystemDisk,kPreferencesFolderType,kCreateFolder,&fref );

    FSSpecからFSRefを得るのにはFSpMakeFSRef()を利用します。FSSpecはアサイン先のファイルが存在していなくても定義できますが、FSRefの方はファイルがファイルが存在していないと定義できませんので注意しましょう。もし存在しないファイルのFSSpecをFSpMakeFSRef()に渡すとエラーが返ります。この特徴をうまく利用すると、FSpMakeFSRef()はファイルの存在を判断する処理に使えます。逆にFSRefからFSSpecを得るのには、FSGetCatalogInfo()を利用します。

    FSpMakeFSRef( &fsc,&fsref );
    FSGetCatalogInfo( &fsref,kFSCatInfoGettableInfo,NULL,NULL,&fsc,NULL );

    次にFSSpecからAliasHandleを作成する場合です。この作業にはNewAlias()を用い、作成したAliasHandleからFSSpecを導くにはResolveAlias()を用います。この処理のFSRef版APIはFSNewAlias()とFSResolveAlias()です。

    Boolean      chg=0;
    AliasHandle  ahd;
    FSSpec       fsc;
    
    NewAlias( NULL,&fsc,&ahd );
    ResolveAlias( NULL,ahd,&fsc,&chg );

    最後にCFURLCreateFromFSRef()を使い、FSRefからCFURLRefを得る方法を紹介します。その逆はCFURLGetFSRef()で実現します。

    FSRef        fsref;
    CFURLRef     url;
    
    url=CFURLCreateFromFSRef( NULL,&fsref );
    CFURLGetFSRef( url,&fsref );

    Apple社には、ファイルアクセスはCFURLRefを用いる方法に統一したいという雰囲気が漂っているのですが、なにせまだ多くのファイル関連APIがFSSpecやFSRefに依存している状態でして(FSSpec依存はかなり減った)早期実現は不可能だと思われます。ちなみに、Mac OS Xが登場したばかりのころ、CFURLRefの使用のみを推薦し、FSSpecやFSRefの使用を否定するテックノート(Technical Note)がデベロッパーサイトに登録されたことがありました。しかし、多くの開発者の「時期尚早である!」という大反論に見舞われ、あえなく引っ込められた経緯があります。だいたい、当時のQuickTime APIはFSSpecしか受け取らなかったわけですし…いったい何を考えていたのやら(笑)。

    次回は、FSSpec、AliasHandle、FSRef、CFURLRefを用いたファイルアクセスの特徴や仕組み、利点や欠点について、もう少し詳しく解説したいと思います。そして、その例題としてFSSpecの代わりにFSRefを得るシートウィンドウ(Sheet Window)タイプのファイル名入力ダイアログ(本サンプルでは未使用)を紹介したいと思います。

    つづく

    「Behind the WebObjects」  第35回  田畑 英和

     Macworldでは続々とAppleの新製品が発表されましたが、WebObjectsはあいかわらずニュースのないのが残念なところです。運用のことを考えますとサーバ系の製品は頻繁にアップデートされても逆に手間が増えてしまいますが、それでも開発ツールなどはまだまだ改良の余地があるはずですので、今年は明るいニュースに期待したいところです。
     さて、今年初の連載はそんな期待も込めつつ、これからWOを始めるデベロッパー向けの情報をまとめてみました。

    まずは開発環境

     正式にサポートされている開発環境はMacかWinになります。WOの実行環境はJavaですので、技術的にはJava環境があればどこでも動作するのですが、独自形式のファイルを扱う必要があったりしますので、Appleが提供している開発ツールを使うことになります。
     開発ツールはMac版とWin版がそれぞれ用意されていますが、完全に同じというわけではありません。開発の中心となるXcodeですが、Win版ではXcodeの前に使われていたProject Builderを使用することになります。もっともProject BuilderはMac OS Xが登場したときに大幅にバージョンアップされましたが、Win版のProject Builderは古いバージョンのままになっています。

     つまり開発環境としてはMac版のほうが進化しているということになりますが、最近はXcode/Project Builderの代わりにEclipse上での開発環境も整いつつあり、いったん使い出すと手放せない状態になるようです。
     WebObjectsのパッケージは1種類のみで、そこにMac版とWin版の開発ツールが両方入っています。Mac OS X ServerにもWebObjectsは付属していますが、こちらは運用環境しか付属していませんので、開発をおこなう場合は開発用のパッケージが必要になります。

    必要なもの

     WO以外の環境でWebアプリケーションの開発経験があるようでしたらおそらくHTMLやデータベースに関する知識は習得済みかと思いますが、そうでない場合は、Webアプリケーションで必須となるこれらの技術を学習していかねばなりません。またWOのプログラミング言語はJavaを採用していますので、Javaプログラミングに関する知識も必要になってきます。
     これらの技術をまだ習得できていない場合でも、WOを学びながら必要に応じて学習していけばよいでしょう。プロジェクトによっては少人数で使用する簡単なものから、Internet上で運用する大規模なものまで様々でしょうから、プロジェクトの規模によって求められるスキルも変わってくるかと思います。

     WOは価格が安いこともあり、小規模なプロジェクトでも導入しやすいですし、iTunes Music Storeのような大規模なサービスでも活用されている実績があります。ですので、最初は小規模なものから始めて、あとから徐々に規模を拡大していくようなことも可能です。

    データベース

     Webアプリケーションを開発するうえで、様々な技術が必要になってきますが、なかでもデータベースに関するものはほとんどの場合で不可欠な技術となります。データベースといいましても実際には色々な種類がありますが、WOが標準でサポートしているのはリレーショナルデータベースになります。リレーショナルデータベースにアクセスするにはSQLという言語を用いますがWebObjectsではORマッパーという手法を用いることで、Java上でオブジェクトの操作をおこなうだけで、データを自動的にデータベースに格納することができます。
     これはオブジェクトの内容に応じて自動的にSQLが生成される仕組みが提供されているからなのですが、WOでデータベースアクセスをおこなうプログラミングをおこなう場合、SQLをコーディングする必要はありません。(*1)
     ですのでSQLをまったく知らなくともデータベースアクセスをおこなうWebアプリケーションを開発することはできるのですが、最適なSQLを発行するためのチューニングが必要になる場面があり、自動発行されたSQLの意味が分かる程度には最低限なっていたいところです。
     SQLの発行は自動的におこなわれても、データベースを格納するためのデータベースの設計は自分でおこなう必要がありますので、リレーショナルデータベースそのものに関する基本的な知識も必要になってきます。

    *1 必要があればSQLを直接コーディングすることもできます。

    まとめ

     簡単ではありますがWOで開発を始めるうえでの情報をまとめてみました。周囲にWOで開発をおこなっている開発者でもいないとなかなか情報を集めるだけでも大変かと思いますが、今年はできるかぎり実用的な情報をこの連載で発信していければと思います。それでは今年もよろしくお願いします。

    ニュース・解説

    今週の解説担当:新居 雅行

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃Kagiの決済登録機能を組み込むモジュールがクロスプラットフォームへ
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    オンラインでのシェアウエア料金決済やライセンス販売を行うKagiは、ソフトウエアにKagiでの決済機能を組み込むモジュールを開発して配布している。
    Kagi Registration Module(KRM)と呼ばれており、Cocoa、Carbon、REALbasic、Java版がすでにリリースされており、1月にはWindows版とPure Java版、さらに今後はPalm、Director、FileMaker、Revolution、SuperCard、FutureBASIC、Symbianといったプラットフォームに広げる。Cocoa版の組み込みサンプルアプリケーションも参照できるようになっているが、ボタンをクリックすると名前などに加えてクレジットカード番号などを入力するシートが出てきて、アプリケーションの中で購入や登録作業ができるようになっている。サンプルのアプリケーションでは日本語は出ないが、Cocoa向けのフレームワークには日本語の文字列も組み込まれている。

    Kagi Registration Module (KRM) Home Page
    http://www.kagi.com/KRM/

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃Objective-Cでの可変引数のメソッド
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Objective-Cでの可変引数のメソッドを定義する方法を解説した文書が掲載されている。こうしたメソッドは、「variadicメソッド」と呼ぶそうで、stdargの3セクション目をmanコマンドで見れば、va_startなどとして解説されている。サンプルプログラムとして、NSMutableArrayのカテゴリで、appendObjectsメソッドの引数を可変にする例が掲載されている。

    Technical Q&A:Variable arguments in Objective-C methods
    http://developer.apple.com/qa/qa2005/qa1405.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃正確な時間を得る方法
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    正確な時間を得るためにmach_absolute_timeを利用して時間を取得した場合の数値の単位についての質問に答えた文書が掲載されている。この時間値の単位はCPU依存するため、実際の時間を知るにはCoreServiceのAPIを使うのがいいとしている。もし、CoreServiceが使えない場合にはmach_absolute_timeを使う方法があると説明されている。それぞれのサンプルコードが掲載されている。
    Technical Q&A: Mach Absolute Time Units
    http://developer.apple.com/qa/qa2004/qa1398.html

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃エンジニアリングツールのMac OS Xネイティブ版がリリース
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    Excel Softwareは、ソフトウエアエンジニアリングツール「MacA&D OSX 1.0」をリリースした。Windows版やMac OS 9版は存在していたが、Mac OS Xネイティブバージョンがリリースされた。価格はシングルユーザ版の$1995から。MacA&Dは、UMLによるチャートなどの作成や要求分析、データベーススキーマの設計、ソースの生成などの機能を持つ。なお、同社からはUMLツールのQuickUMLもリリースされている。

    Excel Software
    http://www.excelsoftware.com/

    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ┃FileMaker 7のアカウント管理を行うツール
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    FileMaker 7向けのアカウント管理ツール「Account Manager 1.0」がFM.NEXUSからリリースされた。FileMaker 7よりデータベースのアカウントの形式が変わり、より細かく設定が可能になっているが、アカウントの管理の機能をより使いやすくするのがAccount Managerである。サーバにあるデータベースをブラウズして、それぞれのアクセス権やアカウントを参照したり、特定のアカウントのログを見るなどをウインドウの中でできるようになっている。5ユーザ版で$179からとなっており、ユーザ数やFSAおよび教育機関向けの割引も設定されている。ユーザ数の多いものは、スクリプトやレイアウト、あるいは全体的な修正が可能になっており、独自に設計変更ができることになる。

    Account Manager 1.0 for FileMaker 7
    http://fmnexus.com/accountmanager

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

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

  • 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.