MOSA Multi-OS Software Artists

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

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

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

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

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

    2006-01-31 

    目次

    • 「WebObjects Dev Report」    第37回  田畑 英和
    • 藤本裕之のプログラミング夜話 #84
    • 高橋真人の「プログラミング指南」  第82回
    • ニュース・解説                小池 邦人

    「WebObjects Dev Report」  第37回  田畑 英和

     さて今回はDirectAction内で使用しているEditingContextの扱いを改良してみたいと思います。前回紹介しましたDirectActionのbrowseAction()は次のようにEditingContextを使っていました。

    ・browseAction()
         EOEditingContext ec = new EOEditingContext();
         ec.lock();
         EOFetchSpecification.fetchSpecificationNamed(
                                        "PublicUsers", "MOSAUser");
         NSArray users = ec.objectsWithFetchSpecification(fetchSpec);
         ec.unlock();
    


     このようにコーディングした場合、browseAction()メソッドが呼び出されるたびにEOEditingContextをインスタンス化することになります。セッションを用いた処理の場合には、セッションが提供するデフォルトのEditingContextを使うことができますが、セッションを使用しない場合はEditingContextを明示的に用意する必要があります。
     生成したEditingContextをどこかで保持できれば、使い回すこともできるのですが、DirectActionクラスは呼び出されるたびにインスタンス化されるためDirectAction内で状態を保持することはできません。そこで、アプリケーション内からは常に共通して参照することのできるApplicationクラスを利用することにします。なお、この方法はWebObjectsのサンプルプロジェクト「Think Movies」を参考にしていますので、ぜひそちらのほうのコードもチェックしてみてください。

    まず、ApplicationクラスにEOEditingContextの変数を追加します。そしてその変数を取得するためのゲッターメソッドを追加します。EOEditingContextはApplicationクラスのコンストラクタでインスタンス化しておきます。関連するコードを抜き出しますと、Application.javaは次のようになります。

    ・EditingContextを提供するApplication.java
         public class Application extends WOApplication {
             private EOEditingContext editingContext;
    
             public Application() {
                 super();
    
                 editingContext = new EOEditingContext();
             }
    
            public EOEditingContext lockEC() {
                 editingContext.lock();
                 return editingContext;
             }
         }
    


     ゲッターメソッドのlockEC()ではあらかじめEditingContextをロックしてからreturnしています。ロックをした場合、アンロックの処理も必要になりますので、次のようなアンロック用のメソッドも用意しておきます。

    ・EditingContextアンロック用メソッド
         public void unlockEC() {
             editingContext.unlock();
         }
    


     それでは、Application.javaに用意したEditingContextを利用するように、DirectActionのメソッドを書き換えてみましょう。改良したコードは次のようになります。

    ・改良したbrowseAction()
         Application app = Application.myApplication();
         EOEditingContext ec = app.lockEC();
         EOFetchSpecification.fetchSpecificationNamed(
                                        "PublicUsers", "MOSAUser");
         NSArray users = ec.objectsWithFetchSpecification(fetchSpec);
         app.unlockEC();
    
    


     browseAction()でApplicationのインスタンスを取得するのに利用しているmyApplication()ですが、これはApplication.javaで次のようなメソッドを用意してあります。

        public static Application myApplication() {
              return (Application)Application.application();
         }
    


     これで毎回EditingContextを生成せずに、ApplicationのEditingContextを使い回すことができるようになったわけですが、最後にこの処理の問題点について考えてみたいと思います。
     まずEditingContextを共有していますので、大量のリクエストがあった場合に、一カ所に負荷が集中する可能性があります。時間のかかるFetch処理を実行した場合などは全体的なパフォーマンスに影響を及ぼすかもしれません。
     次に、データの追加/変更/削除をおこなうような場合、未保存の状態のEOが共有するEditingContext上に存在してしまうと他の処理に影響を与えてしまいます。
     こうなると毎回EditingContextを生成したほうが安全なのではないかということにもなるのですが、ようするに今回紹介した方法はあらゆる場合に有効な方法ではないということです。なんだか歯切れの悪いまとめになってしまいましたが、これで「ビジネスマッチングシステム」で使用しているDirectAction関連の処理については一通りの解説がおわりました。

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

     さて承前、Interface BuilderでNSWindowクラスに指定できる各種属性について探求するシリーズの第……何回目かである。そういうことが気になるムキのひとはすまぬが自分で数えてくだされ。

    前回まで注目していた「Released when closed」の下、「Hide on deactivate」はわかりやすい。読んで字のごとく、これがONならそのウィンドウはアプリケーションがバックグラウンドに回されると「隠される」わけだ。どんなものがそうかというと、例えば……といってiTunesとかiChatとかあれこれ触ってみたんだけどみつからない(笑)。フォントパネルとかはそうなんだけど、あれは使ってるアプリケーション自身が定義しているわけぢゃないしねぇ。
     ……で、探しまわったあげくようやく見つけた。iCalで出て来るアドレスパネルがそうである。断言はできないが、後述する「Utility window (Panel Only)」というのをチェックすると自動的にこれもチェックされることから、一般的にこの属性は、ツールやらデータやらを選択するためのユーティリティ・ウィンドウに与えられているようですな。……そういえばInterface Builderのインスペクタもそうなんだけど、あれはなんで消えるのかな。消えなくてもいいと思いませんか?

    さくさく次にいく。次のスイッチは「Visible at launch time」。これも読めばわかりますな。ONなら起動時に可視状態にされるというわけ。確かめたわけぢゃないけど、iTunesとかiPhotoなんかのメインウィンドウはこのスイッチがONになってんだろ。
     次の「Deferred」についてはNSWindowの説明を始めた最初だかに説明したので、それを読み返してもらうとして、さぁ次の「One shot」である。さぁこれはなんであろうか。NSWindowのリファレンスを参照すると「setOneShot:」というメソッドがあり、その解説はこうなっている。「レシーバー(これはNSWindowのインスタンスのこと)が管理するウィンドウ・デバイスに対し、そいつがスクリーン・リストから除外されたときに解放される(そして次に戻って来る時には新しく生成される)かどうか、を設定します」。
     ……なんのこっちゃ? 「Released when closed」とどう違うんや?
     確かにどちらもメモリがらみで紛らわしいように思えるんだけど、よく読むと全然違う。まず、このスイッチにしたがって解放されるのはレシーバーそのものではなくて「それが管理するウィンドウ・デバイス(これって何かというと、実はこれこそ我々が昔からウィンドウと読んでいたモノなんだが)」である。「Released when closed」の方はインスタンス自身だった。そしてその「解放」が起きるタイミングも、「スクリーン・リストから除外されたとき」、すなわち orderOut メッセージを受け取った時である。ここまでいいですか?
     これを指定できると何が嬉しいかというと……、映画「スウィング・ガールズ」に出てきた野球部の小僧ぢゃないけど世の中には二種類のウィンドウがあるわけだ(ついでに言うとあの小僧の物言いは「続・夕陽のガンマン」に出て来るイーライ・ウォラックの真似である)。さっきも出てきたiTunesのメイン・ウィンドウみたいにユーザがそのアプリケーションを使っている間ほとんどずっと開いているヤツと、同じくiTunesの例えば環境設定のウィンドウみたいに、下手するとセッション(この「セッション」はアプリケーションの起動から終了まで)中一度も開かないことだってあるってヤツ。で、後者のようなウィンドウに対してこのスイッチをONにしておけば、なにがしかのメモリの節約になる、と。……言ってることはわからんでもないが、それを「One Shot」の一言で合点はできないわな。ネーミングに問題ありだと思う。……もしかしてネイティブには「One Shot」と一言書けば、タチドコロにそういう意味合いが通じてしまうような文化的背景があるんだろうか?
    (2006_01_26)

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

    UNIXとしてのMac OS X

    〜Perlについて(28)〜

     こんにちは、高橋真人です。
     前回の説明でPerlスクリプトにコマンドラインから動的にファイルを与えることができるようになりました。以下のように書くことで、与えたファイルの中身をそのまま標準出力に出力するようになります。

    $file_path = shift;
    open IN, "$file_path" or die;
    
    while (<IN>) {
         chomp;
          print "$_?n";
    }

     実は、このスクリプトと等価の処理を以下のように書くことでも実現できます。

    while (<>) {
         chomp;
         print "$_?n";
    }
    


     「一体、ファイルをどうやって指定しているんだ?」と疑問を持たれるかもしれませんが、入力のための演算子である<>という記号は、間にファイルハンドルを入れればその中からデータを読み出しますが、カラ、つまり何も指定せずに使用した場合、コマンドラインでスクリプトの後に指定したファイル名を入力先として処理するのです。
     さらにこの場合、ファイルを複数指定することができます。つまり、以下のようなコマンドを指定すると、

    >perl test.pl abc.txt def.txt ghi.txt

    test.plというスクリプトは、abc.txt、def.txt、ghi.txtの内容を順に表示するのです。
     ちなみに、かつてのMacPerl(というか今でもClassic環境があれば動作させることは可能ですが)の場合、ドロップレット形式でスクリプトを保存すると、それがそのままファイルのドロップを受けるアプリケーションになってくれたため、例えば以下のようなスクリプトを書くだけで、テキストの内容をそのまま表示するものが作れました。

    while (<>) {
         print;
    }
    


     もちろん、実際にはこれだけで使い物になることはまずないので、ここからいろいろと手を加えて発展させていくことになるわけですが、テキストファイルを加工するドロップレットがとても気軽に作れたわけです。また、こういう仕様があったからこそ、私自身はPerlというスクリプト言語に割とすんなり入り込むことができたのではないかと思っています。
     余談ですが、2000年ごろのWWDCでBSDのセッションに参加したとき、スピーカーが「私が簡単なテキスト処理をやるならば、ターミナルを使ってすぐできますが、それを私のおばあちゃんにやらせるとなると話は別。そういう時には、チャチャッとスクリプトやコマンドをアプリケーションでくるんでドロップレットの形式にしてあげれば、おばあちゃんでも簡単に使えるようになりますね」という話をしました。
     そのセッションの最後のQ&Aのコーナーで、とある人が「Perlは標準で付いているし、ドロップレットも簡単にできるのならば、もうMacPerlの役割は終わったのか?」という質問をすると、会場の一部がちょっとざわつきました。しばらくして周りの人たちに促されて若干顔を赤らめながら立ち上がった男性は、Matthias Neeracherという、MacPerlの作者その人でした。
     私はその少し前にMacPerlがとても仕事で役立ってくれたこともあり、意外なところで意外な人を目撃できた感激に思わず心の中で「お世話になってます!」と呼びかけました。もちろん日本語で、ですが(笑)
     しかし、最近になってつくづく思うのは、その時の質問に対する答えはやはり「ノー」なのだということです。
     いろいろな言語に手を出すことが好きな私は、Mac OSがUNIXになったこともあって、Perl、Python、Rubyという「3大人気スクリプト言語」を時々試してみるのですが、「手軽に作って、手軽に動かす」という意味でMacPerlを凌ぐものには未だに出会えていません。
     ここ1、2週間、少し夢中になっているPythonは、標準でかなり優秀なIDEを持っていますし、スクリプトファイルをドロップレットにしてくれるツールも付属しています。ただ、ドロップレットにしてしまうと編集ができなくなってしまうので、必ず別名で保存する必要があるなどと、MacPerlの気軽さにはいま一歩及びません。(ただし、MacPerlよりいい部分はたくさんあります)

     こんなことを書いているうちに気になったので、改めてWebで検索をしてみました。その結果見つかったのは、「MacPerlはMac OS Xのクラシック環境下で動作する。今のところCarbonに移植する予定はない」との相変わらずの文章です。
     今までは確かにクラシック環境があれば使えないことはなかったのですが、いずれMacがすべてIntelベースになってしまうと話は違います。Intel Macの登場が契機になって、本格的なOS Xへの移植が進まないものでしょうか。
     ところで、検索をしていて新たな発見もありました。MacPerlがSourceForge*1で管理されていること、そこではPerlからMac OSのシステムの機能を呼び出せる仕組みであるmac-carbonというものの開発も行われているようです。
     それと、前述のNeeracher氏が「現在はAppleで働いている」という文章も見つけました。ただ、その文章が書かれたのは99年の8月らしいので、私がWWDCで「目撃」した時は、既にAppleの社員だったようですね。
     Appleの社員を現在も続けているのかは定かではありませんが、彼は今Finkのメンテナ*2も務めておいでのようです。

    *1 SourceForge: オープンソースのプロジェクトを無償でサポートしてくれるサービス。CVSなどの管理機能をもち、ソフトのリリースの手段も提供し、開発者同士の情報交換用のフォーラム機能やプロジェクトのWebなどを立ち上げる機能も提供する
    *2 Finkのメンテナ: Finkというのは、UNIXのソフトウエアをMac OS Xで気軽に使えるようにするための導入の手段を提供する仕組み。かなり多くのソフトウエアがあるので、パッケージによってはメンテナンス担当者、つまりメンテナがいるものがある。

    ニュース・解説

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

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

    【開発環境】

    インテル版Macintoshの販売が6ヶ月前倒しで開始されましたので、仕方なく、今まで開発してきた自作アプリケーションのUniversal Binary化の作業スピードを速めている今日この頃です。インテル版の実機については、「DTK Exchange Program」サービスによりインテル版17インチiMacがまもなく届くはずですのでそれ待ちです。最初は、受付終了後1〜2週間という話でしたが、残念なことに受理メールでは2〜4週間と訂正が入っていました(涙)。

    その間は、DTKのマシンを利用して動作チェックをするわけですが、このマシンに搭載されているインテル版Mac OS X 10.4.3には結構バグが残っており、Universal Binary化で発生した不都合なのか? OSのバグなのか? その判断に苦慮する時があります。できれば、このインテルマシンでも出荷済みのMac OS X 10.4.4を使いたいと思い、アップデートの予定があるかどうかをアップル社のメンバーに尋ねてみたところ、「予定はない」と言われてしまいました(涙)。

    契約上、今年の12月までDTKは使えるはずですから、出荷バージョンのMac OS Xへのアップデートは、Apple社側の責任だと思うのですが? 仕方がないので、iMacが届くのをひたすら待つことにしました…。

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

    前回から1月27日の期間中、Apple社のDocumentationサイトには新規ドキュメントがひとつも登録されませんでした。インテル版のiMacとMacBook Proのハード仕様ドキュメントがなかなか登場しませんね?まだ仕様が固定していないのか(笑)

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

    前回から1月27日の期間中、新規テクニカルノートは2つ登録され、新規テクニカルQ&Aの方は7つ登録されました。TN2133「Coalesced Updates」をざっと眺めてみると、Mac OS X 10.4では画面アップデートの仕方が大幅に変更になったようですね。旧仕様とのコンパチビリティを保ちたい場合には、Info.plistにCGDisableCoalescedUpdatesキーを記述することで対応できるようです。テクニカルQ&Aの方は、QuickTimeを用いた圧縮と伸張技術に関する内容がほとんどです。QuickTimeでも一番分かり難い技術エリアでしたから、こうしたサンプル資料が沢山出てくると大いに助かります。これらについては、前号の木下さんの記事も参考にしてください。

    TN2133「Coalesced Updates」(初版登場後すぐに改訂)
    TN2110「Identifying Java on Mac OS X」

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

    QA1457「Compression Sessions – Multipass encoding and the pass mode flags」
    QA1456「Compression Sessions – Configuring options using the Standard
    Compression dialog」
    QA1450「Compression Sessions – Enabling muti-pass encoding」
    QA1455「Compression Sessions – Temporal compression options」(初版)
    QA1236「Debugging Graphics with QuartzDebug」(日本語訳あるが古い)
    QA1460「Decompression Sessions – Setting codec accuracy
    and field mode」(初版)
    QA1062「Limiting the component list in SCRequestImageSettings」

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

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

    前回から1月27日期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが2つ登録されました。どちらも改訂版としての再登録となります。

    「CFNetworkHTTPDownload」(NetWork関連)
    「QTMetaData」(QuickTime関連)

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

    【デベロップメント SDK】

    前回から1月27日の期間中、Apple社のSDKサイトには新しいSDKが4つ登録されました。Mac OS X 10.4.4対応「Kernel Debug Kit」(PowerPC版とIntel版あり)と「QuickTime 7.0.4 SDK」(Windows版あり)です。ところで、Mac OS X 10.3.9でXcode 1.5を利用しているのですが、この環境にQuickTime 7.04をインストールすると、Metrowerks CodeWarrior v9.6でのリンクが正常に終わりません?「QuickTime 7.0.4 SDK」をインストールすれば大丈夫かな?と思ったのですが、やはりダメのようです? 謎ですね(涙)

    「Kernel Debug Kit 10.4.4 (Intel)」
    「Kernel Debug Kit 10.4.4 (PowerPC)」
    「QuickTime 7.0.4 SDK」
    「QuickTime 7.0.4 SDK for Windows」

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

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

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

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

    2006-01-24

    目次

    • 「WebObjects Dev Report」    第36回  田畑 英和
    • 小池邦人の「Carbon API 徒然草」
    • SqueakではじめるSmalltalk入門  第54回  鷲見 正人
    • ニュース・解説               木下 誠

    「WebObjects Dev Report」  第36回  田畑 英和

     今回はユーザ情報の閲覧について解説します。閲覧機能では、ユーザが登録した様々な情報を表示することができ、閲覧画面の表示にはDirectActionを使用しています。

    ・閲覧のURL
    /cgi-bin/WebObjects/MOSAJobMatch.woa/wa/browse

     このURLにアクセスするとユーザの一覧が表示されます。DirectActionを使用する場合、表示する画面の作り方に注意する必要があります。セッションを使わないためにDirectActionを使用していても、表示する画面の作り方によっては自動的にセッションが生成されてしまいます。具体的には、セッションを必要とするDynamicElementやクラスを使用した場合にセッションが自動的に生成されます。

     例えば、ユーザの一覧を表示するためにWODisplayGroupを使ったとしましょう。WODisplayGroupを使用すれば変数を追加して、WebObjects Builder上でパラメータを設定するだけでユーザの一覧を表示することができます。このとき、WebObjects Builder上で次のような設定を行います。

    ・Display Group Option
    Entity:MOSAUser
    Fetches on load:On
    Fetch Spec:PublicUsers

     モデルについて少し補足しておきますと、”MOSAUser”は3種類存在するユーザ用Entityの親Entityです。つまりWODisplayGroupのEntityに”MOSAUser”を指定することによって、すべてのユーザをFetchすることができます。
     ですが、ユーザは自分の情報を登録するときに、情報を公開するかどうかを設定できます。そこでFetch Specを指定することにより、情報を公開しているユーザだけをFetchするようにします。WODisplayGroupで指定するFetch Specは、あらかじめモデルに定義しておきます。モデルには”PublicUsers”という名前でFetch Specを作成しておき、このとき次のようなQualifierを設定します。

    ・Fetch Spec “PublicUsers”に設定したQualifier
    (mosaUserdata.scope = 1)

     ”mosaUserdata”はユーザデータEntityへのリレーション名であり、ユーザデータの”scope”の値によって、情報を公開するかどうかを切り分けています。
     そしてFetches on loadをOnにしておくことにより、画面を表示したときに自動的にデータベースからデータをFetchすることができます。
     これでユーザの一覧が表示できるようになるわけですが、先ほどの話に戻ります。WODisplayGroupクラスを用いた場合、内部的にセッションがもつデフォルトのEditingContextが必要になり、自動的にセッションが生成されてしまいます。これではせっかくDirectActionを用いてユーザの一覧を表示するようにしても、ユーザの一覧を表示するためにセッションが生成されてしまいます。本当にセッションが必要であればもちろんセッションを生成してもよいのですが、WODisplayGroupを使用せずにユーザの一覧を表示する方法を紹介しておきます。WODisplayGroupを使った場合に比べて、若干コードの量は増えるのですがセッションを生成せずに処理が行えるようになります。
     まず、WODisplayGroupを使用していたときのDirectActionの実装ですが、次のようになっています。これは最初に紹介したURLに対応するメソッドです。

         public WOActionResults browseAction() {
             return pageWithName("UserList");
         }
    

     単純に”UserList”コンポーネントを生成してreturnしているだけです。このコードを書き換えて、あらかじめDirectAction内でユーザの一覧を取得し、次に表示する”UserList”コンポーネントに渡すようにしてみたいと思います。
     WODisplayGroupを使用した場合は、WebObjects Builder上でパラメータを指定していただけですが、今度は同様の処理をコーディングしてみたいと思います。モデルに設定されているFetch Specを呼び出すにはEOFetchSpecificationクラスのstaticメソッド”fetchSpecificationNamed”を使用します。
     Entity “MOSAUser”に設定されたFetch Spec “PublicUsers”を取得するには次のようなコードになります。

    ・モデルからのFetch Specの取得
    EOFetchSpecification.fetchSpecificationNamed(
    “PublicUsers”, “MOSAUser”);

     Fetch Specが取得できればあとはEditingContextを使用してデータを取得することができます。今回はDirectAction内でセッションを利用しない処理をおこなうため、EditingContextは新たに生成して処理をおこないます。このときのコードは次のようになります。

        public WOActionResults browseAction() {
             EOEditingContext ec = new EOEditingContext();
             ec.lock();
             EOFetchSpecification.fetchSpecificationNamed(
                                            "PublicUsers", "MOSAUser");
             NSArray users = ec.objectsWithFetchSpecification(fetchSpec);
             ec.unlock();
    
             UserList nextPage = (UserList)pageWithName("UserList");
             nextPage.setMosaUsers(users);
    
             return nextPage;
         }
    


     これで、ユーザの一覧をセッションを使用せずに表示できるようになりました。それでは次回はEditingContextの扱いについてもう少し考えてみたいと思います。

    小池邦人のCarbon API 徒然草(2006/01/20)

    アプリケーションのUniversal Binary化(その1)

    今回からは、本サンプルアプリケーションのUniversal Binary化(Intel x86 CPU対応)について解説していきたいと思います。最初に、現在の開発プロジェクトを、Metrowerks CodeWarrior 9.6からXcode 2.2.1(最新バージョン)へ移植する作業から始め、次に、ソースコードの一部分をPowerPC用からx86用に修正し、最終的にUniversal Binary対応のMach-Oアプリケーションを完成させます。

    開発プロジェクト移行の解説をする前に、まずは「Universal Binary化とは何ぞや?」と言う話をしておきたいと思います。本サンプルアプリケーションは、Carbon FrameworkとNibファイルを用いたMach-O形式アプリとして開発されています。また、若干のリソースデータも用いています。Universal Binary化を実行すると言っても特別なことはなく、こうした開発の仕組みについては何も変更する必要はありません。簡単に言えば、開発環境のコンパイラをPowerPC用からx86用に切り換え、再コンパイル&リンク(Make)をし直せば完了となります。

    こう書いてしまうと、Universal Binary化の作業はとても簡単のように聞こえるのですが(笑)、実際にはプロジェクト形式(CocoaかCarbonかJavaか)やアプリケーションの規模(ソースコード量)、利用している専用フレームワークの種類などにより、その困難さは大きく変化します。ちなみに、移行作業の大部分は、アプリケーションのソースコードの一部分を、PowerPC対応からx86対応に書き換えるという作業に割り当てられることになります。この書き換え量が多いか少ないかにより、そのアプリケーションのUniversal Binary化が完了するまでの作業時間(困難さ)が決定します。

    まずは、Apple社が提供しているUniversal Binary化に関連するドキュメントを調べてみましょう。Apple社のDeveloper Webサイトには、x86トランジション関連のリソースを集中的に集めた「Developer Transition Resource Center」というサイトがあります。ここからは、ドキュメントだけではなく、開発ツールやWWDCにおける関連セッションの映像にもアクセスできます。また、ここから「Xcode Users Mailing List」や「Performance Optimization Development Mailing List」といったメーリングリストへの参加も可能となっています。

    http://developer.apple.com/transition/

    このサイトの日本語訳サイトは以下のURLです。こちらからは、上記サイトに掲載されているドキュメントの日本語訳ドキュメントにアクセスすることが可能です(すべてが日本語訳されているわけではないが…)。

    http://developer.apple.com/jp/transition/

    また、ここからはIntel社の「Development Support for Intel-based Macs」というWebサイトにもリンクされており、Intel CPU版のMacintosh向け開発ツール(C/C++やFortranなど)のβ版リリースを無料でダウンロードすることが可能です。これらの開発ツールは、将来的には販売される予定だそうです。

    http://www.intel.com/cd/ids/developer/asmo-na/eng/255716.htm

    関連ドキュメントのうち、まず最初に読むべき物は「Universal Binary Programming Guide,Second Edition」、日本語訳名は「Universal Binaryプログラミングガイドライン(第2版)」です。最新版PDFの発行日付は、2006年1月10日ですので注意してください。このドキュメントを一読すれば、Universal Binary化に必要な知識をほとんど入手することが可能です。Universal Binary化の過程ついてもう少し大ざっぱに把握したい人は、「Adopting Universal Binary on Mac OS X」、日本語訳「Universal Binaryの導入」を先に読むのが良いでしょう。

    ちなみに、開発アプリケーションがMach-O形式でなくCFM形式であったり、未だCarbon化されていない状況の場合には、最終ゴールは随分と遠くなります(笑)。その場合には、先んじて「Carbon Porting Guide」「Moving Your Code to Mac OS X」を、この機会にCarbonでなくCocoa Frameworkを利用して新規開発を行いたい人は、「The Objective-C Programming Language」、日本語訳名「Objective-C プログラミング言語」を参照されることをお勧めします。色々なタイプのプロジェクトを、どのようにx86対応へと移行させるのかのヒントは、「Scoping Your Transition Project」、日本語訳名「タイプ別移行計画」を参照してください。また、Mac OS Xのバージョン番号にセンシティブなアプリケーションを開発している場合には、「Cross-Development Programming Guide」、日本語訳名「クロス開発プログラミングガイド」が参考になります。

    また、ソースコードでAltiVecコードを利用しているソフトは、この部分を完全に別コード(通常のCコードかx86のSSEコード)に差し換える必要があります。これは、x86 CPUにはAltiVecユニットがないためですが、この作業については、「AltiVec/SSE Migration Guide」が参考になります。また、AltiVecコードを直接記述しないで、特定の処理を高速にしたい場合には、関連ドキュメントとして「Taking Advantage of the Accelerate Framework」、日本語訳「Accelerateフレームワークの活用」を調べてみてください。また、「Optimizing Image Processing With vImage」「vecLib Framework Reference」「vDSP Library」などのドキュメントも処理の高速化についてのヒントを提供しています。ただし、残念ながらこれらのドキュメントには日本語訳が存在していません。

    現在、最新版のCodeWarrior 10にはPowerPC用コンパイラしかなく、このバージョンを最後にメーカ側のサポートは終了してしまいます。つまり、現時点ではx86用gccコンパイラが使えるXcode 2.2.1を利用しないかぎり、アプリケーションのUniversal Binary化は行えません。開発環境をCodeWarriorからXcodeへ切り換える必要がある人は、「Xcode 2.2 User Guide」「Working with Xcode build Setting」「GCC Porting Guide」「Porting CodeWarrior Projects to Xcode」、日本語訳名は「Xcode 2.2ユーザガイド」「Xcodeビルド設定の取り扱い」「GCC ポーティングガイド」「CodeWarriorからXcodeへのプロジェクトの移行」(概要と詳細)などを読まれることをお勧めします。

    次回は開発環境の移行について詳しく解説します。サンプルアプリケーションの開発プロジェクトを、Metrowerks CodeWarrior 9.6からXcode 2.2.1へ移植する話です。

    つづく

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、“生命感”をテーマに作られたGUIフレームワーク、「Morphic(モーフィック)」概要とモーフのごく基本的な操作についてです。

    ▼Morphicとは
     Squeakの前身であるApple Smalltalkや、さらにさかのぼって、ALTOコンピュータのOSだったころの古いSmalltalkシステムでは、今はCocoaや一般的なWebアプリケーションで知られるようになったMVCアーキテクチャと、単純なビットマップ描画を組み合わせたGUIフレームワークが用いられていました。Squeakも当初はせいぜいカラー化を施した程度でこの枠組みをそのまま受け継ぎますが、すぐに、扱わなければならない視覚的情報の多様化に対応するためGUIフレームワークの刷新を迫られることになります。こうして昔ながらのMVCに代わって新たに採用されたのがMorphicです。

    Morphic GUIフレームワークは、もともと、Smalltalkにインスパイアされて(あるいは批判的精神で)作られた「SELF」と呼ばれるオブジェクト指向言語/環境向けに開発されたものです。SELFは、仮想マシンの高速化技術がJavaに応用されたり、インスタンスベース(プロトタイプベース)という考え方がNewtonScriptやJavaScriptに強い影響を与えたり、Morphicの委譲ベースのGUIパーツの協働の仕組みが、やはりNewton OSのGUIのあり方を決定づけたりと、地味ながら、なかなか示唆に富んだソフトウエアであります。Win版はないのに、なぜかMac版の提供が続いていて、今もOS Xで動かすことができます。

    http://research.sun.com/self/
    http://research.sun.com/self/release_4.2/release.html
    http://research.sun.com/self/release_4.0/Self-4.0/Tutorial/index.html

     このSELF向けMorphicの主要な開発者の一人であるジョン・マロニーが、Squeak開発チームに参加、Smalltalkへの移植を行なった結果できあがったのがSqueakのMorphicです。Morphicの名前は、ギリシャ語の「形」や「姿」を意味するmorph(モーフ)からとられたものだそうです。変形を意味するmetamorphose(メタモルフォーゼ)といった英単語にも含まれていますね。Morphicでは、これと同じ「モーフ」と呼ばれる視覚化されたオブジェクトの組み合わせによりGUIを具現化しています。

    モーフというのは、端的にはドロー系描画アプリで使う基本図形オブジェクト(特に矩形オブジェクト)を思い浮かべていただければよいと思います。ただ、ドロー系の図形は色や線の太さや大きさなどの属性しか持ち合わせていないのに対し、モーフはそれに加え自らが積極的に機能し、あるいは、複数で協働することでGUIパーツの役割を果たすことが可能な点で異なります。SELFやSqueakシステムでは、およそ画面上で目に付くものはすべて(ウインドウもメニューも文字も画像も、そしてデスクトップやマウスポインタ(!)すら)このモーフによって成り立っています。

    ▼モーフの基本操作
     モーフはすべて、クラス「Morph」を継承したクラスのインスタンスです。Morphクラスとそのサブクラス群のありようは、Application KitのNSResponderとそのサブクラス群の関係に似ていなくもありません。が、APIとして洗練され、すっきりと分かりやすく整理されたNSResponderとは違って、Morphはそれを継承するサブクラスの数と、そこで定義されたメソッドの数の多さは尋常ではなく、けっして学びやすい(使いやすい)ものとは言えなさそうです。

    Morph allSubclasses size ” => 434 ”
    Morph selectors size ” => 1287 ”

     この数のものを、いきなり全体から把握しようとすることは無謀なので、身近なところから少しずつ見て行くことにしましょう。まず手始めは、モーフのドロー系オブジェクト的側面に着目して、モーフに付与された基本的な操作方法を紹介します。とりあえず、モーフを画面に出してみます。

    Morph new openInHand

     この式をdo itすると、マウスポインタに青い矩形が付いてまわるようになります。これがもっとも基本的なモーフ(クラスMorphのインスタンス)です。デスクトップのどこかでクリックすると、その場に設置できます。

    [fig.A]マウスポインタに付いてまわるモーフ
    http://squab.no-ip.com:8080/mosaren/uploads/54a.png

     このモーフはクリックするとピックアップできますが、モーフの種類によっては、クリックが別の振る舞いに割り振られていたり、そもそもピックアップが制限されていることがあります。そんなときは、コマンドキーを押しながらモーフをドラッグすると移動できます。この操作に伴って、モーフの周りに現われるのが「ハロー」と呼ばれるボタン群で、モーフに関わる各種機能を提供すると同時に、このモーフが選択されたことを意味します。ドラッグ操作をしなければ(つまりコマンドクリックで)移動させずに選択だけすることも可能です。

    [fig.B]選択されたモーフと現われたハロー
    http://squab.no-ip.com:8080/mosaren/uploads/54b.png

     ハローとは英語で後光や光輪を意味する「Halo」で、より正確にはヘイローなのですが、比較的よく知られた心理学用語で「ハロー効果(後光効果、halo effect)」というのがあるので、これにならってハローと呼んでいます。ハローは、モーフの種類によって出る数や種類が若干異なりますが、ほぼこの12個は共通しています。ここでは、上段中央の移動に関わるハロー2個と、上下左右の端にある4つの操作ハローの機能を紹介しましょう。

    上段中央の黒いハローはモーフをピックアップして(持ち上げて)移動するためのボタンです。すぐ右隣の茶色ハローは、先のコマンドドラッグと同じです。

    コマンドドラッグ(茶ハロー)とピックアップ(黒ハロー)との違いは、他のモーフに対する前後の位置関係や従属関係を維持したまま移動できるかどうかです。たとえば、デスクトップ上で他のモーフとの前後位置関係を変えずにモーフを移動したいときは、コマンドドラッグや茶ハロー使います。他方で、後で出てくるゴミ箱からモーフを取り出してデスクトップに移動したいとき(主従関係にあるモーフを変更する)には、コマンドドラッグ(茶色ハロー)ではなくピックアップ(黒ハロー)を使います。

    右下の黄色いハローは、Macのウインドウのサイズボックスに相当するもので、縦横比や大きさを変えることが可能なモーフで機能します。多くのドロー系ツールがそうであるように、シフトキーを押しながらドラッグすると、縦横比を固定したまま大きさだけを変更することも可能です。左下の青いハローはモーフの回転、右上の緑のモーフは複製、左上のピンクのモーフは削除(ゴミ箱へ移動)を担当します。

    ゴミ箱は、初回削除時に画面に現われます。画面にあるときは、Finderでのアイコン操作のように、ピックアップしたモーフをドロップインして捨てることも可能です。ゴミ箱から完全に消去するには、ゴミ箱をダブルクリックして現われる“ゴミ箱の中身”を表示するためのウインドウもどき(やはりこれもモーフ)の右上にある「E」ボタンをクリックします。

    [fig.C]ゴミ箱アイコンと、その中身を確認するためのモーフ
    http://squab.no-ip.com:8080/mosaren/uploads/54c.png

     次回は、デスクトップや、ウインドウ、メニューといった複雑なGUI構成要素が、どのようにしてこの「モーフ」の組み合わせにより実現されているのかを調べてみましょう。

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

    ニュース・解説

    今週の解説担当:木下 誠

    ———————————————————————-
    インテルMac出荷開始!
    ———————————————————————-

    すでにご存知の通り、サンフランシスコのエキスポでインテル版CPUを搭載したMacintoshが発表されました。同時に出荷も始まり、そろそろ皆さんのお手許に届いていることでしょう。

    ADCの方でも早速動きがありました。まず、先週の小池さんの記事でも触れられていますが、開発用に貸し出していたDeveloper Transition Kit (DTK)を、Intel iMacと交換する、DTK交換プログラムが始まっています。4月1日までですので、対象となる方は忘れずに交換しておきましょう。

    Mac OS X Universalロゴプログラムも始まっています。PowerPCに移行した時もありました、パッケージやWebサイトに、Universalアプリケーションであることを示すロゴを付けることができます。ロゴマークは、白と青の「陰陽」をモチーフにしたものですね。ライセンス契約書の郵送が必要です。

    他にも、Universal Binaryプログラミングガイドラインが第2版になり、Developer Transition Resource Centerにもドキュメントが追加されています。Universal化のために、細かくチェックをしておきましょう。

    DTK Exchange Program(日本語)
    http://developer.apple.com/jp/dtkexchange/

    Software Licensing Agreements: Mac Logo Program(日本語)
    http://developer.apple.com/jp/softwarelicensing/agreements/maclogo.html

    Universal Binary Programming Guidelines, Second Edition(日本語)
    http://developer.apple.com/jp/documentation/MacOSX/Conceptual/universal_binary/index.html

    Developer Transition Resource Center(日本語)
    http://developer.apple.com/jp/transition/

    ———————————————————————-
    インテル製Mac OS X向けコンパイラ
    ———————————————————————-

    これも先週小池さんが触れていましたが、インテルからMac OS X向けの開発ツールが登場しています。C++コンパイラ、Fortranコンパイラ、Math Kernel Library、Integrated Performance Primitivesが含まれています。最後の1つは、メディア用の最適化されたライブラリでしょうか。

    これに関しては、CNETの記事「インテルのMac用開発ツール – そのベータ版の内容とは」が、詳しく報じています。それによりますと、インテルコンパイラはXcodeに組み込んで、gccと置き換えて使うことができるようです。記事では、Universal Binary (UB)の開発に使えるとありますが、UBのインテルビルドに使える、ということでしょう。

    この開発ツールの利点は、OpenMPを利用してデュアルコアに最適化できる、SSEに最適化できる、あらかじめ最適化された数学ライブラリなどが使える、といったところでしょう。また、Fortranコンパイラもあるので、科学技術計算用途にも向くと思われます。

    注意すべき点は、Objective-Cのサポートはないところでしょう。インテル製コンパイラの恩恵を受けるには、C/C++で書く必要があります。まぁ、もともと速度重視のところにはObjective-Cは向かないですからね。

    というわけで、インテル版Mac向けに、特にメディア処理を行うアプリケーションを最適化したい方などは、利用を検討してはいかがでしょうか。ベータ版は無料で利用でき、夏に登場する予定の正式版では、C++コンパイラ$399、Fortranコンパイラ$499、Math Kernel Library $399、Integrated Performance Primitivesは$199になるそうです。

    Intel Software Development Products for Mac OS*
    http://www.intel.com/cd/software/products/asmo-na/eng/227389.htm

    インテルのMac用開発ツール – そのベータ版の内容とは
    http://japan.cnet.com/news/ent/story/0,2000047623,20094739,00.htm

    ———————————————————————-
    QuickTimeを用いた、圧縮と展開に関するQA
    ———————————————————————-

    最近、ドキュメントやサンプルの公開ラッシュが続いているQuickTimeですが、またQuickTimeに関する新たなTechnical Q&Aが公開されました。ICM(Image Compression Manager)に関する一連のQAです。

    Compress SessionsまたはDecompress Sessions、つまり画像の圧縮と展開に関する解説を行っています。

    QA1450: Compression Sessions – Enabling multi-pass encoding
    http://developer.apple.com/qa/qa2005/qa1450.html

    QA1455: Compression Sessions – Temporal compression options
    http://developer.apple.com/qa/qa2005/qa1455.html

    QA1456: Compression Sessions – Configuring options using the Standard
    Compression dialog
    http://developer.apple.com/qa/qa2005/qa1456.html

    QA1457: Compression Sessions – Multipass encoding and the pass mode flags
    http://developer.apple.com/qa/qa2005/qa1457.html

    QA1460: Decompression Sessions – Setting codec accuracy and field mode
    http://developer.apple.com/qa/qa2005/qa1460.html

    ———————————————————————-
    Quartzに関するQAとTN
    ———————————————————————-

    Quartzに関するQAとTNが更新されています。

    QA1236では、QuartzDebugの使い方が説明されています。QuartzDebugは、開発環境に付属する、Quartz周りのパフォーマンスを調べるためのツールです。このドキュメントは前から公開されていましたが、10.4用にアップデートされました。

    TN2133では、画面の更新がどのように行われているかを解説しています。画面の更新は、Quartzで統合されて行われています。アプリケーションが、どのように自身描画の更新を行うべきかが議論されています。今回の更新では、10.4.4で追加されたInfo.plistのキー、CGDisableCoalescedUpdatesを説明しています。

    QA1236: Debugging Graphics with QuartzDebug
    http://developer.apple.com/qa/qa2001/qa1236.html

    TN2133: Coalesced Updates
    http://developer.apple.com/technotes/tn2005/tn2133.html

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

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

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

    2006-01-17

    目次

    • 「WebObjects Dev Report」    第35回  田畑 英和
    • 藤本裕之のプログラミング夜話 #83
    • 高橋真人の「プログラミング指南」  第81回
    • ニュース・解説               小池 邦人

    「WebObjects Dev Report」  第35回  田畑 英和

     さて昨年の4月より始まった本連載ですが、今回はここまでの流れをまとめておきたいと思います。「ビジネスマッチングシステム」をWebObjectsを使って開発する過程を紹介してきたわけですが、これまで以下のようなことを取り上げてきました。

    ◇開発環境
     まず最初のころに開発環境について取り上げました。この連載が始まったころのWebObjectsの最新バージョンは5.2.3で、まだTigerもリリースされていませんでしたが、現在のWebObjectsの最新バージョンは5.3.1です。大きな変更点としては、XcodeにはじめからWebObjectsが含まれる(ただしオプションインストール)ようになりました。
     つまりWebObjectsを別途購入する必要がないわけですが、Ver5.3からはついにWindows版がなくなってしまいました。一度なくなったものがすぐに復活するとも思えませんので、今後はWebObjectsで開発をおこなうならXcodeをインストールするということになるかと思います。
     運用環境についてはTiger ServerにWebObjectsの運用環境が含まれおり、これがVer5.3の運用環境としてサポートされている唯一のプラットフォームとなります。Tiger Serverからはシステム起動時のプロセスの起動方法が変わり、wotaskdの起動がそれまでのStartupItemsからlaunchdへと変更になっています。
     また、TigerでもWebObjects Ver5.2を使用することは可能です。5.2系列の最新版は5.2.4ですが、この5.2.4へのアップデータによりTiger上での開発が可能になります。

    ◇モデル
     実装はまずモデルの作成から始めました。システムで必要となるデータをまとめて、「EOModeler」を使ってモデルを作成しました。このときEOFの継承機能を利用して、Entityの継承をおこないました。継承機能を使うことにより、プログラム上のクラスの継承関係をモデル上でも表現できるようになります。
     モデルによってデータベースとオブジェクトのマッピングがおこなわれますが、実際にデータベースにデータを格納するにはあらかじめデータベースを作成しておく必要があります。「EOModeler」にはモデル上で定義した情報に基づいてデータベース上にテーブルを作成するためのSQL文を自動生成する機能があります。この機能を利用してデータベース上にテーブルを作成しました。データベースソフトにはOpenBaseを使用しています。

    ◇Direct To Web
     WebObjectsの「Direct To Web」を使えば、モデルファイルをもとにアプリケーションを自動作成することができます。この機能を利用すればモデルで定義した各Entityに対してデータの登録/変更/削除ができるため、モデルがあらかじめ意図していたとおりに作成されているかどうかを確認することができます。
     また、Direct To Webで作成したアプリケーションは、リレーションの操作をおこなうことも可能でデータのメンテナンスに利用するといったことも考えられます。

    ◇Reusable Component
     WebObjectsでは動的に生成するWebページをコンポーネントとして作成することができますが、ページ全体ではなく、他のページに埋め込んで使用するようなパーツを作成することができます。
     他のページに埋め込むコンポーネントのことをReusable Componentと呼んでいますが、Reusable Componentを積極的に利用することによって開発効率を上げることができます。複数のページで共通するパーツを使用するような場合は共通部分をReusable Component化しておくことにより、コンポーネントの再利用が可能になります。また、再利用しないにしてもReusable Compoentを組み合わせることで1つのページを細分化して作成できるようになるため、メンテナンスがやりやすくなるといったメリットもあります。
     Reusable Componentはステートレス化や親コンポーネントとのデータの自動同期を無効にすることで、パフォーマンスを最適化することができます。

    ◇DirectAction
     通常はセッション管理が自動的におこなわれますが、セッションを必要としないような処理はDirectActionにより実現することができます。DirectActionを使用した場合にはURLが固定になり、Webブラウザでブックマークができるようにもなります。
     ただしDirectActionでは、Webブラウザから送信されたHTML Formの値へアクセスするには、明示的にプログラミングをおこなう必要があります。セッションがある場合には利用できる、デフォルトのEditingContextを利用することもできませんので、データベースアクセスをおこなうような処理はEditingContextを作成してから処理をおこなう必要があります。

     以上のようなことをこれまで解説してきました。今後はもう少し実装に関することを解説してから、WebObjectsで開発したアプリケーションの運用に関することを解説していく予定です。

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

     御慶。……これが配信されるのはもう15日過ぎ、いつまでも正月気分でいられるかよ、というところかも知れないが、なにを隠そうオレは年末やりかけちまったプログラムに追われて元旦その日から正月気分ではなかったので、このさい敵討ちのつもりでここに新年のご挨拶をさせていただく。今年がみなさんにとってよい年でありますように、オレにはみなさんより……ちょっとでいいからよい年でありますように(笑)。

     さて無駄話はそれくらいにして前回の続き。……えと、なんだったっけ? そうそう、Interface Builderで NSWindowに対して指定できるスイッチのひとつ「Release when closed」というヤツの効果を検証しようと言うんだった。以下、前回のコピペになって申し訳ないが……。
     ウィンドウひとつにチェックボックス1個、ボタン2個を並べ、チェックボックスを「□ Release when closed」とする。ボタンはそれぞれ「Close」と「OrderOut」。NSObjectのサブクラスをひとつ作り、そいつのIBOutletとして、このウィンドウ本体とチェックボックスを連結。IBActionとして以下の4つを定義する。

    -(void) closeWindow:(id) sender {
        [ourWindow close];
    }                          // 当然、「Close」ボタンに連結
    
    -(void) orderOutWindow:(id) sender {
        [ourWindow orderOut:self];
    }                          //  「OrderOut」ボタンに連結
    
    -(void) toggleReleaseFlag:(id) sender {
        [ourWindow setReleasedWhenClosed:
                ([sender state] == NSOnState) ? YES:NO];
    }                            // チェックボックスに連結
    
    -(void) openWindow:(id) sender {
        [ourWindow orderFront:self];
    }                            // メインメニューのFile->Openに連結
    
    


    あと、Interface Builderでの設定を起動時にチェックボックスに反映するための以下のコードを書き……、

    
    - (void) awakeFromNib {
        [ourCheckBox setState:([ourWindow isReleasedWhenClosed] == YES) ?
                                                        NSOnState:NSOffState];
    }
    

    さて「□ Release when closed」のチェックボックスをオンにして「Close」を実行する。……いや、ここでは当然ウィンドウが閉じるだけなんだが、次にメニューから「Open」を選んだとき、上のチェックボックスがオフの時のように二度とウィンドウは開かない。それどころかアプリケーションはクラッシュする。なぜか? このインスタンスは文字通り、クローズされると同時にリリースされちゃっているからである。当たり前だが「OrderOut」ボタンでこれを閉じた場合は問題なくまた開く。すなわちこれが「Release when closed」というスイッチの効果である……わけなんだが、ほんぢゃなんでこんな仕組みがあるんだろうか。何の役に立つわけ?
     NSWindowの close メッセージの解説にこうある。「NSWindowオブジェクトはクローズ時にリリースされるのがデフォルトである。NSPanelでは逆……」。つまりNSWindowは、ドキュメントを表示し編集させるような「開いた時に生成され閉じた時に捨てられる」用途に使うものであり(そんときに自動的にリリースされてくれれば手間が省ける)、NSPanel は各種設定のダイアログボックスのような、1セッション中に何度も使用されるウィンドウとして使うのだ、ということである。
     でもさぁ、だったら Interface Builderで新規にNSWindowのオブジェクトを生成したとき、「Released When closed」のスイッチはデフォルトでオンになってて欲しいと思いませんか? まったくこのソフトにはこういう「なんだかなぁ」つう部分が多いよなぁ。
    (2006_01_10)

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

    UNIXとしてのMac OS X

    〜Perlについて(27)〜

     こんにちは、高橋真人です。さて年を越えてしまいましたが、前回お約束した通り、今回はファイルを処理するPerlスクリプトにファイル名を動的に与える方法についてご説明します。
     前回のスクリプトの骨格の部分を流用して、与えられたファイルの内容を単にそのまま出力するだけのスクリプトを作ってみます。今回は、このスクリプトに手を加えながら解説をしていきます。

    $file_path = '/Users//Desktop/data.txt';
    open IN, "$file_path" or die;
    
    while (<IN>) {
         print "$_ ?n";
    }

     まず予備知識として、「コマンドライン引数」というものについてちょっと見てみます。
     C言語では、通常main関数は以下のように書くことになっています。

    int main(int argc, char *argv[]) {
        ...
    }
    

     Terminalなどを使ってコマンドを起動する場合、コマンド名のあとにスペースで区切られた複数の文字列を与えることがありますが、これがコマンドライン引数です。
     これらコマンドライン引数は、時によってコマンドの処理対象となるファイルの名前であったり、コマンドのオプションを指定する記号であったりします。
     しかし、これらのコマンドライン引数が何を意味するのかの解釈に関してはすべてコマンド、つまりプログラム側で行われますので、コマンドライン引数はただの文字列の配列としてプログラムに渡されます。
     このプログラムに渡された文字列の配列が格納されているのが、上記のargvという第2引数となります。さらに、Cでは関数に渡された配列の実体はポインタなので、argvだけでは、その要素数を知ることができないため、第1引数のargcには配列の要素数が入っているのです。
     ちなみにargvの第1要素であるargv[0]には、そのプログラムを起動した文字列、つまり「./a.out」とか「/usr/bin/vi」などという文字列が入ります。

     一方、Perlにおいてはコマンド引数は@ARGVという特殊変数を使って渡されます。特殊変数というと、今までは$_とか、$&などと、'$'という文字で始まっていましたが、それはこれらの特殊変数がスカラー変数だったからです。よって@ARGVは'@'で始まっているので、配列だということが分かります。
     Perlの場合にはスクリプト名は@ARGVの中には入りません。これは、perlコマンドを使って、

    perl test.pl data.txt

    とした場合にも、また、スクリプト自体に実行権限を持たせて(連載52、53回参照)、

    ./test.pl data.txt

    とした場合にも同じで、どちらのケースでも@ARGVに入るのは'data.txt'という文字列だけとなります。

     さて、以上の説明から改良方法が見えてきました。
     スクリプトの先頭の2行を以下のようにすると、すぐ上の形で起動した場合には、$file_pathには'data.txt'が入ってきます。

    $file_path = $ARGV[0];
    open IN, "$file_path" or die;
    


     ですが通常はPerlではこのような書き方をしません。以下のように書きます。

    $file_path = shift;
    open IN, "$file_path" or die;
    

     shiftという演算子が出てきました。この演算子は連載の58回でチラッと出てきているのですが、引数に配列をとる演算子です。動作としては、配列の先頭要素を切り離して返す(つまり、呼び出す度に配列の要素は一つずつ減っていく)というものです。
     このshift演算子ですが、引数を省略した場合@ARGVが暗黙のうちに与えられます。ただし、サブルーチン(Cにおける関数、ただしmain()を除くのようなものと考えてください)の中で使われた場合には、@_という特殊変数が暗黙のうちに使われます。
     最後に以上を簡単に理解できる例をお見せします。

    while ($v = shift) {
        print "$v ?n";
    }
    


     以上をargtest.plというファイルにして、以下のように起動してみてください。

    perl argtest.pl a b c d e f

    ニュース・解説

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

    Carbon ドキュメント & サンプル & SDK ナビゲーション(2006/01/13)

    【開発環境】
    サンフランシスコ Expoの基調講演で、ついにインテル版CPU搭載のMacintoshが登場しました。予定より半年も早い登場ですね。まあ、現行機種の買い控えを最小限に抑えるのには良いタイミングなのでしょうが(最初からの作戦?)、インテル版アプリの開発終了時期を6月と考えていたデベロッパーにとっては頭が痛いところです。

    早速、Intelのウェブサイトにも、Apple向け開発ツールのβ版リリースが載りました(以前からあったような気もするが...)C/C++コンパイラを、Xcode 2.2のgccと差し替えて使えるのは嬉しいですね。興味ある方は試してみてはどうでしょうか?

    http://www.intel.com/cd/software/products/asmo-na/eng/227389.htm

    また、今回の発表に合わせて「DTK Exchange Program」サービスが開始されました。レンタルしていたG5筐体のインテルマシンを、インテルCPU版の17インチiMacに無料交換してくれるそうです。締め切りは2006年3月31日。慌ててインテル版iMacを注文しなくて良かった思う今日この頃(笑)。

    http://developer.apple.com/dtkexchange/index.html

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

    前回から1月13日の期間中、Apple社のDocumentationサイトには数多くのドキュメントが登録されました。ただし、大部分は今までの内容のマイナーチェンジです。今回は、その中で初版と内容が大幅変更になったドキュメントだけをピックアップしました。数多くのQuickTimeに関するドキュメントが、各技術分野ごとに分けられて登場しました。今までは、欲しい技術を習得するための指針を得るのが難しかったので助かります。日本語訳も早急にお願いしたいところです。新規リリースノートの方も7つ登録されています(何やらバージョンが古い物もある?)。また、デベロッパ向け読み物も2つ登録されています。「Using the Audio Extraction API in QuickTime 7」については、前号の木下さんの記事も参照してみてください。

    「Accessibility (ApplicationServices/HIServices) Reference」
    「Apple Publications Style Guide」
    「Control Manager Reference」
    「Ink Services Reference」
    「Launch Services Reference」
    「Multilingual Text Engine Reference」
    「Quartz 2D Reference」
    「QuickTime Component Creation Guide」(初版)
    「QuickTime Compression and Decompression Guide」(初版)
    「QuickTime Guide for Windows」
    「QuickTime Import and Export Guide」(初版)
    「QuickTime Media Types and Media Handlers Guide」(初版)
    「QuickTime Movie Basics」(初版)
    「QuickTime Movie Creation Guide」(初版)
    「QuickTime Movie Internals Guide」(初版)
    「QuickTime Music Architecture Guide」
    「QuickTime Streaming Guide」
    「QuickTime Transport and Delivery Guide」(初版)
    「QuickTime Video Effects and Transitions Guide」
    「Universal Binary Programming Guidelines, Second Edition」
    「WebObjects Overview」
    「WebObjects Web Applications Programming Guide」

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

    リリースノート

    「Developer Documentation Release Notes for Xcode 2.2」
    「High Level Toolbox Release Notes (10.3 and earlier)」
    「High Level Toolbox Release Notes (10.4)」
    「High Level Toolbox Release Notes (10.4.2)」
    「High Level Toolbox Release Notes(10.4.3)」
    「Interface Builder Release Notes」
    「J2SE 5.0 Release 3 Release Notes」

    http://developer.apple.com/releasenotes/

    「Identify your Universal application」(読み物)

    http://developer.apple.com/softwarelicensing/agreements/maclogo.html

    「Using the Audio Extraction API in QuickTime 7」(読み物)

    http://developer.apple.com/quicktime/audioextraction.html

    前回から1月13日の期間中、新規テクニカルノートは3つ登録され、新規テクニカルQ&Aの方は4つ登録されました。インテル版のMacintoshも発表されましたので、その出荷が本格的になれば、新機種に関する新しい資料がもどんどんと増えていくでしょう。しばらくは、新規テクニカルノートやQ&Aの発表を見逃せませんね。

    TN2161「Nested Functions in XCode」(初版)
    TN2083「Daemons and Agents」(初版)
    TN2138「QTKit Frequently Asked Questions 」

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

    QA1429「Deprecated CALL_ON_[UN]LOAD pragmas」
    QA1451「Intel-Based Macs, Dashboard, Safari, and You」(初版)
    QA1295「Java on Intel-based Macintosh Computers」
    QA1449「Setting default open Finder window」(初版)

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

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

    前回から1月13日の期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが7つ登録されました。このうち初めての登録(初版)となるのは「QTKitPlayer」のみです。しかし、私の記憶では、これも以前に登録されたことがあったような気もするのですが...。

    「filesystem_examples」(File関連)
    「QTKitPlayer」(QTKit関連)(初版)
    「CFMBonjourSample」(Bonjour関連)
    「QTKitMovieShuffler」(QuickTime関連)
    「SampleFilterScheme」(Driver関連)
    「SimpleAudioExtraction」(QuickTime関連)
    「ThreadsExportMovie」(QuickTime関連)

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

    【デベロップメント SDK】

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

    「Computer Hardware Understanding Development (CHUD) Tools 4.3.1」

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

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

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