MOSA Multi-OS Software Artists

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

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

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

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

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

    2006-05-30
     

    目次

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

    「Wonderful Server Life」  第4回  田畑 英和

     前回に引き続きMac OS X Serverのインストールについて解説いたします。今回はMac OS X Serverをリモートでインストールする方法について解説いたします。

    まずはどのようなときにリモートでのインストールが有効かですが、もっとも典型的な例はビデオカードを搭載していない(オプションで追加することは可能)Xserveをインストールするときです。ビデオカードがなければモニタを接続することができず、モニタを接続できなければ画面上でインストーラの操作をおこなうことができません。
     また、インストール対象のマシンが、マシンには優しくても人間には優しくない、とても寒くて騒音爆裂のサーバルームに設置してある場合もあるでしょう。こういったときにリモートでのインストールができれば、マシンにモニタを接続することなく、かつマシンのそばにいなくても作業ができてしまいます。

    □インストールディスクからの起動
     インストール作業をリモートから実行するには、まずインストール対象のマシンをインストールディスクから起動する必要があります。Xserveのクラスタノードモデルのように光学式ドライブが搭載されていないマシンがあったり、やり方によってはインストールディスクからマシンを起動せずに、インストールすることもできるのですが、こちらについてはまたの機会にご紹介することにしましょう。

    インストールディスクからマシンを起動する方法ですが、スロットローディング方式のドライブを搭載したマシンの場合は、キーボードのCキーを押しながらマシンを起動し、起動時にディスクをドライブに挿入することで、インストールディスクから起動できます。ですのでこの方法ですと、キーボードの接続は必要になりますがモニタを接続する必要はありません。
     トレイ式のドライブの場合ですけれども、すでになんらかのシステムがインストール済みでかつモニタが接続されていれば、既存のシステムから起動してインストールディスクを挿入し、そこからあらためてインストールディスクから起動すればよいでしょう。モニタを接続していない場合でも、マウスが接続されていれば、マシンの起動時にマウスを押しっぱなしにすることにより、自動的にトレイが開きます。これでインストールディスクを挿入して、インストールディスクから起動することができます。

    以上の方法でほとんどのマシンに対応できますが、Xserve(*1)の場合にはマウスやキーボードを接続する必要もありません。詳しい操作方法はXserve G5の「ユーザガイド(p.63)」に説明がありますが、Xserve G5の前面パネルにあるシステムIDボタンを操作することで、モニタ、マウス、キーボードを接続することなく、Xserve G5をインストールディスクから起動することができます。
     前面パネルでの操作では、インストールディスクからの起動以外にも、ターゲットディスクモードでの起動や、NetBootによる起動や、NVRAMのリセットを実行することができます。

    ・Xserve G5ユーザガイド
    http://images.apple.com/jp/server/documentation/pdfs/Xserve_G5_User_Guide.pdf

    □サーバ管理ツール
     インストールディスクからの起動ができれば、それ以上インストール対象のマシンを直接操作する必要はありません。この後の作業はネットワーク上の他のMacからリモートで実行できます。
     ただし、リモートでのインストールを実行するにはMac OS X Server用のサーバ管理ツールが必要になります。サーバ管理ツールは前回の記事でご紹介したとおり下記のURLからダウンロードできます。

    ・管理ツールダウンロードURL
    http://www.apple.com/jp/ftp-info/reference/serveradmintools104.html

     このサーバ管理ツールをMac OS Xにインストールし、「アプリケーション/サーバ/サーバアシスタント」を使ってリモートでインストールを実行することができます。ちなみにこのv10.4用のサーバ管理ツールはこれまでに2回のアップデートが行われています。
     1回目は10.4.4がリリースされたときにアップデートが行われており、このアップデートについてはすでにサーバ管理ツールをインストールしてある環境ではソフトウェア・アップデートでアップデートすることができます。
     2回目は10.4.6でのアップデートが行われています。ただし、こちらはソフトウェア・アップデートではアップデートできないようです。Mac OS X Serverであれば、OSを10.4.6にアップデートするとそのときサーバ管理ツールもアップデートされますが、Mac OS X上のサーバ管理ツールを最新にアップデートするにはMac OS X Server 10.4.6のアップデートに含まれるパッケージを引っこ抜くなどの対応が必要になります。
     さて、これでリモートインストールの環境が整いましたので、次回は実際のインストール方法について解説したいと思います。

    つづく

    *1 初期型のXserveではこの方法を使用できません。

    小池邦人のCarbon API 徒然草(2006/05/26)

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

    今回は、もう少し詳しく画像データフォーマットに関連した例題を調べてみます。また、DICOM画像など、内部の数値フォーマットがエンディアンに依存しているファイルについても解説します。

    前回の復習となりますが、1ピクセルがunsigned longにマッピングされたMacintosh用画像フォーマットの色成分の並びはαRGB(αは透明度)であり、OpenGL用テクスチャ画像フォーマットの方はRGBαです。よって、両者の変換を行うには(α値は0xff固定とする)、オリジナルデータを8bit左へシフトさせ、透明度として0xffを追加します。実際の変換ソースコードをもう一度見てみます。ビッグエンディアンに最適化した場合には…

     *tex=((*buf++)<<8)+0xff;

    となり、リトルエンディアンに最適化した場合には...

     *tex=((*buf++)>>8)+0xff000000;

    となります。リトルエンディアンの場合はちょっと奇異に見えます。これは、数値に対する加減乗除、シフト演算、理論演算などが、反転したデータに対して正しく行われるよう処理されるためです。例えば、8bit右へシフトすることは256で割るのと同じですから、0x11223344(long値)は0x00112233となります。この数値はメモリ内では44332211と並んでいますので、演算結果は33221100となります。数値演算的には8bit右へシフトさせましたが、画像フォーマット的に見ると左へ8bitシフトしていることが理解できます。

    つまり、リトルエンディアンでは色成分がBGRαと列んでいると考えて各種演算を実行すれば結果オーライとなります(考えるだけ...実際は違う)。以下のzeroLevelImage()ルーチンは、RGBの各色の値がすべて指定範囲外である場合に、画像バッファのピクセルをゼロでクリアしています。画像データからRGBの各色成分を抜き出す処理のソースコード部分が、リトルエンディアンとビッグエンディアンでは異なります。

    void zeroLevelImage( CGrafPtr gptr,unsigned long st,unsigned long ed )
    {
        unsigned long    *add,*pp,i,j,row,cc,rr,gg,bb;
        Rect            drt;
        PixMapHandle    phd;
    
        GetPortBounds( gptr,&drt );   // オフスクリーン(CGrafPort)の矩形枠を得る
        phd=GetGWorldPixMap( gptr );  // PixMapHandleを得る
        row=GetPixRowBytes( phd )>>2; // RowBytesを得てlong Bytes数に変換
        add=(unsigned long *)GetPixBaseAddr( phd ); // 先頭アドレスを得る
    
        for( i=0;i>24;
                gg=(cc&0xff0000)>>16;
                rr=(cc&0xff00)>>8;
                #else                   // ビッグエンディアンに最適化した場合
                rr=(cc&0xff0000)>>16;
                gg=(cc&0xff00)>>8;
                bb=(cc&0xff);
                #endif
    
                if( ( rred && gg> d && bb>ed ) )
                    *pp=0;              // 指定範囲外なら画像データにゼロを代入
                pp++;
            }
            add+=row;
        }
    }
    
    逆に、RGBの各色要素から画像バッファのピクセル(unsigned long値)を作成
    する場合は、以下のようになります。
    
        #if __LITTLE_ENDIAN__           // リトルエンディアンに最適化した場合
            *pp++=0xff+(bb<<24)+(gg<<16)+(rr<<8);
        #else                           // ビッグエンディアンに最適化した場合
            *pp++=0xff000000+(rr<<16)+(gg<<8)+bb;
        #endif
    


    次の例は、医療現場などで使われるDICOM画像ファイルの解析です。readDicomImage()は、FSSpecで指定されたDICOMファイルを読み込み、その画像データをオフスクリーンバッファ(CGrafPPort)に描画するためのルーチンです。TIFFやExif画像ファイルにはリトルエンディアンとビッグエンディアンの両フォーマットがあり、ヘッダ部分でどちらなのか判断可能です。しかし、DICOMファイルの場合はリトルエンディアンフォーマット固定であり、ファイル内に書き込まれているタグやshort,long整数は、ビッグエンディアン環境では反転させてから読み込む必要があります。

    short readDicomImage( CGrafPtr gptr,FSSpec *fsc )
    {
        short                type,fref,chk,ret=1;
        short                *pp,*last;
        long                size,len,i;
        Ptr                    buf=NULL;
        unsigned long        *aa,d1,kk;
    
        #if __LITTLE_ENDIAN__   // タグ比較用の定数を変数に代入する(リトル用)
            kk=0x00107fE0;
        #else
            kk=0xE07F1000;      // (ビッグ用)
        #endif
    
        if( ! FSpOpenDF( fsc,fsRdPerm,&fref ) )  // DICOMファイルをオープンする
        {
            GetEOF( fref,&size );                // ファイルのサイズを得る
            if( buf=NewPtr( size ) )             // メモリ領域を確保する
                ret=FSRead( fref,&size,buf );    // ファイルをメモリに読み込む
            FSClose( fref );                     // ファイルをクローズする
        }
        if( ret==noErr )
        {
            chk=0;
            ret=1;
            len=size>>1;
            pp=(short *)buf;
            last=pp+len;
            for( i=0;i>1)+d1);
            }
        }
        if( buf )
            DisposePtr( buf );  // 確保したメモリ領域を開放
        return( ret );
    }
    


    逆にリトルエンディアン環境であれば、ファイルから得られた数値データはそのまま変数に代入して利用しても良いことになります。以下の2つのルーチンは、DICOMファイルから得られた数値やタグ情報を適切に処理するために用意したものです。

    short getDicomShort( short val )  // DICOMの整数値(short)を反転させる
    {
        #if __BIG_ENDIAN__
            return( Endian16_Swap( val ) );  // ビッグエンディアンのみ反転
        #else
            return( val );
        #endif
    }
    
    long getDicomLong( long val )  // DICOMの整数値(long)を反転させる
    {
        #if __BIG_ENDIAN__
            return( Endian32_Swap( val ) );  // ビッグエンディアンのみ反転
        #else
            return( val );
        #endif
    }
    


    次回は、Universal Binary化における最大の難関(笑)PowerPCのAltiVecコードをIntel CPUのSSE/SSE2コードに変換する話に突入します。まずは、アプリケーションでAltiVecやSSE/SSE2を利用しなければいけないケースについて色々と考察してみます。

    つづく

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

     本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。前回は、ワークスペースというアプリケーション(ウインドウ)がどんなモーフの組み合わせでできているのかを“破壊”して調べてみました。今度は逆に、モーフを組み合わせるスクリプトを記述し、ウインドウを組み立ててみましょう。

    まずは、ワークスペースがどのように組み立てられているのか、その“出生”をたどってみることにします。

     ワークスペースは、デスクトップメニューの「開く…」サブメニューの「ワークスペース (k)」を選んで起動します。ちなみに「(k)」とあるのは、デスクトップメニューをポップアップしたり、それを閉じた直後などに「cmd+ K」でワークスペースを呼び出すことが可能であることを示しています。

     さて、復習を兼ねて、この「開く…」サブメニューの「ワークスペース(k)」項目をインスペクトして、ワークスペースを開くために、どんなメソッドが起動されているのかを調べてみましょう。具体的には「開く…」サブメニューの「ワークスペース (k)」項目を、shift + cmd + クリック(あるいは、複数回 cmd + クリック)してモーフとして選択し、右側の灰色ハロー(デバッグハロー)を shift クリックしてインスペクタを呼び出します。

    [fig.A]モーフとして選択された「ワークスペース (k)」項目

    [fig.B]「ワークスペース (k)」項目のインスペクタ

     インスペクタの左側のリストペインにある、target、selector、argumentsの内容から、このメニュー項目が選択されたときに誰にどんなメッセージが送られるのかが分かります。簡単のため、ここでは#doMenuItem:with:についての詳しい解説は省きますが、その名前とメソッドの定義から、どうやらargumentsの配列内配列の第一要素に対して、第二要素のセレクタを持つメッセージを送信していることが分かります。そこで引き続き、第二要素の#openWorkspaceというメソッドの定義を調べてみることにします。念のため補足しておくと、メソッドの定義を閲覧するには、メソッド名の文字列「openWorkspace」を選択してbrowse it(cmd + B)を使うのでしたね。

    #openWorkspaceには、レガシーなScreenCoontroller >> #openWorkspaceもあり、これがブラウザの起動時に選択されていますが、今は二番目のTheWorldMenu >> #openWorkspaceのほうをクリックして選択しましょう。ここから、implementorsボタンを用いてStringHolder >>#openAsMorphLabel:inWorld:の定義を見ると、具体的にどんな手続きを踏んでワークスペースを表示してるのかが分かります。ちなみに、StringHolderはWorkspaceのスーパークラスです。

    [fig.C]「StringHolder >> #openAsMorphLabel:inWorld:」の定義

     では、この定義に倣って、ワークスペースっぽいウインドウを“作る”スクリプトを書き起こしてみましょう。

    | window textMorph |
    window := SystemWindow labelled: 'My Text Window'.
    textMorph := PluggableTextMorph on: nil text: nil accept: nil.
    window addMorph: textMorph frame: (0@0 corner: 1@1).
    window openInWorld: World
    


     このウインドウは、見た目こそワークスペースに似ていますが、それは同じ種類のパーツを組み合わせた結果にすぎず、ワークスペースとしては機能しません。ちょうどInterface Builderで組み立てただけのUIと同じく、“魂”である「モデル」を欠いている状態です。テキストを入力したり、その編集(cmd + Z/X/C/V)や、do it(cmd + D)、print it(cmd + P)などのキーショートカットは機能しますが、黄ボタンメニューを呼び出すことはできません。ちなみに、オリジナルのStringHolder >> #openAsMorphLabel:inWorld:では、#model:や#on:text:accept:readSelection:menu:が、このUIと“魂”とを接続する作業をしています。とりあえず今は、次の#addMorph:frame:のほうに注目してください。

    SystemWindow >> #addMorph:frame:は、Morph >> #addMorph:同様、サブモーフ(GUIウィジェット)をオーナー(システムウインドウ)に組み込むためのメソッドです。ただ、新しく設けられた第二パラメータとして添えるa Rectangle情報により、常にオーナーのどの範囲に位置するのかを指定することができます。#addMoprh:ではどうして駄目なのかは、実際に試してみればわかります。

    | window textMorph |
    window := SystemWindow labelled: 'My Text Window'.
    textMorph := PluggableTextMorph on: nil text: nil accept: nil.
    window addMorph: textMorph.
    window openInWorld: World
    


    [fig.D]#addMorph:では正常なウインドウを作ることができない…

     たしかに#addMorph:でもa PluggableTextMorph はサブモーフとして登録されますが、オーナーモーフであるウインドウの左上に固定されていて、ウインドウサイズ変更にも追従してくれません。これではウインドウとして使いものになりませんね。

    他方で、次のようにa PluggableTextMorphを二つ用意し、それぞれを#addMoprh:frame:するときに、適切なa Rectangle情報を与えることで、2ペイン(2つのテキスト編集欄)を持つウインドウを組み立てることが可能です。

    | window textMorph1 textMorph2 |
    window := SystemWindow labelled: 'Two Pane Text Window'.
    textMorph1 := PluggableTextMorph on: nil text: nil accept: nil.
    textMorph2 := PluggableTextMorph on: nil text: nil accept: nil.
    window addMorph: textMorph1 frame: (0@0 corner: 1@0.5).
    window addMorph: textMorph2 frame: (0@0.5 corner: 1@1).
    window openInWorld: World

    [fig.E]2ペインのウインドウ

     現在、残念ながらSqueakシステムには、OS XのInterface Builderのような優れたUIデザインユーティリティは組み込まれていません。したがって、ウインドウのデザインは、いちいちこうして、Smalltalkコードとして記述する必要があります。ちょっと面倒ですね。

    バックナンバー:

    ニュース・解説

     今週の解説担当:木下 誠

    ----------------------------------------------------------------------
    WWDC 2006情報
    ----------------------------------------------------------------------

    開催まであと二ヶ月と少しとなったWWDC 2006。チケットやフライトの手配はお済みでしょうか?

    ADCのサイトでは、WWDCのページが更新されて、Community Focusというページが登場しています。ここでは、アプリケーション開発者だけではない、Macプラットフォームに興味を持つプログラミングコミュニティに向けた情報が提供されています。

    登場しているのは、「Digital Media」「System Administration」「Games Development」「Scientific Computing」といった分野に向けたものです。いずれも、「GUI + Unix + Intel」といったMacの特徴を活かしやすいところと言えるでしょう。ま、そのためにはデベロッパが相当力を入れる必要があるでしょうが。

    また、WWDCを控えて、Appleのデベロッパリレーションズ担当副社長ロン・オカモト氏へのインタビュー記事がいくつか公開されています。WWDCの見所などを語っています。

    WWDC 2006
    http://developer.apple.com/wwdc/

    Digital Media
    http://developer.apple.com/wwdc/digitalmedia.html
    System Administration
    http://developer.apple.com/wwdc/sysadmin.html
    Games Development
    http://developer.apple.com/wwdc/games.html
    Scientific Computing
    http://developer.apple.com/wwdc/science.html

    「Boot Campはアプリ開発者にチャンスを生み出す」、米Appleデベロッパ担当副社長が語る
    http://itpro.nikkeibp.co.jp/article/NEWS/20060516/238122/
    【インタビュー】次期Mac OS X Leopard - Appleデベロッパリレーションズ担当副社長語る
    http://journal.mycom.co.jp/articles/2006/05/23/leopard/

    ----------------------------------------------------------------------
    Xcode 2.3
    ----------------------------------------------------------------------

    Xcode 2.3がリリースされました。新しいトピックとして、リリースノートによると、まずデバッグのフォーマットとしてDWARFを採用した事が挙げられています。DWARFを使う事で、デバッグイメージのサイズが小さくなり、パフォーマンスの低い環境でのデバッグが改善されるようです。

    また、Dedicated Network Builds (DNB)が利用できるようになった事も挙げられています。これは、分散ビルドの一種でしょうか。

    ----------------------------------------------------------------------
    ADC Referenceが再編
    ----------------------------------------------------------------------

    Xcode 2.3のリリースと併せて、ADC Referenceの構造も大きく変わっています。

    まず、ドキュメントリソースのタイプが、従来「Documentation」となっていたものが、「Guides」と「Reference」に分かれました。さらに、いままでは散在していたAPIリファレンスが、フレームワークごとに管理されるようになったようです。

    これからもドキュメントは増え続けるでしょうから、きちんとした管理を続けて欲しいものです。

    Newest Features of the ADC Reference Library
    http://developer.apple.com/macosx/newinreflibrary.html

    ----------------------------------------------------------------------
    オープンソースとUniversal Binary
    ----------------------------------------------------------------------

    オープンソースプロジェクトをUniversal Binaryに対応させるステップを紹介したドキュメント、「Building a Universal Binary Framework from Open Source」が公開されています。

    オープンソースの場合、Universal Binary移行の最大のポイントは、Xcode対応になります。多くの場合、オープンソースプロジェクトではMakefileを使っています。ですが、Universal Binaryパッケージを作るには、Appleが推奨する方法では、Xcodeを使う以外ありません。

    このドキュメントでは、MakefileをXcodeに移行させる手順を紹介しています。ただし、自動的に行なう方法はなく、プロジェクトの作成やファイルの登録を、一つ一つ手作業で行なっています。オープンソースプロジェクトでは、できるだけ多くのプラットフォームに対応する事が前提になっている事が多いので、この解説がどれだけ助けになるかは、少し疑問に感じますね。

    Building a Universal Binary Framework from Open Source
    http://developer.apple.com/opensource/opensourceuniversalframework.html

     

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

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

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

    2006-05-23

    目次

    • 「Wonderful Server Life」      第3回  田畑 英和
    • 藤本裕之のプログラミング夜話 #91
    • 高橋真人の「プログラミング指南」  第89回
    • ニュース・解説                小池 邦人

    「Wonderful Server Life」  第3回  田畑 英和

     Intelベースのシステムに新しくMacBookが加わりました。PowerMac G5やXserveなどのPowerPCベースのシステムもまだ残っておりますが、あと3ヶ月ほどすればWWDCも控えており、ハードウェアのIntel移行は思いのほか短期間で進んでいます。

    さて、今回からMac OS X Serverのインストール方法について解説していきたいと思います。Mac OS X ServerのインストールはMac OS Xのインストールを行ったことがあればさほど難しくはないのですが、次のようなケースも考えられます。

    ・Xserveにビデオカードを追加していない
    ・インストールディスクから起動できない
    ・1台のマシンでMac OS Xも使いたい
    ・旧バージョンのMac OS X Serverをすでに使っている
    ・一度に複数台の構築を行いたい

     様々なケースが考えられるのですが、まずは以下のようなケースを考えてみましょう。

    ・キーボード、マウス、モニタが本体につながっている
    ・インストールディスクから起動可能
    ・1台だけ新規にインストールする

     このようなケースでは、まずはインストールディスクから本体を起動します。インストール前にMac本体にすでになんらかのシステムが入っていれば、インストールディスクを本体に入れて「Install Mac OS x Server」という名前のアプリを起動し「再起動」ボタンをクリックします。
     あるいはインストールディスクが本体に入った状態で起動時にCキーを押しながら起動すればインストールディスクから起動します。Mac OS XはTigerになってから標準でDVDによるインストールディスクの提供が行われるようになりましたが、Mac OS X ServerはDVDとCDの両方でインストールディスクが提供されています。
     インストールディスクから起動すれば、あとは画面の指示に従って操作することによりインストールが実行できます。1台のマシンに複数のMac OSをインストールしたい場合には、インストール前にあらかじめパーティションを分割しておきましょう。インストールディスクでも起動中には「ディスクユーティリティ」を使用することもできますので、必要な数だけパーティションを作成しておくことができます。各パーティションに十分なディスク容量があればそれぞれMac OSをインストールすることができますので、たとえば1台のマシンをMac OS XとMac OS X Serverのデュアルブートにすることができます。
     インストール時にはインストールパッケージをカスタマイズすることもできます。プリンタドライバのインストールを省略してディスク容量を節約するのもよいでしょう。インストールが完了すればマシンが再起動し初期設定が始まります。

     ここまではMac OS Xのインストールと同じ手順ですが、Mac OS X Serverの場合はインストール前にあらかじめ準備しておきたいことがあります。事前に準備が必要なものは前回解説しましたが、場合によってはあと1つ準備しておきたいものがあります。それはDNSサーバへの登録です。
     v10.4からはホスト名の設定がDNSサーバを参照して自動設定されるようになりました。つまりこれから構築するサーバは、DNSサーバを参照して自分自身のホスト名を自動的に設定します。使用するサービス(たとえばオープンディレクトリ)によってはDNSに依存するものがありますので、できることならばインストール前にDNSサーバにこれから構築するサーバを登録(正引き、逆引きの両方)しておきましょう。DNSサーバを自由に管理できないような場合には、これから構築するサーバ上でDNSを動かすことも考えられます。
     自動設定されるホスト名は後から変更することもできますので、とりあえずDNSサーバへの登録をせずに作業を進めてしまうこともできます。
     これで今回仮定した環境であれば、インストール作業がおこなえます。では次にモニタが接続していないケースを考えてみましょう。Xserveは標準でビデオカードを搭載していませんので、モニタを接続して画面の指示に従ってインストールを行うことができません。
     そこでMac OS X Serverにはリモートでのインストール機能が用意されています。リモートでインストールを行うには「サーバアシスタント」というツールを使用しますが、こちらはMac OS X Serverの管理ツールの中に含まれています。管理ツールはMac OS X Serverをインストールしたときに「/アプリケーション/サーバ」フォルダにインストールされますが、これからインストールを行うわけですから、別途用意しておく必要があります。
     リモートインストールを行うにはネットワーク上の別マシン上に管理ツールをインストールしておく必要があります。管理ツールをインストールするマシンはMac OS Xでかまいません。管理ツールですが下記のURLからダウンロードすることができます。

    ・管理ツールダウンロードURL
    http://www.apple.com/jp/ftp-info/reference/serveradmintools104.html

     それでは次回は実際にリモートでのインストール方法について解説したいと思います。

    つづく

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

     さてゴールデンウイークはいかがだったろうか。なに? 仕事三昧でどこがゴールデンウイークなんだかわからんかった? ああ、皆さん、ここに今どき珍しいプログラマの鑑がおられましたぞ。そちらのあなたは? 4月末から9連休で海外に行ってきた? この人非人め、少しは発展途上国で飢えている子供たちのこととか考えなさい。

    そんなことはさておき、前回の最後でNSWorkspaceクラスのメソッド、 launchAppWithBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifier:(はぁはぁ長いな、これ)を使えば、なんとか課題である「アプリケーションをフォアグラウンドに持ってこないで起動する」ということができそうであると判った。問題は、このメソッドで起動したいアプリケーションを指定するやり方である。普通にフォアグラウンドで起動してしまう launchApplication:ならフルパスを指定すれば良かったのだが、こいつのパラメータは耳慣れぬbundleIdentifierというヤツである。このbundleIdentifierってなんだ?

    javaでプログラムを書いたことのある人は知ってると思うが、あの言語ではクラスの定義なんかを引っ張ってくるためにピリオド「.」で所属……というか分類をつなげて行くような文字列を使う。例えばjavaの標準クラスであるStringは、「java.lang.String」となるし、Calendarのクラスは「java.lang.Calender」となる。Mac OS Xでもこれをidentifier、つまり識別子に使っていて、例えばMailは「com.apple.mail」、iPhotoは「com.apple.iPhoto」てな具合に表現される。これだと、例えば誰かがMOSAブランドのメーラーソフトを作り、Appleの向こうを張って俺もこれを「Mail」と名付けるんだと言い張っても「jp.gr.mosa.mail」てな具合になって区別がつくわけね。ここまではよろしいか?

    本題に戻り、NSWorkspaceクラスのメソッド、launchAppWithBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifier:に渡すため、フルパスからこのbundleIdentifier、適当に翻訳するけどバンドル識別子をでっちあげなければならない。それにはどうするか。Xcodeのヘルプメニューから「マニュアル」を選択し、bundleIdentifier を検索してみると、そのものずばりのメソッドが NSBundleクラスに存在する。能書きは「レシーバーのバンドル識別子を返す」とある。すなわち以下のごとく、フルパスからNSBundleオブジェクトを作り、それにこのメッセージを送ればバンドル識別子がゲットできるという仕掛けだ。

    NSString*   fullPath;    // 目当てのアプリのフルパスが入ってるもんとする。
    NSBundle*  aBundle = [NSBundle bundleWithPath:fullPath];
                                      // フルパスからバンドルオブジェクトを作る。
    NSString*   bundleIdentifier = [aBundle bundleIdentifier];
                                      // そいつの識別子を獲得。

     これに、前回調べたオプション、それに起動したアプリケーションの識別子を受け取るためのNSNumberへのポインタを渡せば見事、バックグラウンドでアプリケーションが起動できる。

    NSNumber*   aIdentifier;
    
    [[NSWorkspace sharedWorkspace]
        launchAppWithBundleIdentifier:bundleIdentifier
        options:NSWorkspaceLaunchWithoutActivation
        additionalEventParamDescriptor:[NSAppleEventDescriptor nullDescriptor]
        launchIdentifier:&aIdentifier];
    


     ……どうですか。え? なんだかCarbonでやるのと同じくらい面倒な気がするって? うん、私も実はそう思います。そこで次回は、もっと簡単にこの課題がクリアできる、「伊東家の食卓」的裏技を一挙大公開しちゃう。乞うご期待。
    (2006_05_18)

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

    UNIXとしてのMac OS X

    〜Perlについて(35)〜

     こんにちは、高橋真人です。
     さて、Perlネタの最後のお話として解説しているリストデータをmap、grep、sortなどの演算子で順に受け渡しながら処理していくやり方ですが、あと一つだけ説明をしなければならないものがあります。リファレンスです。

     以下は、連載の84回目で紹介したスクリプトの末尾の部分です。

    ...
    grep { $_->[6] =~ /False/ }
    map { [(split /\t/)] }
    <>;

     前にご紹介したように、最終行の<>が生成したリストを後ろから前に順に渡していくわけですが、リストを最初に受けているmap演算子でちょっと奇妙なことをしています。これは何でしょうか? また、grep演算子のブロックの中には、$_->[6]などという見慣れないものがありますね。

    まず、splitという演算子は以前にも登場したと思いますが、対象となる文字列に対して、この場合は /\t/ という正規表現で表される文字列を区切りとして分割します。つまり、文字列をタブで分割してリストにします。
     問題なのは、この式を囲んでいる角カッコです。ちなみに丸カッコの方は演算の優先順位を指定するためのもので、ここではなくても変わりません。
     さて、この角カッコは何でしょうか?
     Perlで角カッコと言えば、まず最初に思い浮かぶのは使用頻度から言っても正規表現における文字クラスですが、角カッコの中にリストを表現する式があると、「無名配列生成子」というものになるのです。
     「無名」というのはあまり馴染みがない言葉かもしれませんが、C言語でも登場します。通常変数には名前が付けられますが、ポインタで指されることによって間接的に存在する変数には名前がない場合があります。これと同様にPerlではリファレンスという間接的に変数を指し示す方法があり、これで指された値を「無名○○」と呼びます。
     具体的な例を挙げましょう。$aという変数があったとき、変数の前にバックスラッシュ(日本語フォントでは円マークになりますが)を付けると、変数$aのリファレンスを返します。

    $a = 'abc';
    $ref_a = \$a;

     今、変数$ref_aは$aのリファレンスを持っていますから、間接的に文字列’abc’を指していることになります。
     $ref_aが間接的に保持している値を取り出す場合、デリファレンス(「参照外し」とか、「参照はがし」などとも言う)を行います。

    print $$ref_a;

     この式で、文字列’abc’が出力されます。
     次に、変数がリストの場合です。

    @list = ('abc', '123', 'ABC');
    $ref_list = \@list;

     リファレンスの値自体は、あくまでもスカラーですから、リファレンスを保持する変数は$ref_listであって、@ref_listとかにはなりませんのでご注意を。
     さて、リファレンスの指しているのが配列だった場合、デリファレンスした上にさらにいずれかの要素を指定しなければならないため、矢印演算子というのを使います。

    print $ref_list->[1];
    


     この式で、文字列’123′が出力されます。

     何だか、$$とか、$ref->だとか、見た目だけでも混乱しそうですね。Perlでリファレンスを使うと、いろいろと高度なワザが使えますが、必ずしもこれらはPerlの「必修ワザ」というわけではないので、今は「まあ、こんな感じかな?」ぐらいにとらえておいておけば充分です。

    さて、そこで無名配列です。Perlではリストと配列は微妙に異なっていたのを覚えていますか?

    @list = ('abc', '123', 'ABC');

     この式の右辺は、リストを生成しています。左辺では、@listという名の配列を宣言し、右辺で生成したリストを代入しています。ここまで、いいですね?

    $list_ref = [('abc', '123', 'ABC')];

     さて、無名配列生成子です。リストを生成する式を単に角カッコで囲んだだけです。これは、@listの前にバックスラッシュを付けて配列のリファレンスを取得する代わりに、ダイレクトに配列のリファレンスを作り出すのです。
     リストの各要素で初期化された配列が確かに生成されていますが、ここではその配列は名前を持ちません。だから、無名配列です。

     どうでしょうか? 何とか理解できましたか?
     では、いよいよ次回からまとめに入ります。

    ニュース・解説

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

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

    【開発環境】

    前号で木下さんも紹介されていましたが、WWDC2006のセッション内容が事前公開されました。それ以外にも、当日まで内容が秘密になっているセッションが沢山あるようですが、そろそろ観念してiPodの開発環境もオープンにしたらどうでしょうか(笑)。それから、Front Rowを外部からコントロールするためのAPIやTool Kitの公開にも期待したいところです。予想としては、PowerMac G5やXserveの後継機種(Mac Pro?)が登場しそうですから、インテル版64bit CPUに対する何かしらの発表があるかもしれません。64Bit版のCarbon &Cocoaはまだまだ無理かな?

    http://developer.apple.com/wwdc/sessions/

    以前紹介した、インテルCPUの仮想化技術を使いMac OS Xで別OS(LinuxやWindows XPなど)を起動することができる「Parallels Workstation 2.1」ですが、名称を「Parallels Desktop for Mac」と変更し、いよいよ最終β版に突入したようです。今回新しく登場したMacBookのCPU能力は十二分ですし、マルチディスプレイも可能ですから、外付けモニターを用意して、そちらではWindows XPを使うという必殺技も可能です(笑)。WWDCでは、Apple社独自の仮想化技術採用ソフトの発表も期待したいところです。

    http://www.parallels.com/en/download/mac

    にしても、見栄えとコストの関係からかもしれませんが、MacBookにテカテカ液晶が採用されてしまったのは、頻繁にソースコードを読んだり書いたりするのが仕事の我々にとってはデメリットのような気がします…。さて、どうでしょうか?

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

    前回から5月19日の期間中、Apple社のDocumentationサイトには新規ドキュメントが13登録されました。すべてが、「…Developer Note」という形態の技術仕様ドキュメントです。最近発表されたMacBookを加え、15インチと17インチのMacBook Pro、それからMac miniのDeveloper Noteも登録されています。加えて、デベロッパ向け読み物もひとつ登録されました。「MySQL on Mac OS X: An Ideal Development Combination」については、前号の木下さんの記事も参考にしてください。

    「MacBook Developer Note」(初版)
    「15-inch MacBook Pro Developer Note」(初版)
    「17-inch MacBook Pro Developer Note」(初版)
    「Mac mini Developer Note」(初版)
    「AirPort Developer Note」
    「Audio Developer Note」
    「Bluetooth Developer Note」
    「Ethernet Developer Note」
    「FireWire Developer Note」
    「PCI Developer Note」
    「RAM Expansion Developer Note」
    「Universal Serial Bus Developer Note」
    「Video Developer Note」

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

    「MySQL on Mac OS X: An Ideal Development Combination」(読み物)

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

    前回から5月19日の期間中、新規テクニカルノートはひとつ登録され、新規テクニカルQ&Aの方もひとつだけ登録されました。両方とも、前号の木下さんの記事も参考にしてください。

    TN2120「QuickTime for Windows ActiveX/COM Frequently Asked Question」(初版)

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

    QA1016「Changing the volume of audio devices」(初版)

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

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

    前回から5月19日期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードがひとつも登録されませんでした。

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

    【デベロップメント SDK】

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

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

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

     

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

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

    2006-05-16
     

    目次

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

    「Wonderful Server Life」  第2回  田畑 英和

     今年のGWは皆さんいかがでしたでしょうか? GW中にApple Store Ginzaに立ち寄ってみましたが、v10.4.6にアップデート済みのMac OS Xが販売されており、パッケージがずいぶんとコンパクトになっていました。Mac OS Xのパッケージは更新されましたが、Mac OS X Serverのほうはまだv10.4.0のまま販売が継続されているようです。

    さて、今回はこれからMac OS X Serverを使い始める方のために、なにを準備しなければならないかを解説したいと思います。まずなんといってもMac本体とMac OS X Serverが必要になるわけですが、Mac OS X Serverの入手方法につきましては前回ご紹介したとおりです。
     次にMac本体ですが、Mac OS X Server v10.4の正式なシステム要件は次のようになっています。Mac OS X Serverが付属しているXserveだけではなくPower Mac G5などのデスクトップ機にもインストールすることが可能です。

    [[Mac OS X Serverのシステム要件]]
    ・PowerPC G3、 G4、または G5プロセッサ
    ・内蔵FireWire
    ・128MB(メガバイト)以上のRAM。
    ・4GB(ギガバイト)以上の空きディスク容量
    ※Mac OS X Server v10.4の技術仕様
    http://www.apple.com/jp/server/macosx/specs.html

     ここでまず気になるのがIntel Macへの対応ですが、Mac OS X ServerはまだIntel Macには正式に対応していません。コンパクトなMac miniをサーバとして使いたいというかたもいらっしゃるかと思いますが、ハードウェアが次々とPowerPCからIntelへと移行しているわけですから、いずれMac OS X ServerもIntelに対応してくることでしょう。
     時期的なことはさっぱり分かりませんが、XserveにMac OS X Serverが付属していることから、Intel版のXserveがリリースされるころには対応するのではないかと思います。

    基本的にはデスクトップ機でMac OS X Serverを使用することになりますが、ノートパソコンにインストールすることもいちおう可能です。検証用に使ったりとか、持ち歩いてデモをするのであればPowerBookなどにインストールするのもよいでしょう。ただし、Mac OS X Serverはサーバとして使用するOSであり、DHCPなどを利用してIPアドレスが頻繁に変更されるような環境はあまり好ましくありません。基本的には固定のIPアドレスを使用して常時ネットワークに接続しておくのがよいです。
     また、キーボードやディスプレイは必ずしも必要ありません。ネットワーク上に別のMac(Mac OS Xでもかまいません)があれば、リモートでインストールから実行することができます。リモートでのインストールについては本連載で取り上げていく予定です。

    システム要件を満たすMac本体が1台とMac OS X Serverがあればさっそくインストールを開始できますが、できればもう1台Macを用意しておきたいところです。場合によってはリモートでのインストールに使用するためというのもあるのですが、サーバ機は単体で使用するものではなく、ネットワーク上でほかのクライアントコンピュータにサービスを提供することが目的となりますので、実際にサービスを利用してみるにはクライアントとして使用するMacがある方がよいです。
     クライアントとして使用しますので、2台目のMacはMac OS Xでかまいません。またサーバとクライアントを接続するためのネットワークも必要になります。2台だけでネットワーク接続する場合はお互いをネットワークケーブルで直結することもできます。また、検証目的で使用するのであれば、ほかのコンピュータに影響を与えないために独立したネットワークを構築するのもよいでしょう。

    あと必要なものといえばサーバ管理に関する知識でしょうか。もっともこれからMac OS X Serverでサーバ管理デビューだという方もいらっしゃるかと思いますが、サーバ管理に関する知識はどうしても必要になってきます。具体的にどういった知識が必要になるかはサーバの使用目的によっても違ってきますがネットワークに関する知識や各種プロトコルに関する知識が必要になってきます。
     ただ操作をするだけであればMacユーザにとってMac OS X Serverの操作はけして難しくはありません。なにせ見た目はそっくりそのままMac OS Xなのです。FinderもDockもDashboardもSpotlightも使用できますし、iTunesやiChatまで付属しています。基本的な設定も専用のサーバ管理ツールが付属していますので、容易に設定を行っていくことができます。ただし、サーバの管理をするわけですから、運用が始まると様々なトラブルにも対応していかなければなりません。そういったときにはただ設定方法を知っているだけというのと、その背後でどのような処理が行われているのかを知っているのとでは随分と違いが出てきます。
     Mac OS X ServerはUnixベースのOSですので、Unix向けに制作された解説書や雑誌の記事なども十分参考になるはずです。ほかのサーバOSの管理経験があれば、まずは基本的な操作方法をマスターすればよいでしょう。

    Unixというとコマンドベースであれこれと設定するといったイメージがあるかもしれませんが、Mac OS X Serverには専用のGUIベースの管理ツールが付属していますので、コマンドにたよらなくとも管理を行うことが可能です。コマンドラインでの操作のほうが慣れているという場合でも、基本的なUnixコマンドはもちろん使用できますし、Mac独自のコマンドというのも色々と用意されています。
     さて、今回はこのへんにいたしまして次回はMac OS X Serverのインストールについて解説したいと思います。

    つづく

    小池邦人のCarbon API 徒然草(2006/05/13)

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

    今回は、画像(ビットフィールド)を処理するアプリケーションにおけるエンディアンの違いの影響について見てみます。例題として、OpenGLのテクスチャ画像を作成する場合について解説します。

    今回の例では、OpenGLでテクスチャ画像を利用するために、オフスクリーン(GWorld)を作成し、そこにPICT画像(Picture)を表示した後に、その画像データフォーマットの内容をテクスチャ画像フォーマットへと変換します。まずは以下のsetupOpenGL()ルーチンで、PICT画像を表示するためのGWorld(CGrafPort)を作成し、画像領域の先頭アドレスやRowBytes(横幅のバイト数)を外部変数へと保存しておきます。

    GWorldPtr        g_off;    // 作成したオフスクリーン用GWorld
    unsigned long    g_row;    // オフスクリーン画像領域のlong Bytes数
    unsigned long    *g_add;   // オフスクリーン画像領域の先頭アドレス
    
    short setupOpenGL(void)
    {
        short           ret=1;
        Rect            srt;
        PixMapHandle    phd;
    
        SetRect( &srt,0,0,512,512 ); // オフスクリーンのサイズは512x512ピクセル
        if( ! NewGWorld( &g_off,32,&srt,NULL,NULL,0 ) ) // フルカラーGWorldを作成
        {
            phd=GetGWorldPixMap( g_off );   // GWorldのPixMapHandleを得る
            LockPixels( phd );              // 画像領域(PixMapHandle)をロック
            g_add=(unsigned long *)GetPixBaseAddr( phd ); // 先頭アドレスを得る
            g_row=GetPixRowBytes( phd )>>2; // RowBytesを得てlong Bytes数に変換
            ret=noErr;
        }
        return( ret );
    }

    次のcreateOpenGLTexture()は、引数で渡されたPICT画像を確保しておいたGWorldへ描画し、その画像データフォーマットを変換した後に、外部変数のbuf1へ保存するためのルーチンです。unsigned longにマッピングされたMacintosh用画像フォーマットはαRGB(αは透明度)ですが、OpenGL用のテクスチャ画像フォーマットはRGBαとなります。ですから、オリジナルデータを8bit左へシフトさせ、透明度として0xffを追加する変換操作が必要となるわけです。また、GWorld画像バッファのアドレス原点は左上なのに対して、テクスチャ画像のアドレス原点は左下となりますので注意してください。

    unsigned long    g_buf1[512][512]; // OpenGLのテクスチャバッファ 512x512ピクセル
    
    void createOpenGLTexture( PicHandle pict )
    {
        unsigned long   *pp,*add,data;
        Rect            frt,srt,drt;
        CGrafPtr        cptr;
        long            i,j;
    
        GetPort( &cptr );
        SetPort( g_off );                    // カレントポートをオフスクリーンに
        add=g_add;                           // 先頭アドレスを代入する
        SetRect( &frt,0,0,512,512 );         // テクスチャ画像の矩形枠を設定
        PaintRect( &frt );                   // オフスクリーンを黒色でクリア
        if( pict )
        {
            QDGetPictureBounds( pict,&srt ); // PICT画像の矩形枠を得る
            fitBounds( 1,&frt,&srt,&drt );   // フレーム枠に合わせる自作ルーチン
            DrawPicture( pict,&drt );        // オフスクリーンへPICT画像を描画
        }
        for( i=511;i>=0;i-- )                // 縦は逆方向から代入していく
        {
            pp=add;
            for( j=0;j<512;j++ )                // 横幅の512回分だけ変換操作を行う
                g_buf1[i][j]=((*pp++)<<8)+0xff; // 左へ8bitシフトさせα値を代入
            add+=g_row;                         // 先頭アドレスを横幅分増加させる
        }
        SetPort( cptr );
    }
    


    さて、上記はあくまでもビックエンディアン用(PowerPC用)のルーチンとなります。リトルエンディアン(Intel版CPU用)の場合には、メモリから読み込んだunsigned long値が反転しているわけですから、上記のままでは画像データは正常に変換されません。シフト操作が逆方向に働き、青色成分(B)が飛んでしまい全体に黄色い画像となってしまいます。よって、リトルエンディアンの場合にのみ、以下のようにデータの変換直前と変換直後にスワップ操作を入れてやる必要があります。

    #if __LITTLE_ENDIAN__      // リトルエンディアンの場合
        for( i=511;i>=0;i-- )
        {
            pp=add;
            for( j=0;j<512;j++ )
            {
                data=Endian32_Swap( *pp++ );       // 読み込みunsigned long値を反転
                data=(data<<8)+0xff;               // 画像データの変換操作
                g_buf1[i][j]=Endian32_Swap( data );// 書き込みunsigned long値を反転
    
            }
            add+=g_row;
        }
    #else                      // ビックエンディアンの場合
        for( i=511;i>=0;i-- )
        {
            pp=add;
            for( j=0;j<512;j++ )
                g_buf1[i][j]=((*pp++)<<8)+0xff;
            add+=g_row;
        }
    #endif
    


    しかしこのままでは、処理速度にシビアであるべき画像フォーマット変換ルーチンとしてはかなり余分な処理を実行しており、決して効率が良いとは言えません。よって、ビット操作とα値の付加をリトルエンディアンに最適化したやり方に切り換えてしまいます。これにより、Intel版CPUでの画像フォーマット変換作業量はPowerPC版とまったく同じとなり、効率の良い処理が可能となります。

    void createOpenGLTexture( PicHandle pict )
    {
        Rect            frt,srt,drt;
        unsigned long   *pp,*add;
        CGrafPtr        cptr;
        long            i,j;
    
        GetPort( &cptr );
        SetPort( g_off );
        add=g_add;
        SetRect( &frt,0,0,512,512 );
        PaintRect( &frt );
        if( pict )
        {
            QDGetPictureBounds( pict,&srt );
            fitBounds( 1,&frt,&srt,&drt );
            DrawPicture( pict,&drt );
        }
        #if __LITTLE_ENDIAN__     // リトルエンディアンに最適化した場合
        for( i=511;i>=0;i-- )
        {
            pp=add;
            for( j=0;j<512;j++ )
                g_buf1[i][j]=((*pp++)>>8)+0xff000000; // 右へ8bitシフトして
            add+=g_row;                               // α値(0xff)を追加する
        }
        #else                    // ビックエンディアンに最適化した場合
        for( i=511;i>=0;i-- )
        {
            pp=add;
            for( j=0;j<512;j++ )
                g_buf1[i][j]=((*pp++)<<8)+0xff;
            add+=g_row;
        }
        #endif
        SetPort( cptr );
    }
    


    次回は、もう少し詳しく画像データフォーマットに関連した例題を調べてみます。また、DICOM画像など、内部データフォーマットがエンディアンに依存しているファイルを取り扱う時の注意点についてもお話しする予定です。

    つづく

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

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

    前回まで4回にわたってポップアップメニューを“解剖”し、それがモーフの組み合わせで構成されていること、メニュー項目モーフ自身が、マウスで選択されたときに実行すべきことを「ターゲット」と、それに送る「メッセージ」(厳密には「セレクタ」とそれに添える「パラメータ」)というかたちで情報を保持していることを確かめました。ずいぶん間が開いてしまいましたが、当初のお約束通り、次は「ウインドウ」の番です。

    ウインドウもまた、ポップアップメニュー同様、枠、あるいは土台となるオーナーモーフと、細部を構成するたくさんのサブモーフからできあがっています。Squeakのウインドウは、MacやWindowsのウインドウに大まかなデザインが似せてあり、その構成成分や役割も(前回までのポップアップメニューよりは)身近でイメージしやすいと思います。そこで、サブモーフの選択や操作方法の復習を兼ねて、ちょっとしたイタズラ気分で、ウインドウを文字通りバラバラに分解してみることにしましょう。

    “生け贄”にはワークスペースを選びます。デスクトップメニューから「開く…」→「ワークスペース」を選択して、ウインドウを開いてください。

    ウインドウに対する一回目のコマンドクリックでは、そこにあるモーフ(オーナーモーフ。ウインドウなら外枠)が選択状態になります。モーフは選択されるとハローが周りに現れます。

    [fig.A]モーフとして選択されたウインドウ

     この状態で再度クリックすると、クリックした場所にあるサブモーフが選択されます。たとえば、タイトルバーをクリックすれば、タイトルバーを構成するモーフの周りに改めてハローが現れます。このとき、それまでウインドウの周りにあったハローは消え、選択対象が移ったことを伝えてくれます。

    [fig.B]サブモーフとして選択されたタイトルバー

     この状態で、黒色のハローをクリックして“持ち上げる”と、タイトルバーをウインドウから“切り離す”ことが可能です。こうして、タイトルバーを一度取り外してしまうと(つまり、オーナーモーフであるウインドウ本体との関係を断ち切ると)、ドラッグしてウインドウを動かしたり、逆にウインドウの動きに追従することはできなくなります。

    このタイトルバーもやはりサブモーフより成っています。コマンドキーを押しながら連続でクリックして選択した後、先ほど同様、黒色ハローをクリック、あるいは、ドラッグすることで部品として組み込まれたサブモーフたちを次々と取り外してゆくことが可能です。タイトルはテキストのモーフ、ボタンはボタンモーフとスケッチモーフの組み合わせ、タイトルバーの濃淡は2つの明度の異なる矩形モーフの組み合わせで表現されていることがお分かりいただけることと思います。

    テキストを入力したり表示する部分についても、同様のことが可能です。タイトルバー以外の領域には「プラガブルテキスト」というテキスト入力欄のモーフが設置されています。プラガブルテキストモーフは、さらにその右端にスクロールバーをサブモーフとして持ち、そのスクロールバーは、矩形モーフやボタンモーフの組み合わせで構成されています。

    [fig.C]ほとんどすべてを分解したウインドウ

     このようにとことん分解してしまえば、もちろん、ウインドウのいくつかの機能は失われてしまいます。しかし、それでも、スクロールバーのボタン群やスクロールボックスなどは、健気にその役割を演じ続けます。なにかこう、オブジェクトの“生命力”のようなものすら感じられてきそうですね。

    では、このウインドウはいったん破棄して、別の角度からモーフとしてのウインドウを解析してみましょう。なお、バラバラにしてしまったウインドウは、それぞれのモーフをコマンドクリックして改めて選択し、×印ハローのクリックで削除可能です。また、一括して選択し、削除してもよいでしょう。隣接する複数のモーフを一括して選択するには、選択したいモーフを囲むようにshiftキーを押しながらマウスをドラッグして青枠の矩形を描きます。削除したいモーフだけが選択されていることを確認した後、×印ハローをクリックすれば、青枠の矩形内のモーフはいちどきに削除できます。なお、あとでイメージを保存せずにSqueakを終了すれば、結果的に破棄したも同然なので、面倒ならば(多少邪魔になりますが…)そのままでも結構です。

    再び新しいワークスペースを開いて、コマンドクリックでモーフとして選択し、今度は、灰色のデバッグハローをshiftキーを押しながらクリックすることでウインドウのインスペクタを開きます。

    [fig.D]ウインドウのインスペクタ

     ポップアップメニューのときと同様に、submorphsというインスタンス変数には、サブモーフが配列の要素として束縛されているのが見てとれるでしょう。第一階層のサブモーフは、さきほどの分解でもおわかりいただけるように、タイトルバーとテキスト入力欄の2つです。

     インスペクタのワークスペース(下のペイン)で、

    submorphs do: [:each | each inspect]

    とタイプして入力し、do it(cmd + D)すると、タイトルバーとテキスト入力欄、それぞれのモーフのインスペクタを開くことができます。そこにあるsubmorphsの中味をたどることで、先ほど実際に分解したのと同じ情報を、今度はウインドウを破壊せずに得ることができます。

    バックナンバー:

    ニュース・解説

     今週の解説担当:木下 誠

    ----------------------------------------------------------------------
    WWDC 2006のセッション情報が公開
    ----------------------------------------------------------------------

    開催まであと三ヶ月となったWWDCですが、セッションの内容が公開されました。100近くのセッションの、タイトルと簡単な説明が紹介されています。

    現在公開されているのは、10.4以前から有効な内容のみです。10.5で新規に登場する機能に関するものは、まだ伏せられています。最終的に、セッションの数は130以上になるそうです。

    WWDC 2006
    http://developer.apple.com/wwdc/

    ----------------------------------------------------------------------
    Cocoaセミナー初級編が開催
    ----------------------------------------------------------------------

    アップルコンピュータが、去る5/1に、「Cocoaセミナー初級編」を開催していました。同様の内容のセミナーを、5/25にも行ないます。参加費用は無料ですが、参加資格としてADCのSelect/Preimer会員であることが必要になっています。

    内容は、C言語の習得者向けに、Cocoaアプリケーションの作成を一から解説します。講師は、私木下がつとめております。

    Cocoaセミナー初級編
    http://developer.apple.com/jp/briefing/cocoa1/

    ----------------------------------------------------------------------
    MySQLへのインタビュー
    ----------------------------------------------------------------------

    オープンソースのデータベースとして広く使われている、MySQLのMac OS X対応状況に関するインタビューが掲載されています。MySQL ABのBrian Akerが答えています。

    MySQLのTigerへの対応、Intel Macへの対応、Cocoaアプリケーションへの対応、などが紹介されています。Cocoaへの対応では、MySQL Workbenchと呼ばれるERD (Entity Relationship Diagramming)ツールが公開されているそうです。

    MySQL on Mac OS X: An Ideal Development Combination
    http://developer.apple.com/business/macmarket/mysql.html

    ----------------------------------------------------------------------
    QuickTime for WindowsのFAQ
    ----------------------------------------------------------------------

    QuickTime for Windowsを、Active Xから利用するときのFAQ、「QuickTime for Windows ActiveX/COM Frequently Asked Questions」が公開されています。Visual BasicとC#でのサンプルが公開されています。

    最近、Windows向けの情報に力が入っていますね。ちなみに、同じくWindows向けのApple製品である、iTunesもActive Xを使ってコントロールする事が出来ます。

    TN2120: QuickTime for Windows ActiveX/COM Frequently Asked Questions
    http://developer.apple.com/technotes/tn2006/tn2120.html

    ----------------------------------------------------------------------
    オーディオデバイスに関するQ&A
    ----------------------------------------------------------------------

    オーディオデバイスに関するQ&A、「Changing the volume of audio devices」が公開されています。Core Audio APIを使って、デバイスのボリュームの取得、および変更を行う方法が説明されています。

    QA1016: Changing the volume of audio devices
    http://developer.apple.com/qa/qa2006/qa1016.html

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

     

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

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

    2006-05-02

    目次

    • 「Wonderful Server Life」      第1回  田畑 英和 ★新連載★
    • 藤本裕之のプログラミング夜話 #90
    • 高橋真人の「プログラミング指南」  第88回
    • ニュース・解説                小池 邦人

    「Wonderful Server Life」  第1回  田畑 英和

     さて、今回から新連載のスタートです。皆様よろしくお願いします。本連載ではMac OS X Serverについて取り上げ、その活用方法をご紹介していきたいと思います。

    さっそくですが、皆さんMac OS X Server使ってますか? 使い方がよく分からずにほったらかしにしていませんか? Mac OS X Serverには専用の管理ツールが付属していますので、簡単に管理ができそうに思えますが、サーバの管理をするからには注意しなけばならないことも色々と出てきますし、基礎的な知識も必要になってきます。
     サーバでは、他のユーザに様々なサービスを提供することになりますので、適切なサーバ管理ができていないと、他のユーザに迷惑をかけてしまうこともありえます。もっとも、兼任でサーバ管理をやっていて本業のほうもあるのでとても十分な手間をかけていられないという方もいらっしゃるかと思いますが、そういった方こそじっくりとサーバ管理に取り組んでいただくことにより、効率的なサーバ管理ができるようになるというものです。
     というわけで、本連載は次のような方々をターゲットにしていきたいと思います。

    ・Mac OS X Serverはあるけれども使い方がいまいち分からない
      いきなり管理ツールをいじったところで、各設定項目の意味が分かっていなければ適切な管理はできません。本連載では各種設定が実際にどのような意味があるのかを解説していきます。
    ・興味はあるが使ったことがない
      まずはMac OS X Serverでどういったことが実現できるのかを知りたいのではないでしょうか。本連載では具体的にどこのようなことが実現可能なのかについても取り上げて行きます。
    ・他のプラットフォームでのサーバ管理経験はある
      基礎知識やサーバの管理経験があれば、あとはツールの使い方などのMac固有なことが分かれば、比較的容易にサーバ管理が始められるでしょう。ツールの操作方法についてもなるべく具体的に解説を行なう予定です。

     逆に本連載では、Mac OS X Serverに直接依存しないような基礎的な知識、特にネットワークやInternetに関することはあまり細かくは解説しない予定です。そういったトピックについてはWebで情報を検索することもできますし、専門書も多数出版されていますので、他にも学習する機会は色々あるかと思います。必要に応じて解説を行なうことはあるかもしれませんが、本連載のテーマはあくまでも「Mac OS X Server」ですので、うまくバランスをとりながら連載を続けていければと思います。

    ◇Mac OS X Serverの入手方法
     それではまずMac OS X Serverの入手方法から解説していきます。まずライセンスには10クライアント版とUnlimitedクライアント版の2種類があり、それぞれ価格が異なっています。

    ・Mac OS X Serverの価格
      10クライアント版:52,000円(税込み)
      Unlimitedクライアント版:98,000円(税込み)

     このライセンスがどう違うかですが、まずはアップル社のWebサイト上にある、ライセンス数の制限についての説明をそのまま引用しておきましょう。

    ・Mac OS X Serverの仕様
    http://www.apple.com/jp/server/macosx/specs.html
      …このクライアント数の制限は、MacintoshおよびWindowsのファイル共有サービスを同時に接続するクライアント数のみに適用されます。

     つまり、ファイルサービスを提供する場合、10クライアント版では同時に接続可能なクライアント数に制限があるということです。逆にそれ以外のサービスについてはライセンス上の制限ありませんので、10クライアント版であっても、例えばメールサーバでは10名以上のユーザをサポートすることができます。
     どちらのライセンスを購入するかですが、Mac/Win向けのファイルサービスを利用するかどうかと、ファイルサービスを利用する場合に必要とするクライアント数を確認しましょう。このとき、現時点での状況と将来クライアント数が増えるかどうかも検討しておきましょう。
     予算に余裕がある場合は最初からUnlimitedクライアント版を購入しておいてもよいでしょうし、予算を最小限に抑えたいのであれば、まずは10クライアント版から始めればよいでしょう。
     もし将来クライアント数が増えて10クライアント版では対応しきれなくなった場合ですが、10クライアント版をUnlimitedクライアント版にアップグレードすることができる「Mac OS X Server v10.4ライセンスアップグレード」が52,000円で販売されています。あとからアップグレードしたほうが若干割高になりますが、最初からUnlimitedクライアント版を購入するのとほとんど価格は変わりません。このライセンスアップグレードはオンラインのAppleStoreでも購入することができます。

    適切なライセンスを選択してパソコンショップ、Apple Store、代理店などでパッケージを購入すればよいわけですが、Mac OS X Serverがハードウェアにあらかじめバンドルされている製品もあります。Xserveを購入した場合にはMac OS X Serverが付属していますので、パッケージを別途購入する必要はありません。ただしXserveのモデルによって付属するMac OS X Serverのライセンスが異なっていますので、購入前によく確認を行なってください。

    またあまり知られていないようですが、Mac OS X Serverにはライセンスを複数購入した場合に割引のある「ボリュームライセンスプログラム」や、3年間はメジャーアップグレード版を受け取るこのできる「ソフトウェア自動送付サービス」といったプログラムも用意されており、それぞれ教育機関向けの特別価格も設定されています。

    ・Appleボリュームライセンスプログラム
    http://www.apple.com/jp/software/volumelicensing/avl.html
    ・Appleソフトウェア自動送付サービス
    http://www.apple.com/jp/software/volumelicensing/amp.html

     というわけで、第1回目の連載ではまずMac OS X Serverの入手方法について解説しました。今後はあと数回にわたって概要的な解説を続けてから、具体的にどのようなサービスを、どのようにして提供することができるのかを解説していく予定です。
     もし本連載に関するリクエストやMac OS X Serverに関するご質問などありましたら、連載で取り上げていきたいと思いますのでhtabata@mac.comまでご連絡いただければと思います。それでは新連載これからもよろしくお願いします。

    つづく

    【著者プロフィール】
    田畑 英和(タバタ ヒデカズ) htabata@mac.com
    Apple Certified Trainer, Apple Certified System Administrator
    2006年4月からサラリーマン生活にピリオドをうってとうとう独立。現在はフリーランスとして、WebObjectsによるWebシステムの開発や、アップル認定トレーニングのトレーナーとして活動中。
    MOSAではこれまでメルマガにWebObjectsの記事を連載したり、湘南セミナーでの講師をつとめる。

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

     前回ここに「Carbonではこうやる」と言って紹介したアプリケーションを起動するコードについて、もしかしたらくるかも知れないと半分期待していた「ちっちっち、フジモトさんそのやり方はもう古いんですよ、今はもっと便利なAPIがあるんです」というご指摘は来なかった。なんとなく「南野陽子が来なかった東京ドームの電脳遊園地」みたいな寂寞とした空気が流れているような気がするが、Carbonのヒトって未だにあんなに面倒くさいコード書いてるの?

    とはいえ、前回も書いたように、こういうコードを書いていれば細かなオプションも指定可能である。例えばlaunchControlFlagにlaunchDontSwitchを指定すれば、目的のアプリケーションをバックグラウンドで起動出来たりする。Cocoaではそれは出来ないの? それを今回は調べていこうというわけ。

    普通、Cocoaのアプリケーションから他のアプリを起動するときに使うシーケンスは以下のものである(前回も書いたけど念のためね)。

    NSString*   aPath;  // ここに起動したいアプリのフルパス
    [[NSWorkspace sharedWorkspace] launchApplication: aPath];
    
    ……簡単だ。だけど簡単すぎて、アプリに「起動はするけどフォアグラウンドにくるな」とか伝える手管はどこにもない。ここで普通考えるのは「そんぢゃNSWorkspaceにそれが可能な他のメソッドがあるよ、きっと」ということだよね。で、読者諸兄の手間を省いて同クラスの、「launch」で始まるメソッドを以下に列挙してみる。
    
    (1) - (BOOL)launchApplication:(NSString *)appName
    (2) - (BOOL)launchApplication:(NSString *)appName showIcon:(BOOL)showIcon autolaunch:(BOOL)autolaunch
    (3) - (BOOL)launchAppWithBundleIdentifier:(NSString *)bundleIdentifier options:(NSWorkspaceLaunchOptions)options additionalEventParamDescriptor:(NSAppleEventDescriptor *)descriptor launchIdentifier:(NSNumber **)identifier
    


     (1)は普通のやつ、(2)は「daemon-likeなアプリのために用意されている」と解説にあるメソッドで、showIconというパラメータはつまり「そのアプリが起動していることをDockにアイコンだしてユーザに報せるかどうか」。autolaunchは「マシンの起動時に自動的に起動させるかどうか」である。これは使えない。次の(3)、やたらパラメータの多いやつは期待出来そうだがどうか。

    解説によれば、こいつのoptionという2番目のパラメータで、CarbonのlaunchControlFlagに渡すような指定を行えるようだ。ここで指定可能なのは、

    enum {
       NSWorkspaceLaunchAndPrint = 0x00000002,
       NSWorkspaceLaunchInhibitingBackgroundOnly = 0x00000080,
       NSWorkspaceLaunchWithoutAddingToRecents = 0x00000100,
       NSWorkspaceLaunchWithoutActivation = 0x00000200,
       NSWorkspaceLaunchAsync = 0x00010000,
       NSWorkspaceLaunchAllowingClassicStartup = 0x00020000,
       NSWorkspaceLaunchPreferringClassic = 0x00040000,
       NSWorkspaceLaunchNewInstance = 0x00080000,
       NSWorkspaceLaunchAndHide = 0x00100000,
       NSWorkspaceLaunchAndHideOthers = 0x00200000,
       NSWorkspaceLaunchDefault = NSWorkspaceLaunchAsync | NSWorkspaceLaunchAllowingClassicStartup
    };
    


    こんだけである。上から4番目にNSWorkspaceLaunchWithoutActivationというのがありますな。ではこれを指定すれば目的を達することができそうである。descriptor は AppleEvent パラメータとあるから、上の例えばNSWorkspaceLaunchAndPrint とかを使う際にプリントしたいファイルを指定したりするのに使うわけで、オレ達の目的には関係ない。……やれやれ、思ったより簡単でしたな……。

    そうか? ほんぢゃその起動するアプリはどう指定するの? パラメータの最初のやつは launchApplication: やlaunchApplication:showIcon:autolaunch: なんかの (NSString *)appName と違って (NSString *)bundleIdentifier である。この bundleIdentifier 何だ? ……というのを次回の話にしよう。あ、念のために言っておくとこれに無理やりフルパスを渡すとプログラムはハングしちゃいますから。
    (2006_04_28)

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

    UNIXとしてのMac OS X

    〜Perlについて(34)〜

     こんにちは、高橋真人です。
     さて、今までsort、grepと説明してきて、今回は最後のmapです。
     mapという演算子は、一般にforまたはforeachと似た目的のために使われます。foreach演算子はリストの各要素に対して処理を行うものですが、mapも同じようにリストの各要素に処理を加えます。
     では何が違っているのかというと、それは記述の仕方です。まずは例を見てください。

    --- 例1
    @list = (0, 1, 2, 3, 4, 5);
    foreach (@list) { print $_ * 2 }
    
    --- 例2
    @list = (0, 1, 2, 3, 4, 5);
    map { print $_ * 2 } @list;
    


     例1も例2も共に出力結果は同じで、0246810となります。
     この例を見ると、foreachとmapではリストの渡し方が異なることが分かります。foreach演算子(for演算子も全く同じ形で使えます)では、ブロックの前にリストがあります。ちなみに、以前にも出てきたように、以下のような書き方をすることもあります。

    foreach $item (@list) {
    #$itemに対する処理
    }
    


     この書き方では、リストの各要素は一時的に変数$itemに入れられた形で使われますが、$itemの部分を省略した場合には$_が代わりに使われます。これが先に示した使い方です。
     さて、この部分を見る限りでは両者の違いは単に構文の違いだけのように見えます。ところが実はこれは少し作為的でして、map演算子をこのような形で使うことは通常はありません。
     mapも、今まで見てきたsortやgrepと同じように「リストを受けて、リストを返す」という仕組みを持っているので、仮に今回のような処理を行うのであれば、以下のような書き方をするのがより一般的です。

    @list = (0, 1, 2, 3, 4, 5);
    print map { $_ * 2 } @list;
    


     これが、map演算子の使い方の自然な形です。少し分かりにくいかもしれませんが、print演算子はあくまでmap演算子が返したリストを出力しているということに注意しましょう。
     ところで、連載の83回目の最後に、「リストを受けてリストを返す演算子」として、「map、grep、foreach」と書いていますが、これは、「map、grep、sort」の間違いでした。今さらですが訂正させていただきます。

     では、もう少しmapについて見ていきましょう。
     map演算子も、sort、grepと同じようにブロックを持ちます。このブロックの中で、$_経由で渡されるリスト内の各要素に対して処理を加え、ブロックの評価値(例によって、ブロック内の最後の式の値がそれになります)を返します。
     よって、上記の例のようにリストの各要素をそれぞれ2倍したリストが返されるような処理ができるわけです。
     ところで、前々回のsortの時にもお話ししたように、mapのブロック内で$_に加える処理は、そのまま元の値にも反映されます。(Cの関数における参照渡しと同じと考えてください)

    @list = (0, 1, 2, 3, 4, 5);
    @list2 = map { $_ *= 2 } @list;
    print "@list\n";
    print "@list2\n";
    


     この例では、$_ *= 2 と、$_自体の値を変更しているために、mapの結果を受けている@list2だけでなく、元の@listの中身も(変更されて)同じになっていることが分かります。
     とはいえmapは、sortの場合とは違いブロックの中で処理した値はそのまま新しいリストの要素として使われることが多いので、

    @list = map { $_ * 2 } @list;

     この例のように、@listの中身をそのまま入れ替えてしまえば結果的には余り影響はありません。ただ、中で何が起こっているのかは把握しておかないと、思わぬバグに見舞われて混乱することになるかもしれません。

    ニュース・解説

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

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

    【開発環境】

    前号で木下さんも紹介されていましたが、WWDC2006の関連ウェブサイトが更新され、Leopard(Mac OS X 10.5)のプレビュー版が発表されることが正式に明記されました。今のところ、Leopardがどうなるかについてはほとんど情報が流れていませんので、どんな進化を見せてくれるのか、今からとても楽しみです。

    http://developer.apple.com/wwdc/

    それに加えて「Apple Design Awards 2006」の開催の告知と作品の募集も始まりました。皆さん、チャレンジしてみてはいかがでしょうか?

    http://developer.apple.com/ada/

    前回紹介した「Parallels Workstation 2.1」ですが、あれから2回改良があり、現在はβ5となっています。なにやら10万人以上のユーザがダウンロードして試しているとか! 最終β版ではUSBにも対応し(まだ色々と問題があるようですが...)フルスクリーンモードでは、ファスト・ユーザ・スイッチのような「画面がぐるりと回る」エフェクトにより、OSの切り換えが可能になったようです(笑)。完成までもう一息といった感じでしょうか?

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

    前回から4月28日の期間中、Apple社のDocumentationサイトには新規ドキュメントが13登録されました。「...Developer Note」関連のドキュメントは、ほとんどが内容の更新です。ただし、「Mac mini Developer Note」と「15-inch MacBook Pro Developer Note」は今回が最初の登録となります。また、J2SE 5.0に関するリリースノートとデベロッパ向け読み物がひとつ登録されています。

    「RAM Expansion Developer Note」
    「Mac mini Developer Note」(初版)
    「15-inch MacBook Pro Developer Note」(初版)
    「AirPort Developer Note」
    「Audio Developer Note」
    「Bluetooth Developer Note」
    「FireWire Developer Note」
    「PCI Developer Note」
    「RAM Expansion Developer Note」
    「Universal Serial Bus Developer Note」
    「Video Developer Note」
    「Hardware Developer Note Terms and Abbreviations」
    「Mac OS X Server Administrator Topics」(PDFあり)

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

    「J2SE 5.0 Release 4 Release Notes 」(リリースノート)

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

    「Building an Open Source Universal Binary」(読み物)

    http://developer.apple.com/opensource/buildingopensourceuniversal.html

    前回から4月28日の期間中、新規テクニカルノートは3つ登録され、新規テクニカルQ&Aの方も3つ登録されました。TN1103では、Macintoshの固有情報を得るための方法が幾つか紹介されています。今回、シリアル番号を読み込むためのルーチンが初めて正式に紹介されました。対応しているのはMac OS X 10.3以降となりますが、Intel CPU版Macの場合は必ず10.4以降ですので、どんな機種でも間違いなくシリアル番号を読み込めることになります。また、QA1475では、ヘッダファイルに記されているAPI名や定数名を検索する方法が解説されています。TN2133、QA1474、QA1471については、前号の木下さんの記事も参考にしてください。

    TN1103「Uniquely Identifying a Macintosh Computer」
    TN2110「Identifying Java on Mac OS X」
    TN2147「JNI Development on Mac OS X」(初版)

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

    QA1475「Tips for searching Headers, APIs and ADC reference material」(初版)
    QA1471「Enumerating fonts with ATS 」(初版)
    QA1474「UnsupportedClass- VersionError With J2SE 5.0 Release 4」(初版)

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

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

    前回から4月28日期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが2つ登録されました。「AudioDeviceNotify」は初めての登録となります。

    「AudioDeviceNotify」(Audio関連)(初版)
    「BlockedEventQueue」(Java関連)

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

    【デベロップメント SDK】

    前回から4月28日の期間中、Apple社のSDKサイトには新しいSDKがひとつだけ登録されました。「FireWire SDK for Mac OS X」の最新版です。SDKに含まれているすべてのサンプルソースコードがUniversal Binary化されているようです。

    「FireWire SDK 22 for Mac OS X」(Universal)

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

     

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

     

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