MOSA Multi-OS Software Artists

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

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

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.